1 |
/* GXemul: $Id: sh4_cpu.h,v 1.2 2006/10/19 10:18:02 debug Exp $ */ |
2 |
/* $NetBSD: cpu.h,v 1.41 2006/01/21 04:24:12 uwe Exp $ */ |
3 |
|
4 |
#ifndef SH4_CPU_H |
5 |
#define SH4_CPU_H |
6 |
|
7 |
/*- |
8 |
* Copyright (c) 2002 The NetBSD Foundation, Inc. All rights reserved. |
9 |
* Copyright (c) 1990 The Regents of the University of California. |
10 |
* All rights reserved. |
11 |
* |
12 |
* This code is derived from software contributed to Berkeley by |
13 |
* William Jolitz. |
14 |
* |
15 |
* Redistribution and use in source and binary forms, with or without |
16 |
* modification, are permitted provided that the following conditions |
17 |
* are met: |
18 |
* 1. Redistributions of source code must retain the above copyright |
19 |
* notice, this list of conditions and the following disclaimer. |
20 |
* 2. Redistributions in binary form must reproduce the above copyright |
21 |
* notice, this list of conditions and the following disclaimer in the |
22 |
* documentation and/or other materials provided with the distribution. |
23 |
* 3. Neither the name of the University nor the names of its contributors |
24 |
* may be used to endorse or promote products derived from this software |
25 |
* without specific prior written permission. |
26 |
* |
27 |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
28 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
29 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
30 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
31 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
32 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
33 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
34 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
35 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
36 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
37 |
* SUCH DAMAGE. |
38 |
* |
39 |
* @(#)cpu.h 5.4 (Berkeley) 5/9/91 |
40 |
*/ |
41 |
|
42 |
/* |
43 |
* SH3/SH4 support. |
44 |
* |
45 |
* T.Horiuchi Brains Corp. 5/22/98 |
46 |
*/ |
47 |
|
48 |
#if defined(_KERNEL_OPT) |
49 |
#include "opt_lockdebug.h" |
50 |
#endif |
51 |
|
52 |
#if 0 |
53 |
#include <sh3/psl.h> |
54 |
#include <sh3/frame.h> |
55 |
#endif |
56 |
|
57 |
#ifdef _KERNEL |
58 |
#include <sys/cpu_data.h> |
59 |
struct cpu_info { |
60 |
struct cpu_data ci_data; /* MI per-cpu data */ |
61 |
}; |
62 |
|
63 |
extern struct cpu_info cpu_info_store; |
64 |
#define curcpu() (&cpu_info_store) |
65 |
|
66 |
/* |
67 |
* definitions of cpu-dependent requirements |
68 |
* referenced in generic code |
69 |
*/ |
70 |
#define cpu_number() 0 |
71 |
/* |
72 |
* Can't swapout u-area, (__SWAP_BROKEN) |
73 |
* since we use P1 converted address for trapframe. |
74 |
*/ |
75 |
#define cpu_swapin(p) /* nothing */ |
76 |
#define cpu_swapout(p) panic("cpu_swapout: can't get here"); |
77 |
#define cpu_proc_fork(p1, p2) /* nothing */ |
78 |
|
79 |
/* |
80 |
* Arguments to hardclock and gatherstats encapsulate the previous |
81 |
* machine state in an opaque clockframe. |
82 |
*/ |
83 |
struct clockframe { |
84 |
int spc; /* program counter at time of interrupt */ |
85 |
int ssr; /* status register at time of interrupt */ |
86 |
int ssp; /* stack pointer at time of interrupt */ |
87 |
}; |
88 |
|
89 |
#define CLKF_USERMODE(cf) (!KERNELMODE((cf)->ssr)) |
90 |
#define CLKF_BASEPRI(cf) (((cf)->ssr & 0xf0) == 0) |
91 |
#define CLKF_PC(cf) ((cf)->spc) |
92 |
#define CLKF_INTR(cf) 0 /* XXX */ |
93 |
|
94 |
/* |
95 |
* This is used during profiling to integrate system time. It can safely |
96 |
* assume that the process is resident. |
97 |
*/ |
98 |
#define PROC_PC(p) \ |
99 |
(((struct trapframe *)(p)->p_md.md_regs)->tf_spc) |
100 |
|
101 |
/* |
102 |
* Preempt the current process if in interrupt from user mode, |
103 |
* or after the current trap/syscall if in system mode. |
104 |
*/ |
105 |
#define need_resched(ci) \ |
106 |
do { \ |
107 |
want_resched = 1; \ |
108 |
if (curproc != NULL) \ |
109 |
aston(curproc); \ |
110 |
} while (/*CONSTCOND*/0) |
111 |
|
112 |
/* |
113 |
* Give a profiling tick to the current process when the user profiling |
114 |
* buffer pages are invalid. On the MIPS, request an ast to send us |
115 |
* through trap, marking the proc as needing a profiling tick. |
116 |
*/ |
117 |
#define need_proftick(p) \ |
118 |
do { \ |
119 |
(p)->p_flag |= P_OWEUPC; \ |
120 |
aston(p); \ |
121 |
} while (/*CONSTCOND*/0) |
122 |
|
123 |
/* |
124 |
* Notify the current process (p) that it has a signal pending, |
125 |
* process as soon as possible. |
126 |
*/ |
127 |
#define signotify(p) aston(p) |
128 |
|
129 |
#define aston(p) ((p)->p_md.md_astpending = 1) |
130 |
|
131 |
extern int want_resched; /* need_resched() was called */ |
132 |
|
133 |
/* |
134 |
* We need a machine-independent name for this. |
135 |
*/ |
136 |
#define DELAY(x) delay(x) |
137 |
#endif /* _KERNEL */ |
138 |
|
139 |
/* |
140 |
* Logical address space of SH3/SH4 CPU. |
141 |
*/ |
142 |
#define SH3_PHYS_MASK 0x1fffffff |
143 |
|
144 |
#define SH3_P0SEG_BASE 0x00000000 /* TLB mapped, also U0SEG */ |
145 |
#define SH3_P0SEG_END 0x7fffffff |
146 |
#define SH3_P1SEG_BASE 0x80000000 /* pa == va */ |
147 |
#define SH3_P1SEG_END 0x9fffffff |
148 |
#define SH3_P2SEG_BASE 0xa0000000 /* pa == va, non-cacheable */ |
149 |
#define SH3_P2SEG_END 0xbfffffff |
150 |
#define SH3_P3SEG_BASE 0xc0000000 /* TLB mapped, kernel mode */ |
151 |
#define SH3_P3SEG_END 0xdfffffff |
152 |
#define SH3_P4SEG_BASE 0xe0000000 /* peripheral space */ |
153 |
#define SH3_P4SEG_END 0xffffffff |
154 |
|
155 |
#define SH3_P1SEG_TO_PHYS(x) ((uint32_t)(x) & SH3_PHYS_MASK) |
156 |
#define SH3_P2SEG_TO_PHYS(x) ((uint32_t)(x) & SH3_PHYS_MASK) |
157 |
#define SH3_PHYS_TO_P1SEG(x) ((uint32_t)(x) | SH3_P1SEG_BASE) |
158 |
#define SH3_PHYS_TO_P2SEG(x) ((uint32_t)(x) | SH3_P2SEG_BASE) |
159 |
#define SH3_P1SEG_TO_P2SEG(x) ((uint32_t)(x) | 0x20000000) |
160 |
#define SH3_P2SEG_TO_P1SEG(x) ((uint32_t)(x) & ~0x20000000) |
161 |
|
162 |
#ifndef __lint__ |
163 |
|
164 |
/* switch from P1 to P2 */ |
165 |
#define RUN_P2 do { \ |
166 |
void *p; \ |
167 |
p = &&P2; \ |
168 |
goto *(void *)SH3_P1SEG_TO_P2SEG(p); \ |
169 |
P2: (void)0; \ |
170 |
} while (0) |
171 |
|
172 |
/* switch from P2 to P1 */ |
173 |
#define RUN_P1 do { \ |
174 |
void *p; \ |
175 |
p = &&P1; \ |
176 |
__asm volatile("nop;nop;nop;nop;nop;nop;nop;nop"); \ |
177 |
goto *(void *)SH3_P2SEG_TO_P1SEG(p); \ |
178 |
P1: (void)0; \ |
179 |
} while (0) |
180 |
|
181 |
#else /* __lint__ */ |
182 |
#define RUN_P2 do {} while (/* CONSTCOND */ 0) |
183 |
#define RUN_P1 do {} while (/* CONSTCOND */ 0) |
184 |
#endif |
185 |
|
186 |
/* #if defined(SH4) */ |
187 |
/* SH4 Processor Version Register */ |
188 |
#define SH4_PVR_ADDR 0xff000030 /* P4 address */ |
189 |
#define SH4_PVR (*(volatile uint32_t *) SH4_PVR_ADDR) |
190 |
#define SH4_PRR_ADDR 0xff000044 /* P4 address */ |
191 |
#define SH4_PRR (*(volatile uint32_t *) SH4_PRR_ADDR) |
192 |
|
193 |
#define SH4_PVR_MASK 0xffffff00 |
194 |
#define SH4_PVR_SH7750 0x04020500 /* SH7750 */ |
195 |
#define SH4_PVR_SH7750S 0x04020600 /* SH7750S */ |
196 |
#define SH4_PVR_SH775xR 0x04050000 /* SH775xR */ |
197 |
#define SH4_PVR_SH7751 0x04110000 /* SH7751 */ |
198 |
|
199 |
#define SH4_PRR_MASK 0xfffffff0 |
200 |
#define SH4_PRR_7750R 0x00000100 /* SH7750R */ |
201 |
#define SH4_PRR_7751R 0x00000110 /* SH7751R */ |
202 |
/* #endif */ |
203 |
|
204 |
/* |
205 |
* pull in #defines for kinds of processors |
206 |
*/ |
207 |
/* #include <machine/cputypes.h> */ |
208 |
|
209 |
/* |
210 |
* CTL_MACHDEP definitions. |
211 |
*/ |
212 |
#define CPU_CONSDEV 1 /* dev_t: console terminal device */ |
213 |
#define CPU_LOADANDRESET 2 /* load kernel image and reset */ |
214 |
#define CPU_MAXID 3 /* number of valid machdep ids */ |
215 |
|
216 |
#define CTL_MACHDEP_NAMES { \ |
217 |
{ 0, 0 }, \ |
218 |
{ "console_device", CTLTYPE_STRUCT }, \ |
219 |
{ "load_and_reset", CTLTYPE_INT }, \ |
220 |
} |
221 |
|
222 |
#ifdef _KERNEL |
223 |
void sh_cpu_init(int, int); |
224 |
void sh_startup(void); |
225 |
void cpu_reset(void) __attribute__((__noreturn__)); /* soft reset */ |
226 |
void _cpu_spin(uint32_t); /* for delay loop. */ |
227 |
void delay(int); |
228 |
struct pcb; |
229 |
void savectx(struct pcb *); |
230 |
void dumpsys(void); |
231 |
#endif /* _KERNEL */ |
232 |
|
233 |
#endif /* SH4_CPU_H */ |
234 |
|