Commit a750fc0b9184a520d00d9e949160a0c6d3232ecd
1 parent
08fa4bab
Great rework and cleanups to ease PowerPC implementations definitions.
* cleanup cpu.h, removing definitions used only in translate.c/translate_init.c * add new flags to define instructions sets more precisely * various changes in MMU models definitions * add definitions for PowerPC 440/460 support (insns and SPRs). * add definitions for PowerPC 401/403 and 620 input pins model * Fix definitions for most PowerPC 401, 403, 405, 440, 601, 602, 603 and 7x0 * Preliminary support for PowerPC 74xx (aka G4) without altivec. * Code provision for other PowerPC support (7x5, 970, ...). * New SPR and PVR defined, from PowerPC 2.04 specification and other sources * Misc code bugs, error messages and styles fixes. * Update status files for PowerPC cores support. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3244 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
10 changed files
with
1017 additions
and
1010 deletions
Too many changes to show.
To preserve performance only 10 of 11 files are displayed.
hw/ppc.c
@@ -376,11 +376,11 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | @@ -376,11 +376,11 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | ||
376 | /* Level sensitive - active high */ | 376 | /* Level sensitive - active high */ |
377 | #if defined(PPC_DEBUG_IRQ) | 377 | #if defined(PPC_DEBUG_IRQ) |
378 | if (loglevel & CPU_LOG_INT) { | 378 | if (loglevel & CPU_LOG_INT) { |
379 | - fprintf(logfile, "%s: set the external IRQ state to %d\n", | 379 | + fprintf(logfile, "%s: set the debug pin state to %d\n", |
380 | __func__, level); | 380 | __func__, level); |
381 | } | 381 | } |
382 | #endif | 382 | #endif |
383 | - ppc_set_irq(env, EXCP_40x_DEBUG, level); | 383 | + ppc_set_irq(env, PPC_INTERRUPT_DEBUG, level); |
384 | break; | 384 | break; |
385 | default: | 385 | default: |
386 | /* Unknown pin - do nothing */ | 386 | /* Unknown pin - do nothing */ |
@@ -904,6 +904,9 @@ struct ppc_dcrn_t { | @@ -904,6 +904,9 @@ struct ppc_dcrn_t { | ||
904 | void *opaque; | 904 | void *opaque; |
905 | }; | 905 | }; |
906 | 906 | ||
907 | +/* XXX: on 460, DCR addresses are 32 bits wide, | ||
908 | + * using DCRIPR to get the 22 upper bits of the DCR address | ||
909 | + */ | ||
907 | #define DCRN_NB 1024 | 910 | #define DCRN_NB 1024 |
908 | struct ppc_dcr_t { | 911 | struct ppc_dcr_t { |
909 | ppc_dcrn_t dcrn[DCRN_NB]; | 912 | ppc_dcrn_t dcrn[DCRN_NB]; |
linux-user/main.c
@@ -712,6 +712,17 @@ uint32_t cpu_ppc601_load_rtcl (CPUState *env) | @@ -712,6 +712,17 @@ uint32_t cpu_ppc601_load_rtcl (CPUState *env) | ||
712 | return cpu_ppc_load_tbl(env) & 0x3FFFFF80; | 712 | return cpu_ppc_load_tbl(env) & 0x3FFFFF80; |
713 | } | 713 | } |
714 | 714 | ||
715 | +/* XXX: to be fixed */ | ||
716 | +int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, target_ulong *valp) | ||
717 | +{ | ||
718 | + return -1; | ||
719 | +} | ||
720 | + | ||
721 | +int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val) | ||
722 | +{ | ||
723 | + return -1; | ||
724 | +} | ||
725 | + | ||
715 | void cpu_loop(CPUPPCState *env) | 726 | void cpu_loop(CPUPPCState *env) |
716 | { | 727 | { |
717 | target_siginfo_t info; | 728 | target_siginfo_t info; |
@@ -761,7 +772,7 @@ void cpu_loop(CPUPPCState *env) | @@ -761,7 +772,7 @@ void cpu_loop(CPUPPCState *env) | ||
761 | case EXCP_MACHINE_CHECK: | 772 | case EXCP_MACHINE_CHECK: |
762 | fprintf(stderr, "Machine check exeption... Stop emulation\n"); | 773 | fprintf(stderr, "Machine check exeption... Stop emulation\n"); |
763 | if (loglevel) | 774 | if (loglevel) |
764 | - fprintf(logfile, "RESET asked... Stop emulation\n"); | 775 | + fprintf(logfile, "Machine check exception. Stop emulation\n"); |
765 | info.si_signo = TARGET_SIGBUS; | 776 | info.si_signo = TARGET_SIGBUS; |
766 | info.si_errno = 0; | 777 | info.si_errno = 0; |
767 | info.si_code = TARGET_BUS_OBJERR; | 778 | info.si_code = TARGET_BUS_OBJERR; |
@@ -914,7 +925,7 @@ void cpu_loop(CPUPPCState *env) | @@ -914,7 +925,7 @@ void cpu_loop(CPUPPCState *env) | ||
914 | info.si_code = TARGET_ILL_ILLOPC; | 925 | info.si_code = TARGET_ILL_ILLOPC; |
915 | break; | 926 | break; |
916 | case EXCP_INVAL_LSWX: | 927 | case EXCP_INVAL_LSWX: |
917 | - info.si_code = TARGET_ILL_ILLOPN; | 928 | + info.si_code = TARGET_ILL_ILLOPN; |
918 | break; | 929 | break; |
919 | case EXCP_INVAL_SPR: | 930 | case EXCP_INVAL_SPR: |
920 | info.si_code = TARGET_ILL_PRVREG; | 931 | info.si_code = TARGET_ILL_PRVREG; |
@@ -1003,7 +1014,7 @@ void cpu_loop(CPUPPCState *env) | @@ -1003,7 +1014,7 @@ void cpu_loop(CPUPPCState *env) | ||
1003 | if (loglevel) | 1014 | if (loglevel) |
1004 | fprintf(logfile, "Tried to go into supervisor mode !\n"); | 1015 | fprintf(logfile, "Tried to go into supervisor mode !\n"); |
1005 | abort(); | 1016 | abort(); |
1006 | - } | 1017 | + } |
1007 | break; | 1018 | break; |
1008 | case EXCP_BRANCH: | 1019 | case EXCP_BRANCH: |
1009 | /* We stopped because of a jump... */ | 1020 | /* We stopped because of a jump... */ |
target-ppc/STATUS
@@ -4,267 +4,462 @@ The goal of this file is to provide a reference status to avoid regressions. | @@ -4,267 +4,462 @@ The goal of this file is to provide a reference status to avoid regressions. | ||
4 | =============================================================================== | 4 | =============================================================================== |
5 | PowerPC core emulation status | 5 | PowerPC core emulation status |
6 | 6 | ||
7 | -32 bits PowerPC | ||
8 | -PowerPC 601: | ||
9 | -INSN | ||
10 | -SPR | ||
11 | -MMU | ||
12 | -EXCP | ||
13 | - | ||
14 | -PowerPC 602: | ||
15 | -INSN | ||
16 | -SPR | ||
17 | -MMU | ||
18 | -EXCP | ||
19 | - | ||
20 | -PowerPC 603: | ||
21 | -INSN OK | ||
22 | -SPR OK | ||
23 | -MMU OK | ||
24 | -EXCP OK | ||
25 | - | ||
26 | -PowerPC 604: | ||
27 | -INSN OK | ||
28 | -SPR OK | ||
29 | -MMU OK | ||
30 | -EXCP OK | ||
31 | - | ||
32 | -PowerPC 740: | ||
33 | -INSN OK | ||
34 | -SPR OK | ||
35 | -MMU OK | ||
36 | -EXCP OK | ||
37 | - | ||
38 | -PowerPC 745: | ||
39 | -INSN | ||
40 | -SPR | ||
41 | -MMU | ||
42 | -EXCP | ||
43 | - | ||
44 | -PowerPC 750: | ||
45 | -INSN OK | ||
46 | -SPR OK | ||
47 | -MMU OK | ||
48 | -EXCP OK | ||
49 | - | ||
50 | -PowerPC 755: | ||
51 | -INSN | ||
52 | -SPR | ||
53 | -MMU | ||
54 | -EXCP | 7 | +INSN: instruction set. |
8 | + OK => all instructions are emulated | ||
9 | + KO => some insns are missing or some should be removed | ||
10 | + ? => unchecked | ||
11 | +SPR: special purpose registers set | ||
12 | + OK => all SPR registered (but some may be fake) | ||
13 | + KO => some SPR are missing or should be removed | ||
14 | + ? => uncheked | ||
15 | +MSR: MSR bits definitions | ||
16 | + OK => all MSR bits properly defined | ||
17 | + KO => MSR definition is incorrect | ||
18 | + ? => unchecked | ||
19 | +IRQ: input signals definitions (mostly interrupts) | ||
20 | + OK => input signals are properly defined | ||
21 | + KO => input signals are not implemented (system emulation does not work) | ||
22 | + ? => input signals definitions may be incorrect | ||
23 | +MMU: MMU model implementation | ||
24 | + OK => MMU model is implemented and Linux is able to boot | ||
25 | + KO => MMU model not implemented or bugged | ||
26 | + ? => MMU model not tested | ||
27 | +EXCP: exceptions model implementation | ||
28 | + OK => exception model is implemented and Linux is able to boot | ||
29 | + KO => exception model not implemented or known to be buggy | ||
30 | + ? => exception model may be incorrect or is untested | ||
55 | 31 | ||
56 | -PowerPC 7400: | ||
57 | -INSN KO | ||
58 | -SPR KO | ||
59 | -MMU OK | ||
60 | -EXCP OK | 32 | +Embedded PowerPC cores |
33 | +*** | ||
34 | +PowerPC 401: | ||
35 | +INSN OK | ||
36 | +SPR OK 401A1 | ||
37 | +MSR OK | ||
38 | +IRQ KO partially implemented | ||
39 | +MMU OK | ||
40 | +EXCP ? | ||
61 | 41 | ||
62 | -PowerPC 7410: | ||
63 | -INSN KO | ||
64 | -SPR KO | ||
65 | -MMU OK | ||
66 | -EXCP OK | ||
67 | - | ||
68 | -PowerPC 7450: | ||
69 | -INSN KO | ||
70 | -SPR KO | ||
71 | -MMU OK | ||
72 | -EXCP OK | ||
73 | - | ||
74 | -PowerPC 7455: | ||
75 | -INSN KO | ||
76 | -SPR KO | ||
77 | -MMU OK | ||
78 | -EXCP OK | ||
79 | - | ||
80 | -PowerPC 7457: | ||
81 | -INSN KO | ||
82 | -SPR KO | ||
83 | -MMU OK | ||
84 | -EXCP OK | ||
85 | - | ||
86 | -PowerPC 7457A: | ||
87 | -INSN KO | ||
88 | -SPR KO | ||
89 | -MMU OK | ||
90 | -EXCP OK | 42 | +PowerPC 401x2: |
43 | +INSN OK | ||
44 | +SPR OK 401B2 401C2 401D2 401E2 401F2 | ||
45 | +MSR OK | ||
46 | +IRQ KO partially implemented | ||
47 | +MMU OK | ||
48 | +EXCP ? | ||
91 | 49 | ||
92 | -64 bits PowerPC | ||
93 | -PowerPC 970: | ||
94 | -INSN KO | ||
95 | -SPR KO | ||
96 | -MMU KO | ||
97 | -EXCP KO | ||
98 | - | ||
99 | -PowerPC 620: (lack of precise informations) | ||
100 | -INSN KO | ||
101 | -SPR KO | ||
102 | -MMU KO | ||
103 | -EXCP KO | ||
104 | - | ||
105 | -PowerPC 630: (lack of precise informations) | ||
106 | -INSN KO | ||
107 | -SPR KO | ||
108 | -MMU KO | ||
109 | -EXCP KO | ||
110 | - | ||
111 | -PowerPC 631: (lack of precise informations) | ||
112 | -INSN KO | ||
113 | -SPR KO | ||
114 | -MMU KO | ||
115 | -EXCP KO | ||
116 | - | ||
117 | -POWER4: (lack of precise informations) | ||
118 | -INSN KO | ||
119 | -SPR KO | ||
120 | -MMU KO | ||
121 | -EXCP KO | ||
122 | - | ||
123 | -POWER4+: (lack of precise informations) | ||
124 | -INSN KO | ||
125 | -SPR KO | ||
126 | -MMU KO | ||
127 | -EXCP KO | ||
128 | - | ||
129 | -POWER5: (lack of precise informations) | ||
130 | -INSN KO | ||
131 | -SPR KO | ||
132 | -MMU KO | ||
133 | -EXCP KO | ||
134 | - | ||
135 | -POWER5+: (lack of precise informations) | ||
136 | -INSN KO | ||
137 | -SPR KO | ||
138 | -MMU KO | ||
139 | -EXCP KO | ||
140 | - | ||
141 | -POWER6: (lack of precise informations) | ||
142 | -INSN KO | ||
143 | -SPR KO | ||
144 | -MMU KO | ||
145 | -EXCP KO | ||
146 | - | ||
147 | -RS64: (lack of precise informations) | ||
148 | -INSN KO | ||
149 | -SPR KO | ||
150 | -MMU KO | ||
151 | -EXCP KO | ||
152 | - | ||
153 | -RS64-II: (lack of precise informations) | ||
154 | -INSN KO | ||
155 | -SPR KO | ||
156 | -MMU KO | ||
157 | -EXCP KO | ||
158 | - | ||
159 | -RS64-III: (lack of precise informations) | ||
160 | -INSN KO | ||
161 | -SPR KO | ||
162 | -MMU KO | ||
163 | -EXCP KO | ||
164 | - | ||
165 | -RS64-IV: (lack of precise informations) | ||
166 | -INSN KO | ||
167 | -SPR KO | ||
168 | -MMU KO | ||
169 | -EXCP KO | 50 | +PowerPC IOP480: |
51 | +INSN OK | ||
52 | +SPR OK IOP480 | ||
53 | +MSR OK | ||
54 | +IRQ KO partially implemented | ||
55 | +MMU OK | ||
56 | +EXCP ? | ||
170 | 57 | ||
171 | -Embedded PowerPC cores | ||
172 | -PowerPC 401: | ||
173 | -INSN OK | ||
174 | -SPR OK | ||
175 | -MMU OK | ||
176 | -EXCP ? | 58 | +To be checked: 401G2 401B3 Cobra |
177 | 59 | ||
60 | +*** | ||
178 | PowerPC 403: | 61 | PowerPC 403: |
179 | -INSN OK | ||
180 | -SPR OK | ||
181 | -MMU OK | ||
182 | -EXCP ? | 62 | +INSN OK |
63 | +SPR OK 403GA 403GB | ||
64 | +MMU OK | ||
65 | +MSR OK | ||
66 | +IRQ KO not implemented | ||
67 | +EXCP ? | ||
183 | 68 | ||
69 | +PowerPC 403GCX: | ||
70 | +INSN OK | ||
71 | +SPR OK 403GCX | ||
72 | +MMU OK | ||
73 | +MSR OK | ||
74 | +IRQ KO not implemented | ||
75 | +EXCP ? | ||
76 | + | ||
77 | +To be checked: 403GC | ||
78 | + | ||
79 | +*** | ||
184 | PowerPC 405: | 80 | PowerPC 405: |
185 | -INSN OK | ||
186 | -SPR OK | ||
187 | -MMU OK | ||
188 | -EXCP OK | 81 | +Checked: 405CRa 405CRb 405CRc 405EP 405GPa 405GPb 405GPc 405GPd 405GPe 405GPR |
82 | + Npe405H Npe405H2 Npe405L | ||
83 | +INSN OK | ||
84 | +SPR OK | ||
85 | +MSR OK | ||
86 | +IRQ OK | ||
87 | +MMU OK | ||
88 | +EXCP OK | ||
89 | +=> Linux 2.4 boots (at least 1 proprietary firmware). | ||
90 | + | ||
91 | +To be checked: 405D2 405D4 405EZ 405LP Npe4GS3 STB03 STB04 STB25 | ||
92 | + x2vp4 x2vp7 x2vp20 x2vp50 | ||
93 | + | ||
94 | +XXX: find what is IBM e407b4 | ||
189 | 95 | ||
96 | +*** | ||
190 | PowerPC 440: | 97 | PowerPC 440: |
98 | +Checked: 440EPa 440EPb 440GXa 440GXb 440GXc 440GXf 440SP 440SP2 | ||
99 | +INSN OK | ||
100 | +SPR OK | ||
101 | +MSR OK | ||
102 | +IRQ KO not implemented | ||
103 | +MMU ? | ||
104 | +EXCP ? | ||
105 | + | ||
106 | +PowerPC 440GP: | ||
107 | +Checked: 440GPb 440GPc | ||
108 | +INSN OK | ||
109 | +SPR OK | ||
110 | +MSR OK | ||
111 | +IRQ KO not implemented | ||
112 | +MMU ? | ||
113 | +EXCP ? | ||
114 | + | ||
115 | +PowerPC 440x4: | ||
116 | +Checked: 440A4 440B4 440G4 440H4 | ||
191 | INSN OK | 117 | INSN OK |
192 | SPR OK | 118 | SPR OK |
119 | +MSR OK | ||
120 | +IRQ KO not implemented | ||
193 | MMU ? | 121 | MMU ? |
194 | EXCP ? | 122 | EXCP ? |
195 | 123 | ||
196 | -PowerPC 460: (lack of precise informations) | 124 | +PowerPC 440x5: |
125 | +Checked: 440A5 440F5 440G5 440H6 440GRa | ||
126 | +INSN OK | ||
127 | +SPR OK | ||
128 | +MSR OK | ||
129 | +IRQ KO not implemented | ||
130 | +MMU ? | ||
131 | +EXCP ? | ||
132 | + | ||
133 | +To be checked: 440EPx 440GRx 440SPE | ||
134 | + | ||
135 | +*** | ||
136 | +PowerPC 460: (disabled: lack of detailed specifications) | ||
137 | +INSN KO | ||
138 | +SPR KO | ||
139 | +MSR KO | ||
140 | +IRQ KO | ||
141 | +MMU KO | ||
142 | +EXCP KO | ||
143 | + | ||
144 | +PowerPC 460F: (disabled: lack of detailed specifications) | ||
197 | INSN KO | 145 | INSN KO |
198 | SPR KO | 146 | SPR KO |
147 | +MSR KO | ||
148 | +IRQ KO | ||
199 | MMU KO | 149 | MMU KO |
200 | EXCP KO | 150 | EXCP KO |
201 | 151 | ||
202 | -Freescale (to be completed) ... | 152 | +*** |
153 | +PowerPC e200: (not implemented) | ||
154 | +INSN KO | ||
155 | +SPR KO | ||
156 | +MSR KO | ||
157 | +IRQ KO | ||
158 | +MMU KO | ||
159 | +EXCP KO | ||
203 | 160 | ||
204 | -Original POWER | ||
205 | -POWER: (lack of precise informations) | 161 | +*** |
162 | +PowerPC e300: (not implemented) | ||
206 | INSN KO | 163 | INSN KO |
207 | SPR KO | 164 | SPR KO |
165 | +MSR KO | ||
166 | +IRQ KO | ||
208 | MMU KO | 167 | MMU KO |
209 | EXCP KO | 168 | EXCP KO |
210 | 169 | ||
211 | -POWER2: (lack of precise informations) | 170 | +*** |
171 | +PowerPC e500: (not implemented) | ||
212 | INSN KO | 172 | INSN KO |
213 | SPR KO | 173 | SPR KO |
174 | +MSR KO | ||
175 | +IRQ KO | ||
214 | MMU KO | 176 | MMU KO |
215 | EXCP KO | 177 | EXCP KO |
216 | 178 | ||
217 | -PowerPC CPU known to work (ie booting at least Linux 2.4): | ||
218 | -* main stream PowerPC cores | ||
219 | -- PowerPC 603 & derivatives | ||
220 | -- PowerPC 604 & derivatives | ||
221 | -- PowerPC 740 & derivatives | ||
222 | -- PowerPC 750 & derivatives | ||
223 | -- PowerPC 405 | ||
224 | - | ||
225 | -PowerPC that should work but are not supported by standard Linux kernel | ||
226 | -(then remain mostly untested) | ||
227 | -- PowerPC 745 | ||
228 | -- PowerPC 755 | ||
229 | - | ||
230 | -Work in progress: | ||
231 | -* embedded PowerPC cores | ||
232 | -- BookE PowerPC | ||
233 | -- e500 core (Freescale PowerQUICC) | ||
234 | -* main stream PowerPC cores | ||
235 | -- PowerPC 601 | ||
236 | -- PowerPC 602 | 179 | +*** |
180 | +PowerPC e600: (not implemented) | ||
181 | +INSN KO | ||
182 | +SPR KO | ||
183 | +MSR KO | ||
184 | +IRQ KO | ||
185 | +MMU KO | ||
186 | +EXCP KO | ||
237 | 187 | ||
238 | -TODO: | ||
239 | -* embedded PowerPC cores | ||
240 | -- PowerPC 401 | ||
241 | -- PowerPC 403 | ||
242 | -- PowerPC 440 | ||
243 | -- PowerPC 460 | ||
244 | -* main stream PowerPC cores | ||
245 | -- PowerPC 7400 (aka G4) | ||
246 | -- PowerPC 7410 | ||
247 | -- PowerPC 7450 | ||
248 | -- PowerPC 7455 | ||
249 | -- PowerPC 7457 | ||
250 | -- PowerPC 7457A | ||
251 | -* original POWER | ||
252 | -- POWER | ||
253 | -- POWER2 | ||
254 | -* 64 bits PowerPC cores | ||
255 | -- PowerPC 620 | ||
256 | -- PowerPC 630 (aka POWER3) | ||
257 | -- PowerPC 631 (aka POWER3+) | ||
258 | -- POWER4 | ||
259 | -- POWER4+ | ||
260 | -- POWER5 | ||
261 | -- POWER5+ | ||
262 | -- PowerPC 970 | ||
263 | -* RS64 series | ||
264 | -- RS64 | ||
265 | -- RS64-II | ||
266 | -- RS64-III | ||
267 | -- RS64-IV | 188 | +*** |
189 | +32 bits PowerPC | ||
190 | +PowerPC 601: (601 601v2) | ||
191 | +INSN OK | ||
192 | +SPR OK is HID15 only on 601v2 ? | ||
193 | +MSR OK | ||
194 | +IRQ KO not implemented | ||
195 | +MMU ? | ||
196 | +EXCP ? | ||
197 | +Remarks: some instructions should have a specific behavior (not implemented) | ||
198 | + | ||
199 | +PowerPC 602: 602 | ||
200 | +INSN OK | ||
201 | +SPR OK | ||
202 | +MSR OK | ||
203 | +IRQ OK | ||
204 | +MMU ? | ||
205 | +EXCP ? at least timer and external interrupt are OK | ||
206 | +Remarks: Linux crashes when entering user-mode. But it seems it does not | ||
207 | + know about this CPU. As this CPU is close to 603e, it should be OK. | ||
208 | + | ||
209 | +PowerPC 603: (603) | ||
210 | +INSN OK | ||
211 | +SPR OK | ||
212 | +MSR OK | ||
213 | +IRQ OK | ||
214 | +MMU OK | ||
215 | +EXCP OK | ||
216 | +Remarks: Linux 2.4 boots and properly recognizes the CPU | ||
217 | + | ||
218 | +PowerPC 603e: (603e11) | ||
219 | +INSN OK | ||
220 | +SPR OK | ||
221 | +MSR OK | ||
222 | +IRQ OK | ||
223 | +MMU OK | ||
224 | +EXCP OK | ||
225 | +Remarks: Linux 2.4 boots and properly recognizes the CPU | ||
226 | + | ||
227 | +PowerPC G2: | ||
228 | +INSN OK | ||
229 | +SPR OK | ||
230 | +MSR OK | ||
231 | +IRQ OK | ||
232 | +MMU OK | ||
233 | +EXCP OK | ||
234 | +Remarks: Linux 2.4 boots, recognizes the CPU as a 82xx. | ||
235 | + | ||
236 | +PowerPC G2le: | ||
237 | +INSN OK | ||
238 | +SPR OK | ||
239 | +MSR OK | ||
240 | +IRQ OK | ||
241 | +MMU OK | ||
242 | +EXCP OK | ||
243 | +Remarks: Linux 2.4 does not boots. Same symptoms as 602. | ||
244 | + | ||
245 | +PowerPC 604: | ||
246 | +INSN OK | ||
247 | +SPR OK | ||
248 | +MSR OK | ||
249 | +IRQ OK | ||
250 | +MMU OK | ||
251 | +EXCP OK | ||
252 | +Remarks: Linux 2.4 boots and properly recognizes the CPU. | ||
253 | + | ||
254 | +PowerPC 7x0: | ||
255 | +INSN OK | ||
256 | +SPR OK | ||
257 | +MSR OK | ||
258 | +IRQ OK | ||
259 | +MMU OK | ||
260 | +EXCP OK | ||
261 | +Remarks: Linux 2.4 boots and properly recognizes the CPU. | ||
262 | + | ||
263 | +PowerPC 750fx: | ||
264 | +INSN OK | ||
265 | +SPR OK | ||
266 | +MSR OK | ||
267 | +IRQ OK | ||
268 | +MMU OK | ||
269 | +EXCP OK | ||
270 | +Remarks: Linux 2.4 boots but does not properly recognizes the CPU. | ||
271 | + | ||
272 | +PowerPC 7x5: | ||
273 | +INSN ? | ||
274 | +SPR ? | ||
275 | +MSR ? | ||
276 | +IRQ OK | ||
277 | +MMU ? | ||
278 | +EXCP OK | ||
279 | +=> Linux 2.4 does not boot. | ||
280 | + | ||
281 | +PowerPC 7400: | ||
282 | +INSN KO Altivec missing | ||
283 | +SPR OK | ||
284 | +MSR OK | ||
285 | +IRQ OK | ||
286 | +MMU OK | ||
287 | +EXCP ? Altivec, ... | ||
288 | +=> Linux 2.4 boots and properly recognize the CPU. | ||
289 | + | ||
290 | +PowerPC 7410: | ||
291 | +INSN KO Altivec missing | ||
292 | +SPR OK | ||
293 | +MSR OK | ||
294 | +IRQ OK | ||
295 | +MMU OK | ||
296 | +EXCP ? Altivec, ... | ||
297 | +=> Linux 2.4 boots and properly recognize the CPU. | ||
298 | + Note that UM says tlbld & tlbli are implemented bus this may be a mistake | ||
299 | + as TLB load are managed by the hardware and it does not implement the | ||
300 | + needed registers. | ||
301 | + | ||
302 | +PowerPC 7441: | ||
303 | +INSN KO Altivec missing + TLB load insns missing | ||
304 | +SPR OK | ||
305 | +MSR OK | ||
306 | +IRQ OK | ||
307 | +MMU KO not implemented | ||
308 | +EXCP ? Altivec, ... | ||
309 | + | ||
310 | +PowerPC 7450/7451: | ||
311 | +INSN KO Altivec missing + TLB load insns missing | ||
312 | +SPR OK | ||
313 | +MSR OK | ||
314 | +IRQ OK | ||
315 | +MMU KO not implemented | ||
316 | +EXCP ? Altivec, ... | ||
317 | + | ||
318 | +PowerPC 7445/7447: | ||
319 | +INSN KO Altivec missing + TLB load insns missing | ||
320 | +SPR OK | ||
321 | +MSR OK | ||
322 | +IRQ OK | ||
323 | +MMU KO not implemented | ||
324 | +EXCP ? Altivec, ... | ||
325 | + | ||
326 | +PowerPC 7455/7457: | ||
327 | +INSN KO Altivec missing + TLB load insns missing | ||
328 | +SPR OK | ||
329 | +MSR OK | ||
330 | +IRQ OK | ||
331 | +MMU KO not implemented | ||
332 | +EXCP ? Altivec, ... | ||
333 | + | ||
334 | +64 bits PowerPC | ||
335 | +PowerPC 620: (disabled) | ||
336 | +INSN KO | ||
337 | +SPR KO | ||
338 | +MSR ? | ||
339 | +IRQ KO | ||
340 | +MMU KO | ||
341 | +EXCP KO | ||
342 | + | ||
343 | +PowerPC 970: (disabled) | ||
344 | +INSN KO Altivec missing and more | ||
345 | +SPR KO | ||
346 | +MSR ? | ||
347 | +IRQ OK | ||
348 | +MMU KO partially implemented | ||
349 | +EXCP KO | ||
350 | + | ||
351 | +PowerPC 970FX: (disabled) | ||
352 | +INSN KO Altivec missing and more | ||
353 | +SPR KO | ||
354 | +MSR ? | ||
355 | +IRQ OK | ||
356 | +MMU KO partially implemented | ||
357 | +EXCP KO | ||
358 | + | ||
359 | +PowerPC 630: (disabled: lack of detailed specifications) | ||
360 | +INSN KO | ||
361 | +SPR KO | ||
362 | +MSR KO | ||
363 | +IRQ KO | ||
364 | +MMU KO | ||
365 | +EXCP KO | ||
366 | + | ||
367 | +PowerPC 631: (disabled: lack of detailed specifications) | ||
368 | +INSN KO | ||
369 | +SPR KO | ||
370 | +MSR KO | ||
371 | +IRQ KO | ||
372 | +MMU KO | ||
373 | +EXCP KO | ||
374 | + | ||
375 | +POWER4: (disabled: lack of detailed specifications) | ||
376 | +INSN KO | ||
377 | +SPR KO | ||
378 | +MSR KO | ||
379 | +IRQ KO | ||
380 | +MMU KO | ||
381 | +EXCP KO | ||
382 | + | ||
383 | +POWER4+: (disabled: lack of detailed specifications) | ||
384 | +INSN KO | ||
385 | +SPR KO | ||
386 | +MSR KO | ||
387 | +IRQ KO | ||
388 | +MMU KO | ||
389 | +EXCP KO | ||
390 | + | ||
391 | +POWER5: (disabled: lack of detailed specifications) | ||
392 | +INSN KO | ||
393 | +SPR KO | ||
394 | +MSR KO | ||
395 | +IRQ KO | ||
396 | +MMU KO | ||
397 | +EXCP KO | ||
398 | + | ||
399 | +POWER5+: (disabled: lack of detailed specifications) | ||
400 | +INSN KO | ||
401 | +SPR KO | ||
402 | +MSR KO | ||
403 | +IRQ KO | ||
404 | +MMU KO | ||
405 | +EXCP KO | ||
406 | + | ||
407 | +POWER6: (disabled: lack of detailed specifications) | ||
408 | +INSN KO | ||
409 | +SPR KO | ||
410 | +MSR KO | ||
411 | +IRQ KO | ||
412 | +MMU KO | ||
413 | +EXCP KO | ||
414 | + | ||
415 | +RS64: (disabled: lack of detailed specifications) | ||
416 | +INSN KO | ||
417 | +SPR KO | ||
418 | +MSR KO | ||
419 | +IRQ KO | ||
420 | +MMU KO | ||
421 | +EXCP KO | ||
422 | + | ||
423 | +RS64-II: (disabled: lack of detailed specifications) | ||
424 | +INSN KO | ||
425 | +SPR KO | ||
426 | +MSR KO | ||
427 | +IRQ KO | ||
428 | +MMU KO | ||
429 | +EXCP KO | ||
430 | + | ||
431 | +RS64-III: (disabled: lack of detailed specifications) | ||
432 | +INSN KO | ||
433 | +SPR KO | ||
434 | +MSR KO | ||
435 | +IRQ KO | ||
436 | +MMU KO | ||
437 | +EXCP KO | ||
438 | + | ||
439 | +RS64-IV: (disabled: lack of detailed specifications) | ||
440 | +INSN KO | ||
441 | +SPR KO | ||
442 | +MSR KO | ||
443 | +IRQ KO | ||
444 | +MMU KO | ||
445 | +EXCP KO | ||
446 | + | ||
447 | +Original POWER | ||
448 | +POWER: (disabled: lack of detailed specifications) | ||
449 | +INSN KO | ||
450 | +SPR KO | ||
451 | +MSR KO | ||
452 | +IRQ KO | ||
453 | +MMU KO | ||
454 | +EXCP KO | ||
455 | + | ||
456 | +POWER2: (disabled: lack of detailed specifications) | ||
457 | +INSN KO | ||
458 | +SPR KO | ||
459 | +MSR KO | ||
460 | +IRQ KO | ||
461 | +MMU KO | ||
462 | +EXCP KO | ||
268 | 463 | ||
269 | =============================================================================== | 464 | =============================================================================== |
270 | PowerPC microcontrollers emulation status | 465 | PowerPC microcontrollers emulation status |
target-ppc/cpu.h
@@ -89,528 +89,89 @@ typedef uint32_t ppc_gpr_t; | @@ -89,528 +89,89 @@ typedef uint32_t ppc_gpr_t; | ||
89 | #define DCACHE_LINE_SIZE 32 | 89 | #define DCACHE_LINE_SIZE 32 |
90 | 90 | ||
91 | /*****************************************************************************/ | 91 | /*****************************************************************************/ |
92 | -/* PVR definitions for most known PowerPC */ | 92 | +/* MMU model */ |
93 | enum { | 93 | enum { |
94 | - /* PowerPC 401 cores */ | ||
95 | - CPU_PPC_401A1 = 0x00210000, | ||
96 | - CPU_PPC_401B2 = 0x00220000, | ||
97 | -#if 0 | ||
98 | - CPU_PPC_401B3 = xxx, | ||
99 | -#endif | ||
100 | - CPU_PPC_401C2 = 0x00230000, | ||
101 | - CPU_PPC_401D2 = 0x00240000, | ||
102 | - CPU_PPC_401E2 = 0x00250000, | ||
103 | - CPU_PPC_401F2 = 0x00260000, | ||
104 | - CPU_PPC_401G2 = 0x00270000, | ||
105 | -#if 0 | ||
106 | - CPU_PPC_401GF = xxx, | ||
107 | -#endif | ||
108 | -#define CPU_PPC_401 CPU_PPC_401G2 | ||
109 | - CPU_PPC_IOP480 = 0x40100000, /* 401B2 ? */ | ||
110 | - CPU_PPC_COBRA = 0x10100000, /* IBM Processor for Network Resources */ | ||
111 | - /* PowerPC 403 cores */ | ||
112 | - CPU_PPC_403GA = 0x00200011, | ||
113 | - CPU_PPC_403GB = 0x00200100, | ||
114 | - CPU_PPC_403GC = 0x00200200, | ||
115 | - CPU_PPC_403GCX = 0x00201400, | ||
116 | -#if 0 | ||
117 | - CPU_PPC_403GP = xxx, | ||
118 | -#endif | ||
119 | -#define CPU_PPC_403 CPU_PPC_403GCX | ||
120 | - /* PowerPC 405 cores */ | ||
121 | -#if 0 | ||
122 | - CPU_PPC_405A3 = xxx, | ||
123 | -#endif | ||
124 | -#if 0 | ||
125 | - CPU_PPC_405A4 = xxx, | ||
126 | -#endif | ||
127 | -#if 0 | ||
128 | - CPU_PPC_405B3 = xxx, | ||
129 | -#endif | ||
130 | - CPU_PPC_405D2 = 0x20010000, | ||
131 | - CPU_PPC_405D4 = 0x41810000, | ||
132 | - CPU_PPC_405CR = 0x40110145, | ||
133 | -#define CPU_PPC_405GP CPU_PPC_405CR | ||
134 | - CPU_PPC_405EP = 0x51210950, | ||
135 | -#if 0 | ||
136 | - CPU_PPC_405EZ = xxx, | ||
137 | -#endif | ||
138 | - CPU_PPC_405GPR = 0x50910951, | ||
139 | -#if 0 | ||
140 | - CPU_PPC_405LP = xxx, | ||
141 | -#endif | ||
142 | -#define CPU_PPC_405 CPU_PPC_405D4 | ||
143 | - CPU_PPC_NPE405H = 0x414100C0, | ||
144 | - CPU_PPC_NPE405H2 = 0x41410140, | ||
145 | - CPU_PPC_NPE405L = 0x416100C0, | ||
146 | -#if 0 | ||
147 | - CPU_PPC_LC77700 = xxx, | ||
148 | -#endif | ||
149 | - /* IBM STBxxx (PowerPC 401/403/405 core based microcontrollers) */ | ||
150 | -#if 0 | ||
151 | - CPU_PPC_STB01000 = xxx, | ||
152 | -#endif | ||
153 | -#if 0 | ||
154 | - CPU_PPC_STB01010 = xxx, | ||
155 | -#endif | ||
156 | -#if 0 | ||
157 | - CPU_PPC_STB0210 = xxx, | ||
158 | -#endif | ||
159 | - CPU_PPC_STB03 = 0x40310000, | ||
160 | -#if 0 | ||
161 | - CPU_PPC_STB043 = xxx, | ||
162 | -#endif | ||
163 | -#if 0 | ||
164 | - CPU_PPC_STB045 = xxx, | ||
165 | -#endif | ||
166 | - CPU_PPC_STB25 = 0x51510950, | ||
167 | -#if 0 | ||
168 | - CPU_PPC_STB130 = xxx, | ||
169 | -#endif | ||
170 | - /* Xilinx cores */ | ||
171 | - CPU_PPC_X2VP4 = 0x20010820, | ||
172 | -#define CPU_PPC_X2VP7 CPU_PPC_X2VP4 | ||
173 | - CPU_PPC_X2VP20 = 0x20010860, | ||
174 | -#define CPU_PPC_X2VP50 CPU_PPC_X2VP20 | ||
175 | - /* PowerPC 440 cores */ | ||
176 | - CPU_PPC_440EP = 0x422218D3, | ||
177 | -#define CPU_PPC_440GR CPU_PPC_440EP | ||
178 | - CPU_PPC_440GP = 0x40120481, | ||
179 | -#if 0 | ||
180 | - CPU_PPC_440GRX = xxx, | ||
181 | -#endif | ||
182 | - CPU_PPC_440GX = 0x51B21850, | ||
183 | - CPU_PPC_440GXc = 0x51B21892, | ||
184 | - CPU_PPC_440GXf = 0x51B21894, | ||
185 | - CPU_PPC_440SP = 0x53221850, | ||
186 | - CPU_PPC_440SP2 = 0x53221891, | ||
187 | - CPU_PPC_440SPE = 0x53421890, | ||
188 | - /* PowerPC 460 cores */ | ||
189 | -#if 0 | ||
190 | - CPU_PPC_464H90 = xxx, | ||
191 | -#endif | ||
192 | -#if 0 | ||
193 | - CPU_PPC_464H90FP = xxx, | ||
194 | -#endif | ||
195 | - /* PowerPC MPC 5xx cores */ | ||
196 | - CPU_PPC_5xx = 0x00020020, | ||
197 | - /* PowerPC MPC 8xx cores (aka PowerQUICC) */ | ||
198 | - CPU_PPC_8xx = 0x00500000, | ||
199 | - /* PowerPC MPC 8xxx cores (aka PowerQUICC-II) */ | ||
200 | - CPU_PPC_82xx_HIP3 = 0x00810101, | ||
201 | - CPU_PPC_82xx_HIP4 = 0x80811014, | ||
202 | - CPU_PPC_827x = 0x80822013, | ||
203 | - /* eCores */ | ||
204 | - CPU_PPC_e200 = 0x81120000, | ||
205 | - CPU_PPC_e500v110 = 0x80200010, | ||
206 | - CPU_PPC_e500v120 = 0x80200020, | ||
207 | - CPU_PPC_e500v210 = 0x80210010, | ||
208 | - CPU_PPC_e500v220 = 0x80210020, | ||
209 | -#define CPU_PPC_e500 CPU_PPC_e500v220 | ||
210 | - CPU_PPC_e600 = 0x80040010, | ||
211 | - /* PowerPC 6xx cores */ | ||
212 | - CPU_PPC_601 = 0x00010001, | ||
213 | - CPU_PPC_602 = 0x00050100, | ||
214 | - CPU_PPC_603 = 0x00030100, | ||
215 | - CPU_PPC_603E = 0x00060101, | ||
216 | - CPU_PPC_603P = 0x00070000, | ||
217 | - CPU_PPC_603E7v = 0x00070100, | ||
218 | - CPU_PPC_603E7v2 = 0x00070201, | ||
219 | - CPU_PPC_603E7 = 0x00070200, | ||
220 | - CPU_PPC_603R = 0x00071201, | ||
221 | - CPU_PPC_G2 = 0x00810011, | ||
222 | - CPU_PPC_G2H4 = 0x80811010, | ||
223 | - CPU_PPC_G2gp = 0x80821010, | ||
224 | - CPU_PPC_G2ls = 0x90810010, | ||
225 | - CPU_PPC_G2LE = 0x80820010, | ||
226 | - CPU_PPC_G2LEgp = 0x80822010, | ||
227 | - CPU_PPC_G2LEls = 0xA0822010, | ||
228 | - CPU_PPC_604 = 0x00040000, | ||
229 | - CPU_PPC_604E = 0x00090100, /* Also 2110 & 2120 */ | ||
230 | - CPU_PPC_604R = 0x000a0101, | ||
231 | - /* PowerPC 74x/75x cores (aka G3) */ | ||
232 | - CPU_PPC_74x = 0x00080000, | ||
233 | - CPU_PPC_740E = 0x00080100, | ||
234 | - CPU_PPC_74xP = 0x10080000, | ||
235 | - CPU_PPC_750E = 0x00080200, | ||
236 | - CPU_PPC_750CXE21 = 0x00082201, | ||
237 | - CPU_PPC_750CXE22 = 0x00082212, | ||
238 | - CPU_PPC_750CXE23 = 0x00082203, | ||
239 | - CPU_PPC_750CXE24 = 0x00082214, | ||
240 | - CPU_PPC_750CXE24b = 0x00083214, | ||
241 | - CPU_PPC_750CXE31 = 0x00083211, | ||
242 | - CPU_PPC_750CXE31b = 0x00083311, | ||
243 | -#define CPU_PPC_750CXE CPU_PPC_750CXE31b | ||
244 | - CPU_PPC_750CXR = 0x00083410, | ||
245 | - CPU_PPC_750FX10 = 0x70000100, | ||
246 | - CPU_PPC_750FX20 = 0x70000200, | ||
247 | - CPU_PPC_750FX21 = 0x70000201, | ||
248 | - CPU_PPC_750FX22 = 0x70000202, | ||
249 | - CPU_PPC_750FX23 = 0x70000203, | ||
250 | -#define CPU_PPC_750FX CPU_PPC_750FX23 | ||
251 | - CPU_PPC_750FL = 0x700A0203, | ||
252 | - CPU_PPC_750GX10 = 0x70020100, | ||
253 | - CPU_PPC_750GX11 = 0x70020101, | ||
254 | - CPU_PPC_750GX12 = 0x70020102, | ||
255 | -#define CPU_PPC_750GX CPU_PPC_750GX12 | ||
256 | - CPU_PPC_750GL = 0x70020102, | ||
257 | - CPU_PPC_750L30 = 0x00088300, | ||
258 | - CPU_PPC_750L32 = 0x00088302, | ||
259 | -#define CPU_PPC_750L CPU_PPC_750L32 | ||
260 | - CPU_PPC_750CL = 0x00087200, | ||
261 | - CPU_PPC_755_10 = 0x00083100, | ||
262 | - CPU_PPC_755_11 = 0x00083101, | ||
263 | - CPU_PPC_755_20 = 0x00083200, | ||
264 | - CPU_PPC_755D = 0x00083202, | ||
265 | - CPU_PPC_755E = 0x00083203, | ||
266 | -#define CPU_PPC_755 CPU_PPC_755E | ||
267 | - /* PowerPC 74xx cores (aka G4) */ | ||
268 | - CPU_PPC_7400 = 0x000C0100, | ||
269 | - CPU_PPC_7410C = 0x800C1102, | ||
270 | - CPU_PPC_7410D = 0x800C1103, | ||
271 | - CPU_PPC_7410E = 0x800C1104, | ||
272 | -#define CPU_PPC_7410 CPU_PPC_7410E | ||
273 | - CPU_PPC_7441 = 0x80000210, | ||
274 | - CPU_PPC_7445 = 0x80010100, | ||
275 | - CPU_PPC_7447 = 0x80020100, | ||
276 | - CPU_PPC_7447A = 0x80030101, | ||
277 | - CPU_PPC_7448 = 0x80040100, | ||
278 | - CPU_PPC_7450 = 0x80000200, | ||
279 | - CPU_PPC_7450b = 0x80000201, | ||
280 | - CPU_PPC_7451 = 0x80000203, | ||
281 | - CPU_PPC_7451G = 0x80000210, | ||
282 | - CPU_PPC_7455 = 0x80010201, | ||
283 | - CPU_PPC_7455F = 0x80010303, | ||
284 | - CPU_PPC_7455G = 0x80010304, | ||
285 | - CPU_PPC_7457 = 0x80020101, | ||
286 | - CPU_PPC_7457C = 0x80020102, | ||
287 | - CPU_PPC_7457A = 0x80030000, | ||
288 | - /* 64 bits PowerPC */ | ||
289 | - CPU_PPC_620 = 0x00140000, | ||
290 | - CPU_PPC_630 = 0x00400000, | ||
291 | - CPU_PPC_631 = 0x00410000, | ||
292 | - CPU_PPC_POWER4 = 0x00350000, | ||
293 | - CPU_PPC_POWER4P = 0x00380000, | ||
294 | - CPU_PPC_POWER5 = 0x003A0000, | ||
295 | - CPU_PPC_POWER5P = 0x003B0000, | ||
296 | -#if 0 | ||
297 | - CPU_PPC_POWER6 = xxx, | ||
298 | -#endif | ||
299 | - CPU_PPC_970 = 0x00390000, | ||
300 | - CPU_PPC_970FX10 = 0x00391100, | ||
301 | - CPU_PPC_970FX20 = 0x003C0200, | ||
302 | - CPU_PPC_970FX21 = 0x003C0201, | ||
303 | - CPU_PPC_970FX30 = 0x003C0300, | ||
304 | - CPU_PPC_970FX31 = 0x003C0301, | ||
305 | -#define CPU_PPC_970FX CPU_PPC_970FX31 | ||
306 | - CPU_PPC_970MP10 = 0x00440100, | ||
307 | - CPU_PPC_970MP11 = 0x00440101, | ||
308 | -#define CPU_PPC_970MP CPU_PPC_970MP11 | ||
309 | - CPU_PPC_CELL10 = 0x00700100, | ||
310 | - CPU_PPC_CELL20 = 0x00700400, | ||
311 | - CPU_PPC_CELL30 = 0x00700500, | ||
312 | - CPU_PPC_CELL31 = 0x00700501, | ||
313 | -#define CPU_PPC_CELL32 CPU_PPC_CELL31 | ||
314 | -#define CPU_PPC_CELL CPU_PPC_CELL32 | ||
315 | - CPU_PPC_RS64 = 0x00330000, | ||
316 | - CPU_PPC_RS64II = 0x00340000, | ||
317 | - CPU_PPC_RS64III = 0x00360000, | ||
318 | - CPU_PPC_RS64IV = 0x00370000, | ||
319 | - /* Original POWER */ | ||
320 | - /* XXX: should be POWER (RIOS), RSC3308, RSC4608, | ||
321 | - * POWER2 (RIOS2) & RSC2 (P2SC) here | ||
322 | - */ | ||
323 | -#if 0 | ||
324 | - CPU_POWER = xxx, | ||
325 | -#endif | ||
326 | -#if 0 | ||
327 | - CPU_POWER2 = xxx, | ||
328 | -#endif | ||
329 | -}; | ||
330 | - | ||
331 | -/* System version register (used on MPC 8xxx) */ | ||
332 | -enum { | ||
333 | - PPC_SVR_8540 = 0x80300000, | ||
334 | - PPC_SVR_8541E = 0x807A0010, | ||
335 | - PPC_SVR_8543v10 = 0x80320010, | ||
336 | - PPC_SVR_8543v11 = 0x80320011, | ||
337 | - PPC_SVR_8543v20 = 0x80320020, | ||
338 | - PPC_SVR_8543Ev10 = 0x803A0010, | ||
339 | - PPC_SVR_8543Ev11 = 0x803A0011, | ||
340 | - PPC_SVR_8543Ev20 = 0x803A0020, | ||
341 | - PPC_SVR_8545 = 0x80310220, | ||
342 | - PPC_SVR_8545E = 0x80390220, | ||
343 | - PPC_SVR_8547E = 0x80390120, | ||
344 | - PPC_SCR_8548v10 = 0x80310010, | ||
345 | - PPC_SCR_8548v11 = 0x80310011, | ||
346 | - PPC_SCR_8548v20 = 0x80310020, | ||
347 | - PPC_SVR_8548Ev10 = 0x80390010, | ||
348 | - PPC_SVR_8548Ev11 = 0x80390011, | ||
349 | - PPC_SVR_8548Ev20 = 0x80390020, | ||
350 | - PPC_SVR_8555E = 0x80790010, | ||
351 | - PPC_SVR_8560v10 = 0x80700010, | ||
352 | - PPC_SVR_8560v20 = 0x80700020, | 94 | + POWERPC_MMU_UNKNOWN = 0, |
95 | + /* Standard 32 bits PowerPC MMU */ | ||
96 | + POWERPC_MMU_32B, | ||
97 | + /* Standard 64 bits PowerPC MMU */ | ||
98 | + POWERPC_MMU_64B, | ||
99 | + /* PowerPC 601 MMU */ | ||
100 | + POWERPC_MMU_601, | ||
101 | + /* PowerPC 6xx MMU with software TLB */ | ||
102 | + POWERPC_MMU_SOFT_6xx, | ||
103 | + /* PowerPC 74xx MMU with software TLB */ | ||
104 | + POWERPC_MMU_SOFT_74xx, | ||
105 | + /* PowerPC 4xx MMU with software TLB */ | ||
106 | + POWERPC_MMU_SOFT_4xx, | ||
107 | + /* PowerPC 4xx MMU with software TLB and zones protections */ | ||
108 | + POWERPC_MMU_SOFT_4xx_Z, | ||
109 | + /* PowerPC 4xx MMU in real mode only */ | ||
110 | + POWERPC_MMU_REAL_4xx, | ||
111 | + /* BookE MMU model */ | ||
112 | + POWERPC_MMU_BOOKE, | ||
113 | + /* BookE FSL MMU model */ | ||
114 | + POWERPC_MMU_BOOKE_FSL, | ||
115 | + /* 64 bits "bridge" PowerPC MMU */ | ||
116 | + POWERPC_MMU_64BRIDGE, | ||
353 | }; | 117 | }; |
354 | 118 | ||
355 | /*****************************************************************************/ | 119 | /*****************************************************************************/ |
356 | -/* Instruction types */ | ||
357 | -enum { | ||
358 | - PPC_NONE = 0x00000000, | ||
359 | - /* integer operations instructions */ | ||
360 | - /* flow control instructions */ | ||
361 | - /* virtual memory instructions */ | ||
362 | - /* ld/st with reservation instructions */ | ||
363 | - /* cache control instructions */ | ||
364 | - /* spr/msr access instructions */ | ||
365 | - PPC_INSNS_BASE = 0x0000000000000001ULL, | ||
366 | -#define PPC_INTEGER PPC_INSNS_BASE | ||
367 | -#define PPC_FLOW PPC_INSNS_BASE | ||
368 | -#define PPC_MEM PPC_INSNS_BASE | ||
369 | -#define PPC_RES PPC_INSNS_BASE | ||
370 | -#define PPC_CACHE PPC_INSNS_BASE | ||
371 | -#define PPC_MISC PPC_INSNS_BASE | ||
372 | - /* floating point operations instructions */ | ||
373 | - PPC_FLOAT = 0x0000000000000002ULL, | ||
374 | - /* more floating point operations instructions */ | ||
375 | - PPC_FLOAT_EXT = 0x0000000000000004ULL, | ||
376 | - /* external control instructions */ | ||
377 | - PPC_EXTERN = 0x0000000000000008ULL, | ||
378 | - /* segment register access instructions */ | ||
379 | - PPC_SEGMENT = 0x0000000000000010ULL, | ||
380 | - /* Optional cache control instructions */ | ||
381 | - PPC_CACHE_OPT = 0x0000000000000020ULL, | ||
382 | - /* Optional floating point op instructions */ | ||
383 | - PPC_FLOAT_OPT = 0x0000000000000040ULL, | ||
384 | - /* Optional memory control instructions */ | ||
385 | - PPC_MEM_TLBIA = 0x0000000000000080ULL, | ||
386 | - PPC_MEM_TLBIE = 0x0000000000000100ULL, | ||
387 | - PPC_MEM_TLBSYNC = 0x0000000000000200ULL, | ||
388 | - /* eieio & sync */ | ||
389 | - PPC_MEM_SYNC = 0x0000000000000400ULL, | ||
390 | - /* PowerPC 6xx TLB management instructions */ | ||
391 | - PPC_6xx_TLB = 0x0000000000000800ULL, | ||
392 | - /* Altivec support */ | ||
393 | - PPC_ALTIVEC = 0x0000000000001000ULL, | ||
394 | - /* Time base support */ | ||
395 | - PPC_TB = 0x0000000000002000ULL, | ||
396 | - /* Embedded PowerPC dedicated instructions */ | ||
397 | - PPC_EMB_COMMON = 0x0000000000004000ULL, | ||
398 | - /* PowerPC 40x exception model */ | ||
399 | - PPC_40x_EXCP = 0x0000000000008000ULL, | ||
400 | - /* PowerPC 40x specific instructions */ | ||
401 | - PPC_40x_SPEC = 0x0000000000010000ULL, | ||
402 | - /* PowerPC 405 Mac instructions */ | ||
403 | - PPC_405_MAC = 0x0000000000020000ULL, | ||
404 | - /* PowerPC 440 specific instructions */ | ||
405 | - PPC_440_SPEC = 0x0000000000040000ULL, | ||
406 | - /* Specific extensions */ | ||
407 | - /* Power-to-PowerPC bridge (601) */ | ||
408 | - PPC_POWER_BR = 0x0000000000080000ULL, | ||
409 | - /* PowerPC 602 specific */ | ||
410 | - PPC_602_SPEC = 0x0000000000100000ULL, | ||
411 | - /* Deprecated instructions */ | ||
412 | - /* Original POWER instruction set */ | ||
413 | - PPC_POWER = 0x0000000000200000ULL, | ||
414 | - /* POWER2 instruction set extension */ | ||
415 | - PPC_POWER2 = 0x0000000000400000ULL, | ||
416 | - /* Power RTC support */ | ||
417 | - PPC_POWER_RTC = 0x0000000000800000ULL, | ||
418 | - /* 64 bits PowerPC instructions */ | ||
419 | - /* 64 bits PowerPC instruction set */ | ||
420 | - PPC_64B = 0x0000000001000000ULL, | ||
421 | - /* 64 bits hypervisor extensions */ | ||
422 | - PPC_64H = 0x0000000002000000ULL, | ||
423 | - /* 64 bits PowerPC "bridge" features */ | ||
424 | - PPC_64_BRIDGE = 0x0000000004000000ULL, | ||
425 | - /* BookE (embedded) PowerPC specification */ | ||
426 | - PPC_BOOKE = 0x0000000008000000ULL, | ||
427 | - /* eieio */ | ||
428 | - PPC_MEM_EIEIO = 0x0000000010000000ULL, | ||
429 | - /* e500 vector instructions */ | ||
430 | - PPC_E500_VECTOR = 0x0000000020000000ULL, | ||
431 | - /* PowerPC 4xx dedicated instructions */ | ||
432 | - PPC_4xx_COMMON = 0x0000000040000000ULL, | ||
433 | - /* PowerPC 2.03 specification extensions */ | ||
434 | - PPC_203 = 0x0000000080000000ULL, | ||
435 | - /* PowerPC 2.03 SPE extension */ | ||
436 | - PPC_SPE = 0x0000000100000000ULL, | ||
437 | - /* PowerPC 2.03 SPE floating-point extension */ | ||
438 | - PPC_SPEFPU = 0x0000000200000000ULL, | ||
439 | - /* SLB management */ | ||
440 | - PPC_SLBI = 0x0000000400000000ULL, | ||
441 | - /* PowerPC 40x ibct instructions */ | ||
442 | - PPC_40x_ICBT = 0x0000000800000000ULL, | ||
443 | -}; | ||
444 | - | ||
445 | -/* CPU run-time flags (MMU and exception model) */ | 120 | +/* Exception model */ |
446 | enum { | 121 | enum { |
447 | - /* MMU model */ | ||
448 | - PPC_FLAGS_MMU_MASK = 0x000000FF, | ||
449 | - /* Standard 32 bits PowerPC MMU */ | ||
450 | - PPC_FLAGS_MMU_32B = 0x00000000, | ||
451 | - /* Standard 64 bits PowerPC MMU */ | ||
452 | - PPC_FLAGS_MMU_64B = 0x00000001, | ||
453 | - /* PowerPC 601 MMU */ | ||
454 | - PPC_FLAGS_MMU_601 = 0x00000002, | ||
455 | - /* PowerPC 6xx MMU with software TLB */ | ||
456 | - PPC_FLAGS_MMU_SOFT_6xx = 0x00000003, | ||
457 | - /* PowerPC 4xx MMU with software TLB */ | ||
458 | - PPC_FLAGS_MMU_SOFT_4xx = 0x00000004, | ||
459 | - /* PowerPC 403 MMU */ | ||
460 | - PPC_FLAGS_MMU_403 = 0x00000005, | ||
461 | - /* BookE FSL MMU model */ | ||
462 | - PPC_FLAGS_MMU_BOOKE_FSL = 0x00000006, | ||
463 | - /* BookE MMU model */ | ||
464 | - PPC_FLAGS_MMU_BOOKE = 0x00000007, | ||
465 | - /* 64 bits "bridge" PowerPC MMU */ | ||
466 | - PPC_FLAGS_MMU_64BRIDGE = 0x00000008, | ||
467 | - /* PowerPC 401 MMU (real mode only) */ | ||
468 | - PPC_FLAGS_MMU_401 = 0x00000009, | ||
469 | - /* Exception model */ | ||
470 | - PPC_FLAGS_EXCP_MASK = 0x0000FF00, | 122 | + POWERPC_EXCP_UNKNOWN = 0, |
471 | /* Standard PowerPC exception model */ | 123 | /* Standard PowerPC exception model */ |
472 | - PPC_FLAGS_EXCP_STD = 0x00000000, | 124 | + POWERPC_EXCP_STD, |
473 | /* PowerPC 40x exception model */ | 125 | /* PowerPC 40x exception model */ |
474 | - PPC_FLAGS_EXCP_40x = 0x00000100, | 126 | + POWERPC_EXCP_40x, |
475 | /* PowerPC 601 exception model */ | 127 | /* PowerPC 601 exception model */ |
476 | - PPC_FLAGS_EXCP_601 = 0x00000200, | 128 | + POWERPC_EXCP_601, |
477 | /* PowerPC 602 exception model */ | 129 | /* PowerPC 602 exception model */ |
478 | - PPC_FLAGS_EXCP_602 = 0x00000300, | 130 | + POWERPC_EXCP_602, |
479 | /* PowerPC 603 exception model */ | 131 | /* PowerPC 603 exception model */ |
480 | - PPC_FLAGS_EXCP_603 = 0x00000400, | 132 | + POWERPC_EXCP_603, |
133 | + /* PowerPC 603e exception model */ | ||
134 | + POWERPC_EXCP_603E, | ||
135 | + /* PowerPC G2 exception model */ | ||
136 | + POWERPC_EXCP_G2, | ||
481 | /* PowerPC 604 exception model */ | 137 | /* PowerPC 604 exception model */ |
482 | - PPC_FLAGS_EXCP_604 = 0x00000500, | 138 | + POWERPC_EXCP_604, |
483 | /* PowerPC 7x0 exception model */ | 139 | /* PowerPC 7x0 exception model */ |
484 | - PPC_FLAGS_EXCP_7x0 = 0x00000600, | 140 | + POWERPC_EXCP_7x0, |
485 | /* PowerPC 7x5 exception model */ | 141 | /* PowerPC 7x5 exception model */ |
486 | - PPC_FLAGS_EXCP_7x5 = 0x00000700, | 142 | + POWERPC_EXCP_7x5, |
487 | /* PowerPC 74xx exception model */ | 143 | /* PowerPC 74xx exception model */ |
488 | - PPC_FLAGS_EXCP_74xx = 0x00000800, | 144 | + POWERPC_EXCP_74xx, |
489 | /* PowerPC 970 exception model */ | 145 | /* PowerPC 970 exception model */ |
490 | - PPC_FLAGS_EXCP_970 = 0x00000900, | 146 | + POWERPC_EXCP_970, |
491 | /* BookE exception model */ | 147 | /* BookE exception model */ |
492 | - PPC_FLAGS_EXCP_BOOKE = 0x00000A00, | ||
493 | - /* Input pins model */ | ||
494 | - PPC_FLAGS_INPUT_MASK = 0x000F0000, | 148 | + POWERPC_EXCP_BOOKE, |
149 | +}; | ||
150 | + | ||
151 | +/*****************************************************************************/ | ||
152 | +/* Input pins model */ | ||
153 | +enum { | ||
154 | + PPC_FLAGS_INPUT_UNKNOWN = 0, | ||
495 | /* PowerPC 6xx bus */ | 155 | /* PowerPC 6xx bus */ |
496 | - PPC_FLAGS_INPUT_6xx = 0x00000000, | 156 | + PPC_FLAGS_INPUT_6xx, |
497 | /* BookE bus */ | 157 | /* BookE bus */ |
498 | - PPC_FLAGS_INPUT_BookE = 0x00010000, | ||
499 | - /* PowerPC 4xx bus */ | ||
500 | - PPC_FLAGS_INPUT_40x = 0x00020000, | 158 | + PPC_FLAGS_INPUT_BookE, |
159 | + /* PowerPC 405 bus */ | ||
160 | + PPC_FLAGS_INPUT_405, | ||
501 | /* PowerPC 970 bus */ | 161 | /* PowerPC 970 bus */ |
502 | - PPC_FLAGS_INPUT_970 = 0x00030000, | 162 | + PPC_FLAGS_INPUT_970, |
163 | + /* PowerPC 401 bus */ | ||
164 | + PPC_FLAGS_INPUT_401, | ||
503 | }; | 165 | }; |
504 | 166 | ||
505 | -#define PPC_MMU(env) (env->flags & PPC_FLAGS_MMU_MASK) | ||
506 | -#define PPC_EXCP(env) (env->flags & PPC_FLAGS_EXCP_MASK) | ||
507 | -#define PPC_INPUT(env) (env->flags & PPC_FLAGS_INPUT_MASK) | 167 | +#define PPC_INPUT(env) (env->bus_model) |
508 | 168 | ||
509 | -/*****************************************************************************/ | ||
510 | -/* Supported instruction set definitions */ | ||
511 | -/* This generates an empty opcode table... */ | ||
512 | -#define PPC_INSNS_TODO (PPC_NONE) | ||
513 | -#define PPC_FLAGS_TODO (0x00000000) | ||
514 | - | ||
515 | -/* PowerPC 40x instruction set */ | ||
516 | -#define PPC_INSNS_EMB (PPC_INSNS_BASE | PPC_EMB_COMMON) | ||
517 | -/* PowerPC 401 */ | ||
518 | -#define PPC_INSNS_401 (PPC_INSNS_EMB | PPC_MEM_SYNC | PPC_MEM_EIEIO | \ | ||
519 | - PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT) | ||
520 | -#define PPC_FLAGS_401 (PPC_FLAGS_MMU_401 | PPC_FLAGS_EXCP_40x | \ | ||
521 | - PPC_FLAGS_INPUT_40x) | ||
522 | -/* PowerPC 403 */ | ||
523 | -#define PPC_INSNS_403 (PPC_INSNS_EMB | PPC_MEM_SYNC | PPC_MEM_EIEIO | \ | ||
524 | - PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | PPC_4xx_COMMON | \ | ||
525 | - PPC_40x_EXCP | PPC_40x_SPEC | PPC_40x_ICBT) | ||
526 | -#define PPC_FLAGS_403 (PPC_FLAGS_MMU_403 | PPC_FLAGS_EXCP_40x | \ | ||
527 | - PPC_FLAGS_INPUT_40x) | ||
528 | -/* PowerPC 405 */ | ||
529 | -#define PPC_INSNS_405 (PPC_INSNS_EMB | PPC_MEM_SYNC | PPC_MEM_EIEIO | \ | ||
530 | - PPC_CACHE_OPT | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \ | ||
531 | - PPC_TB | PPC_4xx_COMMON | PPC_40x_SPEC | \ | ||
532 | - PPC_40x_ICBT | PPC_40x_EXCP | PPC_405_MAC) | ||
533 | -#define PPC_FLAGS_405 (PPC_FLAGS_MMU_SOFT_4xx | PPC_FLAGS_EXCP_40x | \ | ||
534 | - PPC_FLAGS_INPUT_40x) | ||
535 | -/* PowerPC 440 */ | ||
536 | -#define PPC_INSNS_440 (PPC_INSNS_EMB | PPC_CACHE_OPT | PPC_BOOKE | \ | ||
537 | - PPC_MEM_TLBSYNC | PPC_4xx_COMMON | PPC_405_MAC | \ | ||
538 | - PPC_440_SPEC) | ||
539 | -#define PPC_FLAGS_440 (PPC_FLAGS_MMU_BOOKE | PPC_FLAGS_EXCP_BOOKE | \ | ||
540 | - PPC_FLAGS_INPUT_BookE) | ||
541 | -/* Generic BookE PowerPC */ | ||
542 | -#define PPC_INSNS_BOOKE (PPC_INSNS_EMB | PPC_MEM_TLBSYNC | PPC_BOOKE | \ | ||
543 | - PPC_MEM_EIEIO | PPC_FLOAT | PPC_FLOAT_OPT | \ | ||
544 | - PPC_CACHE_OPT) | ||
545 | -#define PPC_FLAGS_BOOKE (PPC_FLAGS_MMU_BOOKE | PPC_FLAGS_EXCP_BOOKE | \ | ||
546 | - PPC_FLAGS_INPUT_BookE) | ||
547 | -/* e500 core */ | ||
548 | -#define PPC_INSNS_E500 (PPC_INSNS_EMB | PPC_MEM_TLBSYNC | PPC_BOOKE | \ | ||
549 | - PPC_MEM_EIEIO | PPC_CACHE_OPT | PPC_E500_VECTOR) | ||
550 | -#define PPC_FLAGS_E500 (PPC_FLAGS_MMU_SOFT_4xx | PPC_FLAGS_EXCP_40x | \ | ||
551 | - PPC_FLAGS_INPUT_BookE) | ||
552 | -/* Non-embedded PowerPC */ | ||
553 | -#define PPC_INSNS_COMMON (PPC_INSNS_BASE | PPC_FLOAT | PPC_MEM_SYNC | \ | ||
554 | - PPC_MEM_EIEIO | PPC_SEGMENT | PPC_MEM_TLBIE) | ||
555 | -/* PowerPC 601 */ | ||
556 | -#define PPC_INSNS_601 (PPC_INSNS_COMMON | PPC_EXTERN | PPC_POWER_BR) | ||
557 | -#define PPC_FLAGS_601 (PPC_FLAGS_MMU_601 | PPC_FLAGS_EXCP_601 | \ | ||
558 | - PPC_FLAGS_INPUT_6xx) | ||
559 | -/* PowerPC 602 */ | ||
560 | -#define PPC_INSNS_602 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_6xx_TLB | \ | ||
561 | - PPC_MEM_TLBSYNC | PPC_TB | PPC_602_SPEC) | ||
562 | -#define PPC_FLAGS_602 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_602 | \ | ||
563 | - PPC_FLAGS_INPUT_6xx) | ||
564 | -/* PowerPC 603 */ | ||
565 | -#define PPC_INSNS_603 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_6xx_TLB | \ | ||
566 | - PPC_MEM_TLBSYNC | PPC_EXTERN | PPC_TB) | ||
567 | -#define PPC_FLAGS_603 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_603 | \ | ||
568 | - PPC_FLAGS_INPUT_6xx) | ||
569 | -/* PowerPC G2 */ | ||
570 | -#define PPC_INSNS_G2 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_6xx_TLB | \ | ||
571 | - PPC_MEM_TLBSYNC | PPC_EXTERN | PPC_TB) | ||
572 | -#define PPC_FLAGS_G2 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_603 | \ | ||
573 | - PPC_FLAGS_INPUT_6xx) | ||
574 | -/* PowerPC 604 */ | ||
575 | -#define PPC_INSNS_604 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_EXTERN | \ | ||
576 | - PPC_MEM_TLBSYNC | PPC_TB) | ||
577 | -#define PPC_FLAGS_604 (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_604 | \ | ||
578 | - PPC_FLAGS_INPUT_6xx) | ||
579 | -/* PowerPC 740/750 (aka G3) */ | ||
580 | -#define PPC_INSNS_7x0 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_EXTERN | \ | ||
581 | - PPC_MEM_TLBSYNC | PPC_TB) | ||
582 | -#define PPC_FLAGS_7x0 (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_7x0 | \ | ||
583 | - PPC_FLAGS_INPUT_6xx) | ||
584 | -/* PowerPC 745/755 */ | ||
585 | -#define PPC_INSNS_7x5 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_EXTERN | \ | ||
586 | - PPC_MEM_TLBSYNC | PPC_TB | PPC_6xx_TLB) | ||
587 | -#define PPC_FLAGS_7x5 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_7x5 | \ | ||
588 | - PPC_FLAGS_INPUT_6xx) | ||
589 | -/* PowerPC 74xx (aka G4) */ | ||
590 | -#define PPC_INSNS_74xx (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_ALTIVEC | \ | ||
591 | - PPC_MEM_TLBSYNC | PPC_TB) | ||
592 | -#define PPC_FLAGS_74xx (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_74xx | \ | ||
593 | - PPC_FLAGS_INPUT_6xx) | ||
594 | -/* PowerPC 970 (aka G5) */ | ||
595 | -#define PPC_INSNS_970 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_FLOAT_OPT | \ | ||
596 | - PPC_ALTIVEC | PPC_MEM_TLBSYNC | PPC_TB | \ | ||
597 | - PPC_64B | PPC_64_BRIDGE | PPC_SLBI) | ||
598 | -#define PPC_FLAGS_970 (PPC_FLAGS_MMU_64BRIDGE | PPC_FLAGS_EXCP_970 | \ | ||
599 | - PPC_FLAGS_INPUT_970) | ||
600 | - | ||
601 | -/* Default PowerPC will be 604/970 */ | ||
602 | -#define PPC_INSNS_PPC32 PPC_INSNS_604 | ||
603 | -#define PPC_FLAGS_PPC32 PPC_FLAGS_604 | ||
604 | -#define PPC_INSNS_PPC64 PPC_INSNS_970 | ||
605 | -#define PPC_FLAGS_PPC64 PPC_FLAGS_970 | ||
606 | -#define PPC_INSNS_DEFAULT PPC_INSNS_604 | ||
607 | -#define PPC_FLAGS_DEFAULT PPC_FLAGS_604 | ||
608 | typedef struct ppc_def_t ppc_def_t; | 169 | typedef struct ppc_def_t ppc_def_t; |
170 | +typedef struct opc_handler_t opc_handler_t; | ||
609 | 171 | ||
610 | /*****************************************************************************/ | 172 | /*****************************************************************************/ |
611 | /* Types used to describe some PowerPC registers */ | 173 | /* Types used to describe some PowerPC registers */ |
612 | typedef struct CPUPPCState CPUPPCState; | 174 | typedef struct CPUPPCState CPUPPCState; |
613 | -typedef struct opc_handler_t opc_handler_t; | ||
614 | typedef struct ppc_tb_t ppc_tb_t; | 175 | typedef struct ppc_tb_t ppc_tb_t; |
615 | typedef struct ppc_spr_t ppc_spr_t; | 176 | typedef struct ppc_spr_t ppc_spr_t; |
616 | typedef struct ppc_dcr_t ppc_dcr_t; | 177 | typedef struct ppc_dcr_t ppc_dcr_t; |
@@ -832,7 +393,11 @@ struct CPUPPCState { | @@ -832,7 +393,11 @@ struct CPUPPCState { | ||
832 | 393 | ||
833 | /* Those resources are used during exception processing */ | 394 | /* Those resources are used during exception processing */ |
834 | /* CPU model definition */ | 395 | /* CPU model definition */ |
835 | - uint64_t msr_mask; | 396 | + target_ulong msr_mask; |
397 | + uint8_t mmu_model; | ||
398 | + uint8_t excp_model; | ||
399 | + uint8_t bus_model; | ||
400 | + uint8_t pad; | ||
836 | uint32_t flags; | 401 | uint32_t flags; |
837 | 402 | ||
838 | int exception_index; | 403 | int exception_index; |
@@ -985,7 +550,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | @@ -985,7 +550,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | ||
985 | #define SPR_LR (0x008) | 550 | #define SPR_LR (0x008) |
986 | #define SPR_CTR (0x009) | 551 | #define SPR_CTR (0x009) |
987 | #define SPR_DSISR (0x012) | 552 | #define SPR_DSISR (0x012) |
988 | -#define SPR_DAR (0x013) | 553 | +#define SPR_DAR (0x013) /* DAE for PowerPC 601 */ |
989 | #define SPR_601_RTCU (0x014) | 554 | #define SPR_601_RTCU (0x014) |
990 | #define SPR_601_RTCL (0x015) | 555 | #define SPR_601_RTCL (0x015) |
991 | #define SPR_DECR (0x016) | 556 | #define SPR_DECR (0x016) |
@@ -1203,6 +768,8 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | @@ -1203,6 +768,8 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | ||
1203 | #define SPR_440_ITV1 (0x375) | 768 | #define SPR_440_ITV1 (0x375) |
1204 | #define SPR_440_ITV2 (0x376) | 769 | #define SPR_440_ITV2 (0x376) |
1205 | #define SPR_440_ITV3 (0x377) | 770 | #define SPR_440_ITV3 (0x377) |
771 | +#define SPR_440_CCR1 (0x378) | ||
772 | +#define SPR_DCRIPR (0x37B) | ||
1206 | #define SPR_PPR (0x380) | 773 | #define SPR_PPR (0x380) |
1207 | #define SPR_440_DNV0 (0x390) | 774 | #define SPR_440_DNV0 (0x390) |
1208 | #define SPR_440_DNV1 (0x391) | 775 | #define SPR_440_DNV1 (0x391) |
@@ -1219,38 +786,63 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | @@ -1219,38 +786,63 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | ||
1219 | #define SPR_BOOKE_DCDBTRH (0x39D) | 786 | #define SPR_BOOKE_DCDBTRH (0x39D) |
1220 | #define SPR_BOOKE_ICDBTRL (0x39E) | 787 | #define SPR_BOOKE_ICDBTRL (0x39E) |
1221 | #define SPR_BOOKE_ICDBTRH (0x39F) | 788 | #define SPR_BOOKE_ICDBTRH (0x39F) |
789 | +#define SPR_UMMCR2 (0x3A0) | ||
790 | +#define SPR_UPMC5 (0x3A1) | ||
791 | +#define SPR_UPMC6 (0x3A2) | ||
792 | +#define SPR_UBAMR (0x3A7) | ||
1222 | #define SPR_UMMCR0 (0x3A8) | 793 | #define SPR_UMMCR0 (0x3A8) |
1223 | #define SPR_UPMC1 (0x3A9) | 794 | #define SPR_UPMC1 (0x3A9) |
1224 | #define SPR_UPMC2 (0x3AA) | 795 | #define SPR_UPMC2 (0x3AA) |
1225 | -#define SPR_USIA (0x3AB) | 796 | +#define SPR_USIAR (0x3AB) |
1226 | #define SPR_UMMCR1 (0x3AC) | 797 | #define SPR_UMMCR1 (0x3AC) |
1227 | #define SPR_UPMC3 (0x3AD) | 798 | #define SPR_UPMC3 (0x3AD) |
1228 | #define SPR_UPMC4 (0x3AE) | 799 | #define SPR_UPMC4 (0x3AE) |
1229 | #define SPR_USDA (0x3AF) | 800 | #define SPR_USDA (0x3AF) |
1230 | #define SPR_40x_ZPR (0x3B0) | 801 | #define SPR_40x_ZPR (0x3B0) |
1231 | #define SPR_BOOKE_MAS7 (0x3B0) | 802 | #define SPR_BOOKE_MAS7 (0x3B0) |
803 | +#define SPR_620_PMR0 (0x3B0) | ||
804 | +#define SPR_MMCR2 (0x3B0) | ||
805 | +#define SPR_PMC5 (0x3B1) | ||
1232 | #define SPR_40x_PID (0x3B1) | 806 | #define SPR_40x_PID (0x3B1) |
807 | +#define SPR_620_PMR1 (0x3B1) | ||
808 | +#define SPR_PMC6 (0x3B2) | ||
1233 | #define SPR_440_MMUCR (0x3B2) | 809 | #define SPR_440_MMUCR (0x3B2) |
810 | +#define SPR_620_PMR2 (0x3B2) | ||
1234 | #define SPR_4xx_CCR0 (0x3B3) | 811 | #define SPR_4xx_CCR0 (0x3B3) |
1235 | #define SPR_BOOKE_EPLC (0x3B3) | 812 | #define SPR_BOOKE_EPLC (0x3B3) |
813 | +#define SPR_620_PMR3 (0x3B3) | ||
1236 | #define SPR_405_IAC3 (0x3B4) | 814 | #define SPR_405_IAC3 (0x3B4) |
1237 | #define SPR_BOOKE_EPSC (0x3B4) | 815 | #define SPR_BOOKE_EPSC (0x3B4) |
816 | +#define SPR_620_PMR4 (0x3B4) | ||
1238 | #define SPR_405_IAC4 (0x3B5) | 817 | #define SPR_405_IAC4 (0x3B5) |
818 | +#define SPR_620_PMR5 (0x3B5) | ||
1239 | #define SPR_405_DVC1 (0x3B6) | 819 | #define SPR_405_DVC1 (0x3B6) |
820 | +#define SPR_620_PMR6 (0x3B6) | ||
1240 | #define SPR_405_DVC2 (0x3B7) | 821 | #define SPR_405_DVC2 (0x3B7) |
822 | +#define SPR_620_PMR7 (0x3B7) | ||
823 | +#define SPR_BAMR (0x3B7) | ||
1241 | #define SPR_MMCR0 (0x3B8) | 824 | #define SPR_MMCR0 (0x3B8) |
825 | +#define SPR_620_PMR8 (0x3B8) | ||
1242 | #define SPR_PMC1 (0x3B9) | 826 | #define SPR_PMC1 (0x3B9) |
1243 | #define SPR_40x_SGR (0x3B9) | 827 | #define SPR_40x_SGR (0x3B9) |
828 | +#define SPR_620_PMR9 (0x3B9) | ||
1244 | #define SPR_PMC2 (0x3BA) | 829 | #define SPR_PMC2 (0x3BA) |
1245 | #define SPR_40x_DCWR (0x3BA) | 830 | #define SPR_40x_DCWR (0x3BA) |
1246 | -#define SPR_SIA (0x3BB) | 831 | +#define SPR_620_PMRA (0x3BA) |
832 | +#define SPR_SIAR (0x3BB) | ||
1247 | #define SPR_405_SLER (0x3BB) | 833 | #define SPR_405_SLER (0x3BB) |
834 | +#define SPR_620_PMRB (0x3BB) | ||
1248 | #define SPR_MMCR1 (0x3BC) | 835 | #define SPR_MMCR1 (0x3BC) |
1249 | #define SPR_405_SU0R (0x3BC) | 836 | #define SPR_405_SU0R (0x3BC) |
837 | +#define SPR_620_PMRC (0x3BC) | ||
838 | +#define SPR_401_SKR (0x3BC) | ||
1250 | #define SPR_PMC3 (0x3BD) | 839 | #define SPR_PMC3 (0x3BD) |
1251 | #define SPR_405_DBCR1 (0x3BD) | 840 | #define SPR_405_DBCR1 (0x3BD) |
841 | +#define SPR_620_PMRD (0x3BD) | ||
1252 | #define SPR_PMC4 (0x3BE) | 842 | #define SPR_PMC4 (0x3BE) |
843 | +#define SPR_620_PMRE (0x3BE) | ||
1253 | #define SPR_SDA (0x3BF) | 844 | #define SPR_SDA (0x3BF) |
845 | +#define SPR_620_PMRF (0x3BF) | ||
1254 | #define SPR_403_VTBL (0x3CC) | 846 | #define SPR_403_VTBL (0x3CC) |
1255 | #define SPR_403_VTBU (0x3CD) | 847 | #define SPR_403_VTBU (0x3CD) |
1256 | #define SPR_DMISS (0x3D0) | 848 | #define SPR_DMISS (0x3D0) |
@@ -1258,18 +850,23 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | @@ -1258,18 +850,23 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | ||
1258 | #define SPR_HASH1 (0x3D2) | 850 | #define SPR_HASH1 (0x3D2) |
1259 | #define SPR_HASH2 (0x3D3) | 851 | #define SPR_HASH2 (0x3D3) |
1260 | #define SPR_BOOKE_ICDBDR (0x3D3) | 852 | #define SPR_BOOKE_ICDBDR (0x3D3) |
853 | +#define SPR_TLBMISS (0x3D4) | ||
1261 | #define SPR_IMISS (0x3D4) | 854 | #define SPR_IMISS (0x3D4) |
1262 | #define SPR_40x_ESR (0x3D4) | 855 | #define SPR_40x_ESR (0x3D4) |
856 | +#define SPR_PTEHI (0x3D5) | ||
1263 | #define SPR_ICMP (0x3D5) | 857 | #define SPR_ICMP (0x3D5) |
1264 | #define SPR_40x_DEAR (0x3D5) | 858 | #define SPR_40x_DEAR (0x3D5) |
859 | +#define SPR_PTELO (0x3D6) | ||
1265 | #define SPR_RPA (0x3D6) | 860 | #define SPR_RPA (0x3D6) |
1266 | #define SPR_40x_EVPR (0x3D6) | 861 | #define SPR_40x_EVPR (0x3D6) |
862 | +#define SPR_L3PM (0x3D7) | ||
1267 | #define SPR_403_CDBCR (0x3D7) | 863 | #define SPR_403_CDBCR (0x3D7) |
864 | +#define SPR_L3OHCR (0x3D8) | ||
1268 | #define SPR_TCR (0x3D8) | 865 | #define SPR_TCR (0x3D8) |
1269 | #define SPR_40x_TSR (0x3D8) | 866 | #define SPR_40x_TSR (0x3D8) |
1270 | #define SPR_IBR (0x3DA) | 867 | #define SPR_IBR (0x3DA) |
1271 | #define SPR_40x_TCR (0x3DA) | 868 | #define SPR_40x_TCR (0x3DA) |
1272 | -#define SPR_ESASR (0x3DB) | 869 | +#define SPR_ESASRR (0x3DB) |
1273 | #define SPR_40x_PIT (0x3DB) | 870 | #define SPR_40x_PIT (0x3DB) |
1274 | #define SPR_403_TBL (0x3DC) | 871 | #define SPR_403_TBL (0x3DC) |
1275 | #define SPR_403_TBU (0x3DD) | 872 | #define SPR_403_TBU (0x3DD) |
@@ -1277,6 +874,10 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | @@ -1277,6 +874,10 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | ||
1277 | #define SPR_40x_SRR2 (0x3DE) | 874 | #define SPR_40x_SRR2 (0x3DE) |
1278 | #define SPR_SER (0x3DF) | 875 | #define SPR_SER (0x3DF) |
1279 | #define SPR_40x_SRR3 (0x3DF) | 876 | #define SPR_40x_SRR3 (0x3DF) |
877 | +#define SPR_L3ITCR0 (0x3E8) | ||
878 | +#define SPR_L3ITCR1 (0x3E9) | ||
879 | +#define SPR_L3ITCR2 (0x3EA) | ||
880 | +#define SPR_L3ITCR3 (0x3EB) | ||
1280 | #define SPR_HID0 (0x3F0) | 881 | #define SPR_HID0 (0x3F0) |
1281 | #define SPR_40x_DBSR (0x3F0) | 882 | #define SPR_40x_DBSR (0x3F0) |
1282 | #define SPR_HID1 (0x3F1) | 883 | #define SPR_HID1 (0x3F1) |
@@ -1284,9 +885,11 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | @@ -1284,9 +885,11 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | ||
1284 | #define SPR_40x_DBCR0 (0x3F2) | 885 | #define SPR_40x_DBCR0 (0x3F2) |
1285 | #define SPR_601_HID2 (0x3F2) | 886 | #define SPR_601_HID2 (0x3F2) |
1286 | #define SPR_E500_L1CSR0 (0x3F2) | 887 | #define SPR_E500_L1CSR0 (0x3F2) |
888 | +#define SPR_ICTRL (0x3F3) | ||
1287 | #define SPR_HID2 (0x3F3) | 889 | #define SPR_HID2 (0x3F3) |
1288 | #define SPR_E500_L1CSR1 (0x3F3) | 890 | #define SPR_E500_L1CSR1 (0x3F3) |
1289 | #define SPR_440_DBDR (0x3F3) | 891 | #define SPR_440_DBDR (0x3F3) |
892 | +#define SPR_LDSTDB (0x3F4) | ||
1290 | #define SPR_40x_IAC1 (0x3F4) | 893 | #define SPR_40x_IAC1 (0x3F4) |
1291 | #define SPR_BOOKE_MMUCSR0 (0x3F4) | 894 | #define SPR_BOOKE_MMUCSR0 (0x3F4) |
1292 | #define SPR_DABR (0x3F5) | 895 | #define SPR_DABR (0x3F5) |
@@ -1295,12 +898,18 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | @@ -1295,12 +898,18 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | ||
1295 | #define SPR_40x_IAC2 (0x3F5) | 898 | #define SPR_40x_IAC2 (0x3F5) |
1296 | #define SPR_601_HID5 (0x3F5) | 899 | #define SPR_601_HID5 (0x3F5) |
1297 | #define SPR_40x_DAC1 (0x3F6) | 900 | #define SPR_40x_DAC1 (0x3F6) |
901 | +#define SPR_MSSCR0 (0x3F6) | ||
902 | +#define SPR_MSSSR0 (0x3F7) | ||
1298 | #define SPR_DABRX (0x3F7) | 903 | #define SPR_DABRX (0x3F7) |
1299 | #define SPR_40x_DAC2 (0x3F7) | 904 | #define SPR_40x_DAC2 (0x3F7) |
1300 | #define SPR_BOOKE_MMUCFG (0x3F7) | 905 | #define SPR_BOOKE_MMUCFG (0x3F7) |
1301 | -#define SPR_L2PM (0x3F8) | 906 | +#define SPR_LDSTCR (0x3F8) |
907 | +#define SPR_L2PMCR (0x3F8) | ||
1302 | #define SPR_750_HID2 (0x3F8) | 908 | #define SPR_750_HID2 (0x3F8) |
909 | +#define SPR_620_HID8 (0x3F8) | ||
1303 | #define SPR_L2CR (0x3F9) | 910 | #define SPR_L2CR (0x3F9) |
911 | +#define SPR_620_HID9 (0x3F9) | ||
912 | +#define SPR_L3CR (0x3FA) | ||
1304 | #define SPR_IABR2 (0x3FA) | 913 | #define SPR_IABR2 (0x3FA) |
1305 | #define SPR_40x_DCCR (0x3FA) | 914 | #define SPR_40x_DCCR (0x3FA) |
1306 | #define SPR_ICTC (0x3FB) | 915 | #define SPR_ICTC (0x3FB) |
@@ -1310,6 +919,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | @@ -1310,6 +919,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | ||
1310 | #define SPR_SP (0x3FD) | 919 | #define SPR_SP (0x3FD) |
1311 | #define SPR_THRM2 (0x3FD) | 920 | #define SPR_THRM2 (0x3FD) |
1312 | #define SPR_403_PBU1 (0x3FD) | 921 | #define SPR_403_PBU1 (0x3FD) |
922 | +#define SPR_604_HID13 (0x3FD) | ||
1313 | #define SPR_LT (0x3FE) | 923 | #define SPR_LT (0x3FE) |
1314 | #define SPR_THRM3 (0x3FE) | 924 | #define SPR_THRM3 (0x3FE) |
1315 | #define SPR_FPECR (0x3FE) | 925 | #define SPR_FPECR (0x3FE) |
@@ -1317,6 +927,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | @@ -1317,6 +927,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | ||
1317 | #define SPR_PIR (0x3FF) | 927 | #define SPR_PIR (0x3FF) |
1318 | #define SPR_403_PBU2 (0x3FF) | 928 | #define SPR_403_PBU2 (0x3FF) |
1319 | #define SPR_601_HID15 (0x3FF) | 929 | #define SPR_601_HID15 (0x3FF) |
930 | +#define SPR_604_HID15 (0x3FF) | ||
1320 | #define SPR_E500_SVR (0x3FF) | 931 | #define SPR_E500_SVR (0x3FF) |
1321 | 932 | ||
1322 | /*****************************************************************************/ | 933 | /*****************************************************************************/ |
@@ -1367,6 +978,11 @@ enum { | @@ -1367,6 +978,11 @@ enum { | ||
1367 | #define EXCP_40x_DEBUG 0x2000 /* Debug exception */ | 978 | #define EXCP_40x_DEBUG 0x2000 /* Debug exception */ |
1368 | /* 405 specific exceptions */ | 979 | /* 405 specific exceptions */ |
1369 | #define EXCP_405_APU 0x0F20 /* APU unavailable exception */ | 980 | #define EXCP_405_APU 0x0F20 /* APU unavailable exception */ |
981 | +/* 440 specific exceptions */ | ||
982 | +#define EXCP_440_CRIT 0x0100 /* Critical interrupt */ | ||
983 | +#define EXCP_440_SPEU 0x1600 /* SPE unavailable exception */ | ||
984 | +#define EXCP_440_SPED 0x1700 /* SPE floating-point data exception */ | ||
985 | +#define EXCP_440_SPER 0x1800 /* SPE floating-point round exception */ | ||
1370 | /* TLB assist exceptions (602/603) */ | 986 | /* TLB assist exceptions (602/603) */ |
1371 | #define EXCP_I_TLBMISS 0x1000 /* Instruction TLB miss */ | 987 | #define EXCP_I_TLBMISS 0x1000 /* Instruction TLB miss */ |
1372 | #define EXCP_DL_TLBMISS 0x1100 /* Data load TLB miss */ | 988 | #define EXCP_DL_TLBMISS 0x1100 /* Data load TLB miss */ |
@@ -1377,7 +993,7 @@ enum { | @@ -1377,7 +993,7 @@ enum { | ||
1377 | /* Altivec related exceptions */ | 993 | /* Altivec related exceptions */ |
1378 | #define EXCP_VPU 0x0F20 /* VPU unavailable exception */ | 994 | #define EXCP_VPU 0x0F20 /* VPU unavailable exception */ |
1379 | /* 601 specific exceptions */ | 995 | /* 601 specific exceptions */ |
1380 | -#define EXCP_601_IO 0x0600 /* IO error exception */ | 996 | +#define EXCP_601_IO 0x0A00 /* IO error exception */ |
1381 | #define EXCP_601_RUNM 0x2000 /* Run mode exception */ | 997 | #define EXCP_601_RUNM 0x2000 /* Run mode exception */ |
1382 | /* 602 specific exceptions */ | 998 | /* 602 specific exceptions */ |
1383 | #define EXCP_602_WATCHDOG 0x1500 /* Watchdog exception */ | 999 | #define EXCP_602_WATCHDOG 0x1500 /* Watchdog exception */ |
@@ -1468,6 +1084,15 @@ enum { | @@ -1468,6 +1084,15 @@ enum { | ||
1468 | }; | 1084 | }; |
1469 | 1085 | ||
1470 | enum { | 1086 | enum { |
1087 | + /* PowerPC 401/403 input pins */ | ||
1088 | + PPC401_INPUT_RESET = 0, | ||
1089 | + PPC401_INPUT_CINT = 1, | ||
1090 | + PPC401_INPUT_INT = 2, | ||
1091 | + PPC401_INPUT_BERR = 3, | ||
1092 | + PPC401_INPUT_HALT = 4, | ||
1093 | +}; | ||
1094 | + | ||
1095 | +enum { | ||
1471 | /* PowerPC 405 input pins */ | 1096 | /* PowerPC 405 input pins */ |
1472 | PPC405_INPUT_RESET_CORE = 0, | 1097 | PPC405_INPUT_RESET_CORE = 0, |
1473 | PPC405_INPUT_RESET_CHIP = 1, | 1098 | PPC405_INPUT_RESET_CHIP = 1, |
@@ -1479,6 +1104,18 @@ enum { | @@ -1479,6 +1104,18 @@ enum { | ||
1479 | }; | 1104 | }; |
1480 | 1105 | ||
1481 | enum { | 1106 | enum { |
1107 | + /* PowerPC 620 (and probably others) input pins */ | ||
1108 | + PPC620_INPUT_HRESET = 0, | ||
1109 | + PPC620_INPUT_SRESET = 1, | ||
1110 | + PPC620_INPUT_CKSTP = 2, | ||
1111 | + PPC620_INPUT_TBEN = 3, | ||
1112 | + PPC620_INPUT_WAKEUP = 4, | ||
1113 | + PPC620_INPUT_MCP = 5, | ||
1114 | + PPC620_INPUT_SMI = 6, | ||
1115 | + PPC620_INPUT_INT = 7, | ||
1116 | +}; | ||
1117 | + | ||
1118 | +enum { | ||
1482 | /* PowerPC 970 input pins */ | 1119 | /* PowerPC 970 input pins */ |
1483 | PPC970_INPUT_HRESET = 0, | 1120 | PPC970_INPUT_HRESET = 0, |
1484 | PPC970_INPUT_SRESET = 1, | 1121 | PPC970_INPUT_SRESET = 1, |
target-ppc/exec.h
@@ -106,6 +106,8 @@ void ppc6xx_tlb_invalidate_virt (CPUState *env, target_ulong eaddr, | @@ -106,6 +106,8 @@ void ppc6xx_tlb_invalidate_virt (CPUState *env, target_ulong eaddr, | ||
106 | void ppc6xx_tlb_store (CPUState *env, target_ulong EPN, int way, int is_code, | 106 | void ppc6xx_tlb_store (CPUState *env, target_ulong EPN, int way, int is_code, |
107 | target_ulong pte0, target_ulong pte1); | 107 | target_ulong pte0, target_ulong pte1); |
108 | void ppc4xx_tlb_invalidate_all (CPUState *env); | 108 | void ppc4xx_tlb_invalidate_all (CPUState *env); |
109 | +void ppc4xx_tlb_invalidate_virt (CPUState *env, target_ulong eaddr, | ||
110 | + uint32_t pid); | ||
109 | 111 | ||
110 | static inline void env_to_regs (void) | 112 | static inline void env_to_regs (void) |
111 | { | 113 | { |
target-ppc/helper.c
@@ -586,8 +586,8 @@ static int find_pte64 (mmu_ctx_t *ctx, int h, int rw) | @@ -586,8 +586,8 @@ static int find_pte64 (mmu_ctx_t *ctx, int h, int rw) | ||
586 | static inline int find_pte (CPUState *env, mmu_ctx_t *ctx, int h, int rw) | 586 | static inline int find_pte (CPUState *env, mmu_ctx_t *ctx, int h, int rw) |
587 | { | 587 | { |
588 | #if defined(TARGET_PPC64) | 588 | #if defined(TARGET_PPC64) |
589 | - if (PPC_MMU(env) == PPC_FLAGS_MMU_64B || | ||
590 | - PPC_MMU(env) == PPC_FLAGS_MMU_64BRIDGE) | 589 | + if (env->mmu_model == POWERPC_MMU_64B || |
590 | + env->mmu_model == POWERPC_MMU_64BRIDGE) | ||
591 | return find_pte64(ctx, h, rw); | 591 | return find_pte64(ctx, h, rw); |
592 | #endif | 592 | #endif |
593 | 593 | ||
@@ -669,7 +669,7 @@ static int get_segment (CPUState *env, mmu_ctx_t *ctx, | @@ -669,7 +669,7 @@ static int get_segment (CPUState *env, mmu_ctx_t *ctx, | ||
669 | int ret, ret2; | 669 | int ret, ret2; |
670 | 670 | ||
671 | #if defined(TARGET_PPC64) | 671 | #if defined(TARGET_PPC64) |
672 | - if (PPC_MMU(env) == PPC_FLAGS_MMU_64B) { | 672 | + if (env->mmu_model == POWERPC_MMU_64B) { |
673 | ret = slb_lookup(env, eaddr, &vsid, &page_mask, &attr); | 673 | ret = slb_lookup(env, eaddr, &vsid, &page_mask, &attr); |
674 | if (ret < 0) | 674 | if (ret < 0) |
675 | return ret; | 675 | return ret; |
@@ -724,8 +724,8 @@ static int get_segment (CPUState *env, mmu_ctx_t *ctx, | @@ -724,8 +724,8 @@ static int get_segment (CPUState *env, mmu_ctx_t *ctx, | ||
724 | hash = (~hash) & vsid_mask; | 724 | hash = (~hash) & vsid_mask; |
725 | ctx->pg_addr[1] = get_pgaddr(sdr, sdr_sh, hash, mask); | 725 | ctx->pg_addr[1] = get_pgaddr(sdr, sdr_sh, hash, mask); |
726 | #if defined(TARGET_PPC64) | 726 | #if defined(TARGET_PPC64) |
727 | - if (PPC_MMU(env) == PPC_FLAGS_MMU_64B || | ||
728 | - PPC_MMU(env) == PPC_FLAGS_MMU_64BRIDGE) { | 727 | + if (env->mmu_model == POWERPC_MMU_64B || |
728 | + env->mmu_model == POWERPC_MMU_64BRIDGE) { | ||
729 | /* Only 5 bits of the page index are used in the AVPN */ | 729 | /* Only 5 bits of the page index are used in the AVPN */ |
730 | ctx->ptem = (vsid << 12) | ((pgidx >> 4) & 0x0F80); | 730 | ctx->ptem = (vsid << 12) | ((pgidx >> 4) & 0x0F80); |
731 | } else | 731 | } else |
@@ -735,7 +735,7 @@ static int get_segment (CPUState *env, mmu_ctx_t *ctx, | @@ -735,7 +735,7 @@ static int get_segment (CPUState *env, mmu_ctx_t *ctx, | ||
735 | } | 735 | } |
736 | /* Initialize real address with an invalid value */ | 736 | /* Initialize real address with an invalid value */ |
737 | ctx->raddr = (target_ulong)-1; | 737 | ctx->raddr = (target_ulong)-1; |
738 | - if (unlikely(PPC_MMU(env) == PPC_FLAGS_MMU_SOFT_6xx)) { | 738 | + if (unlikely(env->mmu_model == POWERPC_MMU_SOFT_6xx)) { |
739 | /* Software TLB search */ | 739 | /* Software TLB search */ |
740 | ret = ppc6xx_tlb_check(env, ctx, eaddr, rw, type); | 740 | ret = ppc6xx_tlb_check(env, ctx, eaddr, rw, type); |
741 | } else { | 741 | } else { |
@@ -865,7 +865,7 @@ int ppcemb_tlb_search (CPUPPCState *env, target_ulong address, uint32_t pid) | @@ -865,7 +865,7 @@ int ppcemb_tlb_search (CPUPPCState *env, target_ulong address, uint32_t pid) | ||
865 | 865 | ||
866 | /* Default return value is no match */ | 866 | /* Default return value is no match */ |
867 | ret = -1; | 867 | ret = -1; |
868 | - for (i = 0; i < 64; i++) { | 868 | + for (i = 0; i < env->nb_tlb; i++) { |
869 | tlb = &env->tlb[i].tlbe; | 869 | tlb = &env->tlb[i].tlbe; |
870 | if (ppcemb_tlb_check(env, tlb, &raddr, address, pid, 0, i) == 0) { | 870 | if (ppcemb_tlb_check(env, tlb, &raddr, address, pid, 0, i) == 0) { |
871 | ret = i; | 871 | ret = i; |
@@ -876,6 +876,26 @@ int ppcemb_tlb_search (CPUPPCState *env, target_ulong address, uint32_t pid) | @@ -876,6 +876,26 @@ int ppcemb_tlb_search (CPUPPCState *env, target_ulong address, uint32_t pid) | ||
876 | return ret; | 876 | return ret; |
877 | } | 877 | } |
878 | 878 | ||
879 | +void ppc4xx_tlb_invalidate_virt (CPUState *env, target_ulong eaddr, | ||
880 | + uint32_t pid) | ||
881 | +{ | ||
882 | + ppcemb_tlb_t *tlb; | ||
883 | + target_phys_addr_t raddr; | ||
884 | + target_ulong page, end; | ||
885 | + int i; | ||
886 | + | ||
887 | + for (i = 0; i < env->nb_tlb; i++) { | ||
888 | + tlb = &env->tlb[i].tlbe; | ||
889 | + if (ppcemb_tlb_check(env, tlb, &raddr, eaddr, pid, 0, i) == 0) { | ||
890 | + end = tlb->EPN + tlb->size; | ||
891 | + for (page = tlb->EPN; page < end; page += TARGET_PAGE_SIZE) | ||
892 | + tlb_flush_page(env, page); | ||
893 | + tlb->prot &= ~PAGE_VALID; | ||
894 | + break; | ||
895 | + } | ||
896 | + } | ||
897 | +} | ||
898 | + | ||
879 | /* Helpers specific to PowerPC 40x implementations */ | 899 | /* Helpers specific to PowerPC 40x implementations */ |
880 | void ppc4xx_tlb_invalidate_all (CPUState *env) | 900 | void ppc4xx_tlb_invalidate_all (CPUState *env) |
881 | { | 901 | { |
@@ -1069,23 +1089,23 @@ static int check_physical (CPUState *env, mmu_ctx_t *ctx, | @@ -1069,23 +1089,23 @@ static int check_physical (CPUState *env, mmu_ctx_t *ctx, | ||
1069 | ctx->raddr = eaddr; | 1089 | ctx->raddr = eaddr; |
1070 | ctx->prot = PAGE_READ; | 1090 | ctx->prot = PAGE_READ; |
1071 | ret = 0; | 1091 | ret = 0; |
1072 | - switch (PPC_MMU(env)) { | ||
1073 | - case PPC_FLAGS_MMU_32B: | ||
1074 | - case PPC_FLAGS_MMU_SOFT_6xx: | ||
1075 | - case PPC_FLAGS_MMU_601: | ||
1076 | - case PPC_FLAGS_MMU_SOFT_4xx: | ||
1077 | - case PPC_FLAGS_MMU_401: | 1092 | + switch (env->mmu_model) { |
1093 | + case POWERPC_MMU_32B: | ||
1094 | + case POWERPC_MMU_SOFT_6xx: | ||
1095 | + case POWERPC_MMU_601: | ||
1096 | + case POWERPC_MMU_SOFT_4xx: | ||
1097 | + case POWERPC_MMU_REAL_4xx: | ||
1078 | ctx->prot |= PAGE_WRITE; | 1098 | ctx->prot |= PAGE_WRITE; |
1079 | break; | 1099 | break; |
1080 | #if defined(TARGET_PPC64) | 1100 | #if defined(TARGET_PPC64) |
1081 | - case PPC_FLAGS_MMU_64B: | ||
1082 | - case PPC_FLAGS_MMU_64BRIDGE: | 1101 | + case POWERPC_MMU_64B: |
1102 | + case POWERPC_MMU_64BRIDGE: | ||
1083 | /* Real address are 60 bits long */ | 1103 | /* Real address are 60 bits long */ |
1084 | - ctx->raddr &= 0x0FFFFFFFFFFFFFFFUL; | 1104 | + ctx->raddr &= 0x0FFFFFFFFFFFFFFFULL; |
1085 | ctx->prot |= PAGE_WRITE; | 1105 | ctx->prot |= PAGE_WRITE; |
1086 | break; | 1106 | break; |
1087 | #endif | 1107 | #endif |
1088 | - case PPC_FLAGS_MMU_403: | 1108 | + case POWERPC_MMU_SOFT_4xx_Z: |
1089 | if (unlikely(msr_pe != 0)) { | 1109 | if (unlikely(msr_pe != 0)) { |
1090 | /* 403 family add some particular protections, | 1110 | /* 403 family add some particular protections, |
1091 | * using PBL/PBU registers for accesses with no translation. | 1111 | * using PBL/PBU registers for accesses with no translation. |
@@ -1108,10 +1128,10 @@ static int check_physical (CPUState *env, mmu_ctx_t *ctx, | @@ -1108,10 +1128,10 @@ static int check_physical (CPUState *env, mmu_ctx_t *ctx, | ||
1108 | ctx->prot |= PAGE_WRITE; | 1128 | ctx->prot |= PAGE_WRITE; |
1109 | } | 1129 | } |
1110 | } | 1130 | } |
1111 | - case PPC_FLAGS_MMU_BOOKE: | 1131 | + case POWERPC_MMU_BOOKE: |
1112 | ctx->prot |= PAGE_WRITE; | 1132 | ctx->prot |= PAGE_WRITE; |
1113 | break; | 1133 | break; |
1114 | - case PPC_FLAGS_MMU_BOOKE_FSL: | 1134 | + case POWERPC_MMU_BOOKE_FSL: |
1115 | /* XXX: TODO */ | 1135 | /* XXX: TODO */ |
1116 | cpu_abort(env, "BookE FSL MMU model not implemented\n"); | 1136 | cpu_abort(env, "BookE FSL MMU model not implemented\n"); |
1117 | break; | 1137 | break; |
@@ -1138,40 +1158,40 @@ int get_physical_address (CPUState *env, mmu_ctx_t *ctx, target_ulong eaddr, | @@ -1138,40 +1158,40 @@ int get_physical_address (CPUState *env, mmu_ctx_t *ctx, target_ulong eaddr, | ||
1138 | ret = check_physical(env, ctx, eaddr, rw); | 1158 | ret = check_physical(env, ctx, eaddr, rw); |
1139 | } else { | 1159 | } else { |
1140 | ret = -1; | 1160 | ret = -1; |
1141 | - switch (PPC_MMU(env)) { | ||
1142 | - case PPC_FLAGS_MMU_32B: | ||
1143 | - case PPC_FLAGS_MMU_SOFT_6xx: | 1161 | + switch (env->mmu_model) { |
1162 | + case POWERPC_MMU_32B: | ||
1163 | + case POWERPC_MMU_SOFT_6xx: | ||
1144 | /* Try to find a BAT */ | 1164 | /* Try to find a BAT */ |
1145 | if (check_BATs) | 1165 | if (check_BATs) |
1146 | ret = get_bat(env, ctx, eaddr, rw, access_type); | 1166 | ret = get_bat(env, ctx, eaddr, rw, access_type); |
1147 | /* No break here */ | 1167 | /* No break here */ |
1148 | #if defined(TARGET_PPC64) | 1168 | #if defined(TARGET_PPC64) |
1149 | - case PPC_FLAGS_MMU_64B: | ||
1150 | - case PPC_FLAGS_MMU_64BRIDGE: | 1169 | + case POWERPC_MMU_64B: |
1170 | + case POWERPC_MMU_64BRIDGE: | ||
1151 | #endif | 1171 | #endif |
1152 | if (ret < 0) { | 1172 | if (ret < 0) { |
1153 | /* We didn't match any BAT entry or don't have BATs */ | 1173 | /* We didn't match any BAT entry or don't have BATs */ |
1154 | ret = get_segment(env, ctx, eaddr, rw, access_type); | 1174 | ret = get_segment(env, ctx, eaddr, rw, access_type); |
1155 | } | 1175 | } |
1156 | break; | 1176 | break; |
1157 | - case PPC_FLAGS_MMU_SOFT_4xx: | ||
1158 | - case PPC_FLAGS_MMU_403: | 1177 | + case POWERPC_MMU_SOFT_4xx: |
1178 | + case POWERPC_MMU_SOFT_4xx_Z: | ||
1159 | ret = mmu40x_get_physical_address(env, ctx, eaddr, | 1179 | ret = mmu40x_get_physical_address(env, ctx, eaddr, |
1160 | rw, access_type); | 1180 | rw, access_type); |
1161 | break; | 1181 | break; |
1162 | - case PPC_FLAGS_MMU_601: | 1182 | + case POWERPC_MMU_601: |
1163 | /* XXX: TODO */ | 1183 | /* XXX: TODO */ |
1164 | cpu_abort(env, "601 MMU model not implemented\n"); | 1184 | cpu_abort(env, "601 MMU model not implemented\n"); |
1165 | return -1; | 1185 | return -1; |
1166 | - case PPC_FLAGS_MMU_BOOKE: | 1186 | + case POWERPC_MMU_BOOKE: |
1167 | ret = mmubooke_get_physical_address(env, ctx, eaddr, | 1187 | ret = mmubooke_get_physical_address(env, ctx, eaddr, |
1168 | rw, access_type); | 1188 | rw, access_type); |
1169 | break; | 1189 | break; |
1170 | - case PPC_FLAGS_MMU_BOOKE_FSL: | 1190 | + case POWERPC_MMU_BOOKE_FSL: |
1171 | /* XXX: TODO */ | 1191 | /* XXX: TODO */ |
1172 | cpu_abort(env, "BookE FSL MMU model not implemented\n"); | 1192 | cpu_abort(env, "BookE FSL MMU model not implemented\n"); |
1173 | return -1; | 1193 | return -1; |
1174 | - case PPC_FLAGS_MMU_401: | 1194 | + case POWERPC_MMU_REAL_4xx: |
1175 | cpu_abort(env, "PowerPC 401 does not do any translation\n"); | 1195 | cpu_abort(env, "PowerPC 401 does not do any translation\n"); |
1176 | return -1; | 1196 | return -1; |
1177 | default: | 1197 | default: |
@@ -1234,46 +1254,46 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | @@ -1234,46 +1254,46 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | ||
1234 | switch (ret) { | 1254 | switch (ret) { |
1235 | case -1: | 1255 | case -1: |
1236 | /* No matches in page tables or TLB */ | 1256 | /* No matches in page tables or TLB */ |
1237 | - switch (PPC_MMU(env)) { | ||
1238 | - case PPC_FLAGS_MMU_SOFT_6xx: | 1257 | + switch (env->mmu_model) { |
1258 | + case POWERPC_MMU_SOFT_6xx: | ||
1239 | exception = EXCP_I_TLBMISS; | 1259 | exception = EXCP_I_TLBMISS; |
1240 | env->spr[SPR_IMISS] = address; | 1260 | env->spr[SPR_IMISS] = address; |
1241 | env->spr[SPR_ICMP] = 0x80000000 | ctx.ptem; | 1261 | env->spr[SPR_ICMP] = 0x80000000 | ctx.ptem; |
1242 | error_code = 1 << 18; | 1262 | error_code = 1 << 18; |
1243 | goto tlb_miss; | 1263 | goto tlb_miss; |
1244 | - case PPC_FLAGS_MMU_SOFT_4xx: | ||
1245 | - case PPC_FLAGS_MMU_403: | 1264 | + case POWERPC_MMU_SOFT_4xx: |
1265 | + case POWERPC_MMU_SOFT_4xx_Z: | ||
1246 | exception = EXCP_40x_ITLBMISS; | 1266 | exception = EXCP_40x_ITLBMISS; |
1247 | error_code = 0; | 1267 | error_code = 0; |
1248 | env->spr[SPR_40x_DEAR] = address; | 1268 | env->spr[SPR_40x_DEAR] = address; |
1249 | env->spr[SPR_40x_ESR] = 0x00000000; | 1269 | env->spr[SPR_40x_ESR] = 0x00000000; |
1250 | break; | 1270 | break; |
1251 | - case PPC_FLAGS_MMU_32B: | 1271 | + case POWERPC_MMU_32B: |
1252 | error_code = 0x40000000; | 1272 | error_code = 0x40000000; |
1253 | break; | 1273 | break; |
1254 | #if defined(TARGET_PPC64) | 1274 | #if defined(TARGET_PPC64) |
1255 | - case PPC_FLAGS_MMU_64B: | 1275 | + case POWERPC_MMU_64B: |
1256 | /* XXX: TODO */ | 1276 | /* XXX: TODO */ |
1257 | cpu_abort(env, "MMU model not implemented\n"); | 1277 | cpu_abort(env, "MMU model not implemented\n"); |
1258 | return -1; | 1278 | return -1; |
1259 | - case PPC_FLAGS_MMU_64BRIDGE: | 1279 | + case POWERPC_MMU_64BRIDGE: |
1260 | /* XXX: TODO */ | 1280 | /* XXX: TODO */ |
1261 | cpu_abort(env, "MMU model not implemented\n"); | 1281 | cpu_abort(env, "MMU model not implemented\n"); |
1262 | return -1; | 1282 | return -1; |
1263 | #endif | 1283 | #endif |
1264 | - case PPC_FLAGS_MMU_601: | 1284 | + case POWERPC_MMU_601: |
1265 | /* XXX: TODO */ | 1285 | /* XXX: TODO */ |
1266 | cpu_abort(env, "MMU model not implemented\n"); | 1286 | cpu_abort(env, "MMU model not implemented\n"); |
1267 | return -1; | 1287 | return -1; |
1268 | - case PPC_FLAGS_MMU_BOOKE: | 1288 | + case POWERPC_MMU_BOOKE: |
1269 | /* XXX: TODO */ | 1289 | /* XXX: TODO */ |
1270 | cpu_abort(env, "MMU model not implemented\n"); | 1290 | cpu_abort(env, "MMU model not implemented\n"); |
1271 | return -1; | 1291 | return -1; |
1272 | - case PPC_FLAGS_MMU_BOOKE_FSL: | 1292 | + case POWERPC_MMU_BOOKE_FSL: |
1273 | /* XXX: TODO */ | 1293 | /* XXX: TODO */ |
1274 | cpu_abort(env, "MMU model not implemented\n"); | 1294 | cpu_abort(env, "MMU model not implemented\n"); |
1275 | return -1; | 1295 | return -1; |
1276 | - case PPC_FLAGS_MMU_401: | 1296 | + case POWERPC_MMU_REAL_4xx: |
1277 | cpu_abort(env, "PowerPC 401 should never raise any MMU " | 1297 | cpu_abort(env, "PowerPC 401 should never raise any MMU " |
1278 | "exceptions\n"); | 1298 | "exceptions\n"); |
1279 | return -1; | 1299 | return -1; |
@@ -1306,8 +1326,8 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | @@ -1306,8 +1326,8 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | ||
1306 | switch (ret) { | 1326 | switch (ret) { |
1307 | case -1: | 1327 | case -1: |
1308 | /* No matches in page tables or TLB */ | 1328 | /* No matches in page tables or TLB */ |
1309 | - switch (PPC_MMU(env)) { | ||
1310 | - case PPC_FLAGS_MMU_SOFT_6xx: | 1329 | + switch (env->mmu_model) { |
1330 | + case POWERPC_MMU_SOFT_6xx: | ||
1311 | if (rw == 1) { | 1331 | if (rw == 1) { |
1312 | exception = EXCP_DS_TLBMISS; | 1332 | exception = EXCP_DS_TLBMISS; |
1313 | error_code = 1 << 16; | 1333 | error_code = 1 << 16; |
@@ -1323,8 +1343,8 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | @@ -1323,8 +1343,8 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | ||
1323 | env->spr[SPR_HASH2] = ctx.pg_addr[1]; | 1343 | env->spr[SPR_HASH2] = ctx.pg_addr[1]; |
1324 | /* Do not alter DAR nor DSISR */ | 1344 | /* Do not alter DAR nor DSISR */ |
1325 | goto out; | 1345 | goto out; |
1326 | - case PPC_FLAGS_MMU_SOFT_4xx: | ||
1327 | - case PPC_FLAGS_MMU_403: | 1346 | + case POWERPC_MMU_SOFT_4xx: |
1347 | + case POWERPC_MMU_SOFT_4xx_Z: | ||
1328 | exception = EXCP_40x_DTLBMISS; | 1348 | exception = EXCP_40x_DTLBMISS; |
1329 | error_code = 0; | 1349 | error_code = 0; |
1330 | env->spr[SPR_40x_DEAR] = address; | 1350 | env->spr[SPR_40x_DEAR] = address; |
@@ -1333,32 +1353,32 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | @@ -1333,32 +1353,32 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | ||
1333 | else | 1353 | else |
1334 | env->spr[SPR_40x_ESR] = 0x00000000; | 1354 | env->spr[SPR_40x_ESR] = 0x00000000; |
1335 | break; | 1355 | break; |
1336 | - case PPC_FLAGS_MMU_32B: | 1356 | + case POWERPC_MMU_32B: |
1337 | error_code = 0x40000000; | 1357 | error_code = 0x40000000; |
1338 | break; | 1358 | break; |
1339 | #if defined(TARGET_PPC64) | 1359 | #if defined(TARGET_PPC64) |
1340 | - case PPC_FLAGS_MMU_64B: | 1360 | + case POWERPC_MMU_64B: |
1341 | /* XXX: TODO */ | 1361 | /* XXX: TODO */ |
1342 | cpu_abort(env, "MMU model not implemented\n"); | 1362 | cpu_abort(env, "MMU model not implemented\n"); |
1343 | return -1; | 1363 | return -1; |
1344 | - case PPC_FLAGS_MMU_64BRIDGE: | 1364 | + case POWERPC_MMU_64BRIDGE: |
1345 | /* XXX: TODO */ | 1365 | /* XXX: TODO */ |
1346 | cpu_abort(env, "MMU model not implemented\n"); | 1366 | cpu_abort(env, "MMU model not implemented\n"); |
1347 | return -1; | 1367 | return -1; |
1348 | #endif | 1368 | #endif |
1349 | - case PPC_FLAGS_MMU_601: | 1369 | + case POWERPC_MMU_601: |
1350 | /* XXX: TODO */ | 1370 | /* XXX: TODO */ |
1351 | cpu_abort(env, "MMU model not implemented\n"); | 1371 | cpu_abort(env, "MMU model not implemented\n"); |
1352 | return -1; | 1372 | return -1; |
1353 | - case PPC_FLAGS_MMU_BOOKE: | 1373 | + case POWERPC_MMU_BOOKE: |
1354 | /* XXX: TODO */ | 1374 | /* XXX: TODO */ |
1355 | cpu_abort(env, "MMU model not implemented\n"); | 1375 | cpu_abort(env, "MMU model not implemented\n"); |
1356 | return -1; | 1376 | return -1; |
1357 | - case PPC_FLAGS_MMU_BOOKE_FSL: | 1377 | + case POWERPC_MMU_BOOKE_FSL: |
1358 | /* XXX: TODO */ | 1378 | /* XXX: TODO */ |
1359 | cpu_abort(env, "MMU model not implemented\n"); | 1379 | cpu_abort(env, "MMU model not implemented\n"); |
1360 | return -1; | 1380 | return -1; |
1361 | - case PPC_FLAGS_MMU_401: | 1381 | + case POWERPC_MMU_REAL_4xx: |
1362 | cpu_abort(env, "PowerPC 401 should never raise any MMU " | 1382 | cpu_abort(env, "PowerPC 401 should never raise any MMU " |
1363 | "exceptions\n"); | 1383 | "exceptions\n"); |
1364 | return -1; | 1384 | return -1; |
@@ -1544,9 +1564,9 @@ void do_store_dbatl (CPUPPCState *env, int nr, target_ulong value) | @@ -1544,9 +1564,9 @@ void do_store_dbatl (CPUPPCState *env, int nr, target_ulong value) | ||
1544 | /* TLB management */ | 1564 | /* TLB management */ |
1545 | void ppc_tlb_invalidate_all (CPUPPCState *env) | 1565 | void ppc_tlb_invalidate_all (CPUPPCState *env) |
1546 | { | 1566 | { |
1547 | - if (unlikely(PPC_MMU(env) == PPC_FLAGS_MMU_SOFT_6xx)) { | 1567 | + if (unlikely(env->mmu_model == POWERPC_MMU_SOFT_6xx)) { |
1548 | ppc6xx_tlb_invalidate_all(env); | 1568 | ppc6xx_tlb_invalidate_all(env); |
1549 | - } else if (unlikely(PPC_MMU(env) == PPC_FLAGS_MMU_SOFT_4xx)) { | 1569 | + } else if (unlikely(env->mmu_model == POWERPC_MMU_SOFT_4xx)) { |
1550 | ppc4xx_tlb_invalidate_all(env); | 1570 | ppc4xx_tlb_invalidate_all(env); |
1551 | } else { | 1571 | } else { |
1552 | tlb_flush(env, 1); | 1572 | tlb_flush(env, 1); |
@@ -1707,9 +1727,11 @@ void do_store_msr (CPUPPCState *env, target_ulong value) | @@ -1707,9 +1727,11 @@ void do_store_msr (CPUPPCState *env, target_ulong value) | ||
1707 | fprintf(logfile, "%s: T0 %08lx\n", __func__, value); | 1727 | fprintf(logfile, "%s: T0 %08lx\n", __func__, value); |
1708 | } | 1728 | } |
1709 | #endif | 1729 | #endif |
1710 | - switch (PPC_EXCP(env)) { | ||
1711 | - case PPC_FLAGS_EXCP_602: | ||
1712 | - case PPC_FLAGS_EXCP_603: | 1730 | + switch (env->excp_model) { |
1731 | + case POWERPC_EXCP_602: | ||
1732 | + case POWERPC_EXCP_603: | ||
1733 | + case POWERPC_EXCP_603E: | ||
1734 | + case POWERPC_EXCP_G2: | ||
1713 | if (((value >> MSR_TGPR) & 1) != msr_tgpr) { | 1735 | if (((value >> MSR_TGPR) & 1) != msr_tgpr) { |
1714 | /* Swap temporary saved registers with GPRs */ | 1736 | /* Swap temporary saved registers with GPRs */ |
1715 | swap_gpr_tgpr(env); | 1737 | swap_gpr_tgpr(env); |
@@ -1750,19 +1772,21 @@ void do_store_msr (CPUPPCState *env, target_ulong value) | @@ -1750,19 +1772,21 @@ void do_store_msr (CPUPPCState *env, target_ulong value) | ||
1750 | do_compute_hflags(env); | 1772 | do_compute_hflags(env); |
1751 | 1773 | ||
1752 | enter_pm = 0; | 1774 | enter_pm = 0; |
1753 | - switch (PPC_EXCP(env)) { | ||
1754 | - case PPC_FLAGS_EXCP_603: | 1775 | + switch (env->excp_model) { |
1776 | + case POWERPC_EXCP_603: | ||
1777 | + case POWERPC_EXCP_603E: | ||
1778 | + case POWERPC_EXCP_G2: | ||
1755 | /* Don't handle SLEEP mode: we should disable all clocks... | 1779 | /* Don't handle SLEEP mode: we should disable all clocks... |
1756 | * No dynamic power-management. | 1780 | * No dynamic power-management. |
1757 | */ | 1781 | */ |
1758 | if (msr_pow == 1 && (env->spr[SPR_HID0] & 0x00C00000) != 0) | 1782 | if (msr_pow == 1 && (env->spr[SPR_HID0] & 0x00C00000) != 0) |
1759 | enter_pm = 1; | 1783 | enter_pm = 1; |
1760 | break; | 1784 | break; |
1761 | - case PPC_FLAGS_EXCP_604: | 1785 | + case POWERPC_EXCP_604: |
1762 | if (msr_pow == 1) | 1786 | if (msr_pow == 1) |
1763 | enter_pm = 1; | 1787 | enter_pm = 1; |
1764 | break; | 1788 | break; |
1765 | - case PPC_FLAGS_EXCP_7x0: | 1789 | + case POWERPC_EXCP_7x0: |
1766 | if (msr_pow == 1 && (env->spr[SPR_HID0] & 0x00E00000) != 0) | 1790 | if (msr_pow == 1 && (env->spr[SPR_HID0] & 0x00E00000) != 0) |
1767 | enter_pm = 1; | 1791 | enter_pm = 1; |
1768 | break; | 1792 | break; |
@@ -1854,12 +1878,12 @@ void do_interrupt (CPUState *env) | @@ -1854,12 +1878,12 @@ void do_interrupt (CPUState *env) | ||
1854 | switch (excp) { | 1878 | switch (excp) { |
1855 | /* Generic PowerPC exceptions */ | 1879 | /* Generic PowerPC exceptions */ |
1856 | case EXCP_RESET: /* 0x0100 */ | 1880 | case EXCP_RESET: /* 0x0100 */ |
1857 | - switch (PPC_EXCP(env)) { | ||
1858 | - case PPC_FLAGS_EXCP_40x: | 1881 | + switch (env->excp_model) { |
1882 | + case POWERPC_EXCP_40x: | ||
1859 | srr_0 = &env->spr[SPR_40x_SRR2]; | 1883 | srr_0 = &env->spr[SPR_40x_SRR2]; |
1860 | srr_1 = &env->spr[SPR_40x_SRR3]; | 1884 | srr_1 = &env->spr[SPR_40x_SRR3]; |
1861 | break; | 1885 | break; |
1862 | - case PPC_FLAGS_EXCP_BOOKE: | 1886 | + case POWERPC_EXCP_BOOKE: |
1863 | idx = 0; | 1887 | idx = 0; |
1864 | srr_0 = &env->spr[SPR_BOOKE_CSRR0]; | 1888 | srr_0 = &env->spr[SPR_BOOKE_CSRR0]; |
1865 | srr_1 = &env->spr[SPR_BOOKE_CSRR1]; | 1889 | srr_1 = &env->spr[SPR_BOOKE_CSRR1]; |
@@ -1872,12 +1896,12 @@ void do_interrupt (CPUState *env) | @@ -1872,12 +1896,12 @@ void do_interrupt (CPUState *env) | ||
1872 | } | 1896 | } |
1873 | goto store_next; | 1897 | goto store_next; |
1874 | case EXCP_MACHINE_CHECK: /* 0x0200 */ | 1898 | case EXCP_MACHINE_CHECK: /* 0x0200 */ |
1875 | - switch (PPC_EXCP(env)) { | ||
1876 | - case PPC_FLAGS_EXCP_40x: | 1899 | + switch (env->excp_model) { |
1900 | + case POWERPC_EXCP_40x: | ||
1877 | srr_0 = &env->spr[SPR_40x_SRR2]; | 1901 | srr_0 = &env->spr[SPR_40x_SRR2]; |
1878 | srr_1 = &env->spr[SPR_40x_SRR3]; | 1902 | srr_1 = &env->spr[SPR_40x_SRR3]; |
1879 | break; | 1903 | break; |
1880 | - case PPC_FLAGS_EXCP_BOOKE: | 1904 | + case POWERPC_EXCP_BOOKE: |
1881 | idx = 1; | 1905 | idx = 1; |
1882 | srr_0 = &env->spr[SPR_BOOKE_MCSRR0]; | 1906 | srr_0 = &env->spr[SPR_BOOKE_MCSRR0]; |
1883 | srr_1 = &env->spr[SPR_BOOKE_MCSRR1]; | 1907 | srr_1 = &env->spr[SPR_BOOKE_MCSRR1]; |
@@ -1920,7 +1944,7 @@ void do_interrupt (CPUState *env) | @@ -1920,7 +1944,7 @@ void do_interrupt (CPUState *env) | ||
1920 | idx = 4; | 1944 | idx = 4; |
1921 | goto store_next; | 1945 | goto store_next; |
1922 | case EXCP_ALIGN: /* 0x0600 */ | 1946 | case EXCP_ALIGN: /* 0x0600 */ |
1923 | - if (likely(PPC_EXCP(env) != PPC_FLAGS_EXCP_601)) { | 1947 | + if (likely(env->excp_model != POWERPC_EXCP_601)) { |
1924 | /* Store exception cause */ | 1948 | /* Store exception cause */ |
1925 | idx = 5; | 1949 | idx = 5; |
1926 | /* Get rS/rD and rA from faulting opcode */ | 1950 | /* Get rS/rD and rA from faulting opcode */ |
@@ -2028,26 +2052,27 @@ void do_interrupt (CPUState *env) | @@ -2028,26 +2052,27 @@ void do_interrupt (CPUState *env) | ||
2028 | goto store_next; | 2052 | goto store_next; |
2029 | /* Implementation specific exceptions */ | 2053 | /* Implementation specific exceptions */ |
2030 | case 0x0A00: | 2054 | case 0x0A00: |
2031 | - if (likely(env->spr[SPR_PVR] == CPU_PPC_G2 || | ||
2032 | - env->spr[SPR_PVR] == CPU_PPC_G2LE)) { | 2055 | + switch (env->excp_model) { |
2056 | + case POWERPC_EXCP_G2: | ||
2033 | /* Critical interrupt on G2 */ | 2057 | /* Critical interrupt on G2 */ |
2034 | /* XXX: TODO */ | 2058 | /* XXX: TODO */ |
2035 | cpu_abort(env, "G2 critical interrupt is not implemented yet !\n"); | 2059 | cpu_abort(env, "G2 critical interrupt is not implemented yet !\n"); |
2036 | goto store_next; | 2060 | goto store_next; |
2037 | - } else { | 2061 | + default: |
2038 | cpu_abort(env, "Invalid exception 0x0A00 !\n"); | 2062 | cpu_abort(env, "Invalid exception 0x0A00 !\n"); |
2063 | + break; | ||
2039 | } | 2064 | } |
2040 | return; | 2065 | return; |
2041 | case 0x0F20: | 2066 | case 0x0F20: |
2042 | idx = 9; | 2067 | idx = 9; |
2043 | - switch (PPC_EXCP(env)) { | ||
2044 | - case PPC_FLAGS_EXCP_40x: | 2068 | + switch (env->excp_model) { |
2069 | + case POWERPC_EXCP_40x: | ||
2045 | /* APU unavailable on 405 */ | 2070 | /* APU unavailable on 405 */ |
2046 | /* XXX: TODO */ | 2071 | /* XXX: TODO */ |
2047 | cpu_abort(env, | 2072 | cpu_abort(env, |
2048 | "APU unavailable exception is not implemented yet !\n"); | 2073 | "APU unavailable exception is not implemented yet !\n"); |
2049 | goto store_next; | 2074 | goto store_next; |
2050 | - case PPC_FLAGS_EXCP_74xx: | 2075 | + case POWERPC_EXCP_74xx: |
2051 | /* Altivec unavailable */ | 2076 | /* Altivec unavailable */ |
2052 | /* XXX: TODO */ | 2077 | /* XXX: TODO */ |
2053 | cpu_abort(env, "Altivec unavailable exception " | 2078 | cpu_abort(env, "Altivec unavailable exception " |
@@ -2060,8 +2085,8 @@ void do_interrupt (CPUState *env) | @@ -2060,8 +2085,8 @@ void do_interrupt (CPUState *env) | ||
2060 | return; | 2085 | return; |
2061 | case 0x1000: | 2086 | case 0x1000: |
2062 | idx = 10; | 2087 | idx = 10; |
2063 | - switch (PPC_EXCP(env)) { | ||
2064 | - case PPC_FLAGS_EXCP_40x: | 2088 | + switch (env->excp_model) { |
2089 | + case POWERPC_EXCP_40x: | ||
2065 | /* PIT on 4xx */ | 2090 | /* PIT on 4xx */ |
2066 | msr &= ~0xFFFF0000; | 2091 | msr &= ~0xFFFF0000; |
2067 | #if defined (DEBUG_EXCEPTIONS) | 2092 | #if defined (DEBUG_EXCEPTIONS) |
@@ -2069,11 +2094,13 @@ void do_interrupt (CPUState *env) | @@ -2069,11 +2094,13 @@ void do_interrupt (CPUState *env) | ||
2069 | fprintf(logfile, "PIT exception\n"); | 2094 | fprintf(logfile, "PIT exception\n"); |
2070 | #endif | 2095 | #endif |
2071 | goto store_next; | 2096 | goto store_next; |
2072 | - case PPC_FLAGS_EXCP_602: | ||
2073 | - case PPC_FLAGS_EXCP_603: | 2097 | + case POWERPC_EXCP_602: |
2098 | + case POWERPC_EXCP_603: | ||
2099 | + case POWERPC_EXCP_603E: | ||
2100 | + case POWERPC_EXCP_G2: | ||
2074 | /* ITLBMISS on 602/603 */ | 2101 | /* ITLBMISS on 602/603 */ |
2075 | goto store_gprs; | 2102 | goto store_gprs; |
2076 | - case PPC_FLAGS_EXCP_7x5: | 2103 | + case POWERPC_EXCP_7x5: |
2077 | /* ITLBMISS on 745/755 */ | 2104 | /* ITLBMISS on 745/755 */ |
2078 | goto tlb_miss; | 2105 | goto tlb_miss; |
2079 | default: | 2106 | default: |
@@ -2083,8 +2110,8 @@ void do_interrupt (CPUState *env) | @@ -2083,8 +2110,8 @@ void do_interrupt (CPUState *env) | ||
2083 | return; | 2110 | return; |
2084 | case 0x1010: | 2111 | case 0x1010: |
2085 | idx = 11; | 2112 | idx = 11; |
2086 | - switch (PPC_EXCP(env)) { | ||
2087 | - case PPC_FLAGS_EXCP_40x: | 2113 | + switch (env->excp_model) { |
2114 | + case POWERPC_EXCP_40x: | ||
2088 | /* FIT on 4xx */ | 2115 | /* FIT on 4xx */ |
2089 | msr &= ~0xFFFF0000; | 2116 | msr &= ~0xFFFF0000; |
2090 | #if defined (DEBUG_EXCEPTIONS) | 2117 | #if defined (DEBUG_EXCEPTIONS) |
@@ -2099,8 +2126,8 @@ void do_interrupt (CPUState *env) | @@ -2099,8 +2126,8 @@ void do_interrupt (CPUState *env) | ||
2099 | return; | 2126 | return; |
2100 | case 0x1020: | 2127 | case 0x1020: |
2101 | idx = 12; | 2128 | idx = 12; |
2102 | - switch (PPC_EXCP(env)) { | ||
2103 | - case PPC_FLAGS_EXCP_40x: | 2129 | + switch (env->excp_model) { |
2130 | + case POWERPC_EXCP_40x: | ||
2104 | /* Watchdog on 4xx */ | 2131 | /* Watchdog on 4xx */ |
2105 | msr &= ~0xFFFF0000; | 2132 | msr &= ~0xFFFF0000; |
2106 | #if defined (DEBUG_EXCEPTIONS) | 2133 | #if defined (DEBUG_EXCEPTIONS) |
@@ -2108,7 +2135,7 @@ void do_interrupt (CPUState *env) | @@ -2108,7 +2135,7 @@ void do_interrupt (CPUState *env) | ||
2108 | fprintf(logfile, "WDT exception\n"); | 2135 | fprintf(logfile, "WDT exception\n"); |
2109 | #endif | 2136 | #endif |
2110 | goto store_next; | 2137 | goto store_next; |
2111 | - case PPC_FLAGS_EXCP_BOOKE: | 2138 | + case POWERPC_EXCP_BOOKE: |
2112 | srr_0 = &env->spr[SPR_BOOKE_CSRR0]; | 2139 | srr_0 = &env->spr[SPR_BOOKE_CSRR0]; |
2113 | srr_1 = &env->spr[SPR_BOOKE_CSRR1]; | 2140 | srr_1 = &env->spr[SPR_BOOKE_CSRR1]; |
2114 | break; | 2141 | break; |
@@ -2119,16 +2146,18 @@ void do_interrupt (CPUState *env) | @@ -2119,16 +2146,18 @@ void do_interrupt (CPUState *env) | ||
2119 | return; | 2146 | return; |
2120 | case 0x1100: | 2147 | case 0x1100: |
2121 | idx = 13; | 2148 | idx = 13; |
2122 | - switch (PPC_EXCP(env)) { | ||
2123 | - case PPC_FLAGS_EXCP_40x: | 2149 | + switch (env->excp_model) { |
2150 | + case POWERPC_EXCP_40x: | ||
2124 | /* DTLBMISS on 4xx */ | 2151 | /* DTLBMISS on 4xx */ |
2125 | msr &= ~0xFFFF0000; | 2152 | msr &= ~0xFFFF0000; |
2126 | goto store_next; | 2153 | goto store_next; |
2127 | - case PPC_FLAGS_EXCP_602: | ||
2128 | - case PPC_FLAGS_EXCP_603: | 2154 | + case POWERPC_EXCP_602: |
2155 | + case POWERPC_EXCP_603: | ||
2156 | + case POWERPC_EXCP_603E: | ||
2157 | + case POWERPC_EXCP_G2: | ||
2129 | /* DLTLBMISS on 602/603 */ | 2158 | /* DLTLBMISS on 602/603 */ |
2130 | goto store_gprs; | 2159 | goto store_gprs; |
2131 | - case PPC_FLAGS_EXCP_7x5: | 2160 | + case POWERPC_EXCP_7x5: |
2132 | /* DLTLBMISS on 745/755 */ | 2161 | /* DLTLBMISS on 745/755 */ |
2133 | goto tlb_miss; | 2162 | goto tlb_miss; |
2134 | default: | 2163 | default: |
@@ -2138,13 +2167,15 @@ void do_interrupt (CPUState *env) | @@ -2138,13 +2167,15 @@ void do_interrupt (CPUState *env) | ||
2138 | return; | 2167 | return; |
2139 | case 0x1200: | 2168 | case 0x1200: |
2140 | idx = 14; | 2169 | idx = 14; |
2141 | - switch (PPC_EXCP(env)) { | ||
2142 | - case PPC_FLAGS_EXCP_40x: | 2170 | + switch (env->excp_model) { |
2171 | + case POWERPC_EXCP_40x: | ||
2143 | /* ITLBMISS on 4xx */ | 2172 | /* ITLBMISS on 4xx */ |
2144 | msr &= ~0xFFFF0000; | 2173 | msr &= ~0xFFFF0000; |
2145 | goto store_next; | 2174 | goto store_next; |
2146 | - case PPC_FLAGS_EXCP_602: | ||
2147 | - case PPC_FLAGS_EXCP_603: | 2175 | + case POWERPC_EXCP_602: |
2176 | + case POWERPC_EXCP_603: | ||
2177 | + case POWERPC_EXCP_603E: | ||
2178 | + case POWERPC_EXCP_G2: | ||
2148 | /* DSTLBMISS on 602/603 */ | 2179 | /* DSTLBMISS on 602/603 */ |
2149 | store_gprs: | 2180 | store_gprs: |
2150 | /* Swap temporary saved registers with GPRs */ | 2181 | /* Swap temporary saved registers with GPRs */ |
@@ -2177,7 +2208,7 @@ void do_interrupt (CPUState *env) | @@ -2177,7 +2208,7 @@ void do_interrupt (CPUState *env) | ||
2177 | } | 2208 | } |
2178 | #endif | 2209 | #endif |
2179 | goto tlb_miss; | 2210 | goto tlb_miss; |
2180 | - case PPC_FLAGS_EXCP_7x5: | 2211 | + case POWERPC_EXCP_7x5: |
2181 | /* DSTLBMISS on 745/755 */ | 2212 | /* DSTLBMISS on 745/755 */ |
2182 | tlb_miss: | 2213 | tlb_miss: |
2183 | msr &= ~0xF83F0000; | 2214 | msr &= ~0xF83F0000; |
@@ -2192,13 +2223,15 @@ void do_interrupt (CPUState *env) | @@ -2192,13 +2223,15 @@ void do_interrupt (CPUState *env) | ||
2192 | } | 2223 | } |
2193 | return; | 2224 | return; |
2194 | case 0x1300: | 2225 | case 0x1300: |
2195 | - switch (PPC_EXCP(env)) { | ||
2196 | - case PPC_FLAGS_EXCP_601: | ||
2197 | - case PPC_FLAGS_EXCP_602: | ||
2198 | - case PPC_FLAGS_EXCP_603: | ||
2199 | - case PPC_FLAGS_EXCP_604: | ||
2200 | - case PPC_FLAGS_EXCP_7x0: | ||
2201 | - case PPC_FLAGS_EXCP_7x5: | 2226 | + switch (env->excp_model) { |
2227 | + case POWERPC_EXCP_601: | ||
2228 | + case POWERPC_EXCP_602: | ||
2229 | + case POWERPC_EXCP_603: | ||
2230 | + case POWERPC_EXCP_603E: | ||
2231 | + case POWERPC_EXCP_G2: | ||
2232 | + case POWERPC_EXCP_604: | ||
2233 | + case POWERPC_EXCP_7x0: | ||
2234 | + case POWERPC_EXCP_7x5: | ||
2202 | /* IABR on 6xx/7xx */ | 2235 | /* IABR on 6xx/7xx */ |
2203 | /* XXX: TODO */ | 2236 | /* XXX: TODO */ |
2204 | cpu_abort(env, "IABR exception is not implemented yet !\n"); | 2237 | cpu_abort(env, "IABR exception is not implemented yet !\n"); |
@@ -2209,13 +2242,15 @@ void do_interrupt (CPUState *env) | @@ -2209,13 +2242,15 @@ void do_interrupt (CPUState *env) | ||
2209 | } | 2242 | } |
2210 | return; | 2243 | return; |
2211 | case 0x1400: | 2244 | case 0x1400: |
2212 | - switch (PPC_EXCP(env)) { | ||
2213 | - case PPC_FLAGS_EXCP_601: | ||
2214 | - case PPC_FLAGS_EXCP_602: | ||
2215 | - case PPC_FLAGS_EXCP_603: | ||
2216 | - case PPC_FLAGS_EXCP_604: | ||
2217 | - case PPC_FLAGS_EXCP_7x0: | ||
2218 | - case PPC_FLAGS_EXCP_7x5: | 2245 | + switch (env->excp_model) { |
2246 | + case POWERPC_EXCP_601: | ||
2247 | + case POWERPC_EXCP_602: | ||
2248 | + case POWERPC_EXCP_603: | ||
2249 | + case POWERPC_EXCP_603E: | ||
2250 | + case POWERPC_EXCP_G2: | ||
2251 | + case POWERPC_EXCP_604: | ||
2252 | + case POWERPC_EXCP_7x0: | ||
2253 | + case POWERPC_EXCP_7x5: | ||
2219 | /* SMI on 6xx/7xx */ | 2254 | /* SMI on 6xx/7xx */ |
2220 | /* XXX: TODO */ | 2255 | /* XXX: TODO */ |
2221 | cpu_abort(env, "SMI exception is not implemented yet !\n"); | 2256 | cpu_abort(env, "SMI exception is not implemented yet !\n"); |
@@ -2226,20 +2261,20 @@ void do_interrupt (CPUState *env) | @@ -2226,20 +2261,20 @@ void do_interrupt (CPUState *env) | ||
2226 | } | 2261 | } |
2227 | return; | 2262 | return; |
2228 | case 0x1500: | 2263 | case 0x1500: |
2229 | - switch (PPC_EXCP(env)) { | ||
2230 | - case PPC_FLAGS_EXCP_602: | 2264 | + switch (env->excp_model) { |
2265 | + case POWERPC_EXCP_602: | ||
2231 | /* Watchdog on 602 */ | 2266 | /* Watchdog on 602 */ |
2232 | /* XXX: TODO */ | 2267 | /* XXX: TODO */ |
2233 | cpu_abort(env, | 2268 | cpu_abort(env, |
2234 | "602 watchdog exception is not implemented yet !\n"); | 2269 | "602 watchdog exception is not implemented yet !\n"); |
2235 | goto store_next; | 2270 | goto store_next; |
2236 | - case PPC_FLAGS_EXCP_970: | 2271 | + case POWERPC_EXCP_970: |
2237 | /* Soft patch exception on 970 */ | 2272 | /* Soft patch exception on 970 */ |
2238 | /* XXX: TODO */ | 2273 | /* XXX: TODO */ |
2239 | cpu_abort(env, | 2274 | cpu_abort(env, |
2240 | "970 soft-patch exception is not implemented yet !\n"); | 2275 | "970 soft-patch exception is not implemented yet !\n"); |
2241 | goto store_next; | 2276 | goto store_next; |
2242 | - case PPC_FLAGS_EXCP_74xx: | 2277 | + case POWERPC_EXCP_74xx: |
2243 | /* VPU assist on 74xx */ | 2278 | /* VPU assist on 74xx */ |
2244 | /* XXX: TODO */ | 2279 | /* XXX: TODO */ |
2245 | cpu_abort(env, "VPU assist exception is not implemented yet !\n"); | 2280 | cpu_abort(env, "VPU assist exception is not implemented yet !\n"); |
@@ -2250,14 +2285,14 @@ void do_interrupt (CPUState *env) | @@ -2250,14 +2285,14 @@ void do_interrupt (CPUState *env) | ||
2250 | } | 2285 | } |
2251 | return; | 2286 | return; |
2252 | case 0x1600: | 2287 | case 0x1600: |
2253 | - switch (PPC_EXCP(env)) { | ||
2254 | - case PPC_FLAGS_EXCP_602: | 2288 | + switch (env->excp_model) { |
2289 | + case POWERPC_EXCP_602: | ||
2255 | /* Emulation trap on 602 */ | 2290 | /* Emulation trap on 602 */ |
2256 | /* XXX: TODO */ | 2291 | /* XXX: TODO */ |
2257 | cpu_abort(env, "602 emulation trap exception " | 2292 | cpu_abort(env, "602 emulation trap exception " |
2258 | "is not implemented yet !\n"); | 2293 | "is not implemented yet !\n"); |
2259 | goto store_next; | 2294 | goto store_next; |
2260 | - case PPC_FLAGS_EXCP_970: | 2295 | + case POWERPC_EXCP_970: |
2261 | /* Maintenance exception on 970 */ | 2296 | /* Maintenance exception on 970 */ |
2262 | /* XXX: TODO */ | 2297 | /* XXX: TODO */ |
2263 | cpu_abort(env, | 2298 | cpu_abort(env, |
@@ -2269,15 +2304,15 @@ void do_interrupt (CPUState *env) | @@ -2269,15 +2304,15 @@ void do_interrupt (CPUState *env) | ||
2269 | } | 2304 | } |
2270 | return; | 2305 | return; |
2271 | case 0x1700: | 2306 | case 0x1700: |
2272 | - switch (PPC_EXCP(env)) { | ||
2273 | - case PPC_FLAGS_EXCP_7x0: | ||
2274 | - case PPC_FLAGS_EXCP_7x5: | 2307 | + switch (env->excp_model) { |
2308 | + case POWERPC_EXCP_7x0: | ||
2309 | + case POWERPC_EXCP_7x5: | ||
2275 | /* Thermal management interrupt on G3 */ | 2310 | /* Thermal management interrupt on G3 */ |
2276 | /* XXX: TODO */ | 2311 | /* XXX: TODO */ |
2277 | cpu_abort(env, "G3 thermal management exception " | 2312 | cpu_abort(env, "G3 thermal management exception " |
2278 | "is not implemented yet !\n"); | 2313 | "is not implemented yet !\n"); |
2279 | goto store_next; | 2314 | goto store_next; |
2280 | - case PPC_FLAGS_EXCP_970: | 2315 | + case POWERPC_EXCP_970: |
2281 | /* VPU assist on 970 */ | 2316 | /* VPU assist on 970 */ |
2282 | /* XXX: TODO */ | 2317 | /* XXX: TODO */ |
2283 | cpu_abort(env, | 2318 | cpu_abort(env, |
@@ -2289,8 +2324,8 @@ void do_interrupt (CPUState *env) | @@ -2289,8 +2324,8 @@ void do_interrupt (CPUState *env) | ||
2289 | } | 2324 | } |
2290 | return; | 2325 | return; |
2291 | case 0x1800: | 2326 | case 0x1800: |
2292 | - switch (PPC_EXCP(env)) { | ||
2293 | - case PPC_FLAGS_EXCP_970: | 2327 | + switch (env->excp_model) { |
2328 | + case POWERPC_EXCP_970: | ||
2294 | /* Thermal exception on 970 */ | 2329 | /* Thermal exception on 970 */ |
2295 | /* XXX: TODO */ | 2330 | /* XXX: TODO */ |
2296 | cpu_abort(env, "970 thermal management exception " | 2331 | cpu_abort(env, "970 thermal management exception " |
@@ -2302,19 +2337,19 @@ void do_interrupt (CPUState *env) | @@ -2302,19 +2337,19 @@ void do_interrupt (CPUState *env) | ||
2302 | } | 2337 | } |
2303 | return; | 2338 | return; |
2304 | case 0x2000: | 2339 | case 0x2000: |
2305 | - switch (PPC_EXCP(env)) { | ||
2306 | - case PPC_FLAGS_EXCP_40x: | 2340 | + switch (env->excp_model) { |
2341 | + case POWERPC_EXCP_40x: | ||
2307 | /* DEBUG on 4xx */ | 2342 | /* DEBUG on 4xx */ |
2308 | /* XXX: TODO */ | 2343 | /* XXX: TODO */ |
2309 | cpu_abort(env, "40x debug exception is not implemented yet !\n"); | 2344 | cpu_abort(env, "40x debug exception is not implemented yet !\n"); |
2310 | goto store_next; | 2345 | goto store_next; |
2311 | - case PPC_FLAGS_EXCP_601: | 2346 | + case POWERPC_EXCP_601: |
2312 | /* Run mode exception on 601 */ | 2347 | /* Run mode exception on 601 */ |
2313 | /* XXX: TODO */ | 2348 | /* XXX: TODO */ |
2314 | cpu_abort(env, | 2349 | cpu_abort(env, |
2315 | "601 run mode exception is not implemented yet !\n"); | 2350 | "601 run mode exception is not implemented yet !\n"); |
2316 | goto store_next; | 2351 | goto store_next; |
2317 | - case PPC_FLAGS_EXCP_BOOKE: | 2352 | + case POWERPC_EXCP_BOOKE: |
2318 | srr_0 = &env->spr[SPR_BOOKE_CSRR0]; | 2353 | srr_0 = &env->spr[SPR_BOOKE_CSRR0]; |
2319 | srr_1 = &env->spr[SPR_BOOKE_CSRR1]; | 2354 | srr_1 = &env->spr[SPR_BOOKE_CSRR1]; |
2320 | break; | 2355 | break; |
@@ -2361,7 +2396,7 @@ void do_interrupt (CPUState *env) | @@ -2361,7 +2396,7 @@ void do_interrupt (CPUState *env) | ||
2361 | msr_dr = 0; | 2396 | msr_dr = 0; |
2362 | msr_ri = 0; | 2397 | msr_ri = 0; |
2363 | msr_le = msr_ile; | 2398 | msr_le = msr_ile; |
2364 | - if (PPC_EXCP(env) == PPC_FLAGS_EXCP_BOOKE) { | 2399 | + if (env->excp_model == POWERPC_EXCP_BOOKE) { |
2365 | msr_cm = msr_icm; | 2400 | msr_cm = msr_icm; |
2366 | if (idx == -1 || (idx >= 16 && idx < 32)) { | 2401 | if (idx == -1 || (idx >= 16 && idx < 32)) { |
2367 | cpu_abort(env, "Invalid exception index for excp %d %08x idx %d\n", | 2402 | cpu_abort(env, "Invalid exception index for excp %d %08x idx %d\n", |
target-ppc/op.c
@@ -2319,7 +2319,6 @@ void OPPROTO op_405_check_satu (void) | @@ -2319,7 +2319,6 @@ void OPPROTO op_405_check_satu (void) | ||
2319 | RETURN(); | 2319 | RETURN(); |
2320 | } | 2320 | } |
2321 | 2321 | ||
2322 | -#if !defined(CONFIG_USER_ONLY) | ||
2323 | void OPPROTO op_load_dcr (void) | 2322 | void OPPROTO op_load_dcr (void) |
2324 | { | 2323 | { |
2325 | do_load_dcr(); | 2324 | do_load_dcr(); |
@@ -2332,6 +2331,7 @@ void OPPROTO op_store_dcr (void) | @@ -2332,6 +2331,7 @@ void OPPROTO op_store_dcr (void) | ||
2332 | RETURN(); | 2331 | RETURN(); |
2333 | } | 2332 | } |
2334 | 2333 | ||
2334 | +#if !defined(CONFIG_USER_ONLY) | ||
2335 | /* Return from critical interrupt : | 2335 | /* Return from critical interrupt : |
2336 | * same as rfi, except nip & MSR are loaded from SRR2/3 instead of SRR0/1 | 2336 | * same as rfi, except nip & MSR are loaded from SRR2/3 instead of SRR0/1 |
2337 | */ | 2337 | */ |
target-ppc/op_helper.c
@@ -1206,6 +1206,41 @@ void do_405_check_sat (void) | @@ -1206,6 +1206,41 @@ void do_405_check_sat (void) | ||
1206 | } | 1206 | } |
1207 | } | 1207 | } |
1208 | 1208 | ||
1209 | +/* XXX: to be improved to check access rights when in user-mode */ | ||
1210 | +void do_load_dcr (void) | ||
1211 | +{ | ||
1212 | + target_ulong val; | ||
1213 | + | ||
1214 | + if (unlikely(env->dcr_env == NULL)) { | ||
1215 | + if (loglevel != 0) { | ||
1216 | + fprintf(logfile, "No DCR environment\n"); | ||
1217 | + } | ||
1218 | + do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_INVAL_INVAL); | ||
1219 | + } else if (unlikely(ppc_dcr_read(env->dcr_env, T0, &val) != 0)) { | ||
1220 | + if (loglevel != 0) { | ||
1221 | + fprintf(logfile, "DCR read error %d %03x\n", (int)T0, (int)T0); | ||
1222 | + } | ||
1223 | + do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_PRIV_REG); | ||
1224 | + } else { | ||
1225 | + T0 = val; | ||
1226 | + } | ||
1227 | +} | ||
1228 | + | ||
1229 | +void do_store_dcr (void) | ||
1230 | +{ | ||
1231 | + if (unlikely(env->dcr_env == NULL)) { | ||
1232 | + if (loglevel != 0) { | ||
1233 | + fprintf(logfile, "No DCR environment\n"); | ||
1234 | + } | ||
1235 | + do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_INVAL_INVAL); | ||
1236 | + } else if (unlikely(ppc_dcr_write(env->dcr_env, T0, T1) != 0)) { | ||
1237 | + if (loglevel != 0) { | ||
1238 | + fprintf(logfile, "DCR write error %d %03x\n", (int)T0, (int)T0); | ||
1239 | + } | ||
1240 | + do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_PRIV_REG); | ||
1241 | + } | ||
1242 | +} | ||
1243 | + | ||
1209 | #if !defined(CONFIG_USER_ONLY) | 1244 | #if !defined(CONFIG_USER_ONLY) |
1210 | void do_40x_rfci (void) | 1245 | void do_40x_rfci (void) |
1211 | { | 1246 | { |
@@ -1268,40 +1303,6 @@ void do_rfmci (void) | @@ -1268,40 +1303,6 @@ void do_rfmci (void) | ||
1268 | env->interrupt_request = CPU_INTERRUPT_EXITTB; | 1303 | env->interrupt_request = CPU_INTERRUPT_EXITTB; |
1269 | } | 1304 | } |
1270 | 1305 | ||
1271 | -void do_load_dcr (void) | ||
1272 | -{ | ||
1273 | - target_ulong val; | ||
1274 | - | ||
1275 | - if (unlikely(env->dcr_env == NULL)) { | ||
1276 | - if (loglevel != 0) { | ||
1277 | - fprintf(logfile, "No DCR environment\n"); | ||
1278 | - } | ||
1279 | - do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_INVAL_INVAL); | ||
1280 | - } else if (unlikely(ppc_dcr_read(env->dcr_env, T0, &val) != 0)) { | ||
1281 | - if (loglevel != 0) { | ||
1282 | - fprintf(logfile, "DCR read error %d %03x\n", (int)T0, (int)T0); | ||
1283 | - } | ||
1284 | - do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_PRIV_REG); | ||
1285 | - } else { | ||
1286 | - T0 = val; | ||
1287 | - } | ||
1288 | -} | ||
1289 | - | ||
1290 | -void do_store_dcr (void) | ||
1291 | -{ | ||
1292 | - if (unlikely(env->dcr_env == NULL)) { | ||
1293 | - if (loglevel != 0) { | ||
1294 | - fprintf(logfile, "No DCR environment\n"); | ||
1295 | - } | ||
1296 | - do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_INVAL_INVAL); | ||
1297 | - } else if (unlikely(ppc_dcr_write(env->dcr_env, T0, T1) != 0)) { | ||
1298 | - if (loglevel != 0) { | ||
1299 | - fprintf(logfile, "DCR write error %d %03x\n", (int)T0, (int)T0); | ||
1300 | - } | ||
1301 | - do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_PRIV_REG); | ||
1302 | - } | ||
1303 | -} | ||
1304 | - | ||
1305 | void do_load_403_pb (int num) | 1306 | void do_load_403_pb (int num) |
1306 | { | 1307 | { |
1307 | T0 = env->pb[num]; | 1308 | T0 = env->pb[num]; |
@@ -2238,7 +2239,7 @@ void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr) | @@ -2238,7 +2239,7 @@ void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr) | ||
2238 | if (unlikely(ret != 0)) { | 2239 | if (unlikely(ret != 0)) { |
2239 | if (likely(retaddr)) { | 2240 | if (likely(retaddr)) { |
2240 | /* now we have a real cpu fault */ | 2241 | /* now we have a real cpu fault */ |
2241 | - pc = (target_phys_addr_t)retaddr; | 2242 | + pc = (target_phys_addr_t)(unsigned long)retaddr; |
2242 | tb = tb_find_pc(pc); | 2243 | tb = tb_find_pc(pc); |
2243 | if (likely(tb)) { | 2244 | if (likely(tb)) { |
2244 | /* the PC is inside the translated code. It means that we have | 2245 | /* the PC is inside the translated code. It means that we have |
@@ -2261,16 +2262,14 @@ void do_tlbie (void) | @@ -2261,16 +2262,14 @@ void do_tlbie (void) | ||
2261 | { | 2262 | { |
2262 | T0 = (uint32_t)T0; | 2263 | T0 = (uint32_t)T0; |
2263 | #if !defined(FLUSH_ALL_TLBS) | 2264 | #if !defined(FLUSH_ALL_TLBS) |
2264 | - if (unlikely(PPC_MMU(env) == PPC_FLAGS_MMU_SOFT_6xx)) { | 2265 | + /* XXX: Remove thoses tests */ |
2266 | + if (unlikely(env->mmu_model == POWERPC_MMU_SOFT_6xx)) { | ||
2265 | ppc6xx_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, 0); | 2267 | ppc6xx_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, 0); |
2266 | if (env->id_tlbs == 1) | 2268 | if (env->id_tlbs == 1) |
2267 | ppc6xx_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, 1); | 2269 | ppc6xx_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, 1); |
2268 | - } else if (unlikely(PPC_MMU(env) == PPC_FLAGS_MMU_SOFT_4xx)) { | ||
2269 | - /* XXX: TODO */ | ||
2270 | -#if 0 | ||
2271 | - ppcbooke_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, | ||
2272 | - env->spr[SPR_BOOKE_PID]); | ||
2273 | -#endif | 2270 | + } else if (unlikely(env->mmu_model == POWERPC_MMU_SOFT_4xx)) { |
2271 | + ppc4xx_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, | ||
2272 | + env->spr[SPR_40x_PID]); | ||
2274 | } else { | 2273 | } else { |
2275 | /* tlbie invalidate TLBs for all segments */ | 2274 | /* tlbie invalidate TLBs for all segments */ |
2276 | T0 &= TARGET_PAGE_MASK; | 2275 | T0 &= TARGET_PAGE_MASK; |
@@ -2305,11 +2304,11 @@ void do_tlbie_64 (void) | @@ -2305,11 +2304,11 @@ void do_tlbie_64 (void) | ||
2305 | { | 2304 | { |
2306 | T0 = (uint64_t)T0; | 2305 | T0 = (uint64_t)T0; |
2307 | #if !defined(FLUSH_ALL_TLBS) | 2306 | #if !defined(FLUSH_ALL_TLBS) |
2308 | - if (unlikely(PPC_MMU(env) == PPC_FLAGS_MMU_SOFT_6xx)) { | 2307 | + if (unlikely(env->mmu_model == POWERPC_MMU_SOFT_6xx)) { |
2309 | ppc6xx_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, 0); | 2308 | ppc6xx_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, 0); |
2310 | if (env->id_tlbs == 1) | 2309 | if (env->id_tlbs == 1) |
2311 | ppc6xx_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, 1); | 2310 | ppc6xx_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, 1); |
2312 | - } else if (unlikely(PPC_MMU(env) == PPC_FLAGS_MMU_SOFT_4xx)) { | 2311 | + } else if (unlikely(env->mmu_model == POWERPC_MMU_SOFT_4xx)) { |
2313 | /* XXX: TODO */ | 2312 | /* XXX: TODO */ |
2314 | #if 0 | 2313 | #if 0 |
2315 | ppcbooke_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, | 2314 | ppcbooke_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, |
@@ -2541,7 +2540,7 @@ void do_4xx_tlbwe_hi (void) | @@ -2541,7 +2540,7 @@ void do_4xx_tlbwe_hi (void) | ||
2541 | "are not supported (%d)\n", | 2540 | "are not supported (%d)\n", |
2542 | tlb->size, TARGET_PAGE_SIZE, (int)((T1 >> 7) & 0x7)); | 2541 | tlb->size, TARGET_PAGE_SIZE, (int)((T1 >> 7) & 0x7)); |
2543 | } | 2542 | } |
2544 | - tlb->EPN = (T1 & 0xFFFFFC00) & ~(tlb->size - 1); | 2543 | + tlb->EPN = T1 & ~(tlb->size - 1); |
2545 | if (T1 & 0x40) | 2544 | if (T1 & 0x40) |
2546 | tlb->prot |= PAGE_VALID; | 2545 | tlb->prot |= PAGE_VALID; |
2547 | else | 2546 | else |
@@ -2676,14 +2675,14 @@ void do_440_tlbwe (int word) | @@ -2676,14 +2675,14 @@ void do_440_tlbwe (int word) | ||
2676 | 2675 | ||
2677 | void do_440_tlbsx (void) | 2676 | void do_440_tlbsx (void) |
2678 | { | 2677 | { |
2679 | - T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_440_MMUCR]); | 2678 | + T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_440_MMUCR] & 0xFF); |
2680 | } | 2679 | } |
2681 | 2680 | ||
2682 | void do_440_tlbsx_ (void) | 2681 | void do_440_tlbsx_ (void) |
2683 | { | 2682 | { |
2684 | int tmp = xer_so; | 2683 | int tmp = xer_so; |
2685 | 2684 | ||
2686 | - T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_440_MMUCR]); | 2685 | + T0 = ppcemb_tlb_search(env, T0, env->spr[SPR_440_MMUCR] & 0xFF); |
2687 | if (T0 != -1) | 2686 | if (T0 != -1) |
2688 | tmp |= 0x02; | 2687 | tmp |= 0x02; |
2689 | env->crf[0] = tmp; | 2688 | env->crf[0] = tmp; |
target-ppc/op_helper.h
@@ -167,9 +167,9 @@ void do_440_tlbwe (int word); | @@ -167,9 +167,9 @@ void do_440_tlbwe (int word); | ||
167 | /* PowerPC 4xx specific helpers */ | 167 | /* PowerPC 4xx specific helpers */ |
168 | void do_405_check_ov (void); | 168 | void do_405_check_ov (void); |
169 | void do_405_check_sat (void); | 169 | void do_405_check_sat (void); |
170 | -#if !defined(CONFIG_USER_ONLY) | ||
171 | void do_load_dcr (void); | 170 | void do_load_dcr (void); |
172 | void do_store_dcr (void); | 171 | void do_store_dcr (void); |
172 | +#if !defined(CONFIG_USER_ONLY) | ||
173 | void do_40x_rfci (void); | 173 | void do_40x_rfci (void); |
174 | void do_rfci (void); | 174 | void do_rfci (void); |
175 | void do_rfdi (void); | 175 | void do_rfdi (void); |
target-ppc/translate.c
@@ -27,11 +27,14 @@ | @@ -27,11 +27,14 @@ | ||
27 | #include "exec-all.h" | 27 | #include "exec-all.h" |
28 | #include "disas.h" | 28 | #include "disas.h" |
29 | 29 | ||
30 | +/* Include definitions for instructions classes and implementations flags */ | ||
30 | //#define DO_SINGLE_STEP | 31 | //#define DO_SINGLE_STEP |
31 | //#define PPC_DEBUG_DISAS | 32 | //#define PPC_DEBUG_DISAS |
32 | //#define DEBUG_MEMORY_ACCESSES | 33 | //#define DEBUG_MEMORY_ACCESSES |
33 | //#define DO_PPC_STATISTICS | 34 | //#define DO_PPC_STATISTICS |
34 | 35 | ||
36 | +/*****************************************************************************/ | ||
37 | +/* Code translation helpers */ | ||
35 | #if defined(USE_DIRECT_JUMP) | 38 | #if defined(USE_DIRECT_JUMP) |
36 | #define TBPARAM(x) | 39 | #define TBPARAM(x) |
37 | #else | 40 | #else |
@@ -175,8 +178,10 @@ struct opc_handler_t { | @@ -175,8 +178,10 @@ struct opc_handler_t { | ||
175 | uint64_t type; | 178 | uint64_t type; |
176 | /* handler */ | 179 | /* handler */ |
177 | void (*handler)(DisasContext *ctx); | 180 | void (*handler)(DisasContext *ctx); |
178 | -#if defined(DO_PPC_STATISTICS) | 181 | +#if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU) |
179 | const unsigned char *oname; | 182 | const unsigned char *oname; |
183 | +#endif | ||
184 | +#if defined(DO_PPC_STATISTICS) | ||
180 | uint64_t count; | 185 | uint64_t count; |
181 | #endif | 186 | #endif |
182 | }; | 187 | }; |
@@ -249,6 +254,7 @@ typedef struct opcode_t { | @@ -249,6 +254,7 @@ typedef struct opcode_t { | ||
249 | const unsigned char *oname; | 254 | const unsigned char *oname; |
250 | } opcode_t; | 255 | } opcode_t; |
251 | 256 | ||
257 | +/*****************************************************************************/ | ||
252 | /*** Instruction decoding ***/ | 258 | /*** Instruction decoding ***/ |
253 | #define EXTRACT_HELPER(name, shift, nb) \ | 259 | #define EXTRACT_HELPER(name, shift, nb) \ |
254 | static inline uint32_t name (uint32_t opcode) \ | 260 | static inline uint32_t name (uint32_t opcode) \ |
@@ -365,6 +371,106 @@ static inline target_ulong MASK (uint32_t start, uint32_t end) | @@ -365,6 +371,106 @@ static inline target_ulong MASK (uint32_t start, uint32_t end) | ||
365 | return ret; | 371 | return ret; |
366 | } | 372 | } |
367 | 373 | ||
374 | +/*****************************************************************************/ | ||
375 | +/* PowerPC Instructions types definitions */ | ||
376 | +enum { | ||
377 | + PPC_NONE = 0x0000000000000000ULL, | ||
378 | + /* integer operations instructions */ | ||
379 | + /* flow control instructions */ | ||
380 | + /* virtual memory instructions */ | ||
381 | + /* ld/st with reservation instructions */ | ||
382 | + /* cache control instructions */ | ||
383 | + /* spr/msr access instructions */ | ||
384 | + PPC_INSNS_BASE = 0x0000000000000001ULL, | ||
385 | +#define PPC_INTEGER PPC_INSNS_BASE | ||
386 | +#define PPC_FLOW PPC_INSNS_BASE | ||
387 | +#define PPC_MEM PPC_INSNS_BASE | ||
388 | +#define PPC_RES PPC_INSNS_BASE | ||
389 | +#define PPC_CACHE PPC_INSNS_BASE | ||
390 | +#define PPC_MISC PPC_INSNS_BASE | ||
391 | + /* Optional floating point instructions */ | ||
392 | + PPC_FLOAT = 0x0000000000000002ULL, | ||
393 | + PPC_FLOAT_FSQRT = 0x0000000000000004ULL, | ||
394 | + PPC_FLOAT_FRES = 0x0000000000000008ULL, | ||
395 | + PPC_FLOAT_FRSQRTE = 0x0000000000000010ULL, | ||
396 | + PPC_FLOAT_FSEL = 0x0000000000000020ULL, | ||
397 | + PPC_FLOAT_STFIWX = 0x0000000000000040ULL, | ||
398 | + /* external control instructions */ | ||
399 | + PPC_EXTERN = 0x0000000000000080ULL, | ||
400 | + /* segment register access instructions */ | ||
401 | + PPC_SEGMENT = 0x0000000000000100ULL, | ||
402 | + /* Optional cache control instruction */ | ||
403 | + PPC_CACHE_DCBA = 0x0000000000000200ULL, | ||
404 | + /* Optional memory control instructions */ | ||
405 | + PPC_MEM_TLBIA = 0x0000000000000400ULL, | ||
406 | + PPC_MEM_TLBIE = 0x0000000000000800ULL, | ||
407 | + PPC_MEM_TLBSYNC = 0x0000000000001000ULL, | ||
408 | + /* eieio & sync */ | ||
409 | + PPC_MEM_SYNC = 0x0000000000002000ULL, | ||
410 | + /* PowerPC 6xx TLB management instructions */ | ||
411 | + PPC_6xx_TLB = 0x0000000000004000ULL, | ||
412 | + /* Altivec support */ | ||
413 | + PPC_ALTIVEC = 0x0000000000008000ULL, | ||
414 | + /* Time base mftb instruction */ | ||
415 | + PPC_MFTB = 0x0000000000010000ULL, | ||
416 | + /* Embedded PowerPC dedicated instructions */ | ||
417 | + PPC_EMB_COMMON = 0x0000000000020000ULL, | ||
418 | + /* PowerPC 40x exception model */ | ||
419 | + PPC_40x_EXCP = 0x0000000000040000ULL, | ||
420 | + /* PowerPC 40x TLB management instructions */ | ||
421 | + PPC_40x_TLB = 0x0000000000080000ULL, | ||
422 | + /* PowerPC 405 Mac instructions */ | ||
423 | + PPC_405_MAC = 0x0000000000100000ULL, | ||
424 | + /* PowerPC 440 specific instructions */ | ||
425 | + PPC_440_SPEC = 0x0000000000200000ULL, | ||
426 | + /* Power-to-PowerPC bridge (601) */ | ||
427 | + PPC_POWER_BR = 0x0000000000400000ULL, | ||
428 | + /* PowerPC 602 specific */ | ||
429 | + PPC_602_SPEC = 0x0000000000800000ULL, | ||
430 | + /* Deprecated instructions */ | ||
431 | + /* Original POWER instruction set */ | ||
432 | + PPC_POWER = 0x0000000001000000ULL, | ||
433 | + /* POWER2 instruction set extension */ | ||
434 | + PPC_POWER2 = 0x0000000002000000ULL, | ||
435 | + /* Power RTC support */ | ||
436 | + PPC_POWER_RTC = 0x0000000004000000ULL, | ||
437 | + /* 64 bits PowerPC instructions */ | ||
438 | + /* 64 bits PowerPC instruction set */ | ||
439 | + PPC_64B = 0x0000000008000000ULL, | ||
440 | + /* 64 bits hypervisor extensions */ | ||
441 | + PPC_64H = 0x0000000010000000ULL, | ||
442 | + /* 64 bits PowerPC "bridge" features */ | ||
443 | + PPC_64_BRIDGE = 0x0000000020000000ULL, | ||
444 | + /* BookE (embedded) PowerPC specification */ | ||
445 | + PPC_BOOKE = 0x0000000040000000ULL, | ||
446 | + /* eieio */ | ||
447 | + PPC_MEM_EIEIO = 0x0000000080000000ULL, | ||
448 | + /* e500 vector instructions */ | ||
449 | + PPC_E500_VECTOR = 0x0000000100000000ULL, | ||
450 | + /* PowerPC 4xx dedicated instructions */ | ||
451 | + PPC_4xx_COMMON = 0x0000000200000000ULL, | ||
452 | + /* PowerPC 2.03 specification extensions */ | ||
453 | + PPC_203 = 0x0000000400000000ULL, | ||
454 | + /* PowerPC 2.03 SPE extension */ | ||
455 | + PPC_SPE = 0x0000000800000000ULL, | ||
456 | + /* PowerPC 2.03 SPE floating-point extension */ | ||
457 | + PPC_SPEFPU = 0x0000001000000000ULL, | ||
458 | + /* SLB management */ | ||
459 | + PPC_SLBI = 0x0000002000000000ULL, | ||
460 | + /* PowerPC 40x ibct instructions */ | ||
461 | + PPC_40x_ICBT = 0x0000004000000000ULL, | ||
462 | + /* PowerPC 74xx TLB management instructions */ | ||
463 | + PPC_74xx_TLB = 0x0000008000000000ULL, | ||
464 | + /* More BookE (embedded) instructions... */ | ||
465 | + PPC_BOOKE_EXT = 0x0000010000000000ULL, | ||
466 | + /* rfmci is not implemented in all BookE PowerPC */ | ||
467 | + PPC_RFMCI = 0x0000020000000000ULL, | ||
468 | + /* user-mode DCR access, implemented in PowerPC 460 */ | ||
469 | + PPC_DCRUX = 0x0000040000000000ULL, | ||
470 | +}; | ||
471 | + | ||
472 | +/*****************************************************************************/ | ||
473 | +/* PowerPC instructions table */ | ||
368 | #if HOST_LONG_BITS == 64 | 474 | #if HOST_LONG_BITS == 64 |
369 | #define OPC_ALIGN 8 | 475 | #define OPC_ALIGN 8 |
370 | #else | 476 | #else |
@@ -845,15 +951,15 @@ GEN_HANDLER(subfic, 0x08, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) | @@ -845,15 +951,15 @@ GEN_HANDLER(subfic, 0x08, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) | ||
845 | 951 | ||
846 | #if defined(TARGET_PPC64) | 952 | #if defined(TARGET_PPC64) |
847 | /* mulhd mulhd. */ | 953 | /* mulhd mulhd. */ |
848 | -GEN_INT_ARITHN (mulhd, 0x1F, 0x09, 0x02, PPC_INTEGER); | 954 | +GEN_INT_ARITHN (mulhd, 0x1F, 0x09, 0x02, PPC_64B); |
849 | /* mulhdu mulhdu. */ | 955 | /* mulhdu mulhdu. */ |
850 | -GEN_INT_ARITHN (mulhdu, 0x1F, 0x09, 0x00, PPC_INTEGER); | 956 | +GEN_INT_ARITHN (mulhdu, 0x1F, 0x09, 0x00, PPC_64B); |
851 | /* mulld mulld. mulldo mulldo. */ | 957 | /* mulld mulld. mulldo mulldo. */ |
852 | -GEN_INT_ARITH2 (mulld, 0x1F, 0x09, 0x07, PPC_INTEGER); | 958 | +GEN_INT_ARITH2 (mulld, 0x1F, 0x09, 0x07, PPC_64B); |
853 | /* divd divd. divdo divdo. */ | 959 | /* divd divd. divdo divdo. */ |
854 | -GEN_INT_ARITH2 (divd, 0x1F, 0x09, 0x0F, PPC_INTEGER); | 960 | +GEN_INT_ARITH2 (divd, 0x1F, 0x09, 0x0F, PPC_64B); |
855 | /* divdu divdu. divduo divduo. */ | 961 | /* divdu divdu. divduo divduo. */ |
856 | -GEN_INT_ARITH2 (divdu, 0x1F, 0x09, 0x0E, PPC_INTEGER); | 962 | +GEN_INT_ARITH2 (divdu, 0x1F, 0x09, 0x0E, PPC_64B); |
857 | #endif | 963 | #endif |
858 | 964 | ||
859 | /*** Integer comparison ***/ | 965 | /*** Integer comparison ***/ |
@@ -1424,8 +1530,8 @@ __GEN_LOGICAL2(srd, 0x1B, 0x10, PPC_64B); | @@ -1424,8 +1530,8 @@ __GEN_LOGICAL2(srd, 0x1B, 0x10, PPC_64B); | ||
1424 | #endif | 1530 | #endif |
1425 | 1531 | ||
1426 | /*** Floating-Point arithmetic ***/ | 1532 | /*** Floating-Point arithmetic ***/ |
1427 | -#define _GEN_FLOAT_ACB(name, op, op1, op2, isfloat) \ | ||
1428 | -GEN_HANDLER(f##name, op1, op2, 0xFF, 0x00000000, PPC_FLOAT) \ | 1533 | +#define _GEN_FLOAT_ACB(name, op, op1, op2, isfloat, type) \ |
1534 | +GEN_HANDLER(f##name, op1, op2, 0xFF, 0x00000000, type) \ | ||
1429 | { \ | 1535 | { \ |
1430 | if (unlikely(!ctx->fpu_enabled)) { \ | 1536 | if (unlikely(!ctx->fpu_enabled)) { \ |
1431 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ | 1537 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ |
@@ -1444,9 +1550,9 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, 0x00000000, PPC_FLOAT) \ | @@ -1444,9 +1550,9 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, 0x00000000, PPC_FLOAT) \ | ||
1444 | gen_op_set_Rc1(); \ | 1550 | gen_op_set_Rc1(); \ |
1445 | } | 1551 | } |
1446 | 1552 | ||
1447 | -#define GEN_FLOAT_ACB(name, op2) \ | ||
1448 | -_GEN_FLOAT_ACB(name, name, 0x3F, op2, 0); \ | ||
1449 | -_GEN_FLOAT_ACB(name##s, name, 0x3B, op2, 1); | 1553 | +#define GEN_FLOAT_ACB(name, op2, type) \ |
1554 | +_GEN_FLOAT_ACB(name, name, 0x3F, op2, 0, type); \ | ||
1555 | +_GEN_FLOAT_ACB(name##s, name, 0x3B, op2, 1, type); | ||
1450 | 1556 | ||
1451 | #define _GEN_FLOAT_AB(name, op, op1, op2, inval, isfloat) \ | 1557 | #define _GEN_FLOAT_AB(name, op, op1, op2, inval, isfloat) \ |
1452 | GEN_HANDLER(f##name, op1, op2, 0xFF, inval, PPC_FLOAT) \ | 1558 | GEN_HANDLER(f##name, op1, op2, 0xFF, inval, PPC_FLOAT) \ |
@@ -1492,8 +1598,8 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, inval, PPC_FLOAT) \ | @@ -1492,8 +1598,8 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, inval, PPC_FLOAT) \ | ||
1492 | _GEN_FLOAT_AC(name, name, 0x3F, op2, inval, 0); \ | 1598 | _GEN_FLOAT_AC(name, name, 0x3F, op2, inval, 0); \ |
1493 | _GEN_FLOAT_AC(name##s, name, 0x3B, op2, inval, 1); | 1599 | _GEN_FLOAT_AC(name##s, name, 0x3B, op2, inval, 1); |
1494 | 1600 | ||
1495 | -#define GEN_FLOAT_B(name, op2, op3) \ | ||
1496 | -GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, PPC_FLOAT) \ | 1601 | +#define GEN_FLOAT_B(name, op2, op3, type) \ |
1602 | +GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, type) \ | ||
1497 | { \ | 1603 | { \ |
1498 | if (unlikely(!ctx->fpu_enabled)) { \ | 1604 | if (unlikely(!ctx->fpu_enabled)) { \ |
1499 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ | 1605 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ |
@@ -1507,8 +1613,8 @@ GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, PPC_FLOAT) \ | @@ -1507,8 +1613,8 @@ GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, PPC_FLOAT) \ | ||
1507 | gen_op_set_Rc1(); \ | 1613 | gen_op_set_Rc1(); \ |
1508 | } | 1614 | } |
1509 | 1615 | ||
1510 | -#define GEN_FLOAT_BS(name, op1, op2) \ | ||
1511 | -GEN_HANDLER(f##name, op1, op2, 0xFF, 0x001F07C0, PPC_FLOAT) \ | 1616 | +#define GEN_FLOAT_BS(name, op1, op2, type) \ |
1617 | +GEN_HANDLER(f##name, op1, op2, 0xFF, 0x001F07C0, type) \ | ||
1512 | { \ | 1618 | { \ |
1513 | if (unlikely(!ctx->fpu_enabled)) { \ | 1619 | if (unlikely(!ctx->fpu_enabled)) { \ |
1514 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ | 1620 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ |
@@ -1529,19 +1635,19 @@ GEN_FLOAT_AB(div, 0x12, 0x000007C0); | @@ -1529,19 +1635,19 @@ GEN_FLOAT_AB(div, 0x12, 0x000007C0); | ||
1529 | /* fmul - fmuls */ | 1635 | /* fmul - fmuls */ |
1530 | GEN_FLOAT_AC(mul, 0x19, 0x0000F800); | 1636 | GEN_FLOAT_AC(mul, 0x19, 0x0000F800); |
1531 | 1637 | ||
1532 | -/* fres */ /* XXX: not in 601 */ | ||
1533 | -GEN_FLOAT_BS(res, 0x3B, 0x18); | 1638 | +/* fres */ |
1639 | +GEN_FLOAT_BS(res, 0x3B, 0x18, PPC_FLOAT_FRES); | ||
1534 | 1640 | ||
1535 | -/* frsqrte */ /* XXX: not in 601 */ | ||
1536 | -GEN_FLOAT_BS(rsqrte, 0x3F, 0x1A); | 1641 | +/* frsqrte */ |
1642 | +GEN_FLOAT_BS(rsqrte, 0x3F, 0x1A, PPC_FLOAT_FRSQRTE); | ||
1537 | 1643 | ||
1538 | -/* fsel */ /* XXX: not in 601 */ | ||
1539 | -_GEN_FLOAT_ACB(sel, sel, 0x3F, 0x17, 0); | 1644 | +/* fsel */ |
1645 | +_GEN_FLOAT_ACB(sel, sel, 0x3F, 0x17, 0, PPC_FLOAT_FSEL); | ||
1540 | /* fsub - fsubs */ | 1646 | /* fsub - fsubs */ |
1541 | GEN_FLOAT_AB(sub, 0x14, 0x000007C0); | 1647 | GEN_FLOAT_AB(sub, 0x14, 0x000007C0); |
1542 | /* Optional: */ | 1648 | /* Optional: */ |
1543 | /* fsqrt */ | 1649 | /* fsqrt */ |
1544 | -GEN_HANDLER(fsqrt, 0x3F, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT) | 1650 | +GEN_HANDLER(fsqrt, 0x3F, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_FSQRT) |
1545 | { | 1651 | { |
1546 | if (unlikely(!ctx->fpu_enabled)) { | 1652 | if (unlikely(!ctx->fpu_enabled)) { |
1547 | RET_EXCP(ctx, EXCP_NO_FP, 0); | 1653 | RET_EXCP(ctx, EXCP_NO_FP, 0); |
@@ -1555,7 +1661,7 @@ GEN_HANDLER(fsqrt, 0x3F, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT) | @@ -1555,7 +1661,7 @@ GEN_HANDLER(fsqrt, 0x3F, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT) | ||
1555 | gen_op_set_Rc1(); | 1661 | gen_op_set_Rc1(); |
1556 | } | 1662 | } |
1557 | 1663 | ||
1558 | -GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT) | 1664 | +GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_FSQRT) |
1559 | { | 1665 | { |
1560 | if (unlikely(!ctx->fpu_enabled)) { | 1666 | if (unlikely(!ctx->fpu_enabled)) { |
1561 | RET_EXCP(ctx, EXCP_NO_FP, 0); | 1667 | RET_EXCP(ctx, EXCP_NO_FP, 0); |
@@ -1572,28 +1678,28 @@ GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT) | @@ -1572,28 +1678,28 @@ GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT) | ||
1572 | 1678 | ||
1573 | /*** Floating-Point multiply-and-add ***/ | 1679 | /*** Floating-Point multiply-and-add ***/ |
1574 | /* fmadd - fmadds */ | 1680 | /* fmadd - fmadds */ |
1575 | -GEN_FLOAT_ACB(madd, 0x1D); | 1681 | +GEN_FLOAT_ACB(madd, 0x1D, PPC_FLOAT); |
1576 | /* fmsub - fmsubs */ | 1682 | /* fmsub - fmsubs */ |
1577 | -GEN_FLOAT_ACB(msub, 0x1C); | 1683 | +GEN_FLOAT_ACB(msub, 0x1C, PPC_FLOAT); |
1578 | /* fnmadd - fnmadds */ | 1684 | /* fnmadd - fnmadds */ |
1579 | -GEN_FLOAT_ACB(nmadd, 0x1F); | 1685 | +GEN_FLOAT_ACB(nmadd, 0x1F, PPC_FLOAT); |
1580 | /* fnmsub - fnmsubs */ | 1686 | /* fnmsub - fnmsubs */ |
1581 | -GEN_FLOAT_ACB(nmsub, 0x1E); | 1687 | +GEN_FLOAT_ACB(nmsub, 0x1E, PPC_FLOAT); |
1582 | 1688 | ||
1583 | /*** Floating-Point round & convert ***/ | 1689 | /*** Floating-Point round & convert ***/ |
1584 | /* fctiw */ | 1690 | /* fctiw */ |
1585 | -GEN_FLOAT_B(ctiw, 0x0E, 0x00); | 1691 | +GEN_FLOAT_B(ctiw, 0x0E, 0x00, PPC_FLOAT); |
1586 | /* fctiwz */ | 1692 | /* fctiwz */ |
1587 | -GEN_FLOAT_B(ctiwz, 0x0F, 0x00); | 1693 | +GEN_FLOAT_B(ctiwz, 0x0F, 0x00, PPC_FLOAT); |
1588 | /* frsp */ | 1694 | /* frsp */ |
1589 | -GEN_FLOAT_B(rsp, 0x0C, 0x00); | 1695 | +GEN_FLOAT_B(rsp, 0x0C, 0x00, PPC_FLOAT); |
1590 | #if defined(TARGET_PPC64) | 1696 | #if defined(TARGET_PPC64) |
1591 | /* fcfid */ | 1697 | /* fcfid */ |
1592 | -GEN_FLOAT_B(cfid, 0x0E, 0x1A); | 1698 | +GEN_FLOAT_B(cfid, 0x0E, 0x1A, PPC_64B); |
1593 | /* fctid */ | 1699 | /* fctid */ |
1594 | -GEN_FLOAT_B(ctid, 0x0E, 0x19); | 1700 | +GEN_FLOAT_B(ctid, 0x0E, 0x19, PPC_64B); |
1595 | /* fctidz */ | 1701 | /* fctidz */ |
1596 | -GEN_FLOAT_B(ctidz, 0x0F, 0x19); | 1702 | +GEN_FLOAT_B(ctidz, 0x0F, 0x19, PPC_64B); |
1597 | #endif | 1703 | #endif |
1598 | 1704 | ||
1599 | /*** Floating-Point compare ***/ | 1705 | /*** Floating-Point compare ***/ |
@@ -1627,7 +1733,7 @@ GEN_HANDLER(fcmpu, 0x3F, 0x00, 0x00, 0x00600001, PPC_FLOAT) | @@ -1627,7 +1733,7 @@ GEN_HANDLER(fcmpu, 0x3F, 0x00, 0x00, 0x00600001, PPC_FLOAT) | ||
1627 | 1733 | ||
1628 | /*** Floating-point move ***/ | 1734 | /*** Floating-point move ***/ |
1629 | /* fabs */ | 1735 | /* fabs */ |
1630 | -GEN_FLOAT_B(abs, 0x08, 0x08); | 1736 | +GEN_FLOAT_B(abs, 0x08, 0x08, PPC_FLOAT); |
1631 | 1737 | ||
1632 | /* fmr - fmr. */ | 1738 | /* fmr - fmr. */ |
1633 | GEN_HANDLER(fmr, 0x3F, 0x08, 0x02, 0x001F0000, PPC_FLOAT) | 1739 | GEN_HANDLER(fmr, 0x3F, 0x08, 0x02, 0x001F0000, PPC_FLOAT) |
@@ -1644,9 +1750,9 @@ GEN_HANDLER(fmr, 0x3F, 0x08, 0x02, 0x001F0000, PPC_FLOAT) | @@ -1644,9 +1750,9 @@ GEN_HANDLER(fmr, 0x3F, 0x08, 0x02, 0x001F0000, PPC_FLOAT) | ||
1644 | } | 1750 | } |
1645 | 1751 | ||
1646 | /* fnabs */ | 1752 | /* fnabs */ |
1647 | -GEN_FLOAT_B(nabs, 0x08, 0x04); | 1753 | +GEN_FLOAT_B(nabs, 0x08, 0x04, PPC_FLOAT); |
1648 | /* fneg */ | 1754 | /* fneg */ |
1649 | -GEN_FLOAT_B(neg, 0x08, 0x01); | 1755 | +GEN_FLOAT_B(neg, 0x08, 0x01, PPC_FLOAT); |
1650 | 1756 | ||
1651 | /*** Floating-Point status & ctrl register ***/ | 1757 | /*** Floating-Point status & ctrl register ***/ |
1652 | /* mcrfs */ | 1758 | /* mcrfs */ |
@@ -2426,7 +2532,7 @@ static GenOpFunc *gen_op_stdcx[] = { | @@ -2426,7 +2532,7 @@ static GenOpFunc *gen_op_stdcx[] = { | ||
2426 | #endif | 2532 | #endif |
2427 | 2533 | ||
2428 | /* ldarx */ | 2534 | /* ldarx */ |
2429 | -GEN_HANDLER(ldarx, 0x1F, 0x14, 0x02, 0x00000001, PPC_RES) | 2535 | +GEN_HANDLER(ldarx, 0x1F, 0x14, 0x02, 0x00000001, PPC_64B) |
2430 | { | 2536 | { |
2431 | gen_addr_reg_index(ctx); | 2537 | gen_addr_reg_index(ctx); |
2432 | op_ldarx(); | 2538 | op_ldarx(); |
@@ -2434,7 +2540,7 @@ GEN_HANDLER(ldarx, 0x1F, 0x14, 0x02, 0x00000001, PPC_RES) | @@ -2434,7 +2540,7 @@ GEN_HANDLER(ldarx, 0x1F, 0x14, 0x02, 0x00000001, PPC_RES) | ||
2434 | } | 2540 | } |
2435 | 2541 | ||
2436 | /* stdcx. */ | 2542 | /* stdcx. */ |
2437 | -GEN_HANDLER(stdcx_, 0x1F, 0x16, 0x06, 0x00000000, PPC_RES) | 2543 | +GEN_HANDLER(stdcx_, 0x1F, 0x16, 0x06, 0x00000000, PPC_64B) |
2438 | { | 2544 | { |
2439 | gen_addr_reg_index(ctx); | 2545 | gen_addr_reg_index(ctx); |
2440 | gen_op_load_gpr_T1(rS(ctx->opcode)); | 2546 | gen_op_load_gpr_T1(rS(ctx->opcode)); |
@@ -2591,7 +2697,7 @@ GEN_STFS(fs, 0x14); | @@ -2591,7 +2697,7 @@ GEN_STFS(fs, 0x14); | ||
2591 | 2697 | ||
2592 | /* Optional: */ | 2698 | /* Optional: */ |
2593 | /* stfiwx */ | 2699 | /* stfiwx */ |
2594 | -GEN_HANDLER(stfiwx, 0x1F, 0x17, 0x1E, 0x00000001, PPC_FLOAT) | 2700 | +GEN_HANDLER(stfiwx, 0x1F, 0x17, 0x1E, 0x00000001, PPC_FLOAT_STFIWX) |
2595 | { | 2701 | { |
2596 | if (unlikely(!ctx->fpu_enabled)) { | 2702 | if (unlikely(!ctx->fpu_enabled)) { |
2597 | RET_EXCP(ctx, EXCP_NO_FP, 0); | 2703 | RET_EXCP(ctx, EXCP_NO_FP, 0); |
@@ -2886,7 +2992,7 @@ GEN_HANDLER(rfi, 0x13, 0x12, 0x01, 0x03FF8001, PPC_FLOW) | @@ -2886,7 +2992,7 @@ GEN_HANDLER(rfi, 0x13, 0x12, 0x01, 0x03FF8001, PPC_FLOW) | ||
2886 | } | 2992 | } |
2887 | 2993 | ||
2888 | #if defined(TARGET_PPC64) | 2994 | #if defined(TARGET_PPC64) |
2889 | -GEN_HANDLER(rfid, 0x13, 0x12, 0x00, 0x03FF8001, PPC_FLOW) | 2995 | +GEN_HANDLER(rfid, 0x13, 0x12, 0x00, 0x03FF8001, PPC_64B) |
2890 | { | 2996 | { |
2891 | #if defined(CONFIG_USER_ONLY) | 2997 | #if defined(CONFIG_USER_ONLY) |
2892 | RET_PRIVOPC(ctx); | 2998 | RET_PRIVOPC(ctx); |
@@ -3050,7 +3156,7 @@ GEN_HANDLER(mfspr, 0x1F, 0x13, 0x0A, 0x00000001, PPC_MISC) | @@ -3050,7 +3156,7 @@ GEN_HANDLER(mfspr, 0x1F, 0x13, 0x0A, 0x00000001, PPC_MISC) | ||
3050 | } | 3156 | } |
3051 | 3157 | ||
3052 | /* mftb */ | 3158 | /* mftb */ |
3053 | -GEN_HANDLER(mftb, 0x1F, 0x13, 0x0B, 0x00000001, PPC_TB) | 3159 | +GEN_HANDLER(mftb, 0x1F, 0x13, 0x0B, 0x00000001, PPC_MFTB) |
3054 | { | 3160 | { |
3055 | gen_op_mfspr(ctx); | 3161 | gen_op_mfspr(ctx); |
3056 | } | 3162 | } |
@@ -3074,7 +3180,7 @@ GEN_HANDLER(mtcrf, 0x1F, 0x10, 0x04, 0x00000801, PPC_MISC) | @@ -3074,7 +3180,7 @@ GEN_HANDLER(mtcrf, 0x1F, 0x10, 0x04, 0x00000801, PPC_MISC) | ||
3074 | 3180 | ||
3075 | /* mtmsr */ | 3181 | /* mtmsr */ |
3076 | #if defined(TARGET_PPC64) | 3182 | #if defined(TARGET_PPC64) |
3077 | -GEN_HANDLER(mtmsrd, 0x1F, 0x12, 0x05, 0x001FF801, PPC_MISC) | 3183 | +GEN_HANDLER(mtmsrd, 0x1F, 0x12, 0x05, 0x001FF801, PPC_64B) |
3078 | { | 3184 | { |
3079 | #if defined(CONFIG_USER_ONLY) | 3185 | #if defined(CONFIG_USER_ONLY) |
3080 | RET_PRIVREG(ctx); | 3186 | RET_PRIVREG(ctx); |
@@ -3296,7 +3402,7 @@ GEN_HANDLER(icbi, 0x1F, 0x16, 0x1E, 0x03E00001, PPC_CACHE) | @@ -3296,7 +3402,7 @@ GEN_HANDLER(icbi, 0x1F, 0x16, 0x1E, 0x03E00001, PPC_CACHE) | ||
3296 | 3402 | ||
3297 | /* Optional: */ | 3403 | /* Optional: */ |
3298 | /* dcba */ | 3404 | /* dcba */ |
3299 | -GEN_HANDLER(dcba, 0x1F, 0x16, 0x17, 0x03E00001, PPC_CACHE_OPT) | 3405 | +GEN_HANDLER(dcba, 0x1F, 0x16, 0x17, 0x03E00001, PPC_CACHE_DCBA) |
3300 | { | 3406 | { |
3301 | } | 3407 | } |
3302 | 3408 | ||
@@ -3568,7 +3674,7 @@ GEN_HANDLER(abso, 0x1F, 0x08, 0x1B, 0x0000F800, PPC_POWER_BR) | @@ -3568,7 +3674,7 @@ GEN_HANDLER(abso, 0x1F, 0x08, 0x1B, 0x0000F800, PPC_POWER_BR) | ||
3568 | } | 3674 | } |
3569 | 3675 | ||
3570 | /* clcs */ | 3676 | /* clcs */ |
3571 | -GEN_HANDLER(clcs, 0x1F, 0x10, 0x13, 0x0000F800, PPC_POWER_BR) /* 601 ? */ | 3677 | +GEN_HANDLER(clcs, 0x1F, 0x10, 0x13, 0x0000F800, PPC_POWER_BR) |
3572 | { | 3678 | { |
3573 | gen_op_load_gpr_T0(rA(ctx->opcode)); | 3679 | gen_op_load_gpr_T0(rA(ctx->opcode)); |
3574 | gen_op_POWER_clcs(); | 3680 | gen_op_POWER_clcs(); |
@@ -4222,14 +4328,14 @@ GEN_HANDLER(stfqx, 0x1F, 0x17, 0x1C, 0x00000001, PPC_POWER2) | @@ -4222,14 +4328,14 @@ GEN_HANDLER(stfqx, 0x1F, 0x17, 0x1C, 0x00000001, PPC_POWER2) | ||
4222 | 4328 | ||
4223 | /* BookE specific instructions */ | 4329 | /* BookE specific instructions */ |
4224 | /* XXX: not implemented on 440 ? */ | 4330 | /* XXX: not implemented on 440 ? */ |
4225 | -GEN_HANDLER(mfapidi, 0x1F, 0x13, 0x08, 0x0000F801, PPC_BOOKE) | 4331 | +GEN_HANDLER(mfapidi, 0x1F, 0x13, 0x08, 0x0000F801, PPC_BOOKE_EXT) |
4226 | { | 4332 | { |
4227 | /* XXX: TODO */ | 4333 | /* XXX: TODO */ |
4228 | RET_INVAL(ctx); | 4334 | RET_INVAL(ctx); |
4229 | } | 4335 | } |
4230 | 4336 | ||
4231 | /* XXX: not implemented on 440 ? */ | 4337 | /* XXX: not implemented on 440 ? */ |
4232 | -GEN_HANDLER(tlbiva, 0x1F, 0x12, 0x18, 0x03FFF801, PPC_BOOKE) | 4338 | +GEN_HANDLER(tlbiva, 0x1F, 0x12, 0x18, 0x03FFF801, PPC_BOOKE_EXT) |
4233 | { | 4339 | { |
4234 | #if defined(CONFIG_USER_ONLY) | 4340 | #if defined(CONFIG_USER_ONLY) |
4235 | RET_PRIVOPC(ctx); | 4341 | RET_PRIVOPC(ctx); |
@@ -4331,99 +4437,98 @@ static inline void gen_405_mulladd_insn (DisasContext *ctx, int opc2, int opc3, | @@ -4331,99 +4437,98 @@ static inline void gen_405_mulladd_insn (DisasContext *ctx, int opc2, int opc3, | ||
4331 | } | 4437 | } |
4332 | } | 4438 | } |
4333 | 4439 | ||
4334 | -#define GEN_MAC_HANDLER(name, opc2, opc3, is_440) \ | ||
4335 | -GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, \ | ||
4336 | - is_440 ? PPC_440_SPEC : PPC_405_MAC) \ | 4440 | +#define GEN_MAC_HANDLER(name, opc2, opc3) \ |
4441 | +GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_405_MAC) \ | ||
4337 | { \ | 4442 | { \ |
4338 | gen_405_mulladd_insn(ctx, opc2, opc3, rA(ctx->opcode), rB(ctx->opcode), \ | 4443 | gen_405_mulladd_insn(ctx, opc2, opc3, rA(ctx->opcode), rB(ctx->opcode), \ |
4339 | rD(ctx->opcode), Rc(ctx->opcode)); \ | 4444 | rD(ctx->opcode), Rc(ctx->opcode)); \ |
4340 | } | 4445 | } |
4341 | 4446 | ||
4342 | /* macchw - macchw. */ | 4447 | /* macchw - macchw. */ |
4343 | -GEN_MAC_HANDLER(macchw, 0x0C, 0x05, 0); | 4448 | +GEN_MAC_HANDLER(macchw, 0x0C, 0x05); |
4344 | /* macchwo - macchwo. */ | 4449 | /* macchwo - macchwo. */ |
4345 | -GEN_MAC_HANDLER(macchwo, 0x0C, 0x15, 0); | 4450 | +GEN_MAC_HANDLER(macchwo, 0x0C, 0x15); |
4346 | /* macchws - macchws. */ | 4451 | /* macchws - macchws. */ |
4347 | -GEN_MAC_HANDLER(macchws, 0x0C, 0x07, 0); | 4452 | +GEN_MAC_HANDLER(macchws, 0x0C, 0x07); |
4348 | /* macchwso - macchwso. */ | 4453 | /* macchwso - macchwso. */ |
4349 | -GEN_MAC_HANDLER(macchwso, 0x0C, 0x17, 0); | 4454 | +GEN_MAC_HANDLER(macchwso, 0x0C, 0x17); |
4350 | /* macchwsu - macchwsu. */ | 4455 | /* macchwsu - macchwsu. */ |
4351 | -GEN_MAC_HANDLER(macchwsu, 0x0C, 0x06, 0); | 4456 | +GEN_MAC_HANDLER(macchwsu, 0x0C, 0x06); |
4352 | /* macchwsuo - macchwsuo. */ | 4457 | /* macchwsuo - macchwsuo. */ |
4353 | -GEN_MAC_HANDLER(macchwsuo, 0x0C, 0x16, 0); | 4458 | +GEN_MAC_HANDLER(macchwsuo, 0x0C, 0x16); |
4354 | /* macchwu - macchwu. */ | 4459 | /* macchwu - macchwu. */ |
4355 | -GEN_MAC_HANDLER(macchwu, 0x0C, 0x04, 0); | 4460 | +GEN_MAC_HANDLER(macchwu, 0x0C, 0x04); |
4356 | /* macchwuo - macchwuo. */ | 4461 | /* macchwuo - macchwuo. */ |
4357 | -GEN_MAC_HANDLER(macchwuo, 0x0C, 0x14, 0); | 4462 | +GEN_MAC_HANDLER(macchwuo, 0x0C, 0x14); |
4358 | /* machhw - machhw. */ | 4463 | /* machhw - machhw. */ |
4359 | -GEN_MAC_HANDLER(machhw, 0x0C, 0x01, 0); | 4464 | +GEN_MAC_HANDLER(machhw, 0x0C, 0x01); |
4360 | /* machhwo - machhwo. */ | 4465 | /* machhwo - machhwo. */ |
4361 | -GEN_MAC_HANDLER(machhwo, 0x0C, 0x11, 0); | 4466 | +GEN_MAC_HANDLER(machhwo, 0x0C, 0x11); |
4362 | /* machhws - machhws. */ | 4467 | /* machhws - machhws. */ |
4363 | -GEN_MAC_HANDLER(machhws, 0x0C, 0x03, 0); | 4468 | +GEN_MAC_HANDLER(machhws, 0x0C, 0x03); |
4364 | /* machhwso - machhwso. */ | 4469 | /* machhwso - machhwso. */ |
4365 | -GEN_MAC_HANDLER(machhwso, 0x0C, 0x13, 0); | 4470 | +GEN_MAC_HANDLER(machhwso, 0x0C, 0x13); |
4366 | /* machhwsu - machhwsu. */ | 4471 | /* machhwsu - machhwsu. */ |
4367 | -GEN_MAC_HANDLER(machhwsu, 0x0C, 0x02, 0); | 4472 | +GEN_MAC_HANDLER(machhwsu, 0x0C, 0x02); |
4368 | /* machhwsuo - machhwsuo. */ | 4473 | /* machhwsuo - machhwsuo. */ |
4369 | -GEN_MAC_HANDLER(machhwsuo, 0x0C, 0x12, 0); | 4474 | +GEN_MAC_HANDLER(machhwsuo, 0x0C, 0x12); |
4370 | /* machhwu - machhwu. */ | 4475 | /* machhwu - machhwu. */ |
4371 | -GEN_MAC_HANDLER(machhwu, 0x0C, 0x00, 0); | 4476 | +GEN_MAC_HANDLER(machhwu, 0x0C, 0x00); |
4372 | /* machhwuo - machhwuo. */ | 4477 | /* machhwuo - machhwuo. */ |
4373 | -GEN_MAC_HANDLER(machhwuo, 0x0C, 0x10, 0); | 4478 | +GEN_MAC_HANDLER(machhwuo, 0x0C, 0x10); |
4374 | /* maclhw - maclhw. */ | 4479 | /* maclhw - maclhw. */ |
4375 | -GEN_MAC_HANDLER(maclhw, 0x0C, 0x0D, 0); | 4480 | +GEN_MAC_HANDLER(maclhw, 0x0C, 0x0D); |
4376 | /* maclhwo - maclhwo. */ | 4481 | /* maclhwo - maclhwo. */ |
4377 | -GEN_MAC_HANDLER(maclhwo, 0x0C, 0x1D, 0); | 4482 | +GEN_MAC_HANDLER(maclhwo, 0x0C, 0x1D); |
4378 | /* maclhws - maclhws. */ | 4483 | /* maclhws - maclhws. */ |
4379 | -GEN_MAC_HANDLER(maclhws, 0x0C, 0x0F, 0); | 4484 | +GEN_MAC_HANDLER(maclhws, 0x0C, 0x0F); |
4380 | /* maclhwso - maclhwso. */ | 4485 | /* maclhwso - maclhwso. */ |
4381 | -GEN_MAC_HANDLER(maclhwso, 0x0C, 0x1F, 0); | 4486 | +GEN_MAC_HANDLER(maclhwso, 0x0C, 0x1F); |
4382 | /* maclhwu - maclhwu. */ | 4487 | /* maclhwu - maclhwu. */ |
4383 | -GEN_MAC_HANDLER(maclhwu, 0x0C, 0x0C, 0); | 4488 | +GEN_MAC_HANDLER(maclhwu, 0x0C, 0x0C); |
4384 | /* maclhwuo - maclhwuo. */ | 4489 | /* maclhwuo - maclhwuo. */ |
4385 | -GEN_MAC_HANDLER(maclhwuo, 0x0C, 0x1C, 0); | 4490 | +GEN_MAC_HANDLER(maclhwuo, 0x0C, 0x1C); |
4386 | /* maclhwsu - maclhwsu. */ | 4491 | /* maclhwsu - maclhwsu. */ |
4387 | -GEN_MAC_HANDLER(maclhwsu, 0x0C, 0x0E, 0); | 4492 | +GEN_MAC_HANDLER(maclhwsu, 0x0C, 0x0E); |
4388 | /* maclhwsuo - maclhwsuo. */ | 4493 | /* maclhwsuo - maclhwsuo. */ |
4389 | -GEN_MAC_HANDLER(maclhwsuo, 0x0C, 0x1E, 0); | 4494 | +GEN_MAC_HANDLER(maclhwsuo, 0x0C, 0x1E); |
4390 | /* nmacchw - nmacchw. */ | 4495 | /* nmacchw - nmacchw. */ |
4391 | -GEN_MAC_HANDLER(nmacchw, 0x0E, 0x05, 0); | 4496 | +GEN_MAC_HANDLER(nmacchw, 0x0E, 0x05); |
4392 | /* nmacchwo - nmacchwo. */ | 4497 | /* nmacchwo - nmacchwo. */ |
4393 | -GEN_MAC_HANDLER(nmacchwo, 0x0E, 0x15, 0); | 4498 | +GEN_MAC_HANDLER(nmacchwo, 0x0E, 0x15); |
4394 | /* nmacchws - nmacchws. */ | 4499 | /* nmacchws - nmacchws. */ |
4395 | -GEN_MAC_HANDLER(nmacchws, 0x0E, 0x07, 0); | 4500 | +GEN_MAC_HANDLER(nmacchws, 0x0E, 0x07); |
4396 | /* nmacchwso - nmacchwso. */ | 4501 | /* nmacchwso - nmacchwso. */ |
4397 | -GEN_MAC_HANDLER(nmacchwso, 0x0E, 0x17, 0); | 4502 | +GEN_MAC_HANDLER(nmacchwso, 0x0E, 0x17); |
4398 | /* nmachhw - nmachhw. */ | 4503 | /* nmachhw - nmachhw. */ |
4399 | -GEN_MAC_HANDLER(nmachhw, 0x0E, 0x01, 0); | 4504 | +GEN_MAC_HANDLER(nmachhw, 0x0E, 0x01); |
4400 | /* nmachhwo - nmachhwo. */ | 4505 | /* nmachhwo - nmachhwo. */ |
4401 | -GEN_MAC_HANDLER(nmachhwo, 0x0E, 0x11, 0); | 4506 | +GEN_MAC_HANDLER(nmachhwo, 0x0E, 0x11); |
4402 | /* nmachhws - nmachhws. */ | 4507 | /* nmachhws - nmachhws. */ |
4403 | -GEN_MAC_HANDLER(nmachhws, 0x0E, 0x03, 1); | 4508 | +GEN_MAC_HANDLER(nmachhws, 0x0E, 0x03); |
4404 | /* nmachhwso - nmachhwso. */ | 4509 | /* nmachhwso - nmachhwso. */ |
4405 | -GEN_MAC_HANDLER(nmachhwso, 0x0E, 0x13, 1); | 4510 | +GEN_MAC_HANDLER(nmachhwso, 0x0E, 0x13); |
4406 | /* nmaclhw - nmaclhw. */ | 4511 | /* nmaclhw - nmaclhw. */ |
4407 | -GEN_MAC_HANDLER(nmaclhw, 0x0E, 0x0D, 1); | 4512 | +GEN_MAC_HANDLER(nmaclhw, 0x0E, 0x0D); |
4408 | /* nmaclhwo - nmaclhwo. */ | 4513 | /* nmaclhwo - nmaclhwo. */ |
4409 | -GEN_MAC_HANDLER(nmaclhwo, 0x0E, 0x1D, 1); | 4514 | +GEN_MAC_HANDLER(nmaclhwo, 0x0E, 0x1D); |
4410 | /* nmaclhws - nmaclhws. */ | 4515 | /* nmaclhws - nmaclhws. */ |
4411 | -GEN_MAC_HANDLER(nmaclhws, 0x0E, 0x0F, 1); | 4516 | +GEN_MAC_HANDLER(nmaclhws, 0x0E, 0x0F); |
4412 | /* nmaclhwso - nmaclhwso. */ | 4517 | /* nmaclhwso - nmaclhwso. */ |
4413 | -GEN_MAC_HANDLER(nmaclhwso, 0x0E, 0x1F, 1); | 4518 | +GEN_MAC_HANDLER(nmaclhwso, 0x0E, 0x1F); |
4414 | 4519 | ||
4415 | /* mulchw - mulchw. */ | 4520 | /* mulchw - mulchw. */ |
4416 | -GEN_MAC_HANDLER(mulchw, 0x08, 0x05, 0); | 4521 | +GEN_MAC_HANDLER(mulchw, 0x08, 0x05); |
4417 | /* mulchwu - mulchwu. */ | 4522 | /* mulchwu - mulchwu. */ |
4418 | -GEN_MAC_HANDLER(mulchwu, 0x08, 0x04, 0); | 4523 | +GEN_MAC_HANDLER(mulchwu, 0x08, 0x04); |
4419 | /* mulhhw - mulhhw. */ | 4524 | /* mulhhw - mulhhw. */ |
4420 | -GEN_MAC_HANDLER(mulhhw, 0x08, 0x01, 0); | 4525 | +GEN_MAC_HANDLER(mulhhw, 0x08, 0x01); |
4421 | /* mulhhwu - mulhhwu. */ | 4526 | /* mulhhwu - mulhhwu. */ |
4422 | -GEN_MAC_HANDLER(mulhhwu, 0x08, 0x00, 0); | 4527 | +GEN_MAC_HANDLER(mulhhwu, 0x08, 0x00); |
4423 | /* mullhw - mullhw. */ | 4528 | /* mullhw - mullhw. */ |
4424 | -GEN_MAC_HANDLER(mullhw, 0x08, 0x0D, 0); | 4529 | +GEN_MAC_HANDLER(mullhw, 0x08, 0x0D); |
4425 | /* mullhwu - mullhwu. */ | 4530 | /* mullhwu - mullhwu. */ |
4426 | -GEN_MAC_HANDLER(mullhwu, 0x08, 0x0C, 0); | 4531 | +GEN_MAC_HANDLER(mullhwu, 0x08, 0x0C); |
4427 | 4532 | ||
4428 | /* mfdcr */ | 4533 | /* mfdcr */ |
4429 | GEN_HANDLER(mfdcr, 0x1F, 0x03, 0x0A, 0x00000001, PPC_EMB_COMMON) | 4534 | GEN_HANDLER(mfdcr, 0x1F, 0x03, 0x0A, 0x00000001, PPC_EMB_COMMON) |
@@ -4463,7 +4568,7 @@ GEN_HANDLER(mtdcr, 0x1F, 0x03, 0x0E, 0x00000001, PPC_EMB_COMMON) | @@ -4463,7 +4568,7 @@ GEN_HANDLER(mtdcr, 0x1F, 0x03, 0x0E, 0x00000001, PPC_EMB_COMMON) | ||
4463 | 4568 | ||
4464 | /* mfdcrx */ | 4569 | /* mfdcrx */ |
4465 | /* XXX: not implemented on 440 ? */ | 4570 | /* XXX: not implemented on 440 ? */ |
4466 | -GEN_HANDLER(mfdcrx, 0x1F, 0x03, 0x08, 0x00000001, PPC_BOOKE) | 4571 | +GEN_HANDLER(mfdcrx, 0x1F, 0x03, 0x08, 0x00000000, PPC_BOOKE_EXT) |
4467 | { | 4572 | { |
4468 | #if defined(CONFIG_USER_ONLY) | 4573 | #if defined(CONFIG_USER_ONLY) |
4469 | RET_PRIVREG(ctx); | 4574 | RET_PRIVREG(ctx); |
@@ -4475,12 +4580,13 @@ GEN_HANDLER(mfdcrx, 0x1F, 0x03, 0x08, 0x00000001, PPC_BOOKE) | @@ -4475,12 +4580,13 @@ GEN_HANDLER(mfdcrx, 0x1F, 0x03, 0x08, 0x00000001, PPC_BOOKE) | ||
4475 | gen_op_load_gpr_T0(rA(ctx->opcode)); | 4580 | gen_op_load_gpr_T0(rA(ctx->opcode)); |
4476 | gen_op_load_dcr(); | 4581 | gen_op_load_dcr(); |
4477 | gen_op_store_T0_gpr(rD(ctx->opcode)); | 4582 | gen_op_store_T0_gpr(rD(ctx->opcode)); |
4583 | + /* Note: Rc update flag set leads to undefined state of Rc0 */ | ||
4478 | #endif | 4584 | #endif |
4479 | } | 4585 | } |
4480 | 4586 | ||
4481 | /* mtdcrx */ | 4587 | /* mtdcrx */ |
4482 | /* XXX: not implemented on 440 ? */ | 4588 | /* XXX: not implemented on 440 ? */ |
4483 | -GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000001, PPC_BOOKE) | 4589 | +GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000000, PPC_BOOKE_EXT) |
4484 | { | 4590 | { |
4485 | #if defined(CONFIG_USER_ONLY) | 4591 | #if defined(CONFIG_USER_ONLY) |
4486 | RET_PRIVREG(ctx); | 4592 | RET_PRIVREG(ctx); |
@@ -4492,9 +4598,28 @@ GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000001, PPC_BOOKE) | @@ -4492,9 +4598,28 @@ GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000001, PPC_BOOKE) | ||
4492 | gen_op_load_gpr_T0(rA(ctx->opcode)); | 4598 | gen_op_load_gpr_T0(rA(ctx->opcode)); |
4493 | gen_op_load_gpr_T1(rS(ctx->opcode)); | 4599 | gen_op_load_gpr_T1(rS(ctx->opcode)); |
4494 | gen_op_store_dcr(); | 4600 | gen_op_store_dcr(); |
4601 | + /* Note: Rc update flag set leads to undefined state of Rc0 */ | ||
4495 | #endif | 4602 | #endif |
4496 | } | 4603 | } |
4497 | 4604 | ||
4605 | +/* mfdcrux (PPC 460) : user-mode access to DCR */ | ||
4606 | +GEN_HANDLER(mfdcrux, 0x1F, 0x03, 0x09, 0x00000000, PPC_DCRUX) | ||
4607 | +{ | ||
4608 | + gen_op_load_gpr_T0(rA(ctx->opcode)); | ||
4609 | + gen_op_load_dcr(); | ||
4610 | + gen_op_store_T0_gpr(rD(ctx->opcode)); | ||
4611 | + /* Note: Rc update flag set leads to undefined state of Rc0 */ | ||
4612 | +} | ||
4613 | + | ||
4614 | +/* mtdcrux (PPC 460) : user-mode access to DCR */ | ||
4615 | +GEN_HANDLER(mtdcrux, 0x1F, 0x03, 0x0D, 0x00000000, PPC_DCRUX) | ||
4616 | +{ | ||
4617 | + gen_op_load_gpr_T0(rA(ctx->opcode)); | ||
4618 | + gen_op_load_gpr_T1(rS(ctx->opcode)); | ||
4619 | + gen_op_store_dcr(); | ||
4620 | + /* Note: Rc update flag set leads to undefined state of Rc0 */ | ||
4621 | +} | ||
4622 | + | ||
4498 | /* dccci */ | 4623 | /* dccci */ |
4499 | GEN_HANDLER(dccci, 0x1F, 0x06, 0x0E, 0x03E00001, PPC_4xx_COMMON) | 4624 | GEN_HANDLER(dccci, 0x1F, 0x06, 0x0E, 0x03E00001, PPC_4xx_COMMON) |
4500 | { | 4625 | { |
@@ -4595,7 +4720,7 @@ GEN_HANDLER(rfci, 0x13, 0x13, 0x01, 0x03FF8001, PPC_BOOKE) | @@ -4595,7 +4720,7 @@ GEN_HANDLER(rfci, 0x13, 0x13, 0x01, 0x03FF8001, PPC_BOOKE) | ||
4595 | 4720 | ||
4596 | /* BookE specific */ | 4721 | /* BookE specific */ |
4597 | /* XXX: not implemented on 440 ? */ | 4722 | /* XXX: not implemented on 440 ? */ |
4598 | -GEN_HANDLER(rfdi, 0x13, 0x07, 0x01, 0x03FF8001, PPC_BOOKE) | 4723 | +GEN_HANDLER(rfdi, 0x13, 0x07, 0x01, 0x03FF8001, PPC_BOOKE_EXT) |
4599 | { | 4724 | { |
4600 | #if defined(CONFIG_USER_ONLY) | 4725 | #if defined(CONFIG_USER_ONLY) |
4601 | RET_PRIVOPC(ctx); | 4726 | RET_PRIVOPC(ctx); |
@@ -4611,7 +4736,7 @@ GEN_HANDLER(rfdi, 0x13, 0x07, 0x01, 0x03FF8001, PPC_BOOKE) | @@ -4611,7 +4736,7 @@ GEN_HANDLER(rfdi, 0x13, 0x07, 0x01, 0x03FF8001, PPC_BOOKE) | ||
4611 | } | 4736 | } |
4612 | 4737 | ||
4613 | /* XXX: not implemented on 440 ? */ | 4738 | /* XXX: not implemented on 440 ? */ |
4614 | -GEN_HANDLER(rfmci, 0x13, 0x06, 0x01, 0x03FF8001, PPC_BOOKE) | 4739 | +GEN_HANDLER(rfmci, 0x13, 0x06, 0x01, 0x03FF8001, PPC_RFMCI) |
4615 | { | 4740 | { |
4616 | #if defined(CONFIG_USER_ONLY) | 4741 | #if defined(CONFIG_USER_ONLY) |
4617 | RET_PRIVOPC(ctx); | 4742 | RET_PRIVOPC(ctx); |
@@ -4628,7 +4753,7 @@ GEN_HANDLER(rfmci, 0x13, 0x06, 0x01, 0x03FF8001, PPC_BOOKE) | @@ -4628,7 +4753,7 @@ GEN_HANDLER(rfmci, 0x13, 0x06, 0x01, 0x03FF8001, PPC_BOOKE) | ||
4628 | 4753 | ||
4629 | /* TLB management - PowerPC 405 implementation */ | 4754 | /* TLB management - PowerPC 405 implementation */ |
4630 | /* tlbre */ | 4755 | /* tlbre */ |
4631 | -GEN_HANDLER(tlbre_40x, 0x1F, 0x12, 0x1D, 0x00000001, PPC_40x_SPEC) | 4756 | +GEN_HANDLER(tlbre_40x, 0x1F, 0x12, 0x1D, 0x00000001, PPC_40x_TLB) |
4632 | { | 4757 | { |
4633 | #if defined(CONFIG_USER_ONLY) | 4758 | #if defined(CONFIG_USER_ONLY) |
4634 | RET_PRIVOPC(ctx); | 4759 | RET_PRIVOPC(ctx); |
@@ -4656,7 +4781,7 @@ GEN_HANDLER(tlbre_40x, 0x1F, 0x12, 0x1D, 0x00000001, PPC_40x_SPEC) | @@ -4656,7 +4781,7 @@ GEN_HANDLER(tlbre_40x, 0x1F, 0x12, 0x1D, 0x00000001, PPC_40x_SPEC) | ||
4656 | } | 4781 | } |
4657 | 4782 | ||
4658 | /* tlbsx - tlbsx. */ | 4783 | /* tlbsx - tlbsx. */ |
4659 | -GEN_HANDLER(tlbsx_40x, 0x1F, 0x12, 0x1C, 0x00000000, PPC_40x_SPEC) | 4784 | +GEN_HANDLER(tlbsx_40x, 0x1F, 0x12, 0x1C, 0x00000000, PPC_40x_TLB) |
4660 | { | 4785 | { |
4661 | #if defined(CONFIG_USER_ONLY) | 4786 | #if defined(CONFIG_USER_ONLY) |
4662 | RET_PRIVOPC(ctx); | 4787 | RET_PRIVOPC(ctx); |
@@ -4675,7 +4800,7 @@ GEN_HANDLER(tlbsx_40x, 0x1F, 0x12, 0x1C, 0x00000000, PPC_40x_SPEC) | @@ -4675,7 +4800,7 @@ GEN_HANDLER(tlbsx_40x, 0x1F, 0x12, 0x1C, 0x00000000, PPC_40x_SPEC) | ||
4675 | } | 4800 | } |
4676 | 4801 | ||
4677 | /* tlbwe */ | 4802 | /* tlbwe */ |
4678 | -GEN_HANDLER(tlbwe_40x, 0x1F, 0x12, 0x1E, 0x00000001, PPC_40x_SPEC) | 4803 | +GEN_HANDLER(tlbwe_40x, 0x1F, 0x12, 0x1E, 0x00000001, PPC_40x_TLB) |
4679 | { | 4804 | { |
4680 | #if defined(CONFIG_USER_ONLY) | 4805 | #if defined(CONFIG_USER_ONLY) |
4681 | RET_PRIVOPC(ctx); | 4806 | RET_PRIVOPC(ctx); |
@@ -5701,7 +5826,7 @@ void cpu_dump_state (CPUState *env, FILE *f, | @@ -5701,7 +5826,7 @@ void cpu_dump_state (CPUState *env, FILE *f, | ||
5701 | for (i = 0; i < 32; i++) { | 5826 | for (i = 0; i < 32; i++) { |
5702 | if ((i & (RGPL - 1)) == 0) | 5827 | if ((i & (RGPL - 1)) == 0) |
5703 | cpu_fprintf(f, "GPR%02d", i); | 5828 | cpu_fprintf(f, "GPR%02d", i); |
5704 | - cpu_fprintf(f, " " REGX, env->gpr[i]); | 5829 | + cpu_fprintf(f, " " REGX, (target_ulong)env->gpr[i]); |
5705 | if ((i & (RGPL - 1)) == (RGPL - 1)) | 5830 | if ((i & (RGPL - 1)) == (RGPL - 1)) |
5706 | cpu_fprintf(f, "\n"); | 5831 | cpu_fprintf(f, "\n"); |
5707 | } | 5832 | } |