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
11 changed files
with
4459 additions
and
3302 deletions
hw/ppc.c
| ... | ... | @@ -376,11 +376,11 @@ static void ppc405_set_irq (void *opaque, int pin, int level) |
| 376 | 376 | /* Level sensitive - active high */ |
| 377 | 377 | #if defined(PPC_DEBUG_IRQ) |
| 378 | 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 | 380 | __func__, level); |
| 381 | 381 | } |
| 382 | 382 | #endif |
| 383 | - ppc_set_irq(env, EXCP_40x_DEBUG, level); | |
| 383 | + ppc_set_irq(env, PPC_INTERRUPT_DEBUG, level); | |
| 384 | 384 | break; |
| 385 | 385 | default: |
| 386 | 386 | /* Unknown pin - do nothing */ |
| ... | ... | @@ -904,6 +904,9 @@ struct ppc_dcrn_t { |
| 904 | 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 | 910 | #define DCRN_NB 1024 |
| 908 | 911 | struct ppc_dcr_t { |
| 909 | 912 | ppc_dcrn_t dcrn[DCRN_NB]; | ... | ... |
linux-user/main.c
| ... | ... | @@ -712,6 +712,17 @@ uint32_t cpu_ppc601_load_rtcl (CPUState *env) |
| 712 | 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 | 726 | void cpu_loop(CPUPPCState *env) |
| 716 | 727 | { |
| 717 | 728 | target_siginfo_t info; |
| ... | ... | @@ -761,7 +772,7 @@ void cpu_loop(CPUPPCState *env) |
| 761 | 772 | case EXCP_MACHINE_CHECK: |
| 762 | 773 | fprintf(stderr, "Machine check exeption... Stop emulation\n"); |
| 763 | 774 | if (loglevel) |
| 764 | - fprintf(logfile, "RESET asked... Stop emulation\n"); | |
| 775 | + fprintf(logfile, "Machine check exception. Stop emulation\n"); | |
| 765 | 776 | info.si_signo = TARGET_SIGBUS; |
| 766 | 777 | info.si_errno = 0; |
| 767 | 778 | info.si_code = TARGET_BUS_OBJERR; |
| ... | ... | @@ -914,7 +925,7 @@ void cpu_loop(CPUPPCState *env) |
| 914 | 925 | info.si_code = TARGET_ILL_ILLOPC; |
| 915 | 926 | break; |
| 916 | 927 | case EXCP_INVAL_LSWX: |
| 917 | - info.si_code = TARGET_ILL_ILLOPN; | |
| 928 | + info.si_code = TARGET_ILL_ILLOPN; | |
| 918 | 929 | break; |
| 919 | 930 | case EXCP_INVAL_SPR: |
| 920 | 931 | info.si_code = TARGET_ILL_PRVREG; |
| ... | ... | @@ -1003,7 +1014,7 @@ void cpu_loop(CPUPPCState *env) |
| 1003 | 1014 | if (loglevel) |
| 1004 | 1015 | fprintf(logfile, "Tried to go into supervisor mode !\n"); |
| 1005 | 1016 | abort(); |
| 1006 | - } | |
| 1017 | + } | |
| 1007 | 1018 | break; |
| 1008 | 1019 | case EXCP_BRANCH: |
| 1009 | 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 | 4 | =============================================================================== |
| 5 | 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 | 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 | 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 | 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 | 117 | INSN OK |
| 192 | 118 | SPR OK |
| 119 | +MSR OK | |
| 120 | +IRQ KO not implemented | |
| 193 | 121 | MMU ? |
| 194 | 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 | 145 | INSN KO |
| 198 | 146 | SPR KO |
| 147 | +MSR KO | |
| 148 | +IRQ KO | |
| 199 | 149 | MMU KO |
| 200 | 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 | 163 | INSN KO |
| 207 | 164 | SPR KO |
| 165 | +MSR KO | |
| 166 | +IRQ KO | |
| 208 | 167 | MMU KO |
| 209 | 168 | EXCP KO |
| 210 | 169 | |
| 211 | -POWER2: (lack of precise informations) | |
| 170 | +*** | |
| 171 | +PowerPC e500: (not implemented) | |
| 212 | 172 | INSN KO |
| 213 | 173 | SPR KO |
| 174 | +MSR KO | |
| 175 | +IRQ KO | |
| 214 | 176 | MMU KO |
| 215 | 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 | 465 | PowerPC microcontrollers emulation status | ... | ... |
target-ppc/cpu.h
| ... | ... | @@ -89,528 +89,89 @@ typedef uint32_t ppc_gpr_t; |
| 89 | 89 | #define DCACHE_LINE_SIZE 32 |
| 90 | 90 | |
| 91 | 91 | /*****************************************************************************/ |
| 92 | -/* PVR definitions for most known PowerPC */ | |
| 92 | +/* MMU model */ | |
| 93 | 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 | 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 | 123 | /* Standard PowerPC exception model */ |
| 472 | - PPC_FLAGS_EXCP_STD = 0x00000000, | |
| 124 | + POWERPC_EXCP_STD, | |
| 473 | 125 | /* PowerPC 40x exception model */ |
| 474 | - PPC_FLAGS_EXCP_40x = 0x00000100, | |
| 126 | + POWERPC_EXCP_40x, | |
| 475 | 127 | /* PowerPC 601 exception model */ |
| 476 | - PPC_FLAGS_EXCP_601 = 0x00000200, | |
| 128 | + POWERPC_EXCP_601, | |
| 477 | 129 | /* PowerPC 602 exception model */ |
| 478 | - PPC_FLAGS_EXCP_602 = 0x00000300, | |
| 130 | + POWERPC_EXCP_602, | |
| 479 | 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 | 137 | /* PowerPC 604 exception model */ |
| 482 | - PPC_FLAGS_EXCP_604 = 0x00000500, | |
| 138 | + POWERPC_EXCP_604, | |
| 483 | 139 | /* PowerPC 7x0 exception model */ |
| 484 | - PPC_FLAGS_EXCP_7x0 = 0x00000600, | |
| 140 | + POWERPC_EXCP_7x0, | |
| 485 | 141 | /* PowerPC 7x5 exception model */ |
| 486 | - PPC_FLAGS_EXCP_7x5 = 0x00000700, | |
| 142 | + POWERPC_EXCP_7x5, | |
| 487 | 143 | /* PowerPC 74xx exception model */ |
| 488 | - PPC_FLAGS_EXCP_74xx = 0x00000800, | |
| 144 | + POWERPC_EXCP_74xx, | |
| 489 | 145 | /* PowerPC 970 exception model */ |
| 490 | - PPC_FLAGS_EXCP_970 = 0x00000900, | |
| 146 | + POWERPC_EXCP_970, | |
| 491 | 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 | 155 | /* PowerPC 6xx bus */ |
| 496 | - PPC_FLAGS_INPUT_6xx = 0x00000000, | |
| 156 | + PPC_FLAGS_INPUT_6xx, | |
| 497 | 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 | 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 | 169 | typedef struct ppc_def_t ppc_def_t; |
| 170 | +typedef struct opc_handler_t opc_handler_t; | |
| 609 | 171 | |
| 610 | 172 | /*****************************************************************************/ |
| 611 | 173 | /* Types used to describe some PowerPC registers */ |
| 612 | 174 | typedef struct CPUPPCState CPUPPCState; |
| 613 | -typedef struct opc_handler_t opc_handler_t; | |
| 614 | 175 | typedef struct ppc_tb_t ppc_tb_t; |
| 615 | 176 | typedef struct ppc_spr_t ppc_spr_t; |
| 616 | 177 | typedef struct ppc_dcr_t ppc_dcr_t; |
| ... | ... | @@ -832,7 +393,11 @@ struct CPUPPCState { |
| 832 | 393 | |
| 833 | 394 | /* Those resources are used during exception processing */ |
| 834 | 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 | 401 | uint32_t flags; |
| 837 | 402 | |
| 838 | 403 | int exception_index; |
| ... | ... | @@ -985,7 +550,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); |
| 985 | 550 | #define SPR_LR (0x008) |
| 986 | 551 | #define SPR_CTR (0x009) |
| 987 | 552 | #define SPR_DSISR (0x012) |
| 988 | -#define SPR_DAR (0x013) | |
| 553 | +#define SPR_DAR (0x013) /* DAE for PowerPC 601 */ | |
| 989 | 554 | #define SPR_601_RTCU (0x014) |
| 990 | 555 | #define SPR_601_RTCL (0x015) |
| 991 | 556 | #define SPR_DECR (0x016) |
| ... | ... | @@ -1203,6 +768,8 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); |
| 1203 | 768 | #define SPR_440_ITV1 (0x375) |
| 1204 | 769 | #define SPR_440_ITV2 (0x376) |
| 1205 | 770 | #define SPR_440_ITV3 (0x377) |
| 771 | +#define SPR_440_CCR1 (0x378) | |
| 772 | +#define SPR_DCRIPR (0x37B) | |
| 1206 | 773 | #define SPR_PPR (0x380) |
| 1207 | 774 | #define SPR_440_DNV0 (0x390) |
| 1208 | 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 | 786 | #define SPR_BOOKE_DCDBTRH (0x39D) |
| 1220 | 787 | #define SPR_BOOKE_ICDBTRL (0x39E) |
| 1221 | 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 | 793 | #define SPR_UMMCR0 (0x3A8) |
| 1223 | 794 | #define SPR_UPMC1 (0x3A9) |
| 1224 | 795 | #define SPR_UPMC2 (0x3AA) |
| 1225 | -#define SPR_USIA (0x3AB) | |
| 796 | +#define SPR_USIAR (0x3AB) | |
| 1226 | 797 | #define SPR_UMMCR1 (0x3AC) |
| 1227 | 798 | #define SPR_UPMC3 (0x3AD) |
| 1228 | 799 | #define SPR_UPMC4 (0x3AE) |
| 1229 | 800 | #define SPR_USDA (0x3AF) |
| 1230 | 801 | #define SPR_40x_ZPR (0x3B0) |
| 1231 | 802 | #define SPR_BOOKE_MAS7 (0x3B0) |
| 803 | +#define SPR_620_PMR0 (0x3B0) | |
| 804 | +#define SPR_MMCR2 (0x3B0) | |
| 805 | +#define SPR_PMC5 (0x3B1) | |
| 1232 | 806 | #define SPR_40x_PID (0x3B1) |
| 807 | +#define SPR_620_PMR1 (0x3B1) | |
| 808 | +#define SPR_PMC6 (0x3B2) | |
| 1233 | 809 | #define SPR_440_MMUCR (0x3B2) |
| 810 | +#define SPR_620_PMR2 (0x3B2) | |
| 1234 | 811 | #define SPR_4xx_CCR0 (0x3B3) |
| 1235 | 812 | #define SPR_BOOKE_EPLC (0x3B3) |
| 813 | +#define SPR_620_PMR3 (0x3B3) | |
| 1236 | 814 | #define SPR_405_IAC3 (0x3B4) |
| 1237 | 815 | #define SPR_BOOKE_EPSC (0x3B4) |
| 816 | +#define SPR_620_PMR4 (0x3B4) | |
| 1238 | 817 | #define SPR_405_IAC4 (0x3B5) |
| 818 | +#define SPR_620_PMR5 (0x3B5) | |
| 1239 | 819 | #define SPR_405_DVC1 (0x3B6) |
| 820 | +#define SPR_620_PMR6 (0x3B6) | |
| 1240 | 821 | #define SPR_405_DVC2 (0x3B7) |
| 822 | +#define SPR_620_PMR7 (0x3B7) | |
| 823 | +#define SPR_BAMR (0x3B7) | |
| 1241 | 824 | #define SPR_MMCR0 (0x3B8) |
| 825 | +#define SPR_620_PMR8 (0x3B8) | |
| 1242 | 826 | #define SPR_PMC1 (0x3B9) |
| 1243 | 827 | #define SPR_40x_SGR (0x3B9) |
| 828 | +#define SPR_620_PMR9 (0x3B9) | |
| 1244 | 829 | #define SPR_PMC2 (0x3BA) |
| 1245 | 830 | #define SPR_40x_DCWR (0x3BA) |
| 1246 | -#define SPR_SIA (0x3BB) | |
| 831 | +#define SPR_620_PMRA (0x3BA) | |
| 832 | +#define SPR_SIAR (0x3BB) | |
| 1247 | 833 | #define SPR_405_SLER (0x3BB) |
| 834 | +#define SPR_620_PMRB (0x3BB) | |
| 1248 | 835 | #define SPR_MMCR1 (0x3BC) |
| 1249 | 836 | #define SPR_405_SU0R (0x3BC) |
| 837 | +#define SPR_620_PMRC (0x3BC) | |
| 838 | +#define SPR_401_SKR (0x3BC) | |
| 1250 | 839 | #define SPR_PMC3 (0x3BD) |
| 1251 | 840 | #define SPR_405_DBCR1 (0x3BD) |
| 841 | +#define SPR_620_PMRD (0x3BD) | |
| 1252 | 842 | #define SPR_PMC4 (0x3BE) |
| 843 | +#define SPR_620_PMRE (0x3BE) | |
| 1253 | 844 | #define SPR_SDA (0x3BF) |
| 845 | +#define SPR_620_PMRF (0x3BF) | |
| 1254 | 846 | #define SPR_403_VTBL (0x3CC) |
| 1255 | 847 | #define SPR_403_VTBU (0x3CD) |
| 1256 | 848 | #define SPR_DMISS (0x3D0) |
| ... | ... | @@ -1258,18 +850,23 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); |
| 1258 | 850 | #define SPR_HASH1 (0x3D2) |
| 1259 | 851 | #define SPR_HASH2 (0x3D3) |
| 1260 | 852 | #define SPR_BOOKE_ICDBDR (0x3D3) |
| 853 | +#define SPR_TLBMISS (0x3D4) | |
| 1261 | 854 | #define SPR_IMISS (0x3D4) |
| 1262 | 855 | #define SPR_40x_ESR (0x3D4) |
| 856 | +#define SPR_PTEHI (0x3D5) | |
| 1263 | 857 | #define SPR_ICMP (0x3D5) |
| 1264 | 858 | #define SPR_40x_DEAR (0x3D5) |
| 859 | +#define SPR_PTELO (0x3D6) | |
| 1265 | 860 | #define SPR_RPA (0x3D6) |
| 1266 | 861 | #define SPR_40x_EVPR (0x3D6) |
| 862 | +#define SPR_L3PM (0x3D7) | |
| 1267 | 863 | #define SPR_403_CDBCR (0x3D7) |
| 864 | +#define SPR_L3OHCR (0x3D8) | |
| 1268 | 865 | #define SPR_TCR (0x3D8) |
| 1269 | 866 | #define SPR_40x_TSR (0x3D8) |
| 1270 | 867 | #define SPR_IBR (0x3DA) |
| 1271 | 868 | #define SPR_40x_TCR (0x3DA) |
| 1272 | -#define SPR_ESASR (0x3DB) | |
| 869 | +#define SPR_ESASRR (0x3DB) | |
| 1273 | 870 | #define SPR_40x_PIT (0x3DB) |
| 1274 | 871 | #define SPR_403_TBL (0x3DC) |
| 1275 | 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 | 874 | #define SPR_40x_SRR2 (0x3DE) |
| 1278 | 875 | #define SPR_SER (0x3DF) |
| 1279 | 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 | 881 | #define SPR_HID0 (0x3F0) |
| 1281 | 882 | #define SPR_40x_DBSR (0x3F0) |
| 1282 | 883 | #define SPR_HID1 (0x3F1) |
| ... | ... | @@ -1284,9 +885,11 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); |
| 1284 | 885 | #define SPR_40x_DBCR0 (0x3F2) |
| 1285 | 886 | #define SPR_601_HID2 (0x3F2) |
| 1286 | 887 | #define SPR_E500_L1CSR0 (0x3F2) |
| 888 | +#define SPR_ICTRL (0x3F3) | |
| 1287 | 889 | #define SPR_HID2 (0x3F3) |
| 1288 | 890 | #define SPR_E500_L1CSR1 (0x3F3) |
| 1289 | 891 | #define SPR_440_DBDR (0x3F3) |
| 892 | +#define SPR_LDSTDB (0x3F4) | |
| 1290 | 893 | #define SPR_40x_IAC1 (0x3F4) |
| 1291 | 894 | #define SPR_BOOKE_MMUCSR0 (0x3F4) |
| 1292 | 895 | #define SPR_DABR (0x3F5) |
| ... | ... | @@ -1295,12 +898,18 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); |
| 1295 | 898 | #define SPR_40x_IAC2 (0x3F5) |
| 1296 | 899 | #define SPR_601_HID5 (0x3F5) |
| 1297 | 900 | #define SPR_40x_DAC1 (0x3F6) |
| 901 | +#define SPR_MSSCR0 (0x3F6) | |
| 902 | +#define SPR_MSSSR0 (0x3F7) | |
| 1298 | 903 | #define SPR_DABRX (0x3F7) |
| 1299 | 904 | #define SPR_40x_DAC2 (0x3F7) |
| 1300 | 905 | #define SPR_BOOKE_MMUCFG (0x3F7) |
| 1301 | -#define SPR_L2PM (0x3F8) | |
| 906 | +#define SPR_LDSTCR (0x3F8) | |
| 907 | +#define SPR_L2PMCR (0x3F8) | |
| 1302 | 908 | #define SPR_750_HID2 (0x3F8) |
| 909 | +#define SPR_620_HID8 (0x3F8) | |
| 1303 | 910 | #define SPR_L2CR (0x3F9) |
| 911 | +#define SPR_620_HID9 (0x3F9) | |
| 912 | +#define SPR_L3CR (0x3FA) | |
| 1304 | 913 | #define SPR_IABR2 (0x3FA) |
| 1305 | 914 | #define SPR_40x_DCCR (0x3FA) |
| 1306 | 915 | #define SPR_ICTC (0x3FB) |
| ... | ... | @@ -1310,6 +919,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); |
| 1310 | 919 | #define SPR_SP (0x3FD) |
| 1311 | 920 | #define SPR_THRM2 (0x3FD) |
| 1312 | 921 | #define SPR_403_PBU1 (0x3FD) |
| 922 | +#define SPR_604_HID13 (0x3FD) | |
| 1313 | 923 | #define SPR_LT (0x3FE) |
| 1314 | 924 | #define SPR_THRM3 (0x3FE) |
| 1315 | 925 | #define SPR_FPECR (0x3FE) |
| ... | ... | @@ -1317,6 +927,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); |
| 1317 | 927 | #define SPR_PIR (0x3FF) |
| 1318 | 928 | #define SPR_403_PBU2 (0x3FF) |
| 1319 | 929 | #define SPR_601_HID15 (0x3FF) |
| 930 | +#define SPR_604_HID15 (0x3FF) | |
| 1320 | 931 | #define SPR_E500_SVR (0x3FF) |
| 1321 | 932 | |
| 1322 | 933 | /*****************************************************************************/ |
| ... | ... | @@ -1367,6 +978,11 @@ enum { |
| 1367 | 978 | #define EXCP_40x_DEBUG 0x2000 /* Debug exception */ |
| 1368 | 979 | /* 405 specific exceptions */ |
| 1369 | 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 | 986 | /* TLB assist exceptions (602/603) */ |
| 1371 | 987 | #define EXCP_I_TLBMISS 0x1000 /* Instruction TLB miss */ |
| 1372 | 988 | #define EXCP_DL_TLBMISS 0x1100 /* Data load TLB miss */ |
| ... | ... | @@ -1377,7 +993,7 @@ enum { |
| 1377 | 993 | /* Altivec related exceptions */ |
| 1378 | 994 | #define EXCP_VPU 0x0F20 /* VPU unavailable exception */ |
| 1379 | 995 | /* 601 specific exceptions */ |
| 1380 | -#define EXCP_601_IO 0x0600 /* IO error exception */ | |
| 996 | +#define EXCP_601_IO 0x0A00 /* IO error exception */ | |
| 1381 | 997 | #define EXCP_601_RUNM 0x2000 /* Run mode exception */ |
| 1382 | 998 | /* 602 specific exceptions */ |
| 1383 | 999 | #define EXCP_602_WATCHDOG 0x1500 /* Watchdog exception */ |
| ... | ... | @@ -1468,6 +1084,15 @@ enum { |
| 1468 | 1084 | }; |
| 1469 | 1085 | |
| 1470 | 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 | 1096 | /* PowerPC 405 input pins */ |
| 1472 | 1097 | PPC405_INPUT_RESET_CORE = 0, |
| 1473 | 1098 | PPC405_INPUT_RESET_CHIP = 1, |
| ... | ... | @@ -1479,6 +1104,18 @@ enum { |
| 1479 | 1104 | }; |
| 1480 | 1105 | |
| 1481 | 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 | 1119 | /* PowerPC 970 input pins */ |
| 1483 | 1120 | PPC970_INPUT_HRESET = 0, |
| 1484 | 1121 | PPC970_INPUT_SRESET = 1, | ... | ... |
target-ppc/exec.h
| ... | ... | @@ -106,6 +106,8 @@ void ppc6xx_tlb_invalidate_virt (CPUState *env, target_ulong eaddr, |
| 106 | 106 | void ppc6xx_tlb_store (CPUState *env, target_ulong EPN, int way, int is_code, |
| 107 | 107 | target_ulong pte0, target_ulong pte1); |
| 108 | 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 | 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 | 586 | static inline int find_pte (CPUState *env, mmu_ctx_t *ctx, int h, int rw) |
| 587 | 587 | { |
| 588 | 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 | 591 | return find_pte64(ctx, h, rw); |
| 592 | 592 | #endif |
| 593 | 593 | |
| ... | ... | @@ -669,7 +669,7 @@ static int get_segment (CPUState *env, mmu_ctx_t *ctx, |
| 669 | 669 | int ret, ret2; |
| 670 | 670 | |
| 671 | 671 | #if defined(TARGET_PPC64) |
| 672 | - if (PPC_MMU(env) == PPC_FLAGS_MMU_64B) { | |
| 672 | + if (env->mmu_model == POWERPC_MMU_64B) { | |
| 673 | 673 | ret = slb_lookup(env, eaddr, &vsid, &page_mask, &attr); |
| 674 | 674 | if (ret < 0) |
| 675 | 675 | return ret; |
| ... | ... | @@ -724,8 +724,8 @@ static int get_segment (CPUState *env, mmu_ctx_t *ctx, |
| 724 | 724 | hash = (~hash) & vsid_mask; |
| 725 | 725 | ctx->pg_addr[1] = get_pgaddr(sdr, sdr_sh, hash, mask); |
| 726 | 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 | 729 | /* Only 5 bits of the page index are used in the AVPN */ |
| 730 | 730 | ctx->ptem = (vsid << 12) | ((pgidx >> 4) & 0x0F80); |
| 731 | 731 | } else |
| ... | ... | @@ -735,7 +735,7 @@ static int get_segment (CPUState *env, mmu_ctx_t *ctx, |
| 735 | 735 | } |
| 736 | 736 | /* Initialize real address with an invalid value */ |
| 737 | 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 | 739 | /* Software TLB search */ |
| 740 | 740 | ret = ppc6xx_tlb_check(env, ctx, eaddr, rw, type); |
| 741 | 741 | } else { |
| ... | ... | @@ -865,7 +865,7 @@ int ppcemb_tlb_search (CPUPPCState *env, target_ulong address, uint32_t pid) |
| 865 | 865 | |
| 866 | 866 | /* Default return value is no match */ |
| 867 | 867 | ret = -1; |
| 868 | - for (i = 0; i < 64; i++) { | |
| 868 | + for (i = 0; i < env->nb_tlb; i++) { | |
| 869 | 869 | tlb = &env->tlb[i].tlbe; |
| 870 | 870 | if (ppcemb_tlb_check(env, tlb, &raddr, address, pid, 0, i) == 0) { |
| 871 | 871 | ret = i; |
| ... | ... | @@ -876,6 +876,26 @@ int ppcemb_tlb_search (CPUPPCState *env, target_ulong address, uint32_t pid) |
| 876 | 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 | 899 | /* Helpers specific to PowerPC 40x implementations */ |
| 880 | 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 | 1089 | ctx->raddr = eaddr; |
| 1070 | 1090 | ctx->prot = PAGE_READ; |
| 1071 | 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 | 1098 | ctx->prot |= PAGE_WRITE; |
| 1079 | 1099 | break; |
| 1080 | 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 | 1103 | /* Real address are 60 bits long */ |
| 1084 | - ctx->raddr &= 0x0FFFFFFFFFFFFFFFUL; | |
| 1104 | + ctx->raddr &= 0x0FFFFFFFFFFFFFFFULL; | |
| 1085 | 1105 | ctx->prot |= PAGE_WRITE; |
| 1086 | 1106 | break; |
| 1087 | 1107 | #endif |
| 1088 | - case PPC_FLAGS_MMU_403: | |
| 1108 | + case POWERPC_MMU_SOFT_4xx_Z: | |
| 1089 | 1109 | if (unlikely(msr_pe != 0)) { |
| 1090 | 1110 | /* 403 family add some particular protections, |
| 1091 | 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 | 1128 | ctx->prot |= PAGE_WRITE; |
| 1109 | 1129 | } |
| 1110 | 1130 | } |
| 1111 | - case PPC_FLAGS_MMU_BOOKE: | |
| 1131 | + case POWERPC_MMU_BOOKE: | |
| 1112 | 1132 | ctx->prot |= PAGE_WRITE; |
| 1113 | 1133 | break; |
| 1114 | - case PPC_FLAGS_MMU_BOOKE_FSL: | |
| 1134 | + case POWERPC_MMU_BOOKE_FSL: | |
| 1115 | 1135 | /* XXX: TODO */ |
| 1116 | 1136 | cpu_abort(env, "BookE FSL MMU model not implemented\n"); |
| 1117 | 1137 | break; |
| ... | ... | @@ -1138,40 +1158,40 @@ int get_physical_address (CPUState *env, mmu_ctx_t *ctx, target_ulong eaddr, |
| 1138 | 1158 | ret = check_physical(env, ctx, eaddr, rw); |
| 1139 | 1159 | } else { |
| 1140 | 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 | 1164 | /* Try to find a BAT */ |
| 1145 | 1165 | if (check_BATs) |
| 1146 | 1166 | ret = get_bat(env, ctx, eaddr, rw, access_type); |
| 1147 | 1167 | /* No break here */ |
| 1148 | 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 | 1171 | #endif |
| 1152 | 1172 | if (ret < 0) { |
| 1153 | 1173 | /* We didn't match any BAT entry or don't have BATs */ |
| 1154 | 1174 | ret = get_segment(env, ctx, eaddr, rw, access_type); |
| 1155 | 1175 | } |
| 1156 | 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 | 1179 | ret = mmu40x_get_physical_address(env, ctx, eaddr, |
| 1160 | 1180 | rw, access_type); |
| 1161 | 1181 | break; |
| 1162 | - case PPC_FLAGS_MMU_601: | |
| 1182 | + case POWERPC_MMU_601: | |
| 1163 | 1183 | /* XXX: TODO */ |
| 1164 | 1184 | cpu_abort(env, "601 MMU model not implemented\n"); |
| 1165 | 1185 | return -1; |
| 1166 | - case PPC_FLAGS_MMU_BOOKE: | |
| 1186 | + case POWERPC_MMU_BOOKE: | |
| 1167 | 1187 | ret = mmubooke_get_physical_address(env, ctx, eaddr, |
| 1168 | 1188 | rw, access_type); |
| 1169 | 1189 | break; |
| 1170 | - case PPC_FLAGS_MMU_BOOKE_FSL: | |
| 1190 | + case POWERPC_MMU_BOOKE_FSL: | |
| 1171 | 1191 | /* XXX: TODO */ |
| 1172 | 1192 | cpu_abort(env, "BookE FSL MMU model not implemented\n"); |
| 1173 | 1193 | return -1; |
| 1174 | - case PPC_FLAGS_MMU_401: | |
| 1194 | + case POWERPC_MMU_REAL_4xx: | |
| 1175 | 1195 | cpu_abort(env, "PowerPC 401 does not do any translation\n"); |
| 1176 | 1196 | return -1; |
| 1177 | 1197 | default: |
| ... | ... | @@ -1234,46 +1254,46 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, |
| 1234 | 1254 | switch (ret) { |
| 1235 | 1255 | case -1: |
| 1236 | 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 | 1259 | exception = EXCP_I_TLBMISS; |
| 1240 | 1260 | env->spr[SPR_IMISS] = address; |
| 1241 | 1261 | env->spr[SPR_ICMP] = 0x80000000 | ctx.ptem; |
| 1242 | 1262 | error_code = 1 << 18; |
| 1243 | 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 | 1266 | exception = EXCP_40x_ITLBMISS; |
| 1247 | 1267 | error_code = 0; |
| 1248 | 1268 | env->spr[SPR_40x_DEAR] = address; |
| 1249 | 1269 | env->spr[SPR_40x_ESR] = 0x00000000; |
| 1250 | 1270 | break; |
| 1251 | - case PPC_FLAGS_MMU_32B: | |
| 1271 | + case POWERPC_MMU_32B: | |
| 1252 | 1272 | error_code = 0x40000000; |
| 1253 | 1273 | break; |
| 1254 | 1274 | #if defined(TARGET_PPC64) |
| 1255 | - case PPC_FLAGS_MMU_64B: | |
| 1275 | + case POWERPC_MMU_64B: | |
| 1256 | 1276 | /* XXX: TODO */ |
| 1257 | 1277 | cpu_abort(env, "MMU model not implemented\n"); |
| 1258 | 1278 | return -1; |
| 1259 | - case PPC_FLAGS_MMU_64BRIDGE: | |
| 1279 | + case POWERPC_MMU_64BRIDGE: | |
| 1260 | 1280 | /* XXX: TODO */ |
| 1261 | 1281 | cpu_abort(env, "MMU model not implemented\n"); |
| 1262 | 1282 | return -1; |
| 1263 | 1283 | #endif |
| 1264 | - case PPC_FLAGS_MMU_601: | |
| 1284 | + case POWERPC_MMU_601: | |
| 1265 | 1285 | /* XXX: TODO */ |
| 1266 | 1286 | cpu_abort(env, "MMU model not implemented\n"); |
| 1267 | 1287 | return -1; |
| 1268 | - case PPC_FLAGS_MMU_BOOKE: | |
| 1288 | + case POWERPC_MMU_BOOKE: | |
| 1269 | 1289 | /* XXX: TODO */ |
| 1270 | 1290 | cpu_abort(env, "MMU model not implemented\n"); |
| 1271 | 1291 | return -1; |
| 1272 | - case PPC_FLAGS_MMU_BOOKE_FSL: | |
| 1292 | + case POWERPC_MMU_BOOKE_FSL: | |
| 1273 | 1293 | /* XXX: TODO */ |
| 1274 | 1294 | cpu_abort(env, "MMU model not implemented\n"); |
| 1275 | 1295 | return -1; |
| 1276 | - case PPC_FLAGS_MMU_401: | |
| 1296 | + case POWERPC_MMU_REAL_4xx: | |
| 1277 | 1297 | cpu_abort(env, "PowerPC 401 should never raise any MMU " |
| 1278 | 1298 | "exceptions\n"); |
| 1279 | 1299 | return -1; |
| ... | ... | @@ -1306,8 +1326,8 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, |
| 1306 | 1326 | switch (ret) { |
| 1307 | 1327 | case -1: |
| 1308 | 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 | 1331 | if (rw == 1) { |
| 1312 | 1332 | exception = EXCP_DS_TLBMISS; |
| 1313 | 1333 | error_code = 1 << 16; |
| ... | ... | @@ -1323,8 +1343,8 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, |
| 1323 | 1343 | env->spr[SPR_HASH2] = ctx.pg_addr[1]; |
| 1324 | 1344 | /* Do not alter DAR nor DSISR */ |
| 1325 | 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 | 1348 | exception = EXCP_40x_DTLBMISS; |
| 1329 | 1349 | error_code = 0; |
| 1330 | 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 | 1353 | else |
| 1334 | 1354 | env->spr[SPR_40x_ESR] = 0x00000000; |
| 1335 | 1355 | break; |
| 1336 | - case PPC_FLAGS_MMU_32B: | |
| 1356 | + case POWERPC_MMU_32B: | |
| 1337 | 1357 | error_code = 0x40000000; |
| 1338 | 1358 | break; |
| 1339 | 1359 | #if defined(TARGET_PPC64) |
| 1340 | - case PPC_FLAGS_MMU_64B: | |
| 1360 | + case POWERPC_MMU_64B: | |
| 1341 | 1361 | /* XXX: TODO */ |
| 1342 | 1362 | cpu_abort(env, "MMU model not implemented\n"); |
| 1343 | 1363 | return -1; |
| 1344 | - case PPC_FLAGS_MMU_64BRIDGE: | |
| 1364 | + case POWERPC_MMU_64BRIDGE: | |
| 1345 | 1365 | /* XXX: TODO */ |
| 1346 | 1366 | cpu_abort(env, "MMU model not implemented\n"); |
| 1347 | 1367 | return -1; |
| 1348 | 1368 | #endif |
| 1349 | - case PPC_FLAGS_MMU_601: | |
| 1369 | + case POWERPC_MMU_601: | |
| 1350 | 1370 | /* XXX: TODO */ |
| 1351 | 1371 | cpu_abort(env, "MMU model not implemented\n"); |
| 1352 | 1372 | return -1; |
| 1353 | - case PPC_FLAGS_MMU_BOOKE: | |
| 1373 | + case POWERPC_MMU_BOOKE: | |
| 1354 | 1374 | /* XXX: TODO */ |
| 1355 | 1375 | cpu_abort(env, "MMU model not implemented\n"); |
| 1356 | 1376 | return -1; |
| 1357 | - case PPC_FLAGS_MMU_BOOKE_FSL: | |
| 1377 | + case POWERPC_MMU_BOOKE_FSL: | |
| 1358 | 1378 | /* XXX: TODO */ |
| 1359 | 1379 | cpu_abort(env, "MMU model not implemented\n"); |
| 1360 | 1380 | return -1; |
| 1361 | - case PPC_FLAGS_MMU_401: | |
| 1381 | + case POWERPC_MMU_REAL_4xx: | |
| 1362 | 1382 | cpu_abort(env, "PowerPC 401 should never raise any MMU " |
| 1363 | 1383 | "exceptions\n"); |
| 1364 | 1384 | return -1; |
| ... | ... | @@ -1544,9 +1564,9 @@ void do_store_dbatl (CPUPPCState *env, int nr, target_ulong value) |
| 1544 | 1564 | /* TLB management */ |
| 1545 | 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 | 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 | 1570 | ppc4xx_tlb_invalidate_all(env); |
| 1551 | 1571 | } else { |
| 1552 | 1572 | tlb_flush(env, 1); |
| ... | ... | @@ -1707,9 +1727,11 @@ void do_store_msr (CPUPPCState *env, target_ulong value) |
| 1707 | 1727 | fprintf(logfile, "%s: T0 %08lx\n", __func__, value); |
| 1708 | 1728 | } |
| 1709 | 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 | 1735 | if (((value >> MSR_TGPR) & 1) != msr_tgpr) { |
| 1714 | 1736 | /* Swap temporary saved registers with GPRs */ |
| 1715 | 1737 | swap_gpr_tgpr(env); |
| ... | ... | @@ -1750,19 +1772,21 @@ void do_store_msr (CPUPPCState *env, target_ulong value) |
| 1750 | 1772 | do_compute_hflags(env); |
| 1751 | 1773 | |
| 1752 | 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 | 1779 | /* Don't handle SLEEP mode: we should disable all clocks... |
| 1756 | 1780 | * No dynamic power-management. |
| 1757 | 1781 | */ |
| 1758 | 1782 | if (msr_pow == 1 && (env->spr[SPR_HID0] & 0x00C00000) != 0) |
| 1759 | 1783 | enter_pm = 1; |
| 1760 | 1784 | break; |
| 1761 | - case PPC_FLAGS_EXCP_604: | |
| 1785 | + case POWERPC_EXCP_604: | |
| 1762 | 1786 | if (msr_pow == 1) |
| 1763 | 1787 | enter_pm = 1; |
| 1764 | 1788 | break; |
| 1765 | - case PPC_FLAGS_EXCP_7x0: | |
| 1789 | + case POWERPC_EXCP_7x0: | |
| 1766 | 1790 | if (msr_pow == 1 && (env->spr[SPR_HID0] & 0x00E00000) != 0) |
| 1767 | 1791 | enter_pm = 1; |
| 1768 | 1792 | break; |
| ... | ... | @@ -1854,12 +1878,12 @@ void do_interrupt (CPUState *env) |
| 1854 | 1878 | switch (excp) { |
| 1855 | 1879 | /* Generic PowerPC exceptions */ |
| 1856 | 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 | 1883 | srr_0 = &env->spr[SPR_40x_SRR2]; |
| 1860 | 1884 | srr_1 = &env->spr[SPR_40x_SRR3]; |
| 1861 | 1885 | break; |
| 1862 | - case PPC_FLAGS_EXCP_BOOKE: | |
| 1886 | + case POWERPC_EXCP_BOOKE: | |
| 1863 | 1887 | idx = 0; |
| 1864 | 1888 | srr_0 = &env->spr[SPR_BOOKE_CSRR0]; |
| 1865 | 1889 | srr_1 = &env->spr[SPR_BOOKE_CSRR1]; |
| ... | ... | @@ -1872,12 +1896,12 @@ void do_interrupt (CPUState *env) |
| 1872 | 1896 | } |
| 1873 | 1897 | goto store_next; |
| 1874 | 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 | 1901 | srr_0 = &env->spr[SPR_40x_SRR2]; |
| 1878 | 1902 | srr_1 = &env->spr[SPR_40x_SRR3]; |
| 1879 | 1903 | break; |
| 1880 | - case PPC_FLAGS_EXCP_BOOKE: | |
| 1904 | + case POWERPC_EXCP_BOOKE: | |
| 1881 | 1905 | idx = 1; |
| 1882 | 1906 | srr_0 = &env->spr[SPR_BOOKE_MCSRR0]; |
| 1883 | 1907 | srr_1 = &env->spr[SPR_BOOKE_MCSRR1]; |
| ... | ... | @@ -1920,7 +1944,7 @@ void do_interrupt (CPUState *env) |
| 1920 | 1944 | idx = 4; |
| 1921 | 1945 | goto store_next; |
| 1922 | 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 | 1948 | /* Store exception cause */ |
| 1925 | 1949 | idx = 5; |
| 1926 | 1950 | /* Get rS/rD and rA from faulting opcode */ |
| ... | ... | @@ -2028,26 +2052,27 @@ void do_interrupt (CPUState *env) |
| 2028 | 2052 | goto store_next; |
| 2029 | 2053 | /* Implementation specific exceptions */ |
| 2030 | 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 | 2057 | /* Critical interrupt on G2 */ |
| 2034 | 2058 | /* XXX: TODO */ |
| 2035 | 2059 | cpu_abort(env, "G2 critical interrupt is not implemented yet !\n"); |
| 2036 | 2060 | goto store_next; |
| 2037 | - } else { | |
| 2061 | + default: | |
| 2038 | 2062 | cpu_abort(env, "Invalid exception 0x0A00 !\n"); |
| 2063 | + break; | |
| 2039 | 2064 | } |
| 2040 | 2065 | return; |
| 2041 | 2066 | case 0x0F20: |
| 2042 | 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 | 2070 | /* APU unavailable on 405 */ |
| 2046 | 2071 | /* XXX: TODO */ |
| 2047 | 2072 | cpu_abort(env, |
| 2048 | 2073 | "APU unavailable exception is not implemented yet !\n"); |
| 2049 | 2074 | goto store_next; |
| 2050 | - case PPC_FLAGS_EXCP_74xx: | |
| 2075 | + case POWERPC_EXCP_74xx: | |
| 2051 | 2076 | /* Altivec unavailable */ |
| 2052 | 2077 | /* XXX: TODO */ |
| 2053 | 2078 | cpu_abort(env, "Altivec unavailable exception " |
| ... | ... | @@ -2060,8 +2085,8 @@ void do_interrupt (CPUState *env) |
| 2060 | 2085 | return; |
| 2061 | 2086 | case 0x1000: |
| 2062 | 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 | 2090 | /* PIT on 4xx */ |
| 2066 | 2091 | msr &= ~0xFFFF0000; |
| 2067 | 2092 | #if defined (DEBUG_EXCEPTIONS) |
| ... | ... | @@ -2069,11 +2094,13 @@ void do_interrupt (CPUState *env) |
| 2069 | 2094 | fprintf(logfile, "PIT exception\n"); |
| 2070 | 2095 | #endif |
| 2071 | 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 | 2101 | /* ITLBMISS on 602/603 */ |
| 2075 | 2102 | goto store_gprs; |
| 2076 | - case PPC_FLAGS_EXCP_7x5: | |
| 2103 | + case POWERPC_EXCP_7x5: | |
| 2077 | 2104 | /* ITLBMISS on 745/755 */ |
| 2078 | 2105 | goto tlb_miss; |
| 2079 | 2106 | default: |
| ... | ... | @@ -2083,8 +2110,8 @@ void do_interrupt (CPUState *env) |
| 2083 | 2110 | return; |
| 2084 | 2111 | case 0x1010: |
| 2085 | 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 | 2115 | /* FIT on 4xx */ |
| 2089 | 2116 | msr &= ~0xFFFF0000; |
| 2090 | 2117 | #if defined (DEBUG_EXCEPTIONS) |
| ... | ... | @@ -2099,8 +2126,8 @@ void do_interrupt (CPUState *env) |
| 2099 | 2126 | return; |
| 2100 | 2127 | case 0x1020: |
| 2101 | 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 | 2131 | /* Watchdog on 4xx */ |
| 2105 | 2132 | msr &= ~0xFFFF0000; |
| 2106 | 2133 | #if defined (DEBUG_EXCEPTIONS) |
| ... | ... | @@ -2108,7 +2135,7 @@ void do_interrupt (CPUState *env) |
| 2108 | 2135 | fprintf(logfile, "WDT exception\n"); |
| 2109 | 2136 | #endif |
| 2110 | 2137 | goto store_next; |
| 2111 | - case PPC_FLAGS_EXCP_BOOKE: | |
| 2138 | + case POWERPC_EXCP_BOOKE: | |
| 2112 | 2139 | srr_0 = &env->spr[SPR_BOOKE_CSRR0]; |
| 2113 | 2140 | srr_1 = &env->spr[SPR_BOOKE_CSRR1]; |
| 2114 | 2141 | break; |
| ... | ... | @@ -2119,16 +2146,18 @@ void do_interrupt (CPUState *env) |
| 2119 | 2146 | return; |
| 2120 | 2147 | case 0x1100: |
| 2121 | 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 | 2151 | /* DTLBMISS on 4xx */ |
| 2125 | 2152 | msr &= ~0xFFFF0000; |
| 2126 | 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 | 2158 | /* DLTLBMISS on 602/603 */ |
| 2130 | 2159 | goto store_gprs; |
| 2131 | - case PPC_FLAGS_EXCP_7x5: | |
| 2160 | + case POWERPC_EXCP_7x5: | |
| 2132 | 2161 | /* DLTLBMISS on 745/755 */ |
| 2133 | 2162 | goto tlb_miss; |
| 2134 | 2163 | default: |
| ... | ... | @@ -2138,13 +2167,15 @@ void do_interrupt (CPUState *env) |
| 2138 | 2167 | return; |
| 2139 | 2168 | case 0x1200: |
| 2140 | 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 | 2172 | /* ITLBMISS on 4xx */ |
| 2144 | 2173 | msr &= ~0xFFFF0000; |
| 2145 | 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 | 2179 | /* DSTLBMISS on 602/603 */ |
| 2149 | 2180 | store_gprs: |
| 2150 | 2181 | /* Swap temporary saved registers with GPRs */ |
| ... | ... | @@ -2177,7 +2208,7 @@ void do_interrupt (CPUState *env) |
| 2177 | 2208 | } |
| 2178 | 2209 | #endif |
| 2179 | 2210 | goto tlb_miss; |
| 2180 | - case PPC_FLAGS_EXCP_7x5: | |
| 2211 | + case POWERPC_EXCP_7x5: | |
| 2181 | 2212 | /* DSTLBMISS on 745/755 */ |
| 2182 | 2213 | tlb_miss: |
| 2183 | 2214 | msr &= ~0xF83F0000; |
| ... | ... | @@ -2192,13 +2223,15 @@ void do_interrupt (CPUState *env) |
| 2192 | 2223 | } |
| 2193 | 2224 | return; |
| 2194 | 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 | 2235 | /* IABR on 6xx/7xx */ |
| 2203 | 2236 | /* XXX: TODO */ |
| 2204 | 2237 | cpu_abort(env, "IABR exception is not implemented yet !\n"); |
| ... | ... | @@ -2209,13 +2242,15 @@ void do_interrupt (CPUState *env) |
| 2209 | 2242 | } |
| 2210 | 2243 | return; |
| 2211 | 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 | 2254 | /* SMI on 6xx/7xx */ |
| 2220 | 2255 | /* XXX: TODO */ |
| 2221 | 2256 | cpu_abort(env, "SMI exception is not implemented yet !\n"); |
| ... | ... | @@ -2226,20 +2261,20 @@ void do_interrupt (CPUState *env) |
| 2226 | 2261 | } |
| 2227 | 2262 | return; |
| 2228 | 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 | 2266 | /* Watchdog on 602 */ |
| 2232 | 2267 | /* XXX: TODO */ |
| 2233 | 2268 | cpu_abort(env, |
| 2234 | 2269 | "602 watchdog exception is not implemented yet !\n"); |
| 2235 | 2270 | goto store_next; |
| 2236 | - case PPC_FLAGS_EXCP_970: | |
| 2271 | + case POWERPC_EXCP_970: | |
| 2237 | 2272 | /* Soft patch exception on 970 */ |
| 2238 | 2273 | /* XXX: TODO */ |
| 2239 | 2274 | cpu_abort(env, |
| 2240 | 2275 | "970 soft-patch exception is not implemented yet !\n"); |
| 2241 | 2276 | goto store_next; |
| 2242 | - case PPC_FLAGS_EXCP_74xx: | |
| 2277 | + case POWERPC_EXCP_74xx: | |
| 2243 | 2278 | /* VPU assist on 74xx */ |
| 2244 | 2279 | /* XXX: TODO */ |
| 2245 | 2280 | cpu_abort(env, "VPU assist exception is not implemented yet !\n"); |
| ... | ... | @@ -2250,14 +2285,14 @@ void do_interrupt (CPUState *env) |
| 2250 | 2285 | } |
| 2251 | 2286 | return; |
| 2252 | 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 | 2290 | /* Emulation trap on 602 */ |
| 2256 | 2291 | /* XXX: TODO */ |
| 2257 | 2292 | cpu_abort(env, "602 emulation trap exception " |
| 2258 | 2293 | "is not implemented yet !\n"); |
| 2259 | 2294 | goto store_next; |
| 2260 | - case PPC_FLAGS_EXCP_970: | |
| 2295 | + case POWERPC_EXCP_970: | |
| 2261 | 2296 | /* Maintenance exception on 970 */ |
| 2262 | 2297 | /* XXX: TODO */ |
| 2263 | 2298 | cpu_abort(env, |
| ... | ... | @@ -2269,15 +2304,15 @@ void do_interrupt (CPUState *env) |
| 2269 | 2304 | } |
| 2270 | 2305 | return; |
| 2271 | 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 | 2310 | /* Thermal management interrupt on G3 */ |
| 2276 | 2311 | /* XXX: TODO */ |
| 2277 | 2312 | cpu_abort(env, "G3 thermal management exception " |
| 2278 | 2313 | "is not implemented yet !\n"); |
| 2279 | 2314 | goto store_next; |
| 2280 | - case PPC_FLAGS_EXCP_970: | |
| 2315 | + case POWERPC_EXCP_970: | |
| 2281 | 2316 | /* VPU assist on 970 */ |
| 2282 | 2317 | /* XXX: TODO */ |
| 2283 | 2318 | cpu_abort(env, |
| ... | ... | @@ -2289,8 +2324,8 @@ void do_interrupt (CPUState *env) |
| 2289 | 2324 | } |
| 2290 | 2325 | return; |
| 2291 | 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 | 2329 | /* Thermal exception on 970 */ |
| 2295 | 2330 | /* XXX: TODO */ |
| 2296 | 2331 | cpu_abort(env, "970 thermal management exception " |
| ... | ... | @@ -2302,19 +2337,19 @@ void do_interrupt (CPUState *env) |
| 2302 | 2337 | } |
| 2303 | 2338 | return; |
| 2304 | 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 | 2342 | /* DEBUG on 4xx */ |
| 2308 | 2343 | /* XXX: TODO */ |
| 2309 | 2344 | cpu_abort(env, "40x debug exception is not implemented yet !\n"); |
| 2310 | 2345 | goto store_next; |
| 2311 | - case PPC_FLAGS_EXCP_601: | |
| 2346 | + case POWERPC_EXCP_601: | |
| 2312 | 2347 | /* Run mode exception on 601 */ |
| 2313 | 2348 | /* XXX: TODO */ |
| 2314 | 2349 | cpu_abort(env, |
| 2315 | 2350 | "601 run mode exception is not implemented yet !\n"); |
| 2316 | 2351 | goto store_next; |
| 2317 | - case PPC_FLAGS_EXCP_BOOKE: | |
| 2352 | + case POWERPC_EXCP_BOOKE: | |
| 2318 | 2353 | srr_0 = &env->spr[SPR_BOOKE_CSRR0]; |
| 2319 | 2354 | srr_1 = &env->spr[SPR_BOOKE_CSRR1]; |
| 2320 | 2355 | break; |
| ... | ... | @@ -2361,7 +2396,7 @@ void do_interrupt (CPUState *env) |
| 2361 | 2396 | msr_dr = 0; |
| 2362 | 2397 | msr_ri = 0; |
| 2363 | 2398 | msr_le = msr_ile; |
| 2364 | - if (PPC_EXCP(env) == PPC_FLAGS_EXCP_BOOKE) { | |
| 2399 | + if (env->excp_model == POWERPC_EXCP_BOOKE) { | |
| 2365 | 2400 | msr_cm = msr_icm; |
| 2366 | 2401 | if (idx == -1 || (idx >= 16 && idx < 32)) { |
| 2367 | 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 | 2319 | RETURN(); |
| 2320 | 2320 | } |
| 2321 | 2321 | |
| 2322 | -#if !defined(CONFIG_USER_ONLY) | |
| 2323 | 2322 | void OPPROTO op_load_dcr (void) |
| 2324 | 2323 | { |
| 2325 | 2324 | do_load_dcr(); |
| ... | ... | @@ -2332,6 +2331,7 @@ void OPPROTO op_store_dcr (void) |
| 2332 | 2331 | RETURN(); |
| 2333 | 2332 | } |
| 2334 | 2333 | |
| 2334 | +#if !defined(CONFIG_USER_ONLY) | |
| 2335 | 2335 | /* Return from critical interrupt : |
| 2336 | 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 | 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 | 1244 | #if !defined(CONFIG_USER_ONLY) |
| 1210 | 1245 | void do_40x_rfci (void) |
| 1211 | 1246 | { |
| ... | ... | @@ -1268,40 +1303,6 @@ void do_rfmci (void) |
| 1268 | 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 | 1306 | void do_load_403_pb (int num) |
| 1306 | 1307 | { |
| 1307 | 1308 | T0 = env->pb[num]; |
| ... | ... | @@ -2238,7 +2239,7 @@ void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr) |
| 2238 | 2239 | if (unlikely(ret != 0)) { |
| 2239 | 2240 | if (likely(retaddr)) { |
| 2240 | 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 | 2243 | tb = tb_find_pc(pc); |
| 2243 | 2244 | if (likely(tb)) { |
| 2244 | 2245 | /* the PC is inside the translated code. It means that we have |
| ... | ... | @@ -2261,16 +2262,14 @@ void do_tlbie (void) |
| 2261 | 2262 | { |
| 2262 | 2263 | T0 = (uint32_t)T0; |
| 2263 | 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 | 2267 | ppc6xx_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, 0); |
| 2266 | 2268 | if (env->id_tlbs == 1) |
| 2267 | 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 | 2273 | } else { |
| 2275 | 2274 | /* tlbie invalidate TLBs for all segments */ |
| 2276 | 2275 | T0 &= TARGET_PAGE_MASK; |
| ... | ... | @@ -2305,11 +2304,11 @@ void do_tlbie_64 (void) |
| 2305 | 2304 | { |
| 2306 | 2305 | T0 = (uint64_t)T0; |
| 2307 | 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 | 2308 | ppc6xx_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, 0); |
| 2310 | 2309 | if (env->id_tlbs == 1) |
| 2311 | 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 | 2312 | /* XXX: TODO */ |
| 2314 | 2313 | #if 0 |
| 2315 | 2314 | ppcbooke_tlb_invalidate_virt(env, T0 & TARGET_PAGE_MASK, |
| ... | ... | @@ -2541,7 +2540,7 @@ void do_4xx_tlbwe_hi (void) |
| 2541 | 2540 | "are not supported (%d)\n", |
| 2542 | 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 | 2544 | if (T1 & 0x40) |
| 2546 | 2545 | tlb->prot |= PAGE_VALID; |
| 2547 | 2546 | else |
| ... | ... | @@ -2676,14 +2675,14 @@ void do_440_tlbwe (int word) |
| 2676 | 2675 | |
| 2677 | 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 | 2681 | void do_440_tlbsx_ (void) |
| 2683 | 2682 | { |
| 2684 | 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 | 2686 | if (T0 != -1) |
| 2688 | 2687 | tmp |= 0x02; |
| 2689 | 2688 | env->crf[0] = tmp; | ... | ... |
target-ppc/op_helper.h
| ... | ... | @@ -167,9 +167,9 @@ void do_440_tlbwe (int word); |
| 167 | 167 | /* PowerPC 4xx specific helpers */ |
| 168 | 168 | void do_405_check_ov (void); |
| 169 | 169 | void do_405_check_sat (void); |
| 170 | -#if !defined(CONFIG_USER_ONLY) | |
| 171 | 170 | void do_load_dcr (void); |
| 172 | 171 | void do_store_dcr (void); |
| 172 | +#if !defined(CONFIG_USER_ONLY) | |
| 173 | 173 | void do_40x_rfci (void); |
| 174 | 174 | void do_rfci (void); |
| 175 | 175 | void do_rfdi (void); | ... | ... |
target-ppc/translate.c
| ... | ... | @@ -27,11 +27,14 @@ |
| 27 | 27 | #include "exec-all.h" |
| 28 | 28 | #include "disas.h" |
| 29 | 29 | |
| 30 | +/* Include definitions for instructions classes and implementations flags */ | |
| 30 | 31 | //#define DO_SINGLE_STEP |
| 31 | 32 | //#define PPC_DEBUG_DISAS |
| 32 | 33 | //#define DEBUG_MEMORY_ACCESSES |
| 33 | 34 | //#define DO_PPC_STATISTICS |
| 34 | 35 | |
| 36 | +/*****************************************************************************/ | |
| 37 | +/* Code translation helpers */ | |
| 35 | 38 | #if defined(USE_DIRECT_JUMP) |
| 36 | 39 | #define TBPARAM(x) |
| 37 | 40 | #else |
| ... | ... | @@ -175,8 +178,10 @@ struct opc_handler_t { |
| 175 | 178 | uint64_t type; |
| 176 | 179 | /* handler */ |
| 177 | 180 | void (*handler)(DisasContext *ctx); |
| 178 | -#if defined(DO_PPC_STATISTICS) | |
| 181 | +#if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU) | |
| 179 | 182 | const unsigned char *oname; |
| 183 | +#endif | |
| 184 | +#if defined(DO_PPC_STATISTICS) | |
| 180 | 185 | uint64_t count; |
| 181 | 186 | #endif |
| 182 | 187 | }; |
| ... | ... | @@ -249,6 +254,7 @@ typedef struct opcode_t { |
| 249 | 254 | const unsigned char *oname; |
| 250 | 255 | } opcode_t; |
| 251 | 256 | |
| 257 | +/*****************************************************************************/ | |
| 252 | 258 | /*** Instruction decoding ***/ |
| 253 | 259 | #define EXTRACT_HELPER(name, shift, nb) \ |
| 254 | 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 | 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 | 474 | #if HOST_LONG_BITS == 64 |
| 369 | 475 | #define OPC_ALIGN 8 |
| 370 | 476 | #else |
| ... | ... | @@ -845,15 +951,15 @@ GEN_HANDLER(subfic, 0x08, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
| 845 | 951 | |
| 846 | 952 | #if defined(TARGET_PPC64) |
| 847 | 953 | /* mulhd mulhd. */ |
| 848 | -GEN_INT_ARITHN (mulhd, 0x1F, 0x09, 0x02, PPC_INTEGER); | |
| 954 | +GEN_INT_ARITHN (mulhd, 0x1F, 0x09, 0x02, PPC_64B); | |
| 849 | 955 | /* mulhdu mulhdu. */ |
| 850 | -GEN_INT_ARITHN (mulhdu, 0x1F, 0x09, 0x00, PPC_INTEGER); | |
| 956 | +GEN_INT_ARITHN (mulhdu, 0x1F, 0x09, 0x00, PPC_64B); | |
| 851 | 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 | 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 | 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 | 963 | #endif |
| 858 | 964 | |
| 859 | 965 | /*** Integer comparison ***/ |
| ... | ... | @@ -1424,8 +1530,8 @@ __GEN_LOGICAL2(srd, 0x1B, 0x10, PPC_64B); |
| 1424 | 1530 | #endif |
| 1425 | 1531 | |
| 1426 | 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 | 1536 | if (unlikely(!ctx->fpu_enabled)) { \ |
| 1431 | 1537 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ |
| ... | ... | @@ -1444,9 +1550,9 @@ GEN_HANDLER(f##name, op1, op2, 0xFF, 0x00000000, PPC_FLOAT) \ |
| 1444 | 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 | 1557 | #define _GEN_FLOAT_AB(name, op, op1, op2, inval, isfloat) \ |
| 1452 | 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 | 1598 | _GEN_FLOAT_AC(name, name, 0x3F, op2, inval, 0); \ |
| 1493 | 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 | 1604 | if (unlikely(!ctx->fpu_enabled)) { \ |
| 1499 | 1605 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ |
| ... | ... | @@ -1507,8 +1613,8 @@ GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, PPC_FLOAT) \ |
| 1507 | 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 | 1619 | if (unlikely(!ctx->fpu_enabled)) { \ |
| 1514 | 1620 | RET_EXCP(ctx, EXCP_NO_FP, 0); \ |
| ... | ... | @@ -1529,19 +1635,19 @@ GEN_FLOAT_AB(div, 0x12, 0x000007C0); |
| 1529 | 1635 | /* fmul - fmuls */ |
| 1530 | 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 | 1646 | /* fsub - fsubs */ |
| 1541 | 1647 | GEN_FLOAT_AB(sub, 0x14, 0x000007C0); |
| 1542 | 1648 | /* Optional: */ |
| 1543 | 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 | 1652 | if (unlikely(!ctx->fpu_enabled)) { |
| 1547 | 1653 | RET_EXCP(ctx, EXCP_NO_FP, 0); |
| ... | ... | @@ -1555,7 +1661,7 @@ GEN_HANDLER(fsqrt, 0x3F, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT) |
| 1555 | 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 | 1666 | if (unlikely(!ctx->fpu_enabled)) { |
| 1561 | 1667 | RET_EXCP(ctx, EXCP_NO_FP, 0); |
| ... | ... | @@ -1572,28 +1678,28 @@ GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT) |
| 1572 | 1678 | |
| 1573 | 1679 | /*** Floating-Point multiply-and-add ***/ |
| 1574 | 1680 | /* fmadd - fmadds */ |
| 1575 | -GEN_FLOAT_ACB(madd, 0x1D); | |
| 1681 | +GEN_FLOAT_ACB(madd, 0x1D, PPC_FLOAT); | |
| 1576 | 1682 | /* fmsub - fmsubs */ |
| 1577 | -GEN_FLOAT_ACB(msub, 0x1C); | |
| 1683 | +GEN_FLOAT_ACB(msub, 0x1C, PPC_FLOAT); | |
| 1578 | 1684 | /* fnmadd - fnmadds */ |
| 1579 | -GEN_FLOAT_ACB(nmadd, 0x1F); | |
| 1685 | +GEN_FLOAT_ACB(nmadd, 0x1F, PPC_FLOAT); | |
| 1580 | 1686 | /* fnmsub - fnmsubs */ |
| 1581 | -GEN_FLOAT_ACB(nmsub, 0x1E); | |
| 1687 | +GEN_FLOAT_ACB(nmsub, 0x1E, PPC_FLOAT); | |
| 1582 | 1688 | |
| 1583 | 1689 | /*** Floating-Point round & convert ***/ |
| 1584 | 1690 | /* fctiw */ |
| 1585 | -GEN_FLOAT_B(ctiw, 0x0E, 0x00); | |
| 1691 | +GEN_FLOAT_B(ctiw, 0x0E, 0x00, PPC_FLOAT); | |
| 1586 | 1692 | /* fctiwz */ |
| 1587 | -GEN_FLOAT_B(ctiwz, 0x0F, 0x00); | |
| 1693 | +GEN_FLOAT_B(ctiwz, 0x0F, 0x00, PPC_FLOAT); | |
| 1588 | 1694 | /* frsp */ |
| 1589 | -GEN_FLOAT_B(rsp, 0x0C, 0x00); | |
| 1695 | +GEN_FLOAT_B(rsp, 0x0C, 0x00, PPC_FLOAT); | |
| 1590 | 1696 | #if defined(TARGET_PPC64) |
| 1591 | 1697 | /* fcfid */ |
| 1592 | -GEN_FLOAT_B(cfid, 0x0E, 0x1A); | |
| 1698 | +GEN_FLOAT_B(cfid, 0x0E, 0x1A, PPC_64B); | |
| 1593 | 1699 | /* fctid */ |
| 1594 | -GEN_FLOAT_B(ctid, 0x0E, 0x19); | |
| 1700 | +GEN_FLOAT_B(ctid, 0x0E, 0x19, PPC_64B); | |
| 1595 | 1701 | /* fctidz */ |
| 1596 | -GEN_FLOAT_B(ctidz, 0x0F, 0x19); | |
| 1702 | +GEN_FLOAT_B(ctidz, 0x0F, 0x19, PPC_64B); | |
| 1597 | 1703 | #endif |
| 1598 | 1704 | |
| 1599 | 1705 | /*** Floating-Point compare ***/ |
| ... | ... | @@ -1627,7 +1733,7 @@ GEN_HANDLER(fcmpu, 0x3F, 0x00, 0x00, 0x00600001, PPC_FLOAT) |
| 1627 | 1733 | |
| 1628 | 1734 | /*** Floating-point move ***/ |
| 1629 | 1735 | /* fabs */ |
| 1630 | -GEN_FLOAT_B(abs, 0x08, 0x08); | |
| 1736 | +GEN_FLOAT_B(abs, 0x08, 0x08, PPC_FLOAT); | |
| 1631 | 1737 | |
| 1632 | 1738 | /* fmr - fmr. */ |
| 1633 | 1739 | 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 | 1752 | /* fnabs */ |
| 1647 | -GEN_FLOAT_B(nabs, 0x08, 0x04); | |
| 1753 | +GEN_FLOAT_B(nabs, 0x08, 0x04, PPC_FLOAT); | |
| 1648 | 1754 | /* fneg */ |
| 1649 | -GEN_FLOAT_B(neg, 0x08, 0x01); | |
| 1755 | +GEN_FLOAT_B(neg, 0x08, 0x01, PPC_FLOAT); | |
| 1650 | 1756 | |
| 1651 | 1757 | /*** Floating-Point status & ctrl register ***/ |
| 1652 | 1758 | /* mcrfs */ |
| ... | ... | @@ -2426,7 +2532,7 @@ static GenOpFunc *gen_op_stdcx[] = { |
| 2426 | 2532 | #endif |
| 2427 | 2533 | |
| 2428 | 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 | 2537 | gen_addr_reg_index(ctx); |
| 2432 | 2538 | op_ldarx(); |
| ... | ... | @@ -2434,7 +2540,7 @@ GEN_HANDLER(ldarx, 0x1F, 0x14, 0x02, 0x00000001, PPC_RES) |
| 2434 | 2540 | } |
| 2435 | 2541 | |
| 2436 | 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 | 2545 | gen_addr_reg_index(ctx); |
| 2440 | 2546 | gen_op_load_gpr_T1(rS(ctx->opcode)); |
| ... | ... | @@ -2591,7 +2697,7 @@ GEN_STFS(fs, 0x14); |
| 2591 | 2697 | |
| 2592 | 2698 | /* Optional: */ |
| 2593 | 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 | 2702 | if (unlikely(!ctx->fpu_enabled)) { |
| 2597 | 2703 | RET_EXCP(ctx, EXCP_NO_FP, 0); |
| ... | ... | @@ -2886,7 +2992,7 @@ GEN_HANDLER(rfi, 0x13, 0x12, 0x01, 0x03FF8001, PPC_FLOW) |
| 2886 | 2992 | } |
| 2887 | 2993 | |
| 2888 | 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 | 2997 | #if defined(CONFIG_USER_ONLY) |
| 2892 | 2998 | RET_PRIVOPC(ctx); |
| ... | ... | @@ -3050,7 +3156,7 @@ GEN_HANDLER(mfspr, 0x1F, 0x13, 0x0A, 0x00000001, PPC_MISC) |
| 3050 | 3156 | } |
| 3051 | 3157 | |
| 3052 | 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 | 3161 | gen_op_mfspr(ctx); |
| 3056 | 3162 | } |
| ... | ... | @@ -3074,7 +3180,7 @@ GEN_HANDLER(mtcrf, 0x1F, 0x10, 0x04, 0x00000801, PPC_MISC) |
| 3074 | 3180 | |
| 3075 | 3181 | /* mtmsr */ |
| 3076 | 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 | 3185 | #if defined(CONFIG_USER_ONLY) |
| 3080 | 3186 | RET_PRIVREG(ctx); |
| ... | ... | @@ -3296,7 +3402,7 @@ GEN_HANDLER(icbi, 0x1F, 0x16, 0x1E, 0x03E00001, PPC_CACHE) |
| 3296 | 3402 | |
| 3297 | 3403 | /* Optional: */ |
| 3298 | 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 | 3674 | } |
| 3569 | 3675 | |
| 3570 | 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 | 3679 | gen_op_load_gpr_T0(rA(ctx->opcode)); |
| 3574 | 3680 | gen_op_POWER_clcs(); |
| ... | ... | @@ -4222,14 +4328,14 @@ GEN_HANDLER(stfqx, 0x1F, 0x17, 0x1C, 0x00000001, PPC_POWER2) |
| 4222 | 4328 | |
| 4223 | 4329 | /* BookE specific instructions */ |
| 4224 | 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 | 4333 | /* XXX: TODO */ |
| 4228 | 4334 | RET_INVAL(ctx); |
| 4229 | 4335 | } |
| 4230 | 4336 | |
| 4231 | 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 | 4340 | #if defined(CONFIG_USER_ONLY) |
| 4235 | 4341 | RET_PRIVOPC(ctx); |
| ... | ... | @@ -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 | 4443 | gen_405_mulladd_insn(ctx, opc2, opc3, rA(ctx->opcode), rB(ctx->opcode), \ |
| 4339 | 4444 | rD(ctx->opcode), Rc(ctx->opcode)); \ |
| 4340 | 4445 | } |
| 4341 | 4446 | |
| 4342 | 4447 | /* macchw - macchw. */ |
| 4343 | -GEN_MAC_HANDLER(macchw, 0x0C, 0x05, 0); | |
| 4448 | +GEN_MAC_HANDLER(macchw, 0x0C, 0x05); | |
| 4344 | 4449 | /* macchwo - macchwo. */ |
| 4345 | -GEN_MAC_HANDLER(macchwo, 0x0C, 0x15, 0); | |
| 4450 | +GEN_MAC_HANDLER(macchwo, 0x0C, 0x15); | |
| 4346 | 4451 | /* macchws - macchws. */ |
| 4347 | -GEN_MAC_HANDLER(macchws, 0x0C, 0x07, 0); | |
| 4452 | +GEN_MAC_HANDLER(macchws, 0x0C, 0x07); | |
| 4348 | 4453 | /* macchwso - macchwso. */ |
| 4349 | -GEN_MAC_HANDLER(macchwso, 0x0C, 0x17, 0); | |
| 4454 | +GEN_MAC_HANDLER(macchwso, 0x0C, 0x17); | |
| 4350 | 4455 | /* macchwsu - macchwsu. */ |
| 4351 | -GEN_MAC_HANDLER(macchwsu, 0x0C, 0x06, 0); | |
| 4456 | +GEN_MAC_HANDLER(macchwsu, 0x0C, 0x06); | |
| 4352 | 4457 | /* macchwsuo - macchwsuo. */ |
| 4353 | -GEN_MAC_HANDLER(macchwsuo, 0x0C, 0x16, 0); | |
| 4458 | +GEN_MAC_HANDLER(macchwsuo, 0x0C, 0x16); | |
| 4354 | 4459 | /* macchwu - macchwu. */ |
| 4355 | -GEN_MAC_HANDLER(macchwu, 0x0C, 0x04, 0); | |
| 4460 | +GEN_MAC_HANDLER(macchwu, 0x0C, 0x04); | |
| 4356 | 4461 | /* macchwuo - macchwuo. */ |
| 4357 | -GEN_MAC_HANDLER(macchwuo, 0x0C, 0x14, 0); | |
| 4462 | +GEN_MAC_HANDLER(macchwuo, 0x0C, 0x14); | |
| 4358 | 4463 | /* machhw - machhw. */ |
| 4359 | -GEN_MAC_HANDLER(machhw, 0x0C, 0x01, 0); | |
| 4464 | +GEN_MAC_HANDLER(machhw, 0x0C, 0x01); | |
| 4360 | 4465 | /* machhwo - machhwo. */ |
| 4361 | -GEN_MAC_HANDLER(machhwo, 0x0C, 0x11, 0); | |
| 4466 | +GEN_MAC_HANDLER(machhwo, 0x0C, 0x11); | |
| 4362 | 4467 | /* machhws - machhws. */ |
| 4363 | -GEN_MAC_HANDLER(machhws, 0x0C, 0x03, 0); | |
| 4468 | +GEN_MAC_HANDLER(machhws, 0x0C, 0x03); | |
| 4364 | 4469 | /* machhwso - machhwso. */ |
| 4365 | -GEN_MAC_HANDLER(machhwso, 0x0C, 0x13, 0); | |
| 4470 | +GEN_MAC_HANDLER(machhwso, 0x0C, 0x13); | |
| 4366 | 4471 | /* machhwsu - machhwsu. */ |
| 4367 | -GEN_MAC_HANDLER(machhwsu, 0x0C, 0x02, 0); | |
| 4472 | +GEN_MAC_HANDLER(machhwsu, 0x0C, 0x02); | |
| 4368 | 4473 | /* machhwsuo - machhwsuo. */ |
| 4369 | -GEN_MAC_HANDLER(machhwsuo, 0x0C, 0x12, 0); | |
| 4474 | +GEN_MAC_HANDLER(machhwsuo, 0x0C, 0x12); | |
| 4370 | 4475 | /* machhwu - machhwu. */ |
| 4371 | -GEN_MAC_HANDLER(machhwu, 0x0C, 0x00, 0); | |
| 4476 | +GEN_MAC_HANDLER(machhwu, 0x0C, 0x00); | |
| 4372 | 4477 | /* machhwuo - machhwuo. */ |
| 4373 | -GEN_MAC_HANDLER(machhwuo, 0x0C, 0x10, 0); | |
| 4478 | +GEN_MAC_HANDLER(machhwuo, 0x0C, 0x10); | |
| 4374 | 4479 | /* maclhw - maclhw. */ |
| 4375 | -GEN_MAC_HANDLER(maclhw, 0x0C, 0x0D, 0); | |
| 4480 | +GEN_MAC_HANDLER(maclhw, 0x0C, 0x0D); | |
| 4376 | 4481 | /* maclhwo - maclhwo. */ |
| 4377 | -GEN_MAC_HANDLER(maclhwo, 0x0C, 0x1D, 0); | |
| 4482 | +GEN_MAC_HANDLER(maclhwo, 0x0C, 0x1D); | |
| 4378 | 4483 | /* maclhws - maclhws. */ |
| 4379 | -GEN_MAC_HANDLER(maclhws, 0x0C, 0x0F, 0); | |
| 4484 | +GEN_MAC_HANDLER(maclhws, 0x0C, 0x0F); | |
| 4380 | 4485 | /* maclhwso - maclhwso. */ |
| 4381 | -GEN_MAC_HANDLER(maclhwso, 0x0C, 0x1F, 0); | |
| 4486 | +GEN_MAC_HANDLER(maclhwso, 0x0C, 0x1F); | |
| 4382 | 4487 | /* maclhwu - maclhwu. */ |
| 4383 | -GEN_MAC_HANDLER(maclhwu, 0x0C, 0x0C, 0); | |
| 4488 | +GEN_MAC_HANDLER(maclhwu, 0x0C, 0x0C); | |
| 4384 | 4489 | /* maclhwuo - maclhwuo. */ |
| 4385 | -GEN_MAC_HANDLER(maclhwuo, 0x0C, 0x1C, 0); | |
| 4490 | +GEN_MAC_HANDLER(maclhwuo, 0x0C, 0x1C); | |
| 4386 | 4491 | /* maclhwsu - maclhwsu. */ |
| 4387 | -GEN_MAC_HANDLER(maclhwsu, 0x0C, 0x0E, 0); | |
| 4492 | +GEN_MAC_HANDLER(maclhwsu, 0x0C, 0x0E); | |
| 4388 | 4493 | /* maclhwsuo - maclhwsuo. */ |
| 4389 | -GEN_MAC_HANDLER(maclhwsuo, 0x0C, 0x1E, 0); | |
| 4494 | +GEN_MAC_HANDLER(maclhwsuo, 0x0C, 0x1E); | |
| 4390 | 4495 | /* nmacchw - nmacchw. */ |
| 4391 | -GEN_MAC_HANDLER(nmacchw, 0x0E, 0x05, 0); | |
| 4496 | +GEN_MAC_HANDLER(nmacchw, 0x0E, 0x05); | |
| 4392 | 4497 | /* nmacchwo - nmacchwo. */ |
| 4393 | -GEN_MAC_HANDLER(nmacchwo, 0x0E, 0x15, 0); | |
| 4498 | +GEN_MAC_HANDLER(nmacchwo, 0x0E, 0x15); | |
| 4394 | 4499 | /* nmacchws - nmacchws. */ |
| 4395 | -GEN_MAC_HANDLER(nmacchws, 0x0E, 0x07, 0); | |
| 4500 | +GEN_MAC_HANDLER(nmacchws, 0x0E, 0x07); | |
| 4396 | 4501 | /* nmacchwso - nmacchwso. */ |
| 4397 | -GEN_MAC_HANDLER(nmacchwso, 0x0E, 0x17, 0); | |
| 4502 | +GEN_MAC_HANDLER(nmacchwso, 0x0E, 0x17); | |
| 4398 | 4503 | /* nmachhw - nmachhw. */ |
| 4399 | -GEN_MAC_HANDLER(nmachhw, 0x0E, 0x01, 0); | |
| 4504 | +GEN_MAC_HANDLER(nmachhw, 0x0E, 0x01); | |
| 4400 | 4505 | /* nmachhwo - nmachhwo. */ |
| 4401 | -GEN_MAC_HANDLER(nmachhwo, 0x0E, 0x11, 0); | |
| 4506 | +GEN_MAC_HANDLER(nmachhwo, 0x0E, 0x11); | |
| 4402 | 4507 | /* nmachhws - nmachhws. */ |
| 4403 | -GEN_MAC_HANDLER(nmachhws, 0x0E, 0x03, 1); | |
| 4508 | +GEN_MAC_HANDLER(nmachhws, 0x0E, 0x03); | |
| 4404 | 4509 | /* nmachhwso - nmachhwso. */ |
| 4405 | -GEN_MAC_HANDLER(nmachhwso, 0x0E, 0x13, 1); | |
| 4510 | +GEN_MAC_HANDLER(nmachhwso, 0x0E, 0x13); | |
| 4406 | 4511 | /* nmaclhw - nmaclhw. */ |
| 4407 | -GEN_MAC_HANDLER(nmaclhw, 0x0E, 0x0D, 1); | |
| 4512 | +GEN_MAC_HANDLER(nmaclhw, 0x0E, 0x0D); | |
| 4408 | 4513 | /* nmaclhwo - nmaclhwo. */ |
| 4409 | -GEN_MAC_HANDLER(nmaclhwo, 0x0E, 0x1D, 1); | |
| 4514 | +GEN_MAC_HANDLER(nmaclhwo, 0x0E, 0x1D); | |
| 4410 | 4515 | /* nmaclhws - nmaclhws. */ |
| 4411 | -GEN_MAC_HANDLER(nmaclhws, 0x0E, 0x0F, 1); | |
| 4516 | +GEN_MAC_HANDLER(nmaclhws, 0x0E, 0x0F); | |
| 4412 | 4517 | /* nmaclhwso - nmaclhwso. */ |
| 4413 | -GEN_MAC_HANDLER(nmaclhwso, 0x0E, 0x1F, 1); | |
| 4518 | +GEN_MAC_HANDLER(nmaclhwso, 0x0E, 0x1F); | |
| 4414 | 4519 | |
| 4415 | 4520 | /* mulchw - mulchw. */ |
| 4416 | -GEN_MAC_HANDLER(mulchw, 0x08, 0x05, 0); | |
| 4521 | +GEN_MAC_HANDLER(mulchw, 0x08, 0x05); | |
| 4417 | 4522 | /* mulchwu - mulchwu. */ |
| 4418 | -GEN_MAC_HANDLER(mulchwu, 0x08, 0x04, 0); | |
| 4523 | +GEN_MAC_HANDLER(mulchwu, 0x08, 0x04); | |
| 4419 | 4524 | /* mulhhw - mulhhw. */ |
| 4420 | -GEN_MAC_HANDLER(mulhhw, 0x08, 0x01, 0); | |
| 4525 | +GEN_MAC_HANDLER(mulhhw, 0x08, 0x01); | |
| 4421 | 4526 | /* mulhhwu - mulhhwu. */ |
| 4422 | -GEN_MAC_HANDLER(mulhhwu, 0x08, 0x00, 0); | |
| 4527 | +GEN_MAC_HANDLER(mulhhwu, 0x08, 0x00); | |
| 4423 | 4528 | /* mullhw - mullhw. */ |
| 4424 | -GEN_MAC_HANDLER(mullhw, 0x08, 0x0D, 0); | |
| 4529 | +GEN_MAC_HANDLER(mullhw, 0x08, 0x0D); | |
| 4425 | 4530 | /* mullhwu - mullhwu. */ |
| 4426 | -GEN_MAC_HANDLER(mullhwu, 0x08, 0x0C, 0); | |
| 4531 | +GEN_MAC_HANDLER(mullhwu, 0x08, 0x0C); | |
| 4427 | 4532 | |
| 4428 | 4533 | /* mfdcr */ |
| 4429 | 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 | 4568 | |
| 4464 | 4569 | /* mfdcrx */ |
| 4465 | 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 | 4573 | #if defined(CONFIG_USER_ONLY) |
| 4469 | 4574 | RET_PRIVREG(ctx); |
| ... | ... | @@ -4475,12 +4580,13 @@ GEN_HANDLER(mfdcrx, 0x1F, 0x03, 0x08, 0x00000001, PPC_BOOKE) |
| 4475 | 4580 | gen_op_load_gpr_T0(rA(ctx->opcode)); |
| 4476 | 4581 | gen_op_load_dcr(); |
| 4477 | 4582 | gen_op_store_T0_gpr(rD(ctx->opcode)); |
| 4583 | + /* Note: Rc update flag set leads to undefined state of Rc0 */ | |
| 4478 | 4584 | #endif |
| 4479 | 4585 | } |
| 4480 | 4586 | |
| 4481 | 4587 | /* mtdcrx */ |
| 4482 | 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 | 4591 | #if defined(CONFIG_USER_ONLY) |
| 4486 | 4592 | RET_PRIVREG(ctx); |
| ... | ... | @@ -4492,9 +4598,28 @@ GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000001, PPC_BOOKE) |
| 4492 | 4598 | gen_op_load_gpr_T0(rA(ctx->opcode)); |
| 4493 | 4599 | gen_op_load_gpr_T1(rS(ctx->opcode)); |
| 4494 | 4600 | gen_op_store_dcr(); |
| 4601 | + /* Note: Rc update flag set leads to undefined state of Rc0 */ | |
| 4495 | 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 | 4623 | /* dccci */ |
| 4499 | 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 | 4720 | |
| 4596 | 4721 | /* BookE specific */ |
| 4597 | 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 | 4725 | #if defined(CONFIG_USER_ONLY) |
| 4601 | 4726 | RET_PRIVOPC(ctx); |
| ... | ... | @@ -4611,7 +4736,7 @@ GEN_HANDLER(rfdi, 0x13, 0x07, 0x01, 0x03FF8001, PPC_BOOKE) |
| 4611 | 4736 | } |
| 4612 | 4737 | |
| 4613 | 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 | 4741 | #if defined(CONFIG_USER_ONLY) |
| 4617 | 4742 | RET_PRIVOPC(ctx); |
| ... | ... | @@ -4628,7 +4753,7 @@ GEN_HANDLER(rfmci, 0x13, 0x06, 0x01, 0x03FF8001, PPC_BOOKE) |
| 4628 | 4753 | |
| 4629 | 4754 | /* TLB management - PowerPC 405 implementation */ |
| 4630 | 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 | 4758 | #if defined(CONFIG_USER_ONLY) |
| 4634 | 4759 | RET_PRIVOPC(ctx); |
| ... | ... | @@ -4656,7 +4781,7 @@ GEN_HANDLER(tlbre_40x, 0x1F, 0x12, 0x1D, 0x00000001, PPC_40x_SPEC) |
| 4656 | 4781 | } |
| 4657 | 4782 | |
| 4658 | 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 | 4786 | #if defined(CONFIG_USER_ONLY) |
| 4662 | 4787 | RET_PRIVOPC(ctx); |
| ... | ... | @@ -4675,7 +4800,7 @@ GEN_HANDLER(tlbsx_40x, 0x1F, 0x12, 0x1C, 0x00000000, PPC_40x_SPEC) |
| 4675 | 4800 | } |
| 4676 | 4801 | |
| 4677 | 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 | 4805 | #if defined(CONFIG_USER_ONLY) |
| 4681 | 4806 | RET_PRIVOPC(ctx); |
| ... | ... | @@ -5701,7 +5826,7 @@ void cpu_dump_state (CPUState *env, FILE *f, |
| 5701 | 5826 | for (i = 0; i < 32; i++) { |
| 5702 | 5827 | if ((i & (RGPL - 1)) == 0) |
| 5703 | 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 | 5830 | if ((i & (RGPL - 1)) == (RGPL - 1)) |
| 5706 | 5831 | cpu_fprintf(f, "\n"); |
| 5707 | 5832 | } | ... | ... |
target-ppc/translate_init.c
| ... | ... | @@ -32,20 +32,26 @@ struct ppc_def_t { |
| 32 | 32 | uint32_t pvr; |
| 33 | 33 | uint32_t pvr_mask; |
| 34 | 34 | uint64_t insns_flags; |
| 35 | - uint32_t flags; | |
| 36 | 35 | uint64_t msr_mask; |
| 36 | + uint8_t mmu_model; | |
| 37 | + uint8_t excp_model; | |
| 38 | + uint8_t bus_model; | |
| 39 | + uint8_t pad; | |
| 40 | + void (*init_proc)(CPUPPCState *env); | |
| 37 | 41 | }; |
| 38 | 42 | |
| 39 | 43 | /* For user-mode emulation, we don't emulate any IRQ controller */ |
| 40 | 44 | #if defined(CONFIG_USER_ONLY) |
| 41 | -#define PPC_IRQ_INIT_FN(name) \ | |
| 42 | -static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env) \ | |
| 43 | -{ \ | |
| 45 | +#define PPC_IRQ_INIT_FN(name) \ | |
| 46 | +static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env) \ | |
| 47 | +{ \ | |
| 44 | 48 | } |
| 45 | 49 | #else |
| 46 | -#define PPC_IRQ_INIT_FN(name) \ | |
| 50 | +#define PPC_IRQ_INIT_FN(name) \ | |
| 47 | 51 | void glue(glue(ppc, name),_irq_init) (CPUPPCState *env); |
| 48 | 52 | #endif |
| 53 | + | |
| 54 | +PPC_IRQ_INIT_FN(401); | |
| 49 | 55 | PPC_IRQ_INIT_FN(405); |
| 50 | 56 | PPC_IRQ_INIT_FN(6xx); |
| 51 | 57 | PPC_IRQ_INIT_FN(970); |
| ... | ... | @@ -285,7 +291,7 @@ static void spr_write_asr (void *opaque, int sprn) |
| 285 | 291 | RET_STOP(ctx); |
| 286 | 292 | } |
| 287 | 293 | #endif |
| 288 | -#endif /* !defined(CONFIG_USER_ONLY) */ | |
| 294 | +#endif | |
| 289 | 295 | |
| 290 | 296 | /* PowerPC 601 specific registers */ |
| 291 | 297 | /* RTC */ |
| ... | ... | @@ -582,7 +588,7 @@ static void gen_low_BATs (CPUPPCState *env) |
| 582 | 588 | SPR_NOACCESS, SPR_NOACCESS, |
| 583 | 589 | &spr_read_dbat, &spr_write_dbatl, |
| 584 | 590 | 0x00000000); |
| 585 | - env->nb_BATs = 4; | |
| 591 | + env->nb_BATs += 4; | |
| 586 | 592 | } |
| 587 | 593 | |
| 588 | 594 | /* BATs 4-7 */ |
| ... | ... | @@ -652,7 +658,7 @@ static void gen_high_BATs (CPUPPCState *env) |
| 652 | 658 | SPR_NOACCESS, SPR_NOACCESS, |
| 653 | 659 | &spr_read_dbat_h, &spr_write_dbatl_h, |
| 654 | 660 | 0x00000000); |
| 655 | - env->nb_BATs = 8; | |
| 661 | + env->nb_BATs += 4; | |
| 656 | 662 | } |
| 657 | 663 | |
| 658 | 664 | /* Generic PowerPC time base */ |
| ... | ... | @@ -797,7 +803,7 @@ static void gen_spr_7xx (CPUPPCState *env) |
| 797 | 803 | &spr_read_generic, &spr_write_generic, |
| 798 | 804 | 0x00000000); |
| 799 | 805 | /* XXX : not implemented */ |
| 800 | - spr_register(env, SPR_SIA, "SIA", | |
| 806 | + spr_register(env, SPR_SIAR, "SIAR", | |
| 801 | 807 | SPR_NOACCESS, SPR_NOACCESS, |
| 802 | 808 | &spr_read_generic, SPR_NOACCESS, |
| 803 | 809 | 0x00000000); |
| ... | ... | @@ -825,29 +831,33 @@ static void gen_spr_7xx (CPUPPCState *env) |
| 825 | 831 | &spr_read_ureg, SPR_NOACCESS, |
| 826 | 832 | &spr_read_ureg, SPR_NOACCESS, |
| 827 | 833 | 0x00000000); |
| 828 | - spr_register(env, SPR_USIA, "USIA", | |
| 834 | + spr_register(env, SPR_USIAR, "USIAR", | |
| 829 | 835 | &spr_read_ureg, SPR_NOACCESS, |
| 830 | 836 | &spr_read_ureg, SPR_NOACCESS, |
| 831 | 837 | 0x00000000); |
| 832 | - /* Thermal management */ | |
| 838 | + /* External access control */ | |
| 833 | 839 | /* XXX : not implemented */ |
| 834 | - spr_register(env, SPR_THRM1, "THRM1", | |
| 840 | + spr_register(env, SPR_EAR, "EAR", | |
| 835 | 841 | SPR_NOACCESS, SPR_NOACCESS, |
| 836 | 842 | &spr_read_generic, &spr_write_generic, |
| 837 | 843 | 0x00000000); |
| 844 | +} | |
| 845 | + | |
| 846 | +static void gen_spr_thrm (CPUPPCState *env) | |
| 847 | +{ | |
| 848 | + /* Thermal management */ | |
| 838 | 849 | /* XXX : not implemented */ |
| 839 | - spr_register(env, SPR_THRM2, "THRM2", | |
| 850 | + spr_register(env, SPR_THRM1, "THRM1", | |
| 840 | 851 | SPR_NOACCESS, SPR_NOACCESS, |
| 841 | 852 | &spr_read_generic, &spr_write_generic, |
| 842 | 853 | 0x00000000); |
| 843 | 854 | /* XXX : not implemented */ |
| 844 | - spr_register(env, SPR_THRM3, "THRM3", | |
| 855 | + spr_register(env, SPR_THRM2, "THRM2", | |
| 845 | 856 | SPR_NOACCESS, SPR_NOACCESS, |
| 846 | 857 | &spr_read_generic, &spr_write_generic, |
| 847 | 858 | 0x00000000); |
| 848 | - /* External access control */ | |
| 849 | 859 | /* XXX : not implemented */ |
| 850 | - spr_register(env, SPR_EAR, "EAR", | |
| 860 | + spr_register(env, SPR_THRM3, "THRM3", | |
| 851 | 861 | SPR_NOACCESS, SPR_NOACCESS, |
| 852 | 862 | &spr_read_generic, &spr_write_generic, |
| 853 | 863 | 0x00000000); |
| ... | ... | @@ -904,7 +914,7 @@ static void gen_spr_604 (CPUPPCState *env) |
| 904 | 914 | &spr_read_generic, &spr_write_generic, |
| 905 | 915 | 0x00000000); |
| 906 | 916 | /* XXX : not implemented */ |
| 907 | - spr_register(env, SPR_SIA, "SIA", | |
| 917 | + spr_register(env, SPR_SIAR, "SIAR", | |
| 908 | 918 | SPR_NOACCESS, SPR_NOACCESS, |
| 909 | 919 | &spr_read_generic, SPR_NOACCESS, |
| 910 | 920 | 0x00000000); |
| ... | ... | @@ -1004,7 +1014,7 @@ static void gen_spr_602 (CPUPPCState *env) |
| 1004 | 1014 | &spr_read_generic, &spr_write_generic, |
| 1005 | 1015 | 0x00000000); |
| 1006 | 1016 | /* XXX : not implemented */ |
| 1007 | - spr_register(env, SPR_ESASR, "ESASR", | |
| 1017 | + spr_register(env, SPR_ESASRR, "ESASRR", | |
| 1008 | 1018 | SPR_NOACCESS, SPR_NOACCESS, |
| 1009 | 1019 | &spr_read_generic, &spr_write_generic, |
| 1010 | 1020 | 0x00000000); |
| ... | ... | @@ -1030,6 +1040,11 @@ static void gen_spr_602 (CPUPPCState *env) |
| 1030 | 1040 | SPR_NOACCESS, SPR_NOACCESS, |
| 1031 | 1041 | &spr_read_generic, &spr_write_generic, |
| 1032 | 1042 | 0x00000000); |
| 1043 | + /* XXX : not implemented */ | |
| 1044 | + spr_register(env, SPR_IABR, "IABR", | |
| 1045 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1046 | + &spr_read_generic, &spr_write_generic, | |
| 1047 | + 0x00000000); | |
| 1033 | 1048 | } |
| 1034 | 1049 | |
| 1035 | 1050 | /* SPR specific to PowerPC 601 implementation */ |
| ... | ... | @@ -1104,7 +1119,116 @@ static void gen_spr_601 (CPUPPCState *env) |
| 1104 | 1119 | SPR_NOACCESS, SPR_NOACCESS, |
| 1105 | 1120 | &spr_read_601_ubat, &spr_write_601_ubatl, |
| 1106 | 1121 | 0x00000000); |
| 1122 | + env->nb_BATs = 4; | |
| 1123 | +} | |
| 1124 | + | |
| 1125 | +static void gen_spr_74xx (CPUPPCState *env) | |
| 1126 | +{ | |
| 1127 | + /* Processor identification */ | |
| 1128 | + spr_register(env, SPR_PIR, "PIR", | |
| 1129 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1130 | + &spr_read_generic, &spr_write_pir, | |
| 1131 | + 0x00000000); | |
| 1132 | + /* XXX : not implemented */ | |
| 1133 | + spr_register(env, SPR_MMCR2, "MMCR2", | |
| 1134 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1135 | + &spr_read_generic, &spr_write_generic, | |
| 1136 | + 0x00000000); | |
| 1137 | + spr_register(env, SPR_UMMCR2, "UMMCR2", | |
| 1138 | + &spr_read_ureg, SPR_NOACCESS, | |
| 1139 | + &spr_read_ureg, SPR_NOACCESS, | |
| 1140 | + 0x00000000); | |
| 1141 | + /* XXX: not implemented */ | |
| 1142 | + spr_register(env, SPR_BAMR, "BAMR", | |
| 1143 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1144 | + &spr_read_generic, &spr_write_generic, | |
| 1145 | + 0x00000000); | |
| 1146 | + spr_register(env, SPR_UBAMR, "UBAMR", | |
| 1147 | + &spr_read_ureg, SPR_NOACCESS, | |
| 1148 | + &spr_read_ureg, SPR_NOACCESS, | |
| 1149 | + 0x00000000); | |
| 1150 | + spr_register(env, SPR_MSSCR0, "MSSCR0", | |
| 1151 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1152 | + &spr_read_generic, &spr_write_generic, | |
| 1153 | + 0x00000000); | |
| 1154 | + /* Hardware implementation registers */ | |
| 1155 | + /* XXX : not implemented */ | |
| 1156 | + spr_register(env, SPR_HID0, "HID0", | |
| 1157 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1158 | + &spr_read_generic, &spr_write_generic, | |
| 1159 | + 0x00000000); | |
| 1160 | + /* XXX : not implemented */ | |
| 1161 | + spr_register(env, SPR_HID1, "HID1", | |
| 1162 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1163 | + &spr_read_generic, &spr_write_generic, | |
| 1164 | + 0x00000000); | |
| 1165 | + /* Altivec */ | |
| 1166 | + spr_register(env, SPR_VRSAVE, "VRSAVE", | |
| 1167 | + &spr_read_generic, &spr_write_generic, | |
| 1168 | + &spr_read_generic, &spr_write_generic, | |
| 1169 | + 0x00000000); | |
| 1170 | +} | |
| 1171 | + | |
| 1172 | +#if defined (TODO) | |
| 1173 | +static void gen_l3_ctrl (CPUPPCState *env) | |
| 1174 | +{ | |
| 1175 | + /* L3CR */ | |
| 1176 | + /* XXX : not implemented */ | |
| 1177 | + spr_register(env, SPR_L3CR, "L3CR", | |
| 1178 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1179 | + &spr_read_generic, &spr_write_generic, | |
| 1180 | + 0x00000000); | |
| 1181 | + /* L3ITCR0 */ | |
| 1182 | + spr_register(env, SPR_L3ITCR0, "L3ITCR0", | |
| 1183 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1184 | + &spr_read_generic, &spr_write_generic, | |
| 1185 | + 0x00000000); | |
| 1186 | + /* L3ITCR1 */ | |
| 1187 | + spr_register(env, SPR_L3ITCR1, "L3ITCR1", | |
| 1188 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1189 | + &spr_read_generic, &spr_write_generic, | |
| 1190 | + 0x00000000); | |
| 1191 | + /* L3ITCR2 */ | |
| 1192 | + spr_register(env, SPR_L3ITCR2, "L3ITCR2", | |
| 1193 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1194 | + &spr_read_generic, &spr_write_generic, | |
| 1195 | + 0x00000000); | |
| 1196 | + /* L3ITCR3 */ | |
| 1197 | + spr_register(env, SPR_L3ITCR3, "L3ITCR3", | |
| 1198 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1199 | + &spr_read_generic, &spr_write_generic, | |
| 1200 | + 0x00000000); | |
| 1201 | + /* L3OHCR */ | |
| 1202 | + spr_register(env, SPR_L3OHCR, "L3OHCR", | |
| 1203 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1204 | + &spr_read_generic, &spr_write_generic, | |
| 1205 | + 0x00000000); | |
| 1206 | + /* L3PM */ | |
| 1207 | + spr_register(env, SPR_L3PM, "L3PM", | |
| 1208 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1209 | + &spr_read_generic, &spr_write_generic, | |
| 1210 | + 0x00000000); | |
| 1211 | +} | |
| 1212 | +#endif /* TODO */ | |
| 1213 | + | |
| 1214 | +#if defined (TODO) | |
| 1215 | +static void gen_74xx_soft_tlb (CPUPPCState *env) | |
| 1216 | +{ | |
| 1217 | + /* XXX: TODO */ | |
| 1218 | + spr_register(env, SPR_PTEHI, "PTEHI", | |
| 1219 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1220 | + &spr_read_generic, &spr_write_generic, | |
| 1221 | + 0x00000000); | |
| 1222 | + spr_register(env, SPR_PTELO, "PTELO", | |
| 1223 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1224 | + &spr_read_generic, &spr_write_generic, | |
| 1225 | + 0x00000000); | |
| 1226 | + spr_register(env, SPR_TLBMISS, "TLBMISS", | |
| 1227 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1228 | + &spr_read_generic, &spr_write_generic, | |
| 1229 | + 0x00000000); | |
| 1107 | 1230 | } |
| 1231 | +#endif /* TODO */ | |
| 1108 | 1232 | |
| 1109 | 1233 | /* PowerPC BookE SPR */ |
| 1110 | 1234 | static void gen_spr_BookE (CPUPPCState *env) |
| ... | ... | @@ -1132,14 +1256,6 @@ static void gen_spr_BookE (CPUPPCState *env) |
| 1132 | 1256 | SPR_NOACCESS, SPR_NOACCESS, |
| 1133 | 1257 | &spr_read_generic, &spr_write_generic, |
| 1134 | 1258 | 0x00000000); |
| 1135 | - spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0", | |
| 1136 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 1137 | - &spr_read_generic, &spr_write_generic, | |
| 1138 | - 0x00000000); | |
| 1139 | - spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1", | |
| 1140 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 1141 | - &spr_read_generic, &spr_write_generic, | |
| 1142 | - 0x00000000); | |
| 1143 | 1259 | #endif |
| 1144 | 1260 | /* Debug */ |
| 1145 | 1261 | /* XXX : not implemented */ |
| ... | ... | @@ -1366,6 +1482,7 @@ static void gen_spr_BookE (CPUPPCState *env) |
| 1366 | 1482 | } |
| 1367 | 1483 | |
| 1368 | 1484 | /* FSL storage control registers */ |
| 1485 | +#if defined(TODO) | |
| 1369 | 1486 | static void gen_spr_BookE_FSL (CPUPPCState *env) |
| 1370 | 1487 | { |
| 1371 | 1488 | /* TLB assist registers */ |
| ... | ... | @@ -1447,6 +1564,7 @@ static void gen_spr_BookE_FSL (CPUPPCState *env) |
| 1447 | 1564 | break; |
| 1448 | 1565 | } |
| 1449 | 1566 | } |
| 1567 | +#endif | |
| 1450 | 1568 | |
| 1451 | 1569 | /* SPR specific to PowerPC 440 implementation */ |
| 1452 | 1570 | static void gen_spr_440 (CPUPPCState *env) |
| ... | ... | @@ -1599,11 +1717,6 @@ static void gen_spr_40x (CPUPPCState *env) |
| 1599 | 1717 | &spr_read_generic, &spr_write_generic, |
| 1600 | 1718 | 0x00000000); |
| 1601 | 1719 | /* XXX : not implemented */ |
| 1602 | - spr_register(env, SPR_40x_DCWR, "DCWR", | |
| 1603 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 1604 | - &spr_read_generic, &spr_write_generic, | |
| 1605 | - 0x00000000); | |
| 1606 | - /* XXX : not implemented */ | |
| 1607 | 1720 | spr_register(env, SPR_40x_ICCR, "ICCR", |
| 1608 | 1721 | SPR_NOACCESS, SPR_NOACCESS, |
| 1609 | 1722 | &spr_read_generic, &spr_write_generic, |
| ... | ... | @@ -1613,11 +1726,6 @@ static void gen_spr_40x (CPUPPCState *env) |
| 1613 | 1726 | SPR_NOACCESS, SPR_NOACCESS, |
| 1614 | 1727 | &spr_read_generic, SPR_NOACCESS, |
| 1615 | 1728 | 0x00000000); |
| 1616 | - /* Bus access control */ | |
| 1617 | - spr_register(env, SPR_40x_SGR, "SGR", | |
| 1618 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 1619 | - &spr_read_generic, &spr_write_generic, | |
| 1620 | - 0xFFFFFFFF); | |
| 1621 | 1729 | /* Exception */ |
| 1622 | 1730 | spr_register(env, SPR_40x_DEAR, "DEAR", |
| 1623 | 1731 | SPR_NOACCESS, SPR_NOACCESS, |
| ... | ... | @@ -1834,6 +1942,19 @@ static void gen_spr_401 (CPUPPCState *env) |
| 1834 | 1942 | 0x00000000); |
| 1835 | 1943 | } |
| 1836 | 1944 | |
| 1945 | +static void gen_spr_401x2 (CPUPPCState *env) | |
| 1946 | +{ | |
| 1947 | + gen_spr_401(env); | |
| 1948 | + spr_register(env, SPR_40x_PID, "PID", | |
| 1949 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1950 | + &spr_read_generic, &spr_write_generic, | |
| 1951 | + 0x00000000); | |
| 1952 | + spr_register(env, SPR_40x_ZPR, "ZPR", | |
| 1953 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 1954 | + &spr_read_generic, &spr_write_generic, | |
| 1955 | + 0x00000000); | |
| 1956 | +} | |
| 1957 | + | |
| 1837 | 1958 | /* SPR specific to PowerPC 403 implementation */ |
| 1838 | 1959 | static void gen_spr_403 (CPUPPCState *env) |
| 1839 | 1960 | { |
| ... | ... | @@ -1867,11 +1988,10 @@ static void gen_spr_403 (CPUPPCState *env) |
| 1867 | 1988 | SPR_NOACCESS, SPR_NOACCESS, |
| 1868 | 1989 | &spr_read_generic, &spr_write_generic, |
| 1869 | 1990 | 0x00000000); |
| 1870 | - /* MMU */ | |
| 1871 | - spr_register(env, SPR_40x_PID, "PID", | |
| 1872 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 1873 | - &spr_read_generic, &spr_write_generic, | |
| 1874 | - 0x00000000); | |
| 1991 | +} | |
| 1992 | + | |
| 1993 | +static void gen_spr_403_real (CPUPPCState *env) | |
| 1994 | +{ | |
| 1875 | 1995 | spr_register(env, SPR_403_PBL1, "PBL1", |
| 1876 | 1996 | SPR_NOACCESS, SPR_NOACCESS, |
| 1877 | 1997 | &spr_read_403_pbr, &spr_write_403_pbr, |
| ... | ... | @@ -1888,6 +2008,15 @@ static void gen_spr_403 (CPUPPCState *env) |
| 1888 | 2008 | SPR_NOACCESS, SPR_NOACCESS, |
| 1889 | 2009 | &spr_read_403_pbr, &spr_write_403_pbr, |
| 1890 | 2010 | 0x00000000); |
| 2011 | +} | |
| 2012 | + | |
| 2013 | +static void gen_spr_403_mmu (CPUPPCState *env) | |
| 2014 | +{ | |
| 2015 | + /* MMU */ | |
| 2016 | + spr_register(env, SPR_40x_PID, "PID", | |
| 2017 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2018 | + &spr_read_generic, &spr_write_generic, | |
| 2019 | + 0x00000000); | |
| 1891 | 2020 | spr_register(env, SPR_40x_ZPR, "ZPR", |
| 1892 | 2021 | SPR_NOACCESS, SPR_NOACCESS, |
| 1893 | 2022 | &spr_read_generic, &spr_write_generic, |
| ... | ... | @@ -1895,7 +2024,6 @@ static void gen_spr_403 (CPUPPCState *env) |
| 1895 | 2024 | } |
| 1896 | 2025 | |
| 1897 | 2026 | /* SPR specific to PowerPC compression coprocessor extension */ |
| 1898 | -#if defined (TODO) | |
| 1899 | 2027 | static void gen_spr_compress (CPUPPCState *env) |
| 1900 | 2028 | { |
| 1901 | 2029 | spr_register(env, SPR_401_SKR, "SKR", |
| ... | ... | @@ -1903,14 +2031,93 @@ static void gen_spr_compress (CPUPPCState *env) |
| 1903 | 2031 | &spr_read_generic, &spr_write_generic, |
| 1904 | 2032 | 0x00000000); |
| 1905 | 2033 | } |
| 2034 | + | |
| 2035 | +#if defined (TARGET_PPC64) | |
| 2036 | +#if defined (TODO) | |
| 2037 | +/* SPR specific to PowerPC 620 */ | |
| 2038 | +static void gen_spr_620 (CPUPPCState *env) | |
| 2039 | +{ | |
| 2040 | + spr_register(env, SPR_620_PMR0, "PMR0", | |
| 2041 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2042 | + &spr_read_generic, &spr_write_generic, | |
| 2043 | + 0x00000000); | |
| 2044 | + spr_register(env, SPR_620_PMR1, "PMR1", | |
| 2045 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2046 | + &spr_read_generic, &spr_write_generic, | |
| 2047 | + 0x00000000); | |
| 2048 | + spr_register(env, SPR_620_PMR2, "PMR2", | |
| 2049 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2050 | + &spr_read_generic, &spr_write_generic, | |
| 2051 | + 0x00000000); | |
| 2052 | + spr_register(env, SPR_620_PMR3, "PMR3", | |
| 2053 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2054 | + &spr_read_generic, &spr_write_generic, | |
| 2055 | + 0x00000000); | |
| 2056 | + spr_register(env, SPR_620_PMR4, "PMR4", | |
| 2057 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2058 | + &spr_read_generic, &spr_write_generic, | |
| 2059 | + 0x00000000); | |
| 2060 | + spr_register(env, SPR_620_PMR5, "PMR5", | |
| 2061 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2062 | + &spr_read_generic, &spr_write_generic, | |
| 2063 | + 0x00000000); | |
| 2064 | + spr_register(env, SPR_620_PMR6, "PMR6", | |
| 2065 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2066 | + &spr_read_generic, &spr_write_generic, | |
| 2067 | + 0x00000000); | |
| 2068 | + spr_register(env, SPR_620_PMR7, "PMR7", | |
| 2069 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2070 | + &spr_read_generic, &spr_write_generic, | |
| 2071 | + 0x00000000); | |
| 2072 | + spr_register(env, SPR_620_PMR8, "PMR8", | |
| 2073 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2074 | + &spr_read_generic, &spr_write_generic, | |
| 2075 | + 0x00000000); | |
| 2076 | + spr_register(env, SPR_620_PMR9, "PMR9", | |
| 2077 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2078 | + &spr_read_generic, &spr_write_generic, | |
| 2079 | + 0x00000000); | |
| 2080 | + spr_register(env, SPR_620_PMRA, "PMR10", | |
| 2081 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2082 | + &spr_read_generic, &spr_write_generic, | |
| 2083 | + 0x00000000); | |
| 2084 | + spr_register(env, SPR_620_PMRB, "PMR11", | |
| 2085 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2086 | + &spr_read_generic, &spr_write_generic, | |
| 2087 | + 0x00000000); | |
| 2088 | + spr_register(env, SPR_620_PMRC, "PMR12", | |
| 2089 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2090 | + &spr_read_generic, &spr_write_generic, | |
| 2091 | + 0x00000000); | |
| 2092 | + spr_register(env, SPR_620_PMRD, "PMR13", | |
| 2093 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2094 | + &spr_read_generic, &spr_write_generic, | |
| 2095 | + 0x00000000); | |
| 2096 | + spr_register(env, SPR_620_PMRE, "PMR14", | |
| 2097 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2098 | + &spr_read_generic, &spr_write_generic, | |
| 2099 | + 0x00000000); | |
| 2100 | + spr_register(env, SPR_620_PMRF, "PMR15", | |
| 2101 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2102 | + &spr_read_generic, &spr_write_generic, | |
| 2103 | + 0x00000000); | |
| 2104 | + spr_register(env, SPR_620_HID8, "HID8", | |
| 2105 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2106 | + &spr_read_generic, &spr_write_generic, | |
| 2107 | + 0x00000000); | |
| 2108 | + spr_register(env, SPR_620_HID9, "HID9", | |
| 2109 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2110 | + &spr_read_generic, &spr_write_generic, | |
| 2111 | + 0x00000000); | |
| 2112 | +} | |
| 1906 | 2113 | #endif |
| 2114 | +#endif /* defined (TARGET_PPC64) */ | |
| 1907 | 2115 | |
| 1908 | 2116 | // XXX: TODO |
| 1909 | 2117 | /* |
| 1910 | 2118 | * AMR => SPR 29 (Power 2.04) |
| 1911 | 2119 | * CTRL => SPR 136 (Power 2.04) |
| 1912 | 2120 | * CTRL => SPR 152 (Power 2.04) |
| 1913 | - * VRSAVE => SPR 256 (Altivec) | |
| 1914 | 2121 | * SCOMC => SPR 276 (64 bits ?) |
| 1915 | 2122 | * SCOMD => SPR 277 (64 bits ?) |
| 1916 | 2123 | * ASR => SPR 280 (64 bits) |
| ... | ... | @@ -1942,2397 +2149,3341 @@ static void gen_spr_compress (CPUPPCState *env) |
| 1942 | 2149 | * ... and more (thermal management, performance counters, ...) |
| 1943 | 2150 | */ |
| 1944 | 2151 | |
| 1945 | -static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) | |
| 1946 | -{ | |
| 1947 | - env->reserve = -1; | |
| 1948 | - /* Default MMU definitions */ | |
| 1949 | - env->nb_BATs = -1; | |
| 1950 | - env->nb_tlb = 0; | |
| 1951 | - env->nb_ways = 0; | |
| 1952 | - /* XXX: missing: | |
| 1953 | - * 32 bits PowerPC: | |
| 1954 | - * - MPC5xx(x) | |
| 1955 | - * - MPC8xx(x) | |
| 1956 | - * - RCPU (same as MPC5xx ?) | |
| 1957 | - */ | |
| 1958 | - spr_register(env, SPR_PVR, "PVR", | |
| 1959 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 1960 | - &spr_read_generic, SPR_NOACCESS, | |
| 1961 | - def->pvr); | |
| 1962 | - printf("%s: PVR %08x mask %08x => %08x\n", __func__, | |
| 1963 | - def->pvr, def->pvr_mask, def->pvr & def->pvr_mask); | |
| 1964 | - switch (def->pvr) { | |
| 1965 | - /* Embedded PowerPC from IBM */ | |
| 1966 | - case CPU_PPC_401A1: /* 401 A1 family */ | |
| 1967 | - case CPU_PPC_401B2: /* 401 B2 family */ | |
| 1968 | -#if 0 | |
| 1969 | - case CPU_PPC_401B3: /* 401 B3 family */ | |
| 1970 | -#endif | |
| 1971 | - case CPU_PPC_401C2: /* 401 C2 family */ | |
| 1972 | - case CPU_PPC_401D2: /* 401 D2 family */ | |
| 1973 | - case CPU_PPC_401E2: /* 401 E2 family */ | |
| 1974 | - case CPU_PPC_401F2: /* 401 F2 family */ | |
| 1975 | - case CPU_PPC_401G2: /* 401 G2 family */ | |
| 1976 | - case CPU_PPC_IOP480: /* IOP 480 family */ | |
| 1977 | - case CPU_PPC_COBRA: /* IBM Processor for Network Resources */ | |
| 1978 | - gen_spr_generic(env); | |
| 1979 | - gen_spr_40x(env); | |
| 1980 | - gen_spr_401_403(env); | |
| 1981 | - gen_spr_401(env); | |
| 1982 | -#if defined (TODO) | |
| 1983 | - /* XXX: optional ? */ | |
| 1984 | - gen_spr_compress(env); | |
| 1985 | -#endif | |
| 1986 | - env->nb_BATs = 0; | |
| 1987 | - env->nb_tlb = 64; | |
| 1988 | - env->nb_ways = 1; | |
| 1989 | - env->id_tlbs = 0; | |
| 1990 | - /* XXX: TODO: allocate internal IRQ controller */ | |
| 1991 | - break; | |
| 1992 | - | |
| 1993 | - case CPU_PPC_403GA: /* 403 GA family */ | |
| 1994 | - case CPU_PPC_403GB: /* 403 GB family */ | |
| 1995 | - case CPU_PPC_403GC: /* 403 GC family */ | |
| 1996 | - case CPU_PPC_403GCX: /* 403 GCX family */ | |
| 1997 | - gen_spr_generic(env); | |
| 1998 | - gen_spr_40x(env); | |
| 1999 | - gen_spr_401_403(env); | |
| 2000 | - gen_spr_403(env); | |
| 2001 | - env->nb_BATs = 0; | |
| 2002 | - env->nb_tlb = 64; | |
| 2003 | - env->nb_ways = 1; | |
| 2004 | - env->id_tlbs = 0; | |
| 2005 | - /* XXX: TODO: allocate internal IRQ controller */ | |
| 2006 | - break; | |
| 2007 | - | |
| 2008 | - case CPU_PPC_405CR: /* 405 GP/CR family */ | |
| 2009 | - case CPU_PPC_405EP: /* 405 EP family */ | |
| 2010 | - case CPU_PPC_405GPR: /* 405 GPR family */ | |
| 2011 | - case CPU_PPC_405D2: /* 405 D2 family */ | |
| 2012 | - case CPU_PPC_405D4: /* 405 D4 family */ | |
| 2013 | - gen_spr_generic(env); | |
| 2014 | - /* Time base */ | |
| 2015 | - gen_tbl(env); | |
| 2016 | - gen_spr_40x(env); | |
| 2017 | - gen_spr_405(env); | |
| 2018 | - env->nb_BATs = 0; | |
| 2019 | - env->nb_tlb = 64; | |
| 2020 | - env->nb_ways = 1; | |
| 2021 | - env->id_tlbs = 0; | |
| 2022 | - /* Allocate hardware IRQ controller */ | |
| 2023 | - ppc405_irq_init(env); | |
| 2024 | - break; | |
| 2152 | +/*****************************************************************************/ | |
| 2153 | +/* PowerPC implementations definitions */ | |
| 2025 | 2154 | |
| 2026 | - case CPU_PPC_NPE405H: /* NPe405 H family */ | |
| 2027 | - case CPU_PPC_NPE405H2: | |
| 2028 | - case CPU_PPC_NPE405L: /* Npe405 L family */ | |
| 2029 | - gen_spr_generic(env); | |
| 2030 | - /* Time base */ | |
| 2031 | - gen_tbl(env); | |
| 2032 | - gen_spr_40x(env); | |
| 2033 | - gen_spr_405(env); | |
| 2034 | - env->nb_BATs = 0; | |
| 2035 | - env->nb_tlb = 64; | |
| 2036 | - env->nb_ways = 1; | |
| 2037 | - env->id_tlbs = 0; | |
| 2038 | - /* Allocate hardware IRQ controller */ | |
| 2039 | - ppc405_irq_init(env); | |
| 2040 | - break; | |
| 2155 | +/* PowerPC 40x instruction set */ | |
| 2156 | +#define POWERPC_INSNS_EMB (PPC_INSNS_BASE | PPC_EMB_COMMON) | |
| 2041 | 2157 | |
| 2042 | -#if defined (TODO) | |
| 2043 | - case CPU_PPC_STB01000: | |
| 2044 | -#endif | |
| 2045 | -#if defined (TODO) | |
| 2046 | - case CPU_PPC_STB01010: | |
| 2047 | -#endif | |
| 2048 | -#if defined (TODO) | |
| 2049 | - case CPU_PPC_STB0210: | |
| 2050 | -#endif | |
| 2051 | - case CPU_PPC_STB03: /* STB03 family */ | |
| 2052 | -#if defined (TODO) | |
| 2053 | - case CPU_PPC_STB043: /* STB043 family */ | |
| 2054 | -#endif | |
| 2055 | -#if defined (TODO) | |
| 2056 | - case CPU_PPC_STB045: /* STB045 family */ | |
| 2057 | -#endif | |
| 2058 | - case CPU_PPC_STB25: /* STB25 family */ | |
| 2059 | -#if defined (TODO) | |
| 2060 | - case CPU_PPC_STB130: /* STB130 family */ | |
| 2061 | -#endif | |
| 2062 | - gen_spr_generic(env); | |
| 2063 | - /* Time base */ | |
| 2064 | - gen_tbl(env); | |
| 2065 | - gen_spr_40x(env); | |
| 2066 | - gen_spr_405(env); | |
| 2067 | - env->nb_BATs = 0; | |
| 2068 | - env->nb_tlb = 64; | |
| 2069 | - env->nb_ways = 1; | |
| 2070 | - env->id_tlbs = 0; | |
| 2071 | - /* Allocate hardware IRQ controller */ | |
| 2072 | - ppc405_irq_init(env); | |
| 2073 | - break; | |
| 2158 | +/* PowerPC 401 */ | |
| 2159 | +#define POWERPC_INSNS_401 (POWERPC_INSNS_EMB | \ | |
| 2160 | + PPC_MEM_SYNC | PPC_MEM_EIEIO | \ | |
| 2161 | + PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT) | |
| 2162 | +#define POWERPC_MSRM_401 (0x00000000000FD201ULL) | |
| 2163 | +#define POWERPC_MMU_401 (POWERPC_MMU_REAL_4xx) | |
| 2164 | +#define POWERPC_EXCP_401 (POWERPC_EXCP_40x) | |
| 2165 | +#define POWERPC_INPUT_401 (PPC_FLAGS_INPUT_401) | |
| 2074 | 2166 | |
| 2075 | - case CPU_PPC_440EP: /* 440 EP family */ | |
| 2076 | - case CPU_PPC_440GP: /* 440 GP family */ | |
| 2077 | - case CPU_PPC_440GX: /* 440 GX family */ | |
| 2078 | - case CPU_PPC_440GXc: /* 440 GXc family */ | |
| 2079 | - case CPU_PPC_440GXf: /* 440 GXf family */ | |
| 2080 | - case CPU_PPC_440SP: /* 440 SP family */ | |
| 2081 | - case CPU_PPC_440SP2: | |
| 2082 | - case CPU_PPC_440SPE: /* 440 SPE family */ | |
| 2083 | - gen_spr_generic(env); | |
| 2084 | - /* Time base */ | |
| 2085 | - gen_tbl(env); | |
| 2086 | - gen_spr_BookE(env); | |
| 2087 | - gen_spr_440(env); | |
| 2088 | - env->nb_BATs = 0; | |
| 2089 | - env->nb_tlb = 64; | |
| 2090 | - env->nb_ways = 1; | |
| 2091 | - env->id_tlbs = 0; | |
| 2092 | - /* XXX: TODO: allocate internal IRQ controller */ | |
| 2093 | - break; | |
| 2167 | +static void init_proc_401 (CPUPPCState *env) | |
| 2168 | +{ | |
| 2169 | + gen_spr_40x(env); | |
| 2170 | + gen_spr_401_403(env); | |
| 2171 | + gen_spr_401(env); | |
| 2172 | + /* Bus access control */ | |
| 2173 | + spr_register(env, SPR_40x_SGR, "SGR", | |
| 2174 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2175 | + &spr_read_generic, &spr_write_generic, | |
| 2176 | + 0xFFFFFFFF); | |
| 2177 | + /* XXX : not implemented */ | |
| 2178 | + spr_register(env, SPR_40x_DCWR, "DCWR", | |
| 2179 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2180 | + &spr_read_generic, &spr_write_generic, | |
| 2181 | + 0x00000000); | |
| 2182 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2183 | +} | |
| 2094 | 2184 | |
| 2095 | - /* Embedded PowerPC from Freescale */ | |
| 2096 | -#if defined (TODO) | |
| 2097 | - case CPU_PPC_5xx: | |
| 2098 | - break; | |
| 2099 | -#endif | |
| 2100 | -#if defined (TODO) | |
| 2101 | - case CPU_PPC_8xx: /* MPC821 / 823 / 850 / 860 */ | |
| 2102 | - break; | |
| 2103 | -#endif | |
| 2104 | -#if defined (TODO) | |
| 2105 | - case CPU_PPC_82xx_HIP3: /* MPC8240 / 8260 */ | |
| 2106 | - case CPU_PPC_82xx_HIP4: /* MPC8240 / 8260 */ | |
| 2107 | - break; | |
| 2108 | -#endif | |
| 2109 | -#if defined (TODO) | |
| 2110 | - case CPU_PPC_827x: /* MPC 827x / 828x */ | |
| 2111 | - break; | |
| 2112 | -#endif | |
| 2113 | - | |
| 2114 | - /* XXX: Use MPC8540 PVR to implement a test PowerPC BookE target */ | |
| 2115 | - case CPU_PPC_e500v110: | |
| 2116 | - case CPU_PPC_e500v120: | |
| 2117 | - case CPU_PPC_e500v210: | |
| 2118 | - case CPU_PPC_e500v220: | |
| 2119 | - gen_spr_generic(env); | |
| 2120 | - /* Time base */ | |
| 2121 | - gen_tbl(env); | |
| 2122 | - gen_spr_BookE(env); | |
| 2123 | - gen_spr_BookE_FSL(env); | |
| 2124 | - env->nb_BATs = 0; | |
| 2125 | - env->nb_tlb = 64; | |
| 2126 | - env->nb_ways = 1; | |
| 2127 | - env->id_tlbs = 0; | |
| 2128 | - /* XXX: TODO: allocate internal IRQ controller */ | |
| 2129 | - break; | |
| 2130 | - | |
| 2131 | -#if defined (TODO) | |
| 2132 | - case CPU_PPC_e600: | |
| 2133 | - break; | |
| 2134 | -#endif | |
| 2135 | - | |
| 2136 | - /* 32 bits PowerPC */ | |
| 2137 | - case CPU_PPC_601: /* PowerPC 601 */ | |
| 2138 | - gen_spr_generic(env); | |
| 2139 | - gen_spr_ne_601(env); | |
| 2140 | - gen_spr_601(env); | |
| 2141 | - /* Hardware implementation registers */ | |
| 2142 | - /* XXX : not implemented */ | |
| 2143 | - spr_register(env, SPR_HID0, "HID0", | |
| 2144 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2145 | - &spr_read_generic, &spr_write_generic, | |
| 2146 | - 0x00000000); | |
| 2147 | - /* XXX : not implemented */ | |
| 2148 | - spr_register(env, SPR_HID1, "HID1", | |
| 2149 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2150 | - &spr_read_generic, &spr_write_generic, | |
| 2151 | - 0x00000000); | |
| 2152 | - /* XXX : not implemented */ | |
| 2153 | - spr_register(env, SPR_601_HID2, "HID2", | |
| 2154 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2155 | - &spr_read_generic, &spr_write_generic, | |
| 2156 | - 0x00000000); | |
| 2157 | - /* XXX : not implemented */ | |
| 2158 | - spr_register(env, SPR_601_HID5, "HID5", | |
| 2159 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2160 | - &spr_read_generic, &spr_write_generic, | |
| 2161 | - 0x00000000); | |
| 2162 | - /* XXX : not implemented */ | |
| 2163 | -#if 0 /* ? */ | |
| 2164 | - spr_register(env, SPR_601_HID15, "HID15", | |
| 2165 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2166 | - &spr_read_generic, &spr_write_generic, | |
| 2167 | - 0x00000000); | |
| 2168 | -#endif | |
| 2169 | - env->nb_tlb = 64; | |
| 2170 | - env->nb_ways = 2; | |
| 2171 | - env->id_tlbs = 0; | |
| 2172 | - env->id_tlbs = 0; | |
| 2173 | - /* XXX: TODO: allocate internal IRQ controller */ | |
| 2174 | - break; | |
| 2175 | - | |
| 2176 | - case CPU_PPC_602: /* PowerPC 602 */ | |
| 2177 | - gen_spr_generic(env); | |
| 2178 | - gen_spr_ne_601(env); | |
| 2179 | - /* Memory management */ | |
| 2180 | - gen_low_BATs(env); | |
| 2181 | - /* Time base */ | |
| 2182 | - gen_tbl(env); | |
| 2183 | - gen_6xx_7xx_soft_tlb(env, 64, 2); | |
| 2184 | - gen_spr_602(env); | |
| 2185 | - /* hardware implementation registers */ | |
| 2186 | - /* XXX : not implemented */ | |
| 2187 | - spr_register(env, SPR_HID0, "HID0", | |
| 2188 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2189 | - &spr_read_generic, &spr_write_generic, | |
| 2190 | - 0x00000000); | |
| 2191 | - /* XXX : not implemented */ | |
| 2192 | - spr_register(env, SPR_HID1, "HID1", | |
| 2193 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2194 | - &spr_read_generic, &spr_write_generic, | |
| 2195 | - 0x00000000); | |
| 2196 | - /* Allocate hardware IRQ controller */ | |
| 2197 | - ppc6xx_irq_init(env); | |
| 2198 | - break; | |
| 2199 | - | |
| 2200 | - case CPU_PPC_603: /* PowerPC 603 */ | |
| 2201 | - case CPU_PPC_603E: /* PowerPC 603e */ | |
| 2202 | - case CPU_PPC_603E7v: | |
| 2203 | - case CPU_PPC_603E7v2: | |
| 2204 | - case CPU_PPC_603P: /* PowerPC 603p */ | |
| 2205 | - case CPU_PPC_603R: /* PowerPC 603r */ | |
| 2206 | - gen_spr_generic(env); | |
| 2207 | - gen_spr_ne_601(env); | |
| 2208 | - /* Memory management */ | |
| 2209 | - gen_low_BATs(env); | |
| 2210 | - /* Time base */ | |
| 2211 | - gen_tbl(env); | |
| 2212 | - gen_6xx_7xx_soft_tlb(env, 64, 2); | |
| 2213 | - gen_spr_603(env); | |
| 2214 | - /* hardware implementation registers */ | |
| 2215 | - /* XXX : not implemented */ | |
| 2216 | - spr_register(env, SPR_HID0, "HID0", | |
| 2217 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2218 | - &spr_read_generic, &spr_write_generic, | |
| 2219 | - 0x00000000); | |
| 2220 | - /* XXX : not implemented */ | |
| 2221 | - spr_register(env, SPR_HID1, "HID1", | |
| 2222 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2223 | - &spr_read_generic, &spr_write_generic, | |
| 2224 | - 0x00000000); | |
| 2225 | - /* Allocate hardware IRQ controller */ | |
| 2226 | - ppc6xx_irq_init(env); | |
| 2227 | - break; | |
| 2228 | - | |
| 2229 | - case CPU_PPC_G2: /* PowerPC G2 family */ | |
| 2230 | - case CPU_PPC_G2H4: | |
| 2231 | - case CPU_PPC_G2gp: | |
| 2232 | - case CPU_PPC_G2ls: | |
| 2233 | - case CPU_PPC_G2LE: /* PowerPC G2LE family */ | |
| 2234 | - case CPU_PPC_G2LEgp: | |
| 2235 | - case CPU_PPC_G2LEls: | |
| 2236 | - gen_spr_generic(env); | |
| 2237 | - gen_spr_ne_601(env); | |
| 2238 | - /* Memory management */ | |
| 2239 | - gen_low_BATs(env); | |
| 2240 | - /* Time base */ | |
| 2241 | - gen_tbl(env); | |
| 2242 | - /* Memory management */ | |
| 2243 | - gen_high_BATs(env); | |
| 2244 | - gen_6xx_7xx_soft_tlb(env, 64, 2); | |
| 2245 | - gen_spr_G2_755(env); | |
| 2246 | - gen_spr_G2(env); | |
| 2247 | - /* Hardware implementation register */ | |
| 2248 | - /* XXX : not implemented */ | |
| 2249 | - spr_register(env, SPR_HID0, "HID0", | |
| 2250 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2251 | - &spr_read_generic, &spr_write_generic, | |
| 2252 | - 0x00000000); | |
| 2253 | - /* XXX : not implemented */ | |
| 2254 | - spr_register(env, SPR_HID1, "HID1", | |
| 2255 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2256 | - &spr_read_generic, &spr_write_generic, | |
| 2257 | - 0x00000000); | |
| 2258 | - /* XXX : not implemented */ | |
| 2259 | - spr_register(env, SPR_HID2, "HID2", | |
| 2260 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2261 | - &spr_read_generic, &spr_write_generic, | |
| 2262 | - 0x00000000); | |
| 2263 | - /* Allocate hardware IRQ controller */ | |
| 2264 | - ppc6xx_irq_init(env); | |
| 2265 | - break; | |
| 2266 | - | |
| 2267 | - case CPU_PPC_604: /* PowerPC 604 */ | |
| 2268 | - case CPU_PPC_604E: /* PowerPC 604e */ | |
| 2269 | - case CPU_PPC_604R: /* PowerPC 604r */ | |
| 2270 | - gen_spr_generic(env); | |
| 2271 | - gen_spr_ne_601(env); | |
| 2272 | - /* Memory management */ | |
| 2273 | - gen_low_BATs(env); | |
| 2274 | - /* Time base */ | |
| 2275 | - gen_tbl(env); | |
| 2276 | - gen_spr_604(env); | |
| 2277 | - /* Hardware implementation registers */ | |
| 2278 | - /* XXX : not implemented */ | |
| 2279 | - spr_register(env, SPR_HID0, "HID0", | |
| 2280 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2281 | - &spr_read_generic, &spr_write_generic, | |
| 2282 | - 0x00000000); | |
| 2283 | - /* XXX : not implemented */ | |
| 2284 | - spr_register(env, SPR_HID1, "HID1", | |
| 2285 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2286 | - &spr_read_generic, &spr_write_generic, | |
| 2287 | - 0x00000000); | |
| 2288 | - /* Allocate hardware IRQ controller */ | |
| 2289 | - ppc6xx_irq_init(env); | |
| 2290 | - break; | |
| 2291 | - | |
| 2292 | - case CPU_PPC_74x: /* PowerPC 740 / 750 */ | |
| 2293 | - case CPU_PPC_740E: | |
| 2294 | - case CPU_PPC_750E: | |
| 2295 | - case CPU_PPC_74xP: /* PowerPC 740P / 750P */ | |
| 2296 | - case CPU_PPC_750CXE21: /* IBM PowerPC 750cxe */ | |
| 2297 | - case CPU_PPC_750CXE22: | |
| 2298 | - case CPU_PPC_750CXE23: | |
| 2299 | - case CPU_PPC_750CXE24: | |
| 2300 | - case CPU_PPC_750CXE24b: | |
| 2301 | - case CPU_PPC_750CXE31: | |
| 2302 | - case CPU_PPC_750CXE31b: | |
| 2303 | - case CPU_PPC_750CXR: | |
| 2304 | - gen_spr_generic(env); | |
| 2305 | - gen_spr_ne_601(env); | |
| 2306 | - /* Memory management */ | |
| 2307 | - gen_low_BATs(env); | |
| 2308 | - /* Time base */ | |
| 2309 | - gen_tbl(env); | |
| 2310 | - gen_spr_7xx(env); | |
| 2311 | - /* Hardware implementation registers */ | |
| 2312 | - /* XXX : not implemented */ | |
| 2313 | - spr_register(env, SPR_HID0, "HID0", | |
| 2314 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2315 | - &spr_read_generic, &spr_write_generic, | |
| 2316 | - 0x00000000); | |
| 2317 | - /* XXX : not implemented */ | |
| 2318 | - spr_register(env, SPR_HID1, "HID1", | |
| 2319 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2320 | - &spr_read_generic, &spr_write_generic, | |
| 2321 | - 0x00000000); | |
| 2322 | - /* Allocate hardware IRQ controller */ | |
| 2323 | - ppc6xx_irq_init(env); | |
| 2324 | - break; | |
| 2325 | - | |
| 2326 | - case CPU_PPC_750FX10: /* IBM PowerPC 750 FX */ | |
| 2327 | - case CPU_PPC_750FX20: | |
| 2328 | - case CPU_PPC_750FX21: | |
| 2329 | - case CPU_PPC_750FX22: | |
| 2330 | - case CPU_PPC_750FX23: | |
| 2331 | - case CPU_PPC_750GX10: /* IBM PowerPC 750 GX */ | |
| 2332 | - case CPU_PPC_750GX11: | |
| 2333 | - case CPU_PPC_750GX12: | |
| 2334 | - gen_spr_generic(env); | |
| 2335 | - gen_spr_ne_601(env); | |
| 2336 | - /* Memory management */ | |
| 2337 | - gen_low_BATs(env); | |
| 2338 | - /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */ | |
| 2339 | - gen_high_BATs(env); | |
| 2340 | - /* Time base */ | |
| 2341 | - gen_tbl(env); | |
| 2342 | - gen_spr_7xx(env); | |
| 2343 | - /* Hardware implementation registers */ | |
| 2344 | - /* XXX : not implemented */ | |
| 2345 | - spr_register(env, SPR_HID0, "HID0", | |
| 2346 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2347 | - &spr_read_generic, &spr_write_generic, | |
| 2348 | - 0x00000000); | |
| 2349 | - /* XXX : not implemented */ | |
| 2350 | - spr_register(env, SPR_HID1, "HID1", | |
| 2351 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2352 | - &spr_read_generic, &spr_write_generic, | |
| 2353 | - 0x00000000); | |
| 2354 | - /* XXX : not implemented */ | |
| 2355 | - spr_register(env, SPR_750_HID2, "HID2", | |
| 2356 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2357 | - &spr_read_generic, &spr_write_generic, | |
| 2358 | - 0x00000000); | |
| 2359 | - /* Allocate hardware IRQ controller */ | |
| 2360 | - ppc6xx_irq_init(env); | |
| 2361 | - break; | |
| 2362 | - | |
| 2363 | - case CPU_PPC_755_10: /* PowerPC 755 */ | |
| 2364 | - case CPU_PPC_755_11: | |
| 2365 | - case CPU_PPC_755_20: | |
| 2366 | - case CPU_PPC_755D: | |
| 2367 | - case CPU_PPC_755E: | |
| 2368 | - gen_spr_generic(env); | |
| 2369 | - gen_spr_ne_601(env); | |
| 2370 | - /* Memory management */ | |
| 2371 | - gen_low_BATs(env); | |
| 2372 | - /* Time base */ | |
| 2373 | - gen_tbl(env); | |
| 2374 | - /* Memory management */ | |
| 2375 | - gen_high_BATs(env); | |
| 2376 | - gen_6xx_7xx_soft_tlb(env, 64, 2); | |
| 2377 | - gen_spr_G2_755(env); | |
| 2378 | - /* L2 cache control */ | |
| 2379 | - /* XXX : not implemented */ | |
| 2380 | - spr_register(env, SPR_ICTC, "ICTC", | |
| 2381 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2382 | - &spr_read_generic, &spr_write_generic, | |
| 2383 | - 0x00000000); | |
| 2384 | - /* XXX : not implemented */ | |
| 2385 | - spr_register(env, SPR_L2PM, "L2PM", | |
| 2386 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2387 | - &spr_read_generic, &spr_write_generic, | |
| 2388 | - 0x00000000); | |
| 2389 | - /* Hardware implementation registers */ | |
| 2390 | - /* XXX : not implemented */ | |
| 2391 | - spr_register(env, SPR_HID0, "HID0", | |
| 2392 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2393 | - &spr_read_generic, &spr_write_generic, | |
| 2394 | - 0x00000000); | |
| 2395 | - /* XXX : not implemented */ | |
| 2396 | - spr_register(env, SPR_HID1, "HID1", | |
| 2397 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2398 | - &spr_read_generic, &spr_write_generic, | |
| 2399 | - 0x00000000); | |
| 2400 | - /* XXX : not implemented */ | |
| 2401 | - spr_register(env, SPR_HID2, "HID2", | |
| 2402 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2403 | - &spr_read_generic, &spr_write_generic, | |
| 2404 | - 0x00000000); | |
| 2405 | - /* Allocate hardware IRQ controller */ | |
| 2406 | - ppc6xx_irq_init(env); | |
| 2407 | - break; | |
| 2408 | - | |
| 2409 | -#if defined (TODO) | |
| 2410 | - /* G4 family */ | |
| 2411 | - case CPU_PPC_7400: /* PowerPC 7400 */ | |
| 2412 | - case CPU_PPC_7410C: /* PowerPC 7410 */ | |
| 2413 | - case CPU_PPC_7410D: | |
| 2414 | - case CPU_PPC_7410E: | |
| 2415 | - case CPU_PPC_7441: /* PowerPC 7441 */ | |
| 2416 | - case CPU_PPC_7445: /* PowerPC 7445 */ | |
| 2417 | - case CPU_PPC_7447: /* PowerPC 7447 */ | |
| 2418 | - case CPU_PPC_7447A: /* PowerPC 7447A */ | |
| 2419 | - case CPU_PPC_7448: /* PowerPC 7448 */ | |
| 2420 | - case CPU_PPC_7450: /* PowerPC 7450 */ | |
| 2421 | - case CPU_PPC_7450b: | |
| 2422 | - case CPU_PPC_7451: /* PowerPC 7451 */ | |
| 2423 | - case CPU_PPC_7451G: | |
| 2424 | - case CPU_PPC_7455: /* PowerPC 7455 */ | |
| 2425 | - case CPU_PPC_7455F: | |
| 2426 | - case CPU_PPC_7455G: | |
| 2427 | - case CPU_PPC_7457: /* PowerPC 7457 */ | |
| 2428 | - case CPU_PPC_7457C: | |
| 2429 | - case CPU_PPC_7457A: /* PowerPC 7457A */ | |
| 2430 | - break; | |
| 2431 | -#endif | |
| 2432 | - | |
| 2433 | - /* 64 bits PowerPC */ | |
| 2434 | -#if defined (TARGET_PPC64) | |
| 2435 | -#if defined (TODO) | |
| 2436 | - case CPU_PPC_620: /* PowerPC 620 */ | |
| 2437 | - case CPU_PPC_630: /* PowerPC 630 (Power 3) */ | |
| 2438 | - case CPU_PPC_631: /* PowerPC 631 (Power 3+) */ | |
| 2439 | - case CPU_PPC_POWER4: /* Power 4 */ | |
| 2440 | - case CPU_PPC_POWER4P: /* Power 4+ */ | |
| 2441 | - case CPU_PPC_POWER5: /* Power 5 */ | |
| 2442 | - case CPU_PPC_POWER5P: /* Power 5+ */ | |
| 2443 | -#endif | |
| 2444 | - break; | |
| 2445 | - | |
| 2446 | - case CPU_PPC_970: /* PowerPC 970 */ | |
| 2447 | - case CPU_PPC_970FX10: /* PowerPC 970 FX */ | |
| 2448 | - case CPU_PPC_970FX20: | |
| 2449 | - case CPU_PPC_970FX21: | |
| 2450 | - case CPU_PPC_970FX30: | |
| 2451 | - case CPU_PPC_970FX31: | |
| 2452 | - case CPU_PPC_970MP10: /* PowerPC 970 MP */ | |
| 2453 | - case CPU_PPC_970MP11: | |
| 2454 | - gen_spr_generic(env); | |
| 2455 | - gen_spr_ne_601(env); | |
| 2456 | - /* XXX: not correct */ | |
| 2457 | - gen_low_BATs(env); | |
| 2458 | - /* Time base */ | |
| 2459 | - gen_tbl(env); | |
| 2460 | - gen_spr_7xx(env); | |
| 2461 | - /* Hardware implementation registers */ | |
| 2462 | - /* XXX : not implemented */ | |
| 2463 | - spr_register(env, SPR_HID0, "HID0", | |
| 2464 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2465 | - &spr_read_generic, &spr_write_generic, | |
| 2466 | - 0x00000000); | |
| 2467 | - /* XXX : not implemented */ | |
| 2468 | - spr_register(env, SPR_HID1, "HID1", | |
| 2469 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2470 | - &spr_read_generic, &spr_write_generic, | |
| 2471 | - 0x00000000); | |
| 2472 | - /* XXX : not implemented */ | |
| 2473 | - spr_register(env, SPR_750_HID2, "HID2", | |
| 2474 | - SPR_NOACCESS, SPR_NOACCESS, | |
| 2475 | - &spr_read_generic, &spr_write_generic, | |
| 2476 | - 0x00000000); | |
| 2477 | - /* Allocate hardware IRQ controller */ | |
| 2478 | - ppc970_irq_init(env); | |
| 2479 | - break; | |
| 2480 | - | |
| 2481 | -#if defined (TODO) | |
| 2482 | - case CPU_PPC_CELL10: /* Cell family */ | |
| 2483 | - case CPU_PPC_CELL20: | |
| 2484 | - case CPU_PPC_CELL30: | |
| 2485 | - case CPU_PPC_CELL31: | |
| 2486 | -#endif | |
| 2487 | - break; | |
| 2488 | - | |
| 2489 | -#if defined (TODO) | |
| 2490 | - case CPU_PPC_RS64: /* Apache (RS64/A35) */ | |
| 2491 | - case CPU_PPC_RS64II: /* NorthStar (RS64-II/A50) */ | |
| 2492 | - case CPU_PPC_RS64III: /* Pulsar (RS64-III) */ | |
| 2493 | - case CPU_PPC_RS64IV: /* IceStar/IStar/SStar (RS64-IV) */ | |
| 2494 | -#endif | |
| 2495 | - break; | |
| 2496 | -#endif /* defined (TARGET_PPC64) */ | |
| 2497 | - | |
| 2498 | -#if defined (TODO) | |
| 2499 | - /* POWER */ | |
| 2500 | - case CPU_POWER: /* POWER */ | |
| 2501 | - case CPU_POWER2: /* POWER2 */ | |
| 2502 | - break; | |
| 2503 | -#endif | |
| 2504 | - | |
| 2505 | - default: | |
| 2506 | - gen_spr_generic(env); | |
| 2507 | - /* XXX: TODO: allocate internal IRQ controller */ | |
| 2508 | - break; | |
| 2509 | - } | |
| 2510 | - if (env->nb_BATs == -1) | |
| 2511 | - env->nb_BATs = 4; | |
| 2512 | - /* Allocate TLBs buffer when needed */ | |
| 2513 | - if (env->nb_tlb != 0) { | |
| 2514 | - int nb_tlb = env->nb_tlb; | |
| 2515 | - if (env->id_tlbs != 0) | |
| 2516 | - nb_tlb *= 2; | |
| 2517 | - env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t)); | |
| 2518 | - /* Pre-compute some useful values */ | |
| 2519 | - env->tlb_per_way = env->nb_tlb / env->nb_ways; | |
| 2520 | - } | |
| 2185 | +/* PowerPC 401x2 */ | |
| 2186 | +#define POWERPC_INSNS_401x2 (POWERPC_INSNS_EMB | \ | |
| 2187 | + PPC_MEM_SYNC | PPC_MEM_EIEIO | \ | |
| 2188 | + PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \ | |
| 2189 | + PPC_CACHE_DCBA | PPC_MFTB | \ | |
| 2190 | + PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT) | |
| 2191 | +#define POWERPC_MSRM_401x2 (0x00000000001FD231ULL) | |
| 2192 | +#define POWERPC_MMU_401x2 (POWERPC_MMU_SOFT_4xx_Z) | |
| 2193 | +#define POWERPC_EXCP_401x2 (POWERPC_EXCP_40x) | |
| 2194 | +#define POWERPC_INPUT_401x2 (PPC_FLAGS_INPUT_401) | |
| 2195 | + | |
| 2196 | +static void init_proc_401x2 (CPUPPCState *env) | |
| 2197 | +{ | |
| 2198 | + gen_spr_40x(env); | |
| 2199 | + gen_spr_401_403(env); | |
| 2200 | + gen_spr_401x2(env); | |
| 2201 | + gen_spr_compress(env); | |
| 2202 | + /* Bus access control */ | |
| 2203 | + spr_register(env, SPR_40x_SGR, "SGR", | |
| 2204 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2205 | + &spr_read_generic, &spr_write_generic, | |
| 2206 | + 0xFFFFFFFF); | |
| 2207 | + /* XXX : not implemented */ | |
| 2208 | + spr_register(env, SPR_40x_DCWR, "DCWR", | |
| 2209 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2210 | + &spr_read_generic, &spr_write_generic, | |
| 2211 | + 0x00000000); | |
| 2212 | + /* Memory management */ | |
| 2213 | + env->nb_tlb = 64; | |
| 2214 | + env->nb_ways = 1; | |
| 2215 | + env->id_tlbs = 0; | |
| 2216 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2521 | 2217 | } |
| 2522 | 2218 | |
| 2523 | -#if defined(PPC_DUMP_CPU) | |
| 2524 | -static void dump_sprs (CPUPPCState *env) | |
| 2219 | +/* PowerPC 401x3 */ | |
| 2220 | +#if defined(TODO) | |
| 2221 | +#define POWERPC_INSNS_401x3 (POWERPC_INSNS_EMB | \ | |
| 2222 | + PPC_MEM_SYNC | PPC_MEM_EIEIO | \ | |
| 2223 | + PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \ | |
| 2224 | + PPC_CACHE_DCBA | PPC_MFTB | \ | |
| 2225 | + PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT) | |
| 2226 | +#define POWERPC_MSRM_401x3 (0x00000000001FD631ULL) | |
| 2227 | +#define POWERPC_MMU_401x3 (POWERPC_MMU_SOFT_4xx_Z) | |
| 2228 | +#define POWERPC_EXCP_401x3 (POWERPC_EXCP_40x) | |
| 2229 | +#define POWERPC_INPUT_401x3 (PPC_FLAGS_INPUT_401) | |
| 2230 | + | |
| 2231 | +static void init_proc_401x2 (CPUPPCState *env) | |
| 2525 | 2232 | { |
| 2526 | - ppc_spr_t *spr; | |
| 2527 | - uint32_t pvr = env->spr[SPR_PVR]; | |
| 2528 | - uint32_t sr, sw, ur, uw; | |
| 2529 | - int i, j, n; | |
| 2530 | - | |
| 2531 | - printf("* SPRs for PVR=%08x\n", pvr); | |
| 2532 | - for (i = 0; i < 32; i++) { | |
| 2533 | - for (j = 0; j < 32; j++) { | |
| 2534 | - n = (i << 5) | j; | |
| 2535 | - spr = &env->spr_cb[n]; | |
| 2536 | -#if !defined(CONFIG_USER_ONLY) | |
| 2537 | - sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS; | |
| 2538 | - sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS; | |
| 2539 | -#else | |
| 2540 | - sw = 0; | |
| 2541 | - sr = 0; | |
| 2542 | -#endif | |
| 2543 | - uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS; | |
| 2544 | - ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS; | |
| 2545 | - if (sw || sr || uw || ur) { | |
| 2546 | - printf("SPR: %4d (%03x) %-8s s%c%c u%c%c\n", | |
| 2547 | - (i << 5) | j, (i << 5) | j, spr->name, | |
| 2548 | - sw ? 'w' : '-', sr ? 'r' : '-', | |
| 2549 | - uw ? 'w' : '-', ur ? 'r' : '-'); | |
| 2550 | - } | |
| 2551 | - } | |
| 2552 | - } | |
| 2553 | - fflush(stdout); | |
| 2554 | - fflush(stderr); | |
| 2555 | 2233 | } |
| 2556 | -#endif | |
| 2557 | - | |
| 2558 | -/*****************************************************************************/ | |
| 2559 | -#include <stdlib.h> | |
| 2560 | -#include <string.h> | |
| 2561 | - | |
| 2562 | -int fflush (FILE *stream); | |
| 2563 | - | |
| 2564 | -/* Opcode types */ | |
| 2565 | -enum { | |
| 2566 | - PPC_DIRECT = 0, /* Opcode routine */ | |
| 2567 | - PPC_INDIRECT = 1, /* Indirect opcode table */ | |
| 2568 | -}; | |
| 2569 | - | |
| 2570 | -static inline int is_indirect_opcode (void *handler) | |
| 2234 | +#endif /* TODO */ | |
| 2235 | + | |
| 2236 | +/* IOP480 */ | |
| 2237 | +#define POWERPC_INSNS_IOP480 (POWERPC_INSNS_EMB | \ | |
| 2238 | + PPC_MEM_SYNC | PPC_MEM_EIEIO | \ | |
| 2239 | + PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \ | |
| 2240 | + PPC_CACHE_DCBA | \ | |
| 2241 | + PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT) | |
| 2242 | +#define POWERPC_MSRM_IOP480 (0x00000000001FD231ULL) | |
| 2243 | +#define POWERPC_MMU_IOP480 (POWERPC_MMU_SOFT_4xx_Z) | |
| 2244 | +#define POWERPC_EXCP_IOP480 (POWERPC_EXCP_40x) | |
| 2245 | +#define POWERPC_INPUT_IOP480 (PPC_FLAGS_INPUT_401) | |
| 2246 | + | |
| 2247 | +static void init_proc_IOP480 (CPUPPCState *env) | |
| 2571 | 2248 | { |
| 2572 | - return ((unsigned long)handler & 0x03) == PPC_INDIRECT; | |
| 2249 | + gen_spr_40x(env); | |
| 2250 | + gen_spr_401_403(env); | |
| 2251 | + gen_spr_401x2(env); | |
| 2252 | + gen_spr_compress(env); | |
| 2253 | + /* Bus access control */ | |
| 2254 | + spr_register(env, SPR_40x_SGR, "SGR", | |
| 2255 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2256 | + &spr_read_generic, &spr_write_generic, | |
| 2257 | + 0xFFFFFFFF); | |
| 2258 | + /* XXX : not implemented */ | |
| 2259 | + spr_register(env, SPR_40x_DCWR, "DCWR", | |
| 2260 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2261 | + &spr_read_generic, &spr_write_generic, | |
| 2262 | + 0x00000000); | |
| 2263 | + /* Memory management */ | |
| 2264 | + env->nb_tlb = 64; | |
| 2265 | + env->nb_ways = 1; | |
| 2266 | + env->id_tlbs = 0; | |
| 2267 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2573 | 2268 | } |
| 2574 | 2269 | |
| 2575 | -static inline opc_handler_t **ind_table(void *handler) | |
| 2270 | +/* PowerPC 403 */ | |
| 2271 | +#define POWERPC_INSNS_403 (POWERPC_INSNS_EMB | \ | |
| 2272 | + PPC_MEM_SYNC | PPC_MEM_EIEIO | \ | |
| 2273 | + PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \ | |
| 2274 | + PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT) | |
| 2275 | +#define POWERPC_MSRM_403 (0x000000000007D00DULL) | |
| 2276 | +#define POWERPC_MMU_403 (POWERPC_MMU_REAL_4xx) | |
| 2277 | +#define POWERPC_EXCP_403 (POWERPC_EXCP_40x) | |
| 2278 | +#define POWERPC_INPUT_403 (PPC_FLAGS_INPUT_401) | |
| 2279 | + | |
| 2280 | +static void init_proc_403 (CPUPPCState *env) | |
| 2576 | 2281 | { |
| 2577 | - return (opc_handler_t **)((unsigned long)handler & ~3); | |
| 2282 | + gen_spr_40x(env); | |
| 2283 | + gen_spr_401_403(env); | |
| 2284 | + gen_spr_403(env); | |
| 2285 | + gen_spr_403_real(env); | |
| 2286 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2578 | 2287 | } |
| 2579 | 2288 | |
| 2580 | -/* Instruction table creation */ | |
| 2581 | -/* Opcodes tables creation */ | |
| 2582 | -static void fill_new_table (opc_handler_t **table, int len) | |
| 2289 | +/* PowerPC 403 GCX */ | |
| 2290 | +#define POWERPC_INSNS_403GCX (POWERPC_INSNS_EMB | \ | |
| 2291 | + PPC_MEM_SYNC | PPC_MEM_EIEIO | \ | |
| 2292 | + PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \ | |
| 2293 | + PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT) | |
| 2294 | +#define POWERPC_MSRM_403GCX (0x000000000007D00DULL) | |
| 2295 | +#define POWERPC_MMU_403GCX (POWERPC_MMU_SOFT_4xx_Z) | |
| 2296 | +#define POWERPC_EXCP_403GCX (POWERPC_EXCP_40x) | |
| 2297 | +#define POWERPC_INPUT_403GCX (PPC_FLAGS_INPUT_401) | |
| 2298 | + | |
| 2299 | +static void init_proc_403GCX (CPUPPCState *env) | |
| 2583 | 2300 | { |
| 2584 | - int i; | |
| 2585 | - | |
| 2586 | - for (i = 0; i < len; i++) | |
| 2587 | - table[i] = &invalid_handler; | |
| 2301 | + gen_spr_40x(env); | |
| 2302 | + gen_spr_401_403(env); | |
| 2303 | + gen_spr_403(env); | |
| 2304 | + gen_spr_403_real(env); | |
| 2305 | + gen_spr_403_mmu(env); | |
| 2306 | + /* Bus access control */ | |
| 2307 | + spr_register(env, SPR_40x_SGR, "SGR", | |
| 2308 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2309 | + &spr_read_generic, &spr_write_generic, | |
| 2310 | + 0xFFFFFFFF); | |
| 2311 | + /* XXX : not implemented */ | |
| 2312 | + spr_register(env, SPR_40x_DCWR, "DCWR", | |
| 2313 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2314 | + &spr_read_generic, &spr_write_generic, | |
| 2315 | + 0x00000000); | |
| 2316 | + /* Memory management */ | |
| 2317 | + env->nb_tlb = 64; | |
| 2318 | + env->nb_ways = 1; | |
| 2319 | + env->id_tlbs = 0; | |
| 2320 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2588 | 2321 | } |
| 2589 | 2322 | |
| 2590 | -static int create_new_table (opc_handler_t **table, unsigned char idx) | |
| 2323 | +/* PowerPC 405 */ | |
| 2324 | +#define POWERPC_INSNS_405 (POWERPC_INSNS_EMB | PPC_MFTB | \ | |
| 2325 | + PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_CACHE_DCBA | \ | |
| 2326 | + PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \ | |
| 2327 | + PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT | \ | |
| 2328 | + PPC_405_MAC) | |
| 2329 | +#define POWERPC_MSRM_405 (0x000000000006E630ULL) | |
| 2330 | +#define POWERPC_MMU_405 (POWERPC_MMU_SOFT_4xx) | |
| 2331 | +#define POWERPC_EXCP_405 (POWERPC_EXCP_40x) | |
| 2332 | +#define POWERPC_INPUT_405 (PPC_FLAGS_INPUT_405) | |
| 2333 | + | |
| 2334 | +static void init_proc_405 (CPUPPCState *env) | |
| 2591 | 2335 | { |
| 2592 | - opc_handler_t **tmp; | |
| 2593 | - | |
| 2594 | - tmp = malloc(0x20 * sizeof(opc_handler_t)); | |
| 2595 | - if (tmp == NULL) | |
| 2596 | - return -1; | |
| 2597 | - fill_new_table(tmp, 0x20); | |
| 2598 | - table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT); | |
| 2599 | - | |
| 2600 | - return 0; | |
| 2336 | + /* Time base */ | |
| 2337 | + gen_tbl(env); | |
| 2338 | + gen_spr_40x(env); | |
| 2339 | + gen_spr_405(env); | |
| 2340 | + /* Bus access control */ | |
| 2341 | + spr_register(env, SPR_40x_SGR, "SGR", | |
| 2342 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2343 | + &spr_read_generic, &spr_write_generic, | |
| 2344 | + 0xFFFFFFFF); | |
| 2345 | + /* XXX : not implemented */ | |
| 2346 | + spr_register(env, SPR_40x_DCWR, "DCWR", | |
| 2347 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2348 | + &spr_read_generic, &spr_write_generic, | |
| 2349 | + 0x00000000); | |
| 2350 | + /* Memory management */ | |
| 2351 | + env->nb_tlb = 64; | |
| 2352 | + env->nb_ways = 1; | |
| 2353 | + env->id_tlbs = 0; | |
| 2354 | + /* Allocate hardware IRQ controller */ | |
| 2355 | + ppc405_irq_init(env); | |
| 2601 | 2356 | } |
| 2602 | 2357 | |
| 2603 | -static int insert_in_table (opc_handler_t **table, unsigned char idx, | |
| 2604 | - opc_handler_t *handler) | |
| 2358 | +/* PowerPC 440 EP */ | |
| 2359 | +#define POWERPC_INSNS_440EP (POWERPC_INSNS_EMB | \ | |
| 2360 | + PPC_CACHE_DCBA | PPC_MEM_TLBSYNC | \ | |
| 2361 | + PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC | \ | |
| 2362 | + PPC_440_SPEC | PPC_RFMCI) | |
| 2363 | +#define POWERPC_MSRM_440EP (0x000000000006D630ULL) | |
| 2364 | +#define POWERPC_MMU_440EP (POWERPC_MMU_BOOKE) | |
| 2365 | +#define POWERPC_EXCP_440EP (POWERPC_EXCP_BOOKE) | |
| 2366 | +#define POWERPC_INPUT_440EP (PPC_FLAGS_INPUT_BookE) | |
| 2367 | + | |
| 2368 | +static void init_proc_440EP (CPUPPCState *env) | |
| 2605 | 2369 | { |
| 2606 | - if (table[idx] != &invalid_handler) | |
| 2607 | - return -1; | |
| 2608 | - table[idx] = handler; | |
| 2609 | - | |
| 2610 | - return 0; | |
| 2370 | + /* Time base */ | |
| 2371 | + gen_tbl(env); | |
| 2372 | + gen_spr_BookE(env); | |
| 2373 | + gen_spr_440(env); | |
| 2374 | + spr_register(env, SPR_BOOKE_MCSR, "MCSR", | |
| 2375 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2376 | + &spr_read_generic, &spr_write_generic, | |
| 2377 | + 0x00000000); | |
| 2378 | + spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0", | |
| 2379 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2380 | + &spr_read_generic, &spr_write_generic, | |
| 2381 | + 0x00000000); | |
| 2382 | + spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1", | |
| 2383 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2384 | + &spr_read_generic, &spr_write_generic, | |
| 2385 | + 0x00000000); | |
| 2386 | + spr_register(env, SPR_440_CCR1, "CCR1", | |
| 2387 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2388 | + &spr_read_generic, &spr_write_generic, | |
| 2389 | + 0x00000000); | |
| 2390 | + /* Memory management */ | |
| 2391 | + env->nb_tlb = 64; | |
| 2392 | + env->nb_ways = 1; | |
| 2393 | + env->id_tlbs = 0; | |
| 2394 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2611 | 2395 | } |
| 2612 | 2396 | |
| 2613 | -static int register_direct_insn (opc_handler_t **ppc_opcodes, | |
| 2614 | - unsigned char idx, opc_handler_t *handler) | |
| 2397 | +/* PowerPC 440 GP */ | |
| 2398 | +#define POWERPC_INSNS_440GP (POWERPC_INSNS_EMB | \ | |
| 2399 | + PPC_CACHE_DCBA | PPC_MEM_TLBSYNC | \ | |
| 2400 | + PPC_BOOKE | PPC_BOOKE_EXT | PPC_4xx_COMMON | \ | |
| 2401 | + PPC_405_MAC | PPC_440_SPEC) | |
| 2402 | +#define POWERPC_MSRM_440GP (0x000000000006FF30ULL) | |
| 2403 | +#define POWERPC_MMU_440GP (POWERPC_MMU_BOOKE) | |
| 2404 | +#define POWERPC_EXCP_440GP (POWERPC_EXCP_BOOKE) | |
| 2405 | +#define POWERPC_INPUT_440GP (PPC_FLAGS_INPUT_BookE) | |
| 2406 | + | |
| 2407 | +static void init_proc_440GP (CPUPPCState *env) | |
| 2615 | 2408 | { |
| 2616 | - if (insert_in_table(ppc_opcodes, idx, handler) < 0) { | |
| 2617 | - printf("*** ERROR: opcode %02x already assigned in main " | |
| 2618 | - "opcode table\n", idx); | |
| 2619 | - return -1; | |
| 2620 | - } | |
| 2621 | - | |
| 2622 | - return 0; | |
| 2409 | + /* Time base */ | |
| 2410 | + gen_tbl(env); | |
| 2411 | + gen_spr_BookE(env); | |
| 2412 | + gen_spr_440(env); | |
| 2413 | + /* Memory management */ | |
| 2414 | + env->nb_tlb = 64; | |
| 2415 | + env->nb_ways = 1; | |
| 2416 | + env->id_tlbs = 0; | |
| 2417 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2623 | 2418 | } |
| 2624 | 2419 | |
| 2625 | -static int register_ind_in_table (opc_handler_t **table, | |
| 2626 | - unsigned char idx1, unsigned char idx2, | |
| 2627 | - opc_handler_t *handler) | |
| 2420 | +/* PowerPC 440x4 */ | |
| 2421 | +#if defined(TODO) | |
| 2422 | +#define POWERPC_INSNS_440x4 (POWERPC_INSNS_EMB | \ | |
| 2423 | + PPC_CACHE_DCBA | PPC_MEM_TLBSYNC | \ | |
| 2424 | + PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC | \ | |
| 2425 | + PPC_440_SPEC) | |
| 2426 | +#define POWERPC_MSRM_440x4 (0x000000000006FF30ULL) | |
| 2427 | +#define POWERPC_MMU_440x4 (POWERPC_MMU_BOOKE) | |
| 2428 | +#define POWERPC_EXCP_440x4 (POWERPC_EXCP_BOOKE) | |
| 2429 | +#define POWERPC_INPUT_440x4 (PPC_FLAGS_INPUT_BookE) | |
| 2430 | + | |
| 2431 | +static void init_proc_440x4 (CPUPPCState *env) | |
| 2628 | 2432 | { |
| 2629 | - if (table[idx1] == &invalid_handler) { | |
| 2630 | - if (create_new_table(table, idx1) < 0) { | |
| 2631 | - printf("*** ERROR: unable to create indirect table " | |
| 2632 | - "idx=%02x\n", idx1); | |
| 2633 | - return -1; | |
| 2634 | - } | |
| 2635 | - } else { | |
| 2636 | - if (!is_indirect_opcode(table[idx1])) { | |
| 2637 | - printf("*** ERROR: idx %02x already assigned to a direct " | |
| 2638 | - "opcode\n", idx1); | |
| 2639 | - return -1; | |
| 2640 | - } | |
| 2641 | - } | |
| 2642 | - if (handler != NULL && | |
| 2643 | - insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) { | |
| 2644 | - printf("*** ERROR: opcode %02x already assigned in " | |
| 2645 | - "opcode table %02x\n", idx2, idx1); | |
| 2646 | - return -1; | |
| 2647 | - } | |
| 2648 | - | |
| 2649 | - return 0; | |
| 2433 | + /* Time base */ | |
| 2434 | + gen_tbl(env); | |
| 2435 | + gen_spr_BookE(env); | |
| 2436 | + gen_spr_440(env); | |
| 2437 | + /* Memory management */ | |
| 2438 | + env->nb_tlb = 64; | |
| 2439 | + env->nb_ways = 1; | |
| 2440 | + env->id_tlbs = 0; | |
| 2441 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2650 | 2442 | } |
| 2651 | - | |
| 2652 | -static int register_ind_insn (opc_handler_t **ppc_opcodes, | |
| 2653 | - unsigned char idx1, unsigned char idx2, | |
| 2654 | - opc_handler_t *handler) | |
| 2443 | +#endif /* TODO */ | |
| 2444 | + | |
| 2445 | +/* PowerPC 440x5 */ | |
| 2446 | +#define POWERPC_INSNS_440x5 (POWERPC_INSNS_EMB | \ | |
| 2447 | + PPC_CACHE_DCBA | PPC_MEM_TLBSYNC | \ | |
| 2448 | + PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC | \ | |
| 2449 | + PPC_440_SPEC | PPC_RFMCI) | |
| 2450 | +#define POWERPC_MSRM_440x5 (0x000000000006FF30ULL) | |
| 2451 | +#define POWERPC_MMU_440x5 (POWERPC_MMU_BOOKE) | |
| 2452 | +#define POWERPC_EXCP_440x5 (POWERPC_EXCP_BOOKE) | |
| 2453 | +#define POWERPC_INPUT_440x5 (PPC_FLAGS_INPUT_BookE) | |
| 2454 | + | |
| 2455 | +static void init_proc_440x5 (CPUPPCState *env) | |
| 2655 | 2456 | { |
| 2656 | - int ret; | |
| 2657 | - | |
| 2658 | - ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler); | |
| 2659 | - | |
| 2660 | - return ret; | |
| 2457 | + /* Time base */ | |
| 2458 | + gen_tbl(env); | |
| 2459 | + gen_spr_BookE(env); | |
| 2460 | + gen_spr_440(env); | |
| 2461 | + spr_register(env, SPR_BOOKE_MCSR, "MCSR", | |
| 2462 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2463 | + &spr_read_generic, &spr_write_generic, | |
| 2464 | + 0x00000000); | |
| 2465 | + spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0", | |
| 2466 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2467 | + &spr_read_generic, &spr_write_generic, | |
| 2468 | + 0x00000000); | |
| 2469 | + spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1", | |
| 2470 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2471 | + &spr_read_generic, &spr_write_generic, | |
| 2472 | + 0x00000000); | |
| 2473 | + spr_register(env, SPR_440_CCR1, "CCR1", | |
| 2474 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2475 | + &spr_read_generic, &spr_write_generic, | |
| 2476 | + 0x00000000); | |
| 2477 | + /* Memory management */ | |
| 2478 | + env->nb_tlb = 64; | |
| 2479 | + env->nb_ways = 1; | |
| 2480 | + env->id_tlbs = 0; | |
| 2481 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2661 | 2482 | } |
| 2662 | 2483 | |
| 2663 | -static int register_dblind_insn (opc_handler_t **ppc_opcodes, | |
| 2664 | - unsigned char idx1, unsigned char idx2, | |
| 2665 | - unsigned char idx3, opc_handler_t *handler) | |
| 2484 | +/* PowerPC 460 (guessed) */ | |
| 2485 | +#if defined(TODO) | |
| 2486 | +#define POWERPC_INSNS_460F (POWERPC_INSNS_EMB | \ | |
| 2487 | + PPC_CACHE_DCBA | PPC_MEM_TLBSYNC | \ | |
| 2488 | + PPC_BOOKE | PPC_BOOKE_EXT | PPC_4xx_COMMON | \ | |
| 2489 | + PPC_405_MAC | PPC_440_SPEC | PPC_DCRUX) | |
| 2490 | +#define POWERPC_MSRM_460 (0x000000000006FF30ULL) | |
| 2491 | +#define POWERPC_MMU_460 (POWERPC_MMU_BOOKE) | |
| 2492 | +#define POWERPC_EXCP_460 (POWERPC_EXCP_BOOKE) | |
| 2493 | +#define POWERPC_INPUT_460 (PPC_FLAGS_INPUT_BookE) | |
| 2494 | + | |
| 2495 | +static void init_proc_460 (CPUPPCState *env) | |
| 2666 | 2496 | { |
| 2667 | - if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) { | |
| 2668 | - printf("*** ERROR: unable to join indirect table idx " | |
| 2669 | - "[%02x-%02x]\n", idx1, idx2); | |
| 2670 | - return -1; | |
| 2671 | - } | |
| 2672 | - if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3, | |
| 2673 | - handler) < 0) { | |
| 2674 | - printf("*** ERROR: unable to insert opcode " | |
| 2675 | - "[%02x-%02x-%02x]\n", idx1, idx2, idx3); | |
| 2676 | - return -1; | |
| 2677 | - } | |
| 2678 | - | |
| 2679 | - return 0; | |
| 2680 | 2497 | } |
| 2681 | - | |
| 2682 | -static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn) | |
| 2498 | +#endif /* TODO */ | |
| 2499 | + | |
| 2500 | +/* PowerPC 460F (guessed) */ | |
| 2501 | +#if defined(TODO) | |
| 2502 | +#define POWERPC_INSNS_460F (POWERPC_INSNS_EMB | \ | |
| 2503 | + PPC_CACHE_DCBA | PPC_MEM_TLBSYNC | \ | |
| 2504 | + PPC_FLOAT | PPC_FLOAT_FSQRT | PPC_FLOAT_FRES | \ | |
| 2505 | + PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL | \ | |
| 2506 | + PPC_FLOAT_STFIWX | \ | |
| 2507 | + PPC_BOOKE | PPC_BOOKE_EXT | PPC_4xx_COMMON | \ | |
| 2508 | + PPC_405_MAC | PPC_440_SPEC | PPC_DCRUX) | |
| 2509 | +#define POWERPC_MSRM_460 (0x000000000006FF30ULL) | |
| 2510 | +#define POWERPC_MMU_460F (POWERPC_MMU_BOOKE) | |
| 2511 | +#define POWERPC_EXCP_460F (POWERPC_EXCP_BOOKE) | |
| 2512 | +#define POWERPC_INPUT_460F (PPC_FLAGS_INPUT_BookE) | |
| 2513 | + | |
| 2514 | +static void init_proc_460 (CPUPPCState *env) | |
| 2683 | 2515 | { |
| 2684 | - if (insn->opc2 != 0xFF) { | |
| 2685 | - if (insn->opc3 != 0xFF) { | |
| 2686 | - if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2, | |
| 2687 | - insn->opc3, &insn->handler) < 0) | |
| 2688 | - return -1; | |
| 2689 | - } else { | |
| 2690 | - if (register_ind_insn(ppc_opcodes, insn->opc1, | |
| 2691 | - insn->opc2, &insn->handler) < 0) | |
| 2692 | - return -1; | |
| 2693 | - } | |
| 2694 | - } else { | |
| 2695 | - if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0) | |
| 2696 | - return -1; | |
| 2697 | - } | |
| 2698 | - | |
| 2699 | - return 0; | |
| 2516 | + /* Time base */ | |
| 2517 | + gen_tbl(env); | |
| 2518 | + gen_spr_BookE(env); | |
| 2519 | + gen_spr_440(env); | |
| 2520 | + spr_register(env, SPR_BOOKE_MCSR, "MCSR", | |
| 2521 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2522 | + &spr_read_generic, &spr_write_generic, | |
| 2523 | + 0x00000000); | |
| 2524 | + spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0", | |
| 2525 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2526 | + &spr_read_generic, &spr_write_generic, | |
| 2527 | + 0x00000000); | |
| 2528 | + spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1", | |
| 2529 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2530 | + &spr_read_generic, &spr_write_generic, | |
| 2531 | + 0x00000000); | |
| 2532 | + spr_register(env, SPR_440_CCR1, "CCR1", | |
| 2533 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2534 | + &spr_read_generic, &spr_write_generic, | |
| 2535 | + 0x00000000); | |
| 2536 | + spr_register(env, SPR_DCRIPR, "SPR_DCRIPR", | |
| 2537 | + &spr_read_generic, &spr_write_generic, | |
| 2538 | + &spr_read_generic, &spr_write_generic, | |
| 2539 | + 0x00000000); | |
| 2540 | + /* Memory management */ | |
| 2541 | + env->nb_tlb = 64; | |
| 2542 | + env->nb_ways = 1; | |
| 2543 | + env->id_tlbs = 0; | |
| 2544 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2700 | 2545 | } |
| 2701 | - | |
| 2702 | -static int test_opcode_table (opc_handler_t **table, int len) | |
| 2546 | +#endif /* TODO */ | |
| 2547 | + | |
| 2548 | +/* Generic BookE PowerPC */ | |
| 2549 | +#if defined(TODO) | |
| 2550 | +#define POWERPC_INSNS_BookE (POWERPC_INSNS_EMB | \ | |
| 2551 | + PPC_MEM_EIEIO | PPC_MEM_TLBSYNC | \ | |
| 2552 | + PPC_CACHE_DCBA | \ | |
| 2553 | + PPC_FLOAT | PPC_FLOAT_FSQRT | \ | |
| 2554 | + PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \ | |
| 2555 | + PPC_FLOAT_FSEL | PPC_FLOAT_STFIW | \ | |
| 2556 | + PPC_BOOKE) | |
| 2557 | +#define POWERPC_MSRM_BookE (0x000000000006D630ULL) | |
| 2558 | +#define POWERPC_MMU_BookE (POWERPC_MMU_BOOKE) | |
| 2559 | +#define POWERPC_EXCP_BookE (POWERPC_EXCP_BOOKE) | |
| 2560 | +#define POWERPC_INPUT_BookE (PPC_FLAGS_INPUT_BookE) | |
| 2561 | + | |
| 2562 | +static void init_proc_BookE (CPUPPCState *env) | |
| 2703 | 2563 | { |
| 2704 | - int i, count, tmp; | |
| 2705 | - | |
| 2706 | - for (i = 0, count = 0; i < len; i++) { | |
| 2707 | - /* Consistency fixup */ | |
| 2708 | - if (table[i] == NULL) | |
| 2709 | - table[i] = &invalid_handler; | |
| 2710 | - if (table[i] != &invalid_handler) { | |
| 2711 | - if (is_indirect_opcode(table[i])) { | |
| 2712 | - tmp = test_opcode_table(ind_table(table[i]), 0x20); | |
| 2713 | - if (tmp == 0) { | |
| 2714 | - free(table[i]); | |
| 2715 | - table[i] = &invalid_handler; | |
| 2716 | - } else { | |
| 2717 | - count++; | |
| 2718 | - } | |
| 2719 | - } else { | |
| 2720 | - count++; | |
| 2721 | - } | |
| 2722 | - } | |
| 2723 | - } | |
| 2724 | - | |
| 2725 | - return count; | |
| 2726 | 2564 | } |
| 2727 | - | |
| 2728 | -static void fix_opcode_tables (opc_handler_t **ppc_opcodes) | |
| 2565 | +#endif /* TODO */ | |
| 2566 | + | |
| 2567 | +/* e200 core */ | |
| 2568 | +#if defined(TODO) | |
| 2569 | +#endif /* TODO */ | |
| 2570 | + | |
| 2571 | +/* e300 core */ | |
| 2572 | +#if defined(TODO) | |
| 2573 | +#endif /* TODO */ | |
| 2574 | + | |
| 2575 | +/* e500 core */ | |
| 2576 | +#if defined(TODO) | |
| 2577 | +#define POWERPC_INSNS_e500 (POWERPC_INSNS_EMB | \ | |
| 2578 | + PPC_MEM_EIEIO | PPC_MEM_TLBSYNC | \ | |
| 2579 | + PPC_CACHE_DCBA | \ | |
| 2580 | + PPC_BOOKE | PPC_E500_VECTOR) | |
| 2581 | +#define POWERPC_MMU_e500 (POWERPC_MMU_SOFT_4xx) | |
| 2582 | +#define POWERPC_EXCP_e500 (POWERPC_EXCP_40x) | |
| 2583 | +#define POWERPC_INPUT_e500 (PPC_FLAGS_INPUT_BookE) | |
| 2584 | + | |
| 2585 | +static void init_proc_e500 (CPUPPCState *env) | |
| 2729 | 2586 | { |
| 2730 | - if (test_opcode_table(ppc_opcodes, 0x40) == 0) | |
| 2731 | - printf("*** WARNING: no opcode defined !\n"); | |
| 2587 | + /* Time base */ | |
| 2588 | + gen_tbl(env); | |
| 2589 | + gen_spr_BookE(env); | |
| 2590 | + /* Memory management */ | |
| 2591 | + gen_spr_BookE_FSL(env); | |
| 2592 | + env->nb_tlb = 64; | |
| 2593 | + env->nb_ways = 1; | |
| 2594 | + env->id_tlbs = 0; | |
| 2595 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2732 | 2596 | } |
| 2733 | - | |
| 2734 | -/*****************************************************************************/ | |
| 2735 | -static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def) | |
| 2597 | +#endif /* TODO */ | |
| 2598 | + | |
| 2599 | +/* e600 core */ | |
| 2600 | +#if defined(TODO) | |
| 2601 | +#endif /* TODO */ | |
| 2602 | + | |
| 2603 | +/* Non-embedded PowerPC */ | |
| 2604 | +/* Base instructions set for all 6xx/7xx/74xx/970 PowerPC */ | |
| 2605 | +#define POWERPC_INSNS_6xx (PPC_INSNS_BASE | PPC_FLOAT | PPC_MEM_SYNC | \ | |
| 2606 | + PPC_MEM_EIEIO | PPC_SEGMENT | PPC_MEM_TLBIE) | |
| 2607 | +/* Instructions common to all 6xx/7xx/74xx/970 PowerPC except 601 & 602 */ | |
| 2608 | +#define POWERPC_INSNS_WORKS (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT | \ | |
| 2609 | + PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \ | |
| 2610 | + PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \ | |
| 2611 | + PPC_MEM_TLBSYNC | PPC_MFTB) | |
| 2612 | + | |
| 2613 | +/* POWER : same as 601, without mfmsr, mfsr */ | |
| 2614 | +#if defined(TODO) | |
| 2615 | +#define POWERPC_INSNS_POWER (XXX_TODO) | |
| 2616 | +/* POWER RSC (from RAD6000) */ | |
| 2617 | +#define POWERPC_MSRM_POWER (0x00000000FEF0ULL) | |
| 2618 | +#endif /* TODO */ | |
| 2619 | + | |
| 2620 | +/* PowerPC 601 */ | |
| 2621 | +#define POWERPC_INSNS_601 (POWERPC_INSNS_6xx | PPC_EXTERN | PPC_POWER_BR) | |
| 2622 | +#define POWERPC_MSRM_601 (0x000000000000FE70ULL) | |
| 2623 | +//#define POWERPC_MMU_601 (POWERPC_MMU_601) | |
| 2624 | +//#define POWERPC_EXCP_601 (POWERPC_EXCP_601) | |
| 2625 | +#define POWERPC_INPUT_601 (PPC_FLAGS_INPUT_6xx) | |
| 2626 | + | |
| 2627 | +static void init_proc_601 (CPUPPCState *env) | |
| 2736 | 2628 | { |
| 2737 | - opcode_t *opc, *start, *end; | |
| 2738 | - | |
| 2739 | - fill_new_table(env->opcodes, 0x40); | |
| 2740 | -#if defined(PPC_DUMP_CPU) | |
| 2741 | - printf("* PowerPC instructions for PVR %08x: %s flags %016" PRIx64 | |
| 2742 | - " %08x\n", | |
| 2743 | - def->pvr, def->name, def->insns_flags, def->flags); | |
| 2744 | -#endif | |
| 2745 | - if (&opc_start < &opc_end) { | |
| 2746 | - start = &opc_start; | |
| 2747 | - end = &opc_end; | |
| 2748 | - } else { | |
| 2749 | - start = &opc_end; | |
| 2750 | - end = &opc_start; | |
| 2751 | - } | |
| 2752 | - for (opc = start + 1; opc != end; opc++) { | |
| 2753 | - if ((opc->handler.type & def->insns_flags) != 0) { | |
| 2754 | - if (register_insn(env->opcodes, opc) < 0) { | |
| 2755 | - printf("*** ERROR initializing PowerPC instruction " | |
| 2756 | - "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2, | |
| 2757 | - opc->opc3); | |
| 2758 | - return -1; | |
| 2759 | - } | |
| 2760 | -#if defined(PPC_DUMP_CPU) | |
| 2761 | - if (opc1 != 0x00) { | |
| 2762 | - if (opc->opc3 == 0xFF) { | |
| 2763 | - if (opc->opc2 == 0xFF) { | |
| 2764 | - printf("INSN: %02x -- -- (%02d ----) : %s\n", | |
| 2765 | - opc->opc1, opc->opc1, opc->oname); | |
| 2766 | - } else { | |
| 2767 | - printf("INSN: %02x %02x -- (%02d %04d) : %s\n", | |
| 2768 | - opc->opc1, opc->opc2, opc->opc1, opc->opc2, | |
| 2769 | - opc->oname); | |
| 2770 | - } | |
| 2771 | - } else { | |
| 2772 | - printf("INSN: %02x %02x %02x (%02d %04d) : %s\n", | |
| 2773 | - opc->opc1, opc->opc2, opc->opc3, | |
| 2774 | - opc->opc1, (opc->opc3 << 5) | opc->opc2, | |
| 2775 | - opc->oname); | |
| 2776 | - } | |
| 2777 | - } | |
| 2778 | -#endif | |
| 2779 | - } | |
| 2780 | - } | |
| 2781 | - fix_opcode_tables(env->opcodes); | |
| 2782 | - fflush(stdout); | |
| 2783 | - fflush(stderr); | |
| 2784 | - | |
| 2785 | - return 0; | |
| 2629 | + gen_spr_ne_601(env); | |
| 2630 | + gen_spr_601(env); | |
| 2631 | + /* Hardware implementation registers */ | |
| 2632 | + /* XXX : not implemented */ | |
| 2633 | + spr_register(env, SPR_HID0, "HID0", | |
| 2634 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2635 | + &spr_read_generic, &spr_write_generic, | |
| 2636 | + 0x00000000); | |
| 2637 | + /* XXX : not implemented */ | |
| 2638 | + spr_register(env, SPR_HID1, "HID1", | |
| 2639 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2640 | + &spr_read_generic, &spr_write_generic, | |
| 2641 | + 0x00000000); | |
| 2642 | + /* XXX : not implemented */ | |
| 2643 | + spr_register(env, SPR_601_HID2, "HID2", | |
| 2644 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2645 | + &spr_read_generic, &spr_write_generic, | |
| 2646 | + 0x00000000); | |
| 2647 | + /* XXX : not implemented */ | |
| 2648 | + spr_register(env, SPR_601_HID5, "HID5", | |
| 2649 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2650 | + &spr_read_generic, &spr_write_generic, | |
| 2651 | + 0x00000000); | |
| 2652 | + /* XXX : not implemented */ | |
| 2653 | + spr_register(env, SPR_601_HID15, "HID15", | |
| 2654 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2655 | + &spr_read_generic, &spr_write_generic, | |
| 2656 | + 0x00000000); | |
| 2657 | + /* Memory management */ | |
| 2658 | + env->nb_tlb = 64; | |
| 2659 | + env->nb_ways = 2; | |
| 2660 | + env->id_tlbs = 0; | |
| 2661 | + env->id_tlbs = 0; | |
| 2662 | + /* XXX: TODO: allocate internal IRQ controller */ | |
| 2786 | 2663 | } |
| 2787 | 2664 | |
| 2788 | -int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def) | |
| 2665 | +/* PowerPC 602 */ | |
| 2666 | +#define POWERPC_INSNS_602 (POWERPC_INSNS_6xx | PPC_MFTB | \ | |
| 2667 | + PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \ | |
| 2668 | + PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \ | |
| 2669 | + PPC_6xx_TLB | PPC_MEM_TLBSYNC | PPC_602_SPEC) | |
| 2670 | +#define POWERPC_MSRM_602 (0x000000000033FF73ULL) | |
| 2671 | +#define POWERPC_MMU_602 (POWERPC_MMU_SOFT_6xx) | |
| 2672 | +//#define POWERPC_EXCP_602 (POWERPC_EXCP_602) | |
| 2673 | +#define POWERPC_INPUT_602 (PPC_FLAGS_INPUT_6xx) | |
| 2674 | + | |
| 2675 | +static void init_proc_602 (CPUPPCState *env) | |
| 2789 | 2676 | { |
| 2790 | - env->msr_mask = def->msr_mask; | |
| 2791 | - env->flags = def->flags; | |
| 2792 | - if (create_ppc_opcodes(env, def) < 0) | |
| 2793 | - return -1; | |
| 2794 | - init_ppc_proc(env, def); | |
| 2795 | -#if defined(PPC_DUMP_CPU) | |
| 2796 | - dump_sprs(env); | |
| 2797 | - if (env->tlb != NULL) { | |
| 2798 | - printf("%d %s TLB in %d ways\n", env->nb_tlb, | |
| 2799 | - env->id_tlbs ? "splitted" : "merged", env->nb_ways); | |
| 2800 | - } | |
| 2801 | -#endif | |
| 2677 | + gen_spr_ne_601(env); | |
| 2678 | + gen_spr_602(env); | |
| 2679 | + /* Time base */ | |
| 2680 | + gen_tbl(env); | |
| 2681 | + /* hardware implementation registers */ | |
| 2682 | + /* XXX : not implemented */ | |
| 2683 | + spr_register(env, SPR_HID0, "HID0", | |
| 2684 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2685 | + &spr_read_generic, &spr_write_generic, | |
| 2686 | + 0x00000000); | |
| 2687 | + /* XXX : not implemented */ | |
| 2688 | + spr_register(env, SPR_HID1, "HID1", | |
| 2689 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2690 | + &spr_read_generic, &spr_write_generic, | |
| 2691 | + 0x00000000); | |
| 2692 | + /* Memory management */ | |
| 2693 | + gen_low_BATs(env); | |
| 2694 | + gen_6xx_7xx_soft_tlb(env, 64, 2); | |
| 2695 | + /* Allocate hardware IRQ controller */ | |
| 2696 | + ppc6xx_irq_init(env); | |
| 2697 | +} | |
| 2802 | 2698 | |
| 2803 | - return 0; | |
| 2699 | +/* PowerPC 603 */ | |
| 2700 | +#define POWERPC_INSNS_603 (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN) | |
| 2701 | +#define POWERPC_MSRM_603 (0x000000000001FF73ULL) | |
| 2702 | +#define POWERPC_MMU_603 (POWERPC_MMU_SOFT_6xx) | |
| 2703 | +//#define POWERPC_EXCP_603 (POWERPC_EXCP_603) | |
| 2704 | +#define POWERPC_INPUT_603 (PPC_FLAGS_INPUT_6xx) | |
| 2705 | + | |
| 2706 | +static void init_proc_603 (CPUPPCState *env) | |
| 2707 | +{ | |
| 2708 | + gen_spr_ne_601(env); | |
| 2709 | + gen_spr_603(env); | |
| 2710 | + /* Time base */ | |
| 2711 | + gen_tbl(env); | |
| 2712 | + /* hardware implementation registers */ | |
| 2713 | + /* XXX : not implemented */ | |
| 2714 | + spr_register(env, SPR_HID0, "HID0", | |
| 2715 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2716 | + &spr_read_generic, &spr_write_generic, | |
| 2717 | + 0x00000000); | |
| 2718 | + /* XXX : not implemented */ | |
| 2719 | + spr_register(env, SPR_HID1, "HID1", | |
| 2720 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2721 | + &spr_read_generic, &spr_write_generic, | |
| 2722 | + 0x00000000); | |
| 2723 | + /* Memory management */ | |
| 2724 | + gen_low_BATs(env); | |
| 2725 | + gen_6xx_7xx_soft_tlb(env, 64, 2); | |
| 2726 | + /* Allocate hardware IRQ controller */ | |
| 2727 | + ppc6xx_irq_init(env); | |
| 2804 | 2728 | } |
| 2805 | 2729 | |
| 2730 | +/* PowerPC 603e */ | |
| 2731 | +#define POWERPC_INSNS_603E (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN) | |
| 2732 | +#define POWERPC_MSRM_603E (0x000000000007FF73ULL) | |
| 2733 | +#define POWERPC_MMU_603E (POWERPC_MMU_SOFT_6xx) | |
| 2734 | +//#define POWERPC_EXCP_603E (POWERPC_EXCP_603E) | |
| 2735 | +#define POWERPC_INPUT_603E (PPC_FLAGS_INPUT_6xx) | |
| 2736 | + | |
| 2737 | +static void init_proc_603E (CPUPPCState *env) | |
| 2738 | +{ | |
| 2739 | + gen_spr_ne_601(env); | |
| 2740 | + gen_spr_603(env); | |
| 2741 | + /* Time base */ | |
| 2742 | + gen_tbl(env); | |
| 2743 | + /* hardware implementation registers */ | |
| 2744 | + /* XXX : not implemented */ | |
| 2745 | + spr_register(env, SPR_HID0, "HID0", | |
| 2746 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2747 | + &spr_read_generic, &spr_write_generic, | |
| 2748 | + 0x00000000); | |
| 2749 | + /* XXX : not implemented */ | |
| 2750 | + spr_register(env, SPR_HID1, "HID1", | |
| 2751 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2752 | + &spr_read_generic, &spr_write_generic, | |
| 2753 | + 0x00000000); | |
| 2754 | + /* XXX : not implemented */ | |
| 2755 | + spr_register(env, SPR_IABR, "IABR", | |
| 2756 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2757 | + &spr_read_generic, &spr_write_generic, | |
| 2758 | + 0x00000000); | |
| 2759 | + /* Memory management */ | |
| 2760 | + gen_low_BATs(env); | |
| 2761 | + gen_6xx_7xx_soft_tlb(env, 64, 2); | |
| 2762 | + /* Allocate hardware IRQ controller */ | |
| 2763 | + ppc6xx_irq_init(env); | |
| 2764 | +} | |
| 2765 | + | |
| 2766 | +/* PowerPC G2 */ | |
| 2767 | +#define POWERPC_INSNS_G2 (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN) | |
| 2768 | +#define POWERPC_MSRM_G2 (0x000000000006FFF2ULL) | |
| 2769 | +#define POWERPC_MMU_G2 (POWERPC_MMU_SOFT_6xx) | |
| 2770 | +//#define POWERPC_EXCP_G2 (POWERPC_EXCP_G2) | |
| 2771 | +#define POWERPC_INPUT_G2 (PPC_FLAGS_INPUT_6xx) | |
| 2772 | + | |
| 2773 | +static void init_proc_G2 (CPUPPCState *env) | |
| 2774 | +{ | |
| 2775 | + gen_spr_ne_601(env); | |
| 2776 | + gen_spr_G2_755(env); | |
| 2777 | + gen_spr_G2(env); | |
| 2778 | + /* Time base */ | |
| 2779 | + gen_tbl(env); | |
| 2780 | + /* Hardware implementation register */ | |
| 2781 | + /* XXX : not implemented */ | |
| 2782 | + spr_register(env, SPR_HID0, "HID0", | |
| 2783 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2784 | + &spr_read_generic, &spr_write_generic, | |
| 2785 | + 0x00000000); | |
| 2786 | + /* XXX : not implemented */ | |
| 2787 | + spr_register(env, SPR_HID1, "HID1", | |
| 2788 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2789 | + &spr_read_generic, &spr_write_generic, | |
| 2790 | + 0x00000000); | |
| 2791 | + /* XXX : not implemented */ | |
| 2792 | + spr_register(env, SPR_HID2, "HID2", | |
| 2793 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2794 | + &spr_read_generic, &spr_write_generic, | |
| 2795 | + 0x00000000); | |
| 2796 | + /* Memory management */ | |
| 2797 | + gen_low_BATs(env); | |
| 2798 | + gen_high_BATs(env); | |
| 2799 | + gen_6xx_7xx_soft_tlb(env, 64, 2); | |
| 2800 | + /* Allocate hardware IRQ controller */ | |
| 2801 | + ppc6xx_irq_init(env); | |
| 2802 | +} | |
| 2803 | + | |
| 2804 | +/* PowerPC G2LE */ | |
| 2805 | +#define POWERPC_INSNS_G2LE (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN) | |
| 2806 | +#define POWERPC_MSRM_G2LE (0x000000000007FFF3ULL) | |
| 2807 | +#define POWERPC_MMU_G2LE (POWERPC_MMU_SOFT_6xx) | |
| 2808 | +#define POWERPC_EXCP_G2LE (POWERPC_EXCP_G2) | |
| 2809 | +#define POWERPC_INPUT_G2LE (PPC_FLAGS_INPUT_6xx) | |
| 2810 | + | |
| 2811 | +static void init_proc_G2LE (CPUPPCState *env) | |
| 2812 | +{ | |
| 2813 | + gen_spr_ne_601(env); | |
| 2814 | + gen_spr_G2_755(env); | |
| 2815 | + gen_spr_G2(env); | |
| 2816 | + /* Time base */ | |
| 2817 | + gen_tbl(env); | |
| 2818 | + /* Hardware implementation register */ | |
| 2819 | + /* XXX : not implemented */ | |
| 2820 | + spr_register(env, SPR_HID0, "HID0", | |
| 2821 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2822 | + &spr_read_generic, &spr_write_generic, | |
| 2823 | + 0x00000000); | |
| 2824 | + /* XXX : not implemented */ | |
| 2825 | + spr_register(env, SPR_HID1, "HID1", | |
| 2826 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2827 | + &spr_read_generic, &spr_write_generic, | |
| 2828 | + 0x00000000); | |
| 2829 | + /* XXX : not implemented */ | |
| 2830 | + spr_register(env, SPR_HID2, "HID2", | |
| 2831 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2832 | + &spr_read_generic, &spr_write_generic, | |
| 2833 | + 0x00000000); | |
| 2834 | + /* Memory management */ | |
| 2835 | + gen_low_BATs(env); | |
| 2836 | + gen_high_BATs(env); | |
| 2837 | + gen_6xx_7xx_soft_tlb(env, 64, 2); | |
| 2838 | + /* Allocate hardware IRQ controller */ | |
| 2839 | + ppc6xx_irq_init(env); | |
| 2840 | +} | |
| 2841 | + | |
| 2842 | +/* PowerPC 604 */ | |
| 2843 | +#define POWERPC_INSNS_604 (POWERPC_INSNS_WORKS | PPC_EXTERN) | |
| 2844 | +#define POWERPC_MSRM_604 (0x000000000005FF77ULL) | |
| 2845 | +#define POWERPC_MMU_604 (POWERPC_MMU_32B) | |
| 2846 | +//#define POWERPC_EXCP_604 (POWERPC_EXCP_604) | |
| 2847 | +#define POWERPC_INPUT_604 (PPC_FLAGS_INPUT_6xx) | |
| 2848 | + | |
| 2849 | +static void init_proc_604 (CPUPPCState *env) | |
| 2850 | +{ | |
| 2851 | + gen_spr_ne_601(env); | |
| 2852 | + gen_spr_604(env); | |
| 2853 | + /* Time base */ | |
| 2854 | + gen_tbl(env); | |
| 2855 | + /* Hardware implementation registers */ | |
| 2856 | + /* XXX : not implemented */ | |
| 2857 | + spr_register(env, SPR_HID0, "HID0", | |
| 2858 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2859 | + &spr_read_generic, &spr_write_generic, | |
| 2860 | + 0x00000000); | |
| 2861 | + /* XXX : not implemented */ | |
| 2862 | + spr_register(env, SPR_HID1, "HID1", | |
| 2863 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2864 | + &spr_read_generic, &spr_write_generic, | |
| 2865 | + 0x00000000); | |
| 2866 | + /* Memory management */ | |
| 2867 | + gen_low_BATs(env); | |
| 2868 | + /* Allocate hardware IRQ controller */ | |
| 2869 | + ppc6xx_irq_init(env); | |
| 2870 | +} | |
| 2871 | + | |
| 2872 | +/* PowerPC 740/750 (aka G3) */ | |
| 2873 | +#define POWERPC_INSNS_7x0 (POWERPC_INSNS_WORKS | PPC_EXTERN) | |
| 2874 | +#define POWERPC_MSRM_7x0 (0x000000000007FF77ULL) | |
| 2875 | +#define POWERPC_MMU_7x0 (POWERPC_MMU_32B) | |
| 2876 | +//#define POWERPC_EXCP_7x0 (POWERPC_EXCP_7x0) | |
| 2877 | +#define POWERPC_INPUT_7x0 (PPC_FLAGS_INPUT_6xx) | |
| 2878 | + | |
| 2879 | +static void init_proc_7x0 (CPUPPCState *env) | |
| 2880 | +{ | |
| 2881 | + gen_spr_ne_601(env); | |
| 2882 | + gen_spr_7xx(env); | |
| 2883 | + /* Time base */ | |
| 2884 | + gen_tbl(env); | |
| 2885 | + /* Thermal management */ | |
| 2886 | + gen_spr_thrm(env); | |
| 2887 | + /* Hardware implementation registers */ | |
| 2888 | + /* XXX : not implemented */ | |
| 2889 | + spr_register(env, SPR_HID0, "HID0", | |
| 2890 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2891 | + &spr_read_generic, &spr_write_generic, | |
| 2892 | + 0x00000000); | |
| 2893 | + /* XXX : not implemented */ | |
| 2894 | + spr_register(env, SPR_HID1, "HID1", | |
| 2895 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2896 | + &spr_read_generic, &spr_write_generic, | |
| 2897 | + 0x00000000); | |
| 2898 | + /* Memory management */ | |
| 2899 | + gen_low_BATs(env); | |
| 2900 | + /* Allocate hardware IRQ controller */ | |
| 2901 | + ppc6xx_irq_init(env); | |
| 2902 | +} | |
| 2903 | + | |
| 2904 | +/* PowerPC 750FX/GX */ | |
| 2905 | +#define POWERPC_INSNS_750fx (POWERPC_INSNS_WORKS | PPC_EXTERN) | |
| 2906 | +#define POWERPC_MSRM_750fx (0x000000000007FF77ULL) | |
| 2907 | +#define POWERPC_MMU_750fx (POWERPC_MMU_32B) | |
| 2908 | +#define POWERPC_EXCP_750fx (POWERPC_EXCP_7x0) | |
| 2909 | +#define POWERPC_INPUT_750fx (PPC_FLAGS_INPUT_6xx) | |
| 2910 | + | |
| 2911 | +static void init_proc_750fx (CPUPPCState *env) | |
| 2912 | +{ | |
| 2913 | + gen_spr_ne_601(env); | |
| 2914 | + gen_spr_7xx(env); | |
| 2915 | + /* Time base */ | |
| 2916 | + gen_tbl(env); | |
| 2917 | + /* Thermal management */ | |
| 2918 | + gen_spr_thrm(env); | |
| 2919 | + /* Hardware implementation registers */ | |
| 2920 | + /* XXX : not implemented */ | |
| 2921 | + spr_register(env, SPR_HID0, "HID0", | |
| 2922 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2923 | + &spr_read_generic, &spr_write_generic, | |
| 2924 | + 0x00000000); | |
| 2925 | + /* XXX : not implemented */ | |
| 2926 | + spr_register(env, SPR_HID1, "HID1", | |
| 2927 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2928 | + &spr_read_generic, &spr_write_generic, | |
| 2929 | + 0x00000000); | |
| 2930 | + /* XXX : not implemented */ | |
| 2931 | + spr_register(env, SPR_750_HID2, "HID2", | |
| 2932 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2933 | + &spr_read_generic, &spr_write_generic, | |
| 2934 | + 0x00000000); | |
| 2935 | + /* Memory management */ | |
| 2936 | + gen_low_BATs(env); | |
| 2937 | + /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */ | |
| 2938 | + gen_high_BATs(env); | |
| 2939 | + /* Allocate hardware IRQ controller */ | |
| 2940 | + ppc6xx_irq_init(env); | |
| 2941 | +} | |
| 2942 | + | |
| 2943 | +/* PowerPC 745/755 */ | |
| 2944 | +#define POWERPC_INSNS_7x5 (POWERPC_INSNS_WORKS | PPC_EXTERN | PPC_6xx_TLB) | |
| 2945 | +#define POWERPC_MSRM_7x5 (0x000000000007FF77ULL) | |
| 2946 | +#define POWERPC_MMU_7x5 (POWERPC_MMU_SOFT_6xx) | |
| 2947 | +//#define POWERPC_EXCP_7x5 (POWERPC_EXCP_7x5) | |
| 2948 | +#define POWERPC_INPUT_7x5 (PPC_FLAGS_INPUT_6xx) | |
| 2949 | + | |
| 2950 | +static void init_proc_7x5 (CPUPPCState *env) | |
| 2951 | +{ | |
| 2952 | + gen_spr_ne_601(env); | |
| 2953 | + gen_spr_G2_755(env); | |
| 2954 | + /* Time base */ | |
| 2955 | + gen_tbl(env); | |
| 2956 | + /* L2 cache control */ | |
| 2957 | + /* XXX : not implemented */ | |
| 2958 | + spr_register(env, SPR_ICTC, "ICTC", | |
| 2959 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2960 | + &spr_read_generic, &spr_write_generic, | |
| 2961 | + 0x00000000); | |
| 2962 | + /* XXX : not implemented */ | |
| 2963 | + spr_register(env, SPR_L2PMCR, "L2PMCR", | |
| 2964 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2965 | + &spr_read_generic, &spr_write_generic, | |
| 2966 | + 0x00000000); | |
| 2967 | + /* Hardware implementation registers */ | |
| 2968 | + /* XXX : not implemented */ | |
| 2969 | + spr_register(env, SPR_HID0, "HID0", | |
| 2970 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2971 | + &spr_read_generic, &spr_write_generic, | |
| 2972 | + 0x00000000); | |
| 2973 | + /* XXX : not implemented */ | |
| 2974 | + spr_register(env, SPR_HID1, "HID1", | |
| 2975 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2976 | + &spr_read_generic, &spr_write_generic, | |
| 2977 | + 0x00000000); | |
| 2978 | + /* XXX : not implemented */ | |
| 2979 | + spr_register(env, SPR_HID2, "HID2", | |
| 2980 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 2981 | + &spr_read_generic, &spr_write_generic, | |
| 2982 | + 0x00000000); | |
| 2983 | + /* Memory management */ | |
| 2984 | + gen_low_BATs(env); | |
| 2985 | + gen_high_BATs(env); | |
| 2986 | + gen_6xx_7xx_soft_tlb(env, 64, 2); | |
| 2987 | + /* Allocate hardware IRQ controller */ | |
| 2988 | + ppc6xx_irq_init(env); | |
| 2989 | +} | |
| 2990 | + | |
| 2991 | +/* PowerPC 7400 (aka G4) */ | |
| 2992 | +#define POWERPC_INSNS_7400 (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA | \ | |
| 2993 | + PPC_EXTERN | PPC_MEM_TLBIA | \ | |
| 2994 | + PPC_ALTIVEC) | |
| 2995 | +#define POWERPC_MSRM_7400 (0x000000000205FF77ULL) | |
| 2996 | +#define POWERPC_MMU_7400 (POWERPC_MMU_32B) | |
| 2997 | +#define POWERPC_EXCP_7400 (POWERPC_EXCP_74xx) | |
| 2998 | +#define POWERPC_INPUT_7400 (PPC_FLAGS_INPUT_6xx) | |
| 2999 | + | |
| 3000 | +static void init_proc_7400 (CPUPPCState *env) | |
| 3001 | +{ | |
| 3002 | + gen_spr_ne_601(env); | |
| 3003 | + gen_spr_7xx(env); | |
| 3004 | + /* Time base */ | |
| 3005 | + gen_tbl(env); | |
| 3006 | + /* 74xx specific SPR */ | |
| 3007 | + gen_spr_74xx(env); | |
| 3008 | + /* Thermal management */ | |
| 3009 | + gen_spr_thrm(env); | |
| 3010 | + /* Memory management */ | |
| 3011 | + gen_low_BATs(env); | |
| 3012 | + /* Allocate hardware IRQ controller */ | |
| 3013 | + ppc6xx_irq_init(env); | |
| 3014 | +} | |
| 3015 | + | |
| 3016 | +/* PowerPC 7410 (aka G4) */ | |
| 3017 | +#define POWERPC_INSNS_7410 (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA | \ | |
| 3018 | + PPC_EXTERN | PPC_MEM_TLBIA | \ | |
| 3019 | + PPC_ALTIVEC) | |
| 3020 | +#define POWERPC_MSRM_7410 (0x000000000205FF77ULL) | |
| 3021 | +#define POWERPC_MMU_7410 (POWERPC_MMU_32B) | |
| 3022 | +#define POWERPC_EXCP_7410 (POWERPC_EXCP_74xx) | |
| 3023 | +#define POWERPC_INPUT_7410 (PPC_FLAGS_INPUT_6xx) | |
| 3024 | + | |
| 3025 | +static void init_proc_7410 (CPUPPCState *env) | |
| 3026 | +{ | |
| 3027 | + gen_spr_ne_601(env); | |
| 3028 | + gen_spr_7xx(env); | |
| 3029 | + /* Time base */ | |
| 3030 | + gen_tbl(env); | |
| 3031 | + /* 74xx specific SPR */ | |
| 3032 | + gen_spr_74xx(env); | |
| 3033 | + /* Thermal management */ | |
| 3034 | + gen_spr_thrm(env); | |
| 3035 | + /* L2PMCR */ | |
| 3036 | + /* XXX : not implemented */ | |
| 3037 | + spr_register(env, SPR_L2PMCR, "L2PMCR", | |
| 3038 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3039 | + &spr_read_generic, &spr_write_generic, | |
| 3040 | + 0x00000000); | |
| 3041 | + /* LDSTDB */ | |
| 3042 | + /* XXX : not implemented */ | |
| 3043 | + spr_register(env, SPR_LDSTDB, "LDSTDB", | |
| 3044 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3045 | + &spr_read_generic, &spr_write_generic, | |
| 3046 | + 0x00000000); | |
| 3047 | + /* Memory management */ | |
| 3048 | + gen_low_BATs(env); | |
| 3049 | + /* Allocate hardware IRQ controller */ | |
| 3050 | + ppc6xx_irq_init(env); | |
| 3051 | +} | |
| 3052 | + | |
| 3053 | +/* PowerPC 7440 (aka G4) */ | |
| 3054 | +#if defined (TODO) | |
| 3055 | +#define POWERPC_INSNS_7440 (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA | \ | |
| 3056 | + PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA | \ | |
| 3057 | + PPC_ALTIVEC) | |
| 3058 | +#define POWERPC_MSRM_7440 (0x000000000205FF77ULL) | |
| 3059 | +#define POWERPC_MMU_7440 (POWERPC_MMU_SOFT_74xx) | |
| 3060 | +#define POWERPC_EXCP_7440 (POWERPC_EXCP_74xx) | |
| 3061 | +#define POWERPC_INPUT_7440 (PPC_FLAGS_INPUT_6xx) | |
| 3062 | + | |
| 3063 | +static void init_proc_7440 (CPUPPCState *env) | |
| 3064 | +{ | |
| 3065 | + gen_spr_ne_601(env); | |
| 3066 | + gen_spr_7xx(env); | |
| 3067 | + /* Time base */ | |
| 3068 | + gen_tbl(env); | |
| 3069 | + /* 74xx specific SPR */ | |
| 3070 | + gen_spr_74xx(env); | |
| 3071 | + /* LDSTCR */ | |
| 3072 | + /* XXX : not implemented */ | |
| 3073 | + spr_register(env, SPR_LDSTCR, "LDSTCR", | |
| 3074 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3075 | + &spr_read_generic, &spr_write_generic, | |
| 3076 | + 0x00000000); | |
| 3077 | + /* ICTRL */ | |
| 3078 | + /* XXX : not implemented */ | |
| 3079 | + spr_register(env, SPR_ICTRL, "ICTRL", | |
| 3080 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3081 | + &spr_read_generic, &spr_write_generic, | |
| 3082 | + 0x00000000); | |
| 3083 | + /* MSSSR0 */ | |
| 3084 | + spr_register(env, SPR_MSSSR0, "MSSSR0", | |
| 3085 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3086 | + &spr_read_generic, &spr_write_generic, | |
| 3087 | + 0x00000000); | |
| 3088 | + /* PMC */ | |
| 3089 | + /* XXX : not implemented */ | |
| 3090 | + spr_register(env, SPR_PMC5, "PMC5", | |
| 3091 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3092 | + &spr_read_generic, &spr_write_generic, | |
| 3093 | + 0x00000000); | |
| 3094 | + spr_register(env, SPR_UPMC5, "UPMC5", | |
| 3095 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3096 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3097 | + 0x00000000); | |
| 3098 | + spr_register(env, SPR_PMC6, "PMC6", | |
| 3099 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3100 | + &spr_read_generic, &spr_write_generic, | |
| 3101 | + 0x00000000); | |
| 3102 | + spr_register(env, SPR_UPMC6, "UPMC6", | |
| 3103 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3104 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3105 | + 0x00000000); | |
| 3106 | + /* Memory management */ | |
| 3107 | + gen_low_BATs(env); | |
| 3108 | + gen_74xx_soft_tlb(env); | |
| 3109 | + /* Allocate hardware IRQ controller */ | |
| 3110 | + ppc6xx_irq_init(env); | |
| 3111 | +} | |
| 3112 | +#endif /* TODO */ | |
| 3113 | + | |
| 3114 | +/* PowerPC 7450 (aka G4) */ | |
| 3115 | +#if defined (TODO) | |
| 3116 | +#define POWERPC_INSNS_7450 (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA | \ | |
| 3117 | + PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA | \ | |
| 3118 | + PPC_ALTIVEC) | |
| 3119 | +#define POWERPC_MSRM_7450 (0x000000000205FF77ULL) | |
| 3120 | +#define POWERPC_MMU_7450 (POWERPC_MMU_SOFT_74xx) | |
| 3121 | +#define POWERPC_EXCP_7450 (POWERPC_EXCP_74xx) | |
| 3122 | +#define POWERPC_INPUT_7450 (PPC_FLAGS_INPUT_6xx) | |
| 3123 | + | |
| 3124 | +static void init_proc_7450 (CPUPPCState *env) | |
| 3125 | +{ | |
| 3126 | + gen_spr_ne_601(env); | |
| 3127 | + gen_spr_7xx(env); | |
| 3128 | + /* Time base */ | |
| 3129 | + gen_tbl(env); | |
| 3130 | + /* 74xx specific SPR */ | |
| 3131 | + gen_spr_74xx(env); | |
| 3132 | + /* Level 3 cache control */ | |
| 3133 | + gen_l3_ctrl(env); | |
| 3134 | + /* LDSTCR */ | |
| 3135 | + /* XXX : not implemented */ | |
| 3136 | + spr_register(env, SPR_LDSTCR, "LDSTCR", | |
| 3137 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3138 | + &spr_read_generic, &spr_write_generic, | |
| 3139 | + 0x00000000); | |
| 3140 | + /* ICTRL */ | |
| 3141 | + /* XXX : not implemented */ | |
| 3142 | + spr_register(env, SPR_ICTRL, "ICTRL", | |
| 3143 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3144 | + &spr_read_generic, &spr_write_generic, | |
| 3145 | + 0x00000000); | |
| 3146 | + /* MSSSR0 */ | |
| 3147 | + spr_register(env, SPR_MSSSR0, "MSSSR0", | |
| 3148 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3149 | + &spr_read_generic, &spr_write_generic, | |
| 3150 | + 0x00000000); | |
| 3151 | + /* PMC */ | |
| 3152 | + /* XXX : not implemented */ | |
| 3153 | + spr_register(env, SPR_PMC5, "PMC5", | |
| 3154 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3155 | + &spr_read_generic, &spr_write_generic, | |
| 3156 | + 0x00000000); | |
| 3157 | + spr_register(env, SPR_UPMC5, "UPMC5", | |
| 3158 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3159 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3160 | + 0x00000000); | |
| 3161 | + spr_register(env, SPR_PMC6, "PMC6", | |
| 3162 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3163 | + &spr_read_generic, &spr_write_generic, | |
| 3164 | + 0x00000000); | |
| 3165 | + spr_register(env, SPR_UPMC6, "UPMC6", | |
| 3166 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3167 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3168 | + 0x00000000); | |
| 3169 | + /* Memory management */ | |
| 3170 | + gen_low_BATs(env); | |
| 3171 | + gen_74xx_soft_tlb(env); | |
| 3172 | + /* Allocate hardware IRQ controller */ | |
| 3173 | + ppc6xx_irq_init(env); | |
| 3174 | +} | |
| 3175 | +#endif /* TODO */ | |
| 3176 | + | |
| 3177 | +/* PowerPC 7445 (aka G4) */ | |
| 3178 | +#if defined (TODO) | |
| 3179 | +#define POWERPC_INSNS_7445 (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA | \ | |
| 3180 | + PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA | \ | |
| 3181 | + PPC_ALTIVEC) | |
| 3182 | +#define POWERPC_MSRM_7445 (0x000000000205FF77ULL) | |
| 3183 | +#define POWERPC_MMU_7445 (POWERPC_MMU_SOFT_74xx) | |
| 3184 | +#define POWERPC_EXCP_7445 (POWERPC_EXCP_74xx) | |
| 3185 | +#define POWERPC_INPUT_7445 (PPC_FLAGS_INPUT_6xx) | |
| 3186 | + | |
| 3187 | +static void init_proc_7445 (CPUPPCState *env) | |
| 3188 | +{ | |
| 3189 | + gen_spr_ne_601(env); | |
| 3190 | + gen_spr_7xx(env); | |
| 3191 | + /* Time base */ | |
| 3192 | + gen_tbl(env); | |
| 3193 | + /* 74xx specific SPR */ | |
| 3194 | + gen_spr_74xx(env); | |
| 3195 | + /* LDSTCR */ | |
| 3196 | + /* XXX : not implemented */ | |
| 3197 | + spr_register(env, SPR_LDSTCR, "LDSTCR", | |
| 3198 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3199 | + &spr_read_generic, &spr_write_generic, | |
| 3200 | + 0x00000000); | |
| 3201 | + /* ICTRL */ | |
| 3202 | + /* XXX : not implemented */ | |
| 3203 | + spr_register(env, SPR_ICTRL, "ICTRL", | |
| 3204 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3205 | + &spr_read_generic, &spr_write_generic, | |
| 3206 | + 0x00000000); | |
| 3207 | + /* MSSSR0 */ | |
| 3208 | + spr_register(env, SPR_MSSSR0, "MSSSR0", | |
| 3209 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3210 | + &spr_read_generic, &spr_write_generic, | |
| 3211 | + 0x00000000); | |
| 3212 | + /* PMC */ | |
| 3213 | + /* XXX : not implemented */ | |
| 3214 | + spr_register(env, SPR_PMC5, "PMC5", | |
| 3215 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3216 | + &spr_read_generic, &spr_write_generic, | |
| 3217 | + 0x00000000); | |
| 3218 | + spr_register(env, SPR_UPMC5, "UPMC5", | |
| 3219 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3220 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3221 | + 0x00000000); | |
| 3222 | + spr_register(env, SPR_PMC6, "PMC6", | |
| 3223 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3224 | + &spr_read_generic, &spr_write_generic, | |
| 3225 | + 0x00000000); | |
| 3226 | + spr_register(env, SPR_UPMC6, "UPMC6", | |
| 3227 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3228 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3229 | + 0x00000000); | |
| 3230 | + /* SPRGs */ | |
| 3231 | + spr_register(env, SPR_SPRG4, "SPRG4", | |
| 3232 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3233 | + &spr_read_generic, &spr_write_generic, | |
| 3234 | + 0x00000000); | |
| 3235 | + spr_register(env, SPR_USPRG4, "USPRG4", | |
| 3236 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3237 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3238 | + 0x00000000); | |
| 3239 | + spr_register(env, SPR_SPRG5, "SPRG5", | |
| 3240 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3241 | + &spr_read_generic, &spr_write_generic, | |
| 3242 | + 0x00000000); | |
| 3243 | + spr_register(env, SPR_USPRG5, "USPRG5", | |
| 3244 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3245 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3246 | + 0x00000000); | |
| 3247 | + spr_register(env, SPR_SPRG6, "SPRG6", | |
| 3248 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3249 | + &spr_read_generic, &spr_write_generic, | |
| 3250 | + 0x00000000); | |
| 3251 | + spr_register(env, SPR_USPRG6, "USPRG6", | |
| 3252 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3253 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3254 | + 0x00000000); | |
| 3255 | + spr_register(env, SPR_SPRG7, "SPRG7", | |
| 3256 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3257 | + &spr_read_generic, &spr_write_generic, | |
| 3258 | + 0x00000000); | |
| 3259 | + spr_register(env, SPR_USPRG7, "USPRG7", | |
| 3260 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3261 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3262 | + 0x00000000); | |
| 3263 | + /* Memory management */ | |
| 3264 | + gen_low_BATs(env); | |
| 3265 | + gen_high_BATs(env); | |
| 3266 | + gen_74xx_soft_tlb(env); | |
| 3267 | + /* Allocate hardware IRQ controller */ | |
| 3268 | + ppc6xx_irq_init(env); | |
| 3269 | +} | |
| 3270 | +#endif /* TODO */ | |
| 3271 | + | |
| 3272 | +/* PowerPC 7455 (aka G4) */ | |
| 3273 | +#if defined (TODO) | |
| 3274 | +#define POWERPC_INSNS_7455 (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA | \ | |
| 3275 | + PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA | \ | |
| 3276 | + PPC_ALTIVEC) | |
| 3277 | +#define POWERPC_MSRM_7455 (0x000000000205FF77ULL) | |
| 3278 | +#define POWERPC_MMU_7455 (POWERPC_MMU_SOFT_74xx) | |
| 3279 | +#define POWERPC_EXCP_7455 (POWERPC_EXCP_74xx) | |
| 3280 | +#define POWERPC_INPUT_7455 (PPC_FLAGS_INPUT_6xx) | |
| 3281 | + | |
| 3282 | +static void init_proc_7455 (CPUPPCState *env) | |
| 3283 | +{ | |
| 3284 | + gen_spr_ne_601(env); | |
| 3285 | + gen_spr_7xx(env); | |
| 3286 | + /* Time base */ | |
| 3287 | + gen_tbl(env); | |
| 3288 | + /* 74xx specific SPR */ | |
| 3289 | + gen_spr_74xx(env); | |
| 3290 | + /* Level 3 cache control */ | |
| 3291 | + gen_l3_ctrl(env); | |
| 3292 | + /* LDSTCR */ | |
| 3293 | + /* XXX : not implemented */ | |
| 3294 | + spr_register(env, SPR_LDSTCR, "LDSTCR", | |
| 3295 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3296 | + &spr_read_generic, &spr_write_generic, | |
| 3297 | + 0x00000000); | |
| 3298 | + /* ICTRL */ | |
| 3299 | + /* XXX : not implemented */ | |
| 3300 | + spr_register(env, SPR_ICTRL, "ICTRL", | |
| 3301 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3302 | + &spr_read_generic, &spr_write_generic, | |
| 3303 | + 0x00000000); | |
| 3304 | + /* MSSSR0 */ | |
| 3305 | + spr_register(env, SPR_MSSSR0, "MSSSR0", | |
| 3306 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3307 | + &spr_read_generic, &spr_write_generic, | |
| 3308 | + 0x00000000); | |
| 3309 | + /* PMC */ | |
| 3310 | + /* XXX : not implemented */ | |
| 3311 | + spr_register(env, SPR_PMC5, "PMC5", | |
| 3312 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3313 | + &spr_read_generic, &spr_write_generic, | |
| 3314 | + 0x00000000); | |
| 3315 | + spr_register(env, SPR_UPMC5, "UPMC5", | |
| 3316 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3317 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3318 | + 0x00000000); | |
| 3319 | + spr_register(env, SPR_PMC6, "PMC6", | |
| 3320 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3321 | + &spr_read_generic, &spr_write_generic, | |
| 3322 | + 0x00000000); | |
| 3323 | + spr_register(env, SPR_UPMC6, "UPMC6", | |
| 3324 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3325 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3326 | + 0x00000000); | |
| 3327 | + /* SPRGs */ | |
| 3328 | + spr_register(env, SPR_SPRG4, "SPRG4", | |
| 3329 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3330 | + &spr_read_generic, &spr_write_generic, | |
| 3331 | + 0x00000000); | |
| 3332 | + spr_register(env, SPR_USPRG4, "USPRG4", | |
| 3333 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3334 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3335 | + 0x00000000); | |
| 3336 | + spr_register(env, SPR_SPRG5, "SPRG5", | |
| 3337 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3338 | + &spr_read_generic, &spr_write_generic, | |
| 3339 | + 0x00000000); | |
| 3340 | + spr_register(env, SPR_USPRG5, "USPRG5", | |
| 3341 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3342 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3343 | + 0x00000000); | |
| 3344 | + spr_register(env, SPR_SPRG6, "SPRG6", | |
| 3345 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3346 | + &spr_read_generic, &spr_write_generic, | |
| 3347 | + 0x00000000); | |
| 3348 | + spr_register(env, SPR_USPRG6, "USPRG6", | |
| 3349 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3350 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3351 | + 0x00000000); | |
| 3352 | + spr_register(env, SPR_SPRG7, "SPRG7", | |
| 3353 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3354 | + &spr_read_generic, &spr_write_generic, | |
| 3355 | + 0x00000000); | |
| 3356 | + spr_register(env, SPR_USPRG7, "USPRG7", | |
| 3357 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3358 | + &spr_read_ureg, SPR_NOACCESS, | |
| 3359 | + 0x00000000); | |
| 3360 | + /* Memory management */ | |
| 3361 | + gen_low_BATs(env); | |
| 3362 | + gen_high_BATs(env); | |
| 3363 | + gen_74xx_soft_tlb(env); | |
| 3364 | + /* Allocate hardware IRQ controller */ | |
| 3365 | + ppc6xx_irq_init(env); | |
| 3366 | +} | |
| 3367 | +#endif /* TODO */ | |
| 3368 | + | |
| 3369 | +#if defined (TARGET_PPC64) | |
| 3370 | +/* PowerPC 970 */ | |
| 3371 | +#if defined (TODO) | |
| 3372 | +#define POWERPC_INSNS_970 (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \ | |
| 3373 | + PPC_64B | PPC_ALTIVEC | \ | |
| 3374 | + PPC_64_BRIDGE | PPC_SLBI) | |
| 3375 | +#define POWERPC_MSRM_970 (0x900000000204FF36ULL) | |
| 3376 | +#define POWERPC_MMU_970 (POWERPC_MMU_64BRIDGE) | |
| 3377 | +//#define POWERPC_EXCP_970 (POWERPC_EXCP_970) | |
| 3378 | +#define POWERPC_INPUT_970 (PPC_FLAGS_INPUT_970) | |
| 3379 | + | |
| 3380 | +static void init_proc_970 (CPUPPCState *env) | |
| 3381 | +{ | |
| 3382 | + gen_spr_ne_601(env); | |
| 3383 | + gen_spr_7xx(env); | |
| 3384 | + /* Time base */ | |
| 3385 | + gen_tbl(env); | |
| 3386 | + /* Hardware implementation registers */ | |
| 3387 | + /* XXX : not implemented */ | |
| 3388 | + spr_register(env, SPR_HID0, "HID0", | |
| 3389 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3390 | + &spr_read_generic, &spr_write_generic, | |
| 3391 | + 0x00000000); | |
| 3392 | + /* XXX : not implemented */ | |
| 3393 | + spr_register(env, SPR_HID1, "HID1", | |
| 3394 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3395 | + &spr_read_generic, &spr_write_generic, | |
| 3396 | + 0x00000000); | |
| 3397 | + /* XXX : not implemented */ | |
| 3398 | + spr_register(env, SPR_750_HID2, "HID2", | |
| 3399 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3400 | + &spr_read_generic, &spr_write_generic, | |
| 3401 | + 0x00000000); | |
| 3402 | + /* Memory management */ | |
| 3403 | + /* XXX: not correct */ | |
| 3404 | + gen_low_BATs(env); | |
| 3405 | +#if 0 // TODO | |
| 3406 | + env->slb_nr = 32; | |
| 3407 | +#endif | |
| 3408 | + /* Allocate hardware IRQ controller */ | |
| 3409 | + ppc970_irq_init(env); | |
| 3410 | +} | |
| 3411 | +#endif /* TODO */ | |
| 3412 | + | |
| 3413 | +/* PowerPC 970FX (aka G5) */ | |
| 3414 | +#if defined (TODO) | |
| 3415 | +#define POWERPC_INSNS_970FX (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \ | |
| 3416 | + PPC_64B | PPC_ALTIVEC | \ | |
| 3417 | + PPC_64_BRIDGE | PPC_SLBI) | |
| 3418 | +#define POWERPC_MSRM_970FX (0x800000000204FF36ULL) | |
| 3419 | +#define POWERPC_MMU_970FX (POWERPC_MMU_64BRIDGE) | |
| 3420 | +#define POWERPC_EXCP_970FX (POWERPC_EXCP_970) | |
| 3421 | +#define POWERPC_INPUT_970FX (PPC_FLAGS_INPUT_970) | |
| 3422 | + | |
| 3423 | +static void init_proc_970FX (CPUPPCState *env) | |
| 3424 | +{ | |
| 3425 | + gen_spr_ne_601(env); | |
| 3426 | + gen_spr_7xx(env); | |
| 3427 | + /* Time base */ | |
| 3428 | + gen_tbl(env); | |
| 3429 | + /* Hardware implementation registers */ | |
| 3430 | + /* XXX : not implemented */ | |
| 3431 | + spr_register(env, SPR_HID0, "HID0", | |
| 3432 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3433 | + &spr_read_generic, &spr_write_generic, | |
| 3434 | + 0x00000000); | |
| 3435 | + /* XXX : not implemented */ | |
| 3436 | + spr_register(env, SPR_HID1, "HID1", | |
| 3437 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3438 | + &spr_read_generic, &spr_write_generic, | |
| 3439 | + 0x00000000); | |
| 3440 | + /* XXX : not implemented */ | |
| 3441 | + spr_register(env, SPR_750_HID2, "HID2", | |
| 3442 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3443 | + &spr_read_generic, &spr_write_generic, | |
| 3444 | + 0x00000000); | |
| 3445 | + /* Memory management */ | |
| 3446 | + /* XXX: not correct */ | |
| 3447 | + gen_low_BATs(env); | |
| 3448 | +#if 0 // TODO | |
| 3449 | + env->slb_nr = 32; | |
| 3450 | +#endif | |
| 3451 | + /* Allocate hardware IRQ controller */ | |
| 3452 | + ppc970_irq_init(env); | |
| 3453 | +} | |
| 3454 | +#endif /* TODO */ | |
| 3455 | + | |
| 3456 | +/* PowerPC 970 GX */ | |
| 3457 | +#if defined (TODO) | |
| 3458 | +#define POWERPC_INSNS_970GX (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \ | |
| 3459 | + PPC_64B | PPC_ALTIVEC | \ | |
| 3460 | + PPC_64_BRIDGE | PPC_SLBI) | |
| 3461 | +#define POWERPC_MSRM_970GX (0x800000000204FF36ULL) | |
| 3462 | +#define POWERPC_MMU_970GX (POWERPC_MMU_64BRIDGE) | |
| 3463 | +#define POWERPC_EXCP_970GX (POWERPC_EXCP_970) | |
| 3464 | +#define POWERPC_INPUT_970GX (PPC_FLAGS_INPUT_970) | |
| 3465 | + | |
| 3466 | +static void init_proc_970GX (CPUPPCState *env) | |
| 3467 | +{ | |
| 3468 | + gen_spr_ne_601(env); | |
| 3469 | + gen_spr_7xx(env); | |
| 3470 | + /* Time base */ | |
| 3471 | + gen_tbl(env); | |
| 3472 | + /* Hardware implementation registers */ | |
| 3473 | + /* XXX : not implemented */ | |
| 3474 | + spr_register(env, SPR_HID0, "HID0", | |
| 3475 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3476 | + &spr_read_generic, &spr_write_generic, | |
| 3477 | + 0x00000000); | |
| 3478 | + /* XXX : not implemented */ | |
| 3479 | + spr_register(env, SPR_HID1, "HID1", | |
| 3480 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3481 | + &spr_read_generic, &spr_write_generic, | |
| 3482 | + 0x00000000); | |
| 3483 | + /* XXX : not implemented */ | |
| 3484 | + spr_register(env, SPR_750_HID2, "HID2", | |
| 3485 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3486 | + &spr_read_generic, &spr_write_generic, | |
| 3487 | + 0x00000000); | |
| 3488 | + /* Memory management */ | |
| 3489 | + /* XXX: not correct */ | |
| 3490 | + gen_low_BATs(env); | |
| 3491 | +#if 0 // TODO | |
| 3492 | + env->slb_nr = 32; | |
| 3493 | +#endif | |
| 3494 | + /* Allocate hardware IRQ controller */ | |
| 3495 | + ppc970_irq_init(env); | |
| 3496 | +} | |
| 3497 | +#endif /* TODO */ | |
| 3498 | + | |
| 3499 | +/* PowerPC 620 */ | |
| 3500 | +#if defined (TODO) | |
| 3501 | +#define POWERPC_INSNS_620 (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \ | |
| 3502 | + PPC_64B | PPC_SLBI) | |
| 3503 | +#define POWERPC_MSRM_620 (0x800000000005FF73ULL) | |
| 3504 | +#define POWERPC_MMU_620 (POWERPC_MMU_64B) | |
| 3505 | +#define POWERPC_EXCP_620 (POWERPC_EXCP_970) | |
| 3506 | +#define POWERPC_INPUT_620 (PPC_FLAGS_INPUT_970) | |
| 3507 | + | |
| 3508 | +static void init_proc_620 (CPUPPCState *env) | |
| 3509 | +{ | |
| 3510 | + gen_spr_ne_601(env); | |
| 3511 | + gen_spr_620(env); | |
| 3512 | + /* Time base */ | |
| 3513 | + gen_tbl(env); | |
| 3514 | + /* Hardware implementation registers */ | |
| 3515 | + /* XXX : not implemented */ | |
| 3516 | + spr_register(env, SPR_HID0, "HID0", | |
| 3517 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 3518 | + &spr_read_generic, &spr_write_generic, | |
| 3519 | + 0x00000000); | |
| 3520 | + /* Memory management */ | |
| 3521 | + gen_low_BATs(env); | |
| 3522 | + gen_high_BATs(env); | |
| 3523 | + /* XXX: TODO: initialize internal interrupt controller */ | |
| 3524 | +} | |
| 3525 | +#endif /* TODO */ | |
| 3526 | +#endif /* defined (TARGET_PPC64) */ | |
| 3527 | + | |
| 3528 | +/* Default 32 bits PowerPC target will be 604 */ | |
| 3529 | +#define CPU_POWERPC_PPC32 CPU_POWERPC_604 | |
| 3530 | +#define POWERPC_INSNS_PPC32 POWERPC_INSNS_604 | |
| 3531 | +#define POWERPC_MSRM_PPC32 POWERPC_MSRM_604 | |
| 3532 | +#define POWERPC_MMU_PPC32 POWERPC_MMU_604 | |
| 3533 | +#define POWERPC_EXCP_PPC32 POWERPC_EXCP_604 | |
| 3534 | +#define POWERPC_INPUT_PPC32 POWERPC_INPUT_604 | |
| 3535 | +#define init_proc_PPC32 init_proc_604 | |
| 3536 | + | |
| 3537 | +/* Default 64 bits PowerPC target will be 970 FX */ | |
| 3538 | +#define CPU_POWERPC_PPC64 CPU_POWERPC_970FX | |
| 3539 | +#define POWERPC_INSNS_PPC64 POWERPC_INSNS_970FX | |
| 3540 | +#define POWERPC_MSRM_PPC64 POWERPC_MSRM_970FX | |
| 3541 | +#define POWERPC_MMU_PPC64 POWERPC_MMU_970FX | |
| 3542 | +#define POWERPC_EXCP_PPC64 POWERPC_EXCP_970FX | |
| 3543 | +#define POWERPC_INPUT_PPC64 POWERPC_INPUT_970FX | |
| 3544 | +#define init_proc_PPC64 init_proc_970FX | |
| 3545 | + | |
| 3546 | +/* Default PowerPC target will be PowerPC 32 */ | |
| 3547 | +#if defined (TARGET_PPC64) && 0 // XXX: TODO | |
| 3548 | +#define CPU_POWERPC_PPC CPU_POWERPC_PPC64 | |
| 3549 | +#define POWERPC_INSNS_PPC POWERPC_INSNS_PPC64 | |
| 3550 | +#define POWERPC_MSRM_PPC POWERPC_MSRM_PPC64 | |
| 3551 | +#define POWERPC_MMU_PPC POWERPC_MMU_PPC64 | |
| 3552 | +#define POWERPC_EXCP_PPC POWERPC_EXCP_PPC64 | |
| 3553 | +#define POWERPC_INPUT_PPC POWERPC_INPUT_PPC64 | |
| 3554 | +#define init_proc_PPC init_proc_PPC64 | |
| 3555 | +#else | |
| 3556 | +#define CPU_POWERPC_PPC CPU_POWERPC_PPC32 | |
| 3557 | +#define POWERPC_INSNS_PPC POWERPC_INSNS_PPC32 | |
| 3558 | +#define POWERPC_MSRM_PPC POWERPC_MSRM_PPC32 | |
| 3559 | +#define POWERPC_MMU_PPC POWERPC_MMU_PPC32 | |
| 3560 | +#define POWERPC_EXCP_PPC POWERPC_EXCP_PPC32 | |
| 3561 | +#define POWERPC_INPUT_PPC POWERPC_INPUT_PPC32 | |
| 3562 | +#define init_proc_PPC init_proc_PPC32 | |
| 3563 | +#endif | |
| 3564 | + | |
| 3565 | +/*****************************************************************************/ | |
| 3566 | +/* PVR definitions for most known PowerPC */ | |
| 3567 | +enum { | |
| 3568 | + /* PowerPC 401 family */ | |
| 3569 | + /* Generic PowerPC 401 */ | |
| 3570 | +#define CPU_POWERPC_401 CPU_POWERPC_401G2 | |
| 3571 | + /* PowerPC 401 cores */ | |
| 3572 | + CPU_POWERPC_401A1 = 0x00210000, | |
| 3573 | + CPU_POWERPC_401B2 = 0x00220000, | |
| 3574 | +#if 0 | |
| 3575 | + CPU_POWERPC_401B3 = xxx, | |
| 3576 | +#endif | |
| 3577 | + CPU_POWERPC_401C2 = 0x00230000, | |
| 3578 | + CPU_POWERPC_401D2 = 0x00240000, | |
| 3579 | + CPU_POWERPC_401E2 = 0x00250000, | |
| 3580 | + CPU_POWERPC_401F2 = 0x00260000, | |
| 3581 | + CPU_POWERPC_401G2 = 0x00270000, | |
| 3582 | + /* PowerPC 401 microcontrolers */ | |
| 3583 | +#if 0 | |
| 3584 | + CPU_POWERPC_401GF = xxx, | |
| 3585 | +#endif | |
| 3586 | +#define CPU_POWERPC_IOP480 CPU_POWERPC_401B2 | |
| 3587 | + /* IBM Processor for Network Resources */ | |
| 3588 | + CPU_POWERPC_COBRA = 0x10100000, /* XXX: 405 ? */ | |
| 3589 | +#if 0 | |
| 3590 | + CPU_POWERPC_XIPCHIP = xxx, | |
| 3591 | +#endif | |
| 3592 | + /* PowerPC 403 family */ | |
| 3593 | + /* Generic PowerPC 403 */ | |
| 3594 | +#define CPU_POWERPC_403 CPU_POWERPC_403GC | |
| 3595 | + /* PowerPC 403 microcontrollers */ | |
| 3596 | + CPU_POWERPC_403GA = 0x00200011, | |
| 3597 | + CPU_POWERPC_403GB = 0x00200100, | |
| 3598 | + CPU_POWERPC_403GC = 0x00200200, | |
| 3599 | + CPU_POWERPC_403GCX = 0x00201400, | |
| 3600 | +#if 0 | |
| 3601 | + CPU_POWERPC_403GP = xxx, | |
| 3602 | +#endif | |
| 3603 | + /* PowerPC 405 family */ | |
| 3604 | + /* Generic PowerPC 405 */ | |
| 3605 | +#define CPU_POWERPC_405 CPU_POWERPC_405D4 | |
| 3606 | + /* PowerPC 405 cores */ | |
| 3607 | +#if 0 | |
| 3608 | + CPU_POWERPC_405A3 = xxx, | |
| 3609 | +#endif | |
| 3610 | +#if 0 | |
| 3611 | + CPU_POWERPC_405A4 = xxx, | |
| 3612 | +#endif | |
| 3613 | +#if 0 | |
| 3614 | + CPU_POWERPC_405B3 = xxx, | |
| 3615 | +#endif | |
| 3616 | +#if 0 | |
| 3617 | + CPU_POWERPC_405B4 = xxx, | |
| 3618 | +#endif | |
| 3619 | +#if 0 | |
| 3620 | + CPU_POWERPC_405C3 = xxx, | |
| 3621 | +#endif | |
| 3622 | +#if 0 | |
| 3623 | + CPU_POWERPC_405C4 = xxx, | |
| 3624 | +#endif | |
| 3625 | + CPU_POWERPC_405D2 = 0x20010000, | |
| 3626 | +#if 0 | |
| 3627 | + CPU_POWERPC_405D3 = xxx, | |
| 3628 | +#endif | |
| 3629 | + CPU_POWERPC_405D4 = 0x41810000, | |
| 3630 | +#if 0 | |
| 3631 | + CPU_POWERPC_405D5 = xxx, | |
| 3632 | +#endif | |
| 3633 | +#if 0 | |
| 3634 | + CPU_POWERPC_405E4 = xxx, | |
| 3635 | +#endif | |
| 3636 | +#if 0 | |
| 3637 | + CPU_POWERPC_405F4 = xxx, | |
| 3638 | +#endif | |
| 3639 | +#if 0 | |
| 3640 | + CPU_POWERPC_405F5 = xxx, | |
| 3641 | +#endif | |
| 3642 | +#if 0 | |
| 3643 | + CPU_POWERPC_405F6 = xxx, | |
| 3644 | +#endif | |
| 3645 | + /* PowerPC 405 microcontrolers */ | |
| 3646 | + /* XXX: missing 0x200108a0 */ | |
| 3647 | +#define CPU_POWERPC_405CR CPU_POWERPC_405CRc | |
| 3648 | + CPU_POWERPC_405CRa = 0x40110041, | |
| 3649 | + CPU_POWERPC_405CRb = 0x401100C5, | |
| 3650 | + CPU_POWERPC_405CRc = 0x40110145, | |
| 3651 | + CPU_POWERPC_405EP = 0x51210950, | |
| 3652 | +#if 0 | |
| 3653 | + CPU_POWERPC_405EXr = xxx, | |
| 3654 | +#endif | |
| 3655 | + CPU_POWERPC_405EZ = 0x41511460, /* 0x51210950 ? */ | |
| 3656 | +#if 0 | |
| 3657 | + CPU_POWERPC_405FX = xxx, | |
| 3658 | +#endif | |
| 3659 | +#define CPU_POWERPC_405GP CPU_POWERPC_405GPd | |
| 3660 | + CPU_POWERPC_405GPa = 0x40110000, | |
| 3661 | + CPU_POWERPC_405GPb = 0x40110040, | |
| 3662 | + CPU_POWERPC_405GPc = 0x40110082, | |
| 3663 | + CPU_POWERPC_405GPd = 0x401100C4, | |
| 3664 | +#define CPU_POWERPC_405GPe CPU_POWERPC_405CRc | |
| 3665 | + CPU_POWERPC_405GPR = 0x50910951, | |
| 3666 | +#if 0 | |
| 3667 | + CPU_POWERPC_405H = xxx, | |
| 3668 | +#endif | |
| 3669 | +#if 0 | |
| 3670 | + CPU_POWERPC_405L = xxx, | |
| 3671 | +#endif | |
| 3672 | + CPU_POWERPC_405LP = 0x41F10000, | |
| 3673 | +#if 0 | |
| 3674 | + CPU_POWERPC_405PM = xxx, | |
| 3675 | +#endif | |
| 3676 | +#if 0 | |
| 3677 | + CPU_POWERPC_405PS = xxx, | |
| 3678 | +#endif | |
| 3679 | +#if 0 | |
| 3680 | + CPU_POWERPC_405S = xxx, | |
| 3681 | +#endif | |
| 3682 | + /* IBM network processors */ | |
| 3683 | + CPU_POWERPC_NPE405H = 0x414100C0, | |
| 3684 | + CPU_POWERPC_NPE405H2 = 0x41410140, | |
| 3685 | + CPU_POWERPC_NPE405L = 0x416100C0, | |
| 3686 | + CPU_POWERPC_NPE4GS3 = 0x40B10000, | |
| 3687 | +#if 0 | |
| 3688 | + CPU_POWERPC_NPCxx1 = xxx, | |
| 3689 | +#endif | |
| 3690 | +#if 0 | |
| 3691 | + CPU_POWERPC_NPR161 = xxx, | |
| 3692 | +#endif | |
| 3693 | +#if 0 | |
| 3694 | + CPU_POWERPC_LC77700 = xxx, | |
| 3695 | +#endif | |
| 3696 | + /* IBM STBxxx (PowerPC 401/403/405 core based microcontrollers) */ | |
| 3697 | +#if 0 | |
| 3698 | + CPU_POWERPC_STB01000 = xxx, | |
| 3699 | +#endif | |
| 3700 | +#if 0 | |
| 3701 | + CPU_POWERPC_STB01010 = xxx, | |
| 3702 | +#endif | |
| 3703 | +#if 0 | |
| 3704 | + CPU_POWERPC_STB0210 = xxx, /* 401B3 */ | |
| 3705 | +#endif | |
| 3706 | + CPU_POWERPC_STB03 = 0x40310000, /* 0x40130000 ? */ | |
| 3707 | +#if 0 | |
| 3708 | + CPU_POWERPC_STB043 = xxx, | |
| 3709 | +#endif | |
| 3710 | +#if 0 | |
| 3711 | + CPU_POWERPC_STB045 = xxx, | |
| 3712 | +#endif | |
| 3713 | + CPU_POWERPC_STB04 = 0x41810000, | |
| 3714 | + CPU_POWERPC_STB25 = 0x51510950, | |
| 3715 | +#if 0 | |
| 3716 | + CPU_POWERPC_STB130 = xxx, | |
| 3717 | +#endif | |
| 3718 | + /* Xilinx cores */ | |
| 3719 | + CPU_POWERPC_X2VP4 = 0x20010820, | |
| 3720 | +#define CPU_POWERPC_X2VP7 CPU_POWERPC_X2VP4 | |
| 3721 | + CPU_POWERPC_X2VP20 = 0x20010860, | |
| 3722 | +#define CPU_POWERPC_X2VP50 CPU_POWERPC_X2VP20 | |
| 3723 | +#if 0 | |
| 3724 | + CPU_POWERPC_ZL10310 = xxx, | |
| 3725 | +#endif | |
| 3726 | +#if 0 | |
| 3727 | + CPU_POWERPC_ZL10311 = xxx, | |
| 3728 | +#endif | |
| 3729 | +#if 0 | |
| 3730 | + CPU_POWERPC_ZL10320 = xxx, | |
| 3731 | +#endif | |
| 3732 | +#if 0 | |
| 3733 | + CPU_POWERPC_ZL10321 = xxx, | |
| 3734 | +#endif | |
| 3735 | + /* PowerPC 440 family */ | |
| 3736 | + /* Generic PowerPC 440 */ | |
| 3737 | +#define CPU_POWERPC_440 CPU_POWERPC_440GXf | |
| 3738 | + /* PowerPC 440 cores */ | |
| 3739 | +#if 0 | |
| 3740 | + CPU_POWERPC_440A4 = xxx, | |
| 3741 | +#endif | |
| 3742 | +#if 0 | |
| 3743 | + CPU_POWERPC_440A5 = xxx, | |
| 3744 | +#endif | |
| 3745 | +#if 0 | |
| 3746 | + CPU_POWERPC_440B4 = xxx, | |
| 3747 | +#endif | |
| 3748 | +#if 0 | |
| 3749 | + CPU_POWERPC_440F5 = xxx, | |
| 3750 | +#endif | |
| 3751 | +#if 0 | |
| 3752 | + CPU_POWERPC_440G5 = xxx, | |
| 3753 | +#endif | |
| 3754 | +#if 0 | |
| 3755 | + CPU_POWERPC_440H4 = xxx, | |
| 3756 | +#endif | |
| 3757 | +#if 0 | |
| 3758 | + CPU_POWERPC_440H6 = xxx, | |
| 3759 | +#endif | |
| 3760 | + /* PowerPC 440 microcontrolers */ | |
| 3761 | +#define CPU_POWERPC_440EP CPU_POWERPC_440EPb | |
| 3762 | + CPU_POWERPC_440EPa = 0x42221850, | |
| 3763 | + CPU_POWERPC_440EPb = 0x422218D3, | |
| 3764 | +#define CPU_POWERPC_440GP CPU_POWERPC_440GPc | |
| 3765 | + CPU_POWERPC_440GPb = 0x40120440, | |
| 3766 | + CPU_POWERPC_440GPc = 0x40120481, | |
| 3767 | +#define CPU_POWERPC_440GR CPU_POWERPC_440GRa | |
| 3768 | +#define CPU_POWERPC_440GRa CPU_POWERPC_440EPb | |
| 3769 | + CPU_POWERPC_440GRX = 0x200008D0, | |
| 3770 | +#define CPU_POWERPC_440EPX CPU_POWERPC_440GRX | |
| 3771 | +#define CPU_POWERPC_440GX CPU_POWERPC_440GXf | |
| 3772 | + CPU_POWERPC_440GXa = 0x51B21850, | |
| 3773 | + CPU_POWERPC_440GXb = 0x51B21851, | |
| 3774 | + CPU_POWERPC_440GXc = 0x51B21892, | |
| 3775 | + CPU_POWERPC_440GXf = 0x51B21894, | |
| 3776 | +#if 0 | |
| 3777 | + CPU_POWERPC_440S = xxx, | |
| 3778 | +#endif | |
| 3779 | + CPU_POWERPC_440SP = 0x53221850, | |
| 3780 | + CPU_POWERPC_440SP2 = 0x53221891, | |
| 3781 | + CPU_POWERPC_440SPE = 0x53421890, | |
| 3782 | + /* PowerPC 460 family */ | |
| 3783 | +#if 0 | |
| 3784 | + /* Generic PowerPC 464 */ | |
| 3785 | +#define CPU_POWERPC_464 CPU_POWERPC_464H90 | |
| 3786 | +#endif | |
| 3787 | + /* PowerPC 464 microcontrolers */ | |
| 3788 | +#if 0 | |
| 3789 | + CPU_POWERPC_464H90 = xxx, | |
| 3790 | +#endif | |
| 3791 | +#if 0 | |
| 3792 | + CPU_POWERPC_464H90FP = xxx, | |
| 3793 | +#endif | |
| 3794 | + /* Freescale embedded PowerPC cores */ | |
| 3795 | + /* e200 family */ | |
| 3796 | +#define CPU_POWERPC_e200 CPU_POWERPC_e200z6 | |
| 3797 | +#if 0 | |
| 3798 | + CPU_POWERPC_e200z0 = xxx, | |
| 3799 | +#endif | |
| 3800 | +#if 0 | |
| 3801 | + CPU_POWERPC_e200z3 = xxx, | |
| 3802 | +#endif | |
| 3803 | + CPU_POWERPC_e200z5 = 0x81000000, | |
| 3804 | + CPU_POWERPC_e200z6 = 0x81120000, | |
| 3805 | + /* e300 family */ | |
| 3806 | +#define CPU_POWERPC_e300 CPU_POWERPC_e300c3 | |
| 3807 | + CPU_POWERPC_e300c1 = 0x00830000, | |
| 3808 | + CPU_POWERPC_e300c2 = 0x00840000, | |
| 3809 | + CPU_POWERPC_e300c3 = 0x00850000, | |
| 3810 | + /* e500 family */ | |
| 3811 | +#define CPU_POWERPC_e500 CPU_POWERPC_e500_v22 | |
| 3812 | + CPU_POWERPC_e500_v11 = 0x80200010, | |
| 3813 | + CPU_POWERPC_e500_v12 = 0x80200020, | |
| 3814 | + CPU_POWERPC_e500_v21 = 0x80210010, | |
| 3815 | + CPU_POWERPC_e500_v22 = 0x80210020, | |
| 3816 | +#if 0 | |
| 3817 | + CPU_POWERPC_e500mc = xxx, | |
| 3818 | +#endif | |
| 3819 | + /* e600 family */ | |
| 3820 | + CPU_POWERPC_e600 = 0x80040010, | |
| 3821 | + /* PowerPC MPC 5xx cores */ | |
| 3822 | + CPU_POWERPC_5xx = 0x00020020, | |
| 3823 | + /* PowerPC MPC 8xx cores (aka PowerQUICC) */ | |
| 3824 | + CPU_POWERPC_8xx = 0x00500000, | |
| 3825 | + /* PowerPC MPC 8xxx cores (aka PowerQUICC-II) */ | |
| 3826 | + CPU_POWERPC_82xx_HIP3 = 0x00810101, | |
| 3827 | + CPU_POWERPC_82xx_HIP4 = 0x80811014, | |
| 3828 | + CPU_POWERPC_827x = 0x80822013, | |
| 3829 | + /* PowerPC 6xx cores */ | |
| 3830 | + CPU_POWERPC_601 = 0x00010001, | |
| 3831 | + CPU_POWERPC_601a = 0x00010002, | |
| 3832 | + CPU_POWERPC_602 = 0x00050100, | |
| 3833 | + CPU_POWERPC_603 = 0x00030100, | |
| 3834 | +#define CPU_POWERPC_603E CPU_POWERPC_603E_v41 | |
| 3835 | + CPU_POWERPC_603E_v11 = 0x00060101, | |
| 3836 | + CPU_POWERPC_603E_v12 = 0x00060102, | |
| 3837 | + CPU_POWERPC_603E_v13 = 0x00060103, | |
| 3838 | + CPU_POWERPC_603E_v14 = 0x00060104, | |
| 3839 | + CPU_POWERPC_603E_v22 = 0x00060202, | |
| 3840 | + CPU_POWERPC_603E_v3 = 0x00060300, | |
| 3841 | + CPU_POWERPC_603E_v4 = 0x00060400, | |
| 3842 | + CPU_POWERPC_603E_v41 = 0x00060401, | |
| 3843 | + CPU_POWERPC_603E7t = 0x00071201, | |
| 3844 | + CPU_POWERPC_603E7v = 0x00070100, | |
| 3845 | + CPU_POWERPC_603E7v1 = 0x00070101, | |
| 3846 | + CPU_POWERPC_603E7v2 = 0x00070201, | |
| 3847 | + CPU_POWERPC_603E7 = 0x00070200, | |
| 3848 | + CPU_POWERPC_603P = 0x00070000, | |
| 3849 | +#define CPU_POWERPC_603R CPU_POWERPC_603E7t | |
| 3850 | + CPU_POWERPC_G2 = 0x00810011, | |
| 3851 | +#if 0 // Linux pretends the MSB is zero... | |
| 3852 | + CPU_POWERPC_G2H4 = 0x80811010, | |
| 3853 | + CPU_POWERPC_G2gp = 0x80821010, | |
| 3854 | + CPU_POWERPC_G2ls = 0x90810010, | |
| 3855 | + CPU_POWERPC_G2LE = 0x80820010, | |
| 3856 | + CPU_POWERPC_G2LEgp = 0x80822010, | |
| 3857 | + CPU_POWERPC_G2LEls = 0xA0822010, | |
| 3858 | +#else | |
| 3859 | + CPU_POWERPC_G2H4 = 0x00811010, | |
| 3860 | + CPU_POWERPC_G2gp = 0x00821010, | |
| 3861 | + CPU_POWERPC_G2ls = 0x10810010, | |
| 3862 | + CPU_POWERPC_G2LE = 0x00820010, | |
| 3863 | + CPU_POWERPC_G2LEgp = 0x00822010, | |
| 3864 | + CPU_POWERPC_G2LEls = 0x20822010, | |
| 3865 | +#endif | |
| 3866 | + CPU_POWERPC_604 = 0x00040103, | |
| 3867 | +#define CPU_POWERPC_604E CPU_POWERPC_604E_v24 | |
| 3868 | + CPU_POWERPC_604E_v10 = 0x00090100, /* Also 2110 & 2120 */ | |
| 3869 | + CPU_POWERPC_604E_v22 = 0x00090202, | |
| 3870 | + CPU_POWERPC_604E_v24 = 0x00090204, | |
| 3871 | + CPU_POWERPC_604R = 0x000a0101, /* Also 0x00093102 */ | |
| 3872 | +#if 0 | |
| 3873 | + CPU_POWERPC_604EV = xxx, | |
| 3874 | +#endif | |
| 3875 | + /* PowerPC 740/750 cores (aka G3) */ | |
| 3876 | + /* XXX: missing 0x00084202 */ | |
| 3877 | +#define CPU_POWERPC_7x0 CPU_POWERPC_7x0_v31 | |
| 3878 | + CPU_POWERPC_7x0_v20 = 0x00080200, | |
| 3879 | + CPU_POWERPC_7x0_v21 = 0x00080201, | |
| 3880 | + CPU_POWERPC_7x0_v22 = 0x00080202, | |
| 3881 | + CPU_POWERPC_7x0_v30 = 0x00080300, | |
| 3882 | + CPU_POWERPC_7x0_v31 = 0x00080301, | |
| 3883 | + CPU_POWERPC_740E = 0x00080100, | |
| 3884 | + CPU_POWERPC_7x0P = 0x10080000, | |
| 3885 | + /* XXX: missing 0x00087010 (CL ?) */ | |
| 3886 | + CPU_POWERPC_750CL = 0x00087200, | |
| 3887 | +#define CPU_POWERPC_750CX CPU_POWERPC_750CX_v22 | |
| 3888 | + CPU_POWERPC_750CX_v21 = 0x00082201, | |
| 3889 | + CPU_POWERPC_750CX_v22 = 0x00082202, | |
| 3890 | +#define CPU_POWERPC_750CXE CPU_POWERPC_750CXE_v31b | |
| 3891 | + CPU_POWERPC_750CXE_v21 = 0x00082211, | |
| 3892 | + CPU_POWERPC_750CXE_v22 = 0x00082212, | |
| 3893 | + CPU_POWERPC_750CXE_v23 = 0x00082213, | |
| 3894 | + CPU_POWERPC_750CXE_v24 = 0x00082214, | |
| 3895 | + CPU_POWERPC_750CXE_v24b = 0x00083214, | |
| 3896 | + CPU_POWERPC_750CXE_v31 = 0x00083211, | |
| 3897 | + CPU_POWERPC_750CXE_v31b = 0x00083311, | |
| 3898 | + CPU_POWERPC_750CXR = 0x00083410, | |
| 3899 | + CPU_POWERPC_750E = 0x00080200, | |
| 3900 | + CPU_POWERPC_750FL = 0x700A0203, | |
| 3901 | +#define CPU_POWERPC_750FX CPU_POWERPC_750FX_v23 | |
| 3902 | + CPU_POWERPC_750FX_v10 = 0x70000100, | |
| 3903 | + CPU_POWERPC_750FX_v20 = 0x70000200, | |
| 3904 | + CPU_POWERPC_750FX_v21 = 0x70000201, | |
| 3905 | + CPU_POWERPC_750FX_v22 = 0x70000202, | |
| 3906 | + CPU_POWERPC_750FX_v23 = 0x70000203, | |
| 3907 | + CPU_POWERPC_750GL = 0x70020102, | |
| 3908 | +#define CPU_POWERPC_750GX CPU_POWERPC_750GX_v12 | |
| 3909 | + CPU_POWERPC_750GX_v10 = 0x70020100, | |
| 3910 | + CPU_POWERPC_750GX_v11 = 0x70020101, | |
| 3911 | + CPU_POWERPC_750GX_v12 = 0x70020102, | |
| 3912 | +#define CPU_POWERPC_750L CPU_POWERPC_750L_v32 /* Aka LoneStar */ | |
| 3913 | + CPU_POWERPC_750L_v22 = 0x00088202, | |
| 3914 | + CPU_POWERPC_750L_v30 = 0x00088300, | |
| 3915 | + CPU_POWERPC_750L_v32 = 0x00088302, | |
| 3916 | + /* PowerPC 745/755 cores */ | |
| 3917 | +#define CPU_POWERPC_7x5 CPU_POWERPC_7x5_v28 | |
| 3918 | + CPU_POWERPC_7x5_v10 = 0x00083100, | |
| 3919 | + CPU_POWERPC_7x5_v11 = 0x00083101, | |
| 3920 | + CPU_POWERPC_7x5_v20 = 0x00083200, | |
| 3921 | + CPU_POWERPC_7x5_v21 = 0x00083201, | |
| 3922 | + CPU_POWERPC_7x5_v22 = 0x00083202, /* aka D */ | |
| 3923 | + CPU_POWERPC_7x5_v23 = 0x00083203, /* aka E */ | |
| 3924 | + CPU_POWERPC_7x5_v24 = 0x00083204, | |
| 3925 | + CPU_POWERPC_7x5_v25 = 0x00083205, | |
| 3926 | + CPU_POWERPC_7x5_v26 = 0x00083206, | |
| 3927 | + CPU_POWERPC_7x5_v27 = 0x00083207, | |
| 3928 | + CPU_POWERPC_7x5_v28 = 0x00083208, | |
| 3929 | +#if 0 | |
| 3930 | + CPU_POWERPC_7x5P = xxx, | |
| 3931 | +#endif | |
| 3932 | + /* PowerPC 74xx cores (aka G4) */ | |
| 3933 | + /* XXX: missing 0x000C1101 */ | |
| 3934 | +#define CPU_POWERPC_7400 CPU_POWERPC_7400_v29 | |
| 3935 | + CPU_POWERPC_7400_v10 = 0x000C0100, | |
| 3936 | + CPU_POWERPC_7400_v11 = 0x000C0101, | |
| 3937 | + CPU_POWERPC_7400_v20 = 0x000C0200, | |
| 3938 | + CPU_POWERPC_7400_v22 = 0x000C0202, | |
| 3939 | + CPU_POWERPC_7400_v26 = 0x000C0206, | |
| 3940 | + CPU_POWERPC_7400_v27 = 0x000C0207, | |
| 3941 | + CPU_POWERPC_7400_v28 = 0x000C0208, | |
| 3942 | + CPU_POWERPC_7400_v29 = 0x000C0209, | |
| 3943 | +#define CPU_POWERPC_7410 CPU_POWERPC_7410_v14 | |
| 3944 | + CPU_POWERPC_7410_v10 = 0x800C1100, | |
| 3945 | + CPU_POWERPC_7410_v11 = 0x800C1101, | |
| 3946 | + CPU_POWERPC_7410_v12 = 0x800C1102, /* aka C */ | |
| 3947 | + CPU_POWERPC_7410_v13 = 0x800C1103, /* aka D */ | |
| 3948 | + CPU_POWERPC_7410_v14 = 0x800C1104, /* aka E */ | |
| 3949 | +#define CPU_POWERPC_7448 CPU_POWERPC_7448_v21 | |
| 3950 | + CPU_POWERPC_7448_v10 = 0x80040100, | |
| 3951 | + CPU_POWERPC_7448_v11 = 0x80040101, | |
| 3952 | + CPU_POWERPC_7448_v20 = 0x80040200, | |
| 3953 | + CPU_POWERPC_7448_v21 = 0x80040201, | |
| 3954 | +#define CPU_POWERPC_7450 CPU_POWERPC_7450_v21 | |
| 3955 | + CPU_POWERPC_7450_v10 = 0x80000100, | |
| 3956 | + CPU_POWERPC_7450_v11 = 0x80000101, | |
| 3957 | + CPU_POWERPC_7450_v12 = 0x80000102, | |
| 3958 | + CPU_POWERPC_7450_v20 = 0x80000200, /* aka D: 2.04 */ | |
| 3959 | + CPU_POWERPC_7450_v21 = 0x80000201, /* aka E */ | |
| 3960 | + CPU_POWERPC_74x1 = 0x80000203, | |
| 3961 | + CPU_POWERPC_74x1G = 0x80000210, /* aka G: 2.3 */ | |
| 3962 | + /* XXX: missing 0x80010200 */ | |
| 3963 | +#define CPU_POWERPC_74x5 CPU_POWERPC_74x5_v32 | |
| 3964 | + CPU_POWERPC_74x5_v10 = 0x80010100, | |
| 3965 | + CPU_POWERPC_74x5_v21 = 0x80010201, /* aka C: 2.1 */ | |
| 3966 | + CPU_POWERPC_74x5_v32 = 0x80010302, | |
| 3967 | + CPU_POWERPC_74x5_v33 = 0x80010303, /* aka F: 3.3 */ | |
| 3968 | + CPU_POWERPC_74x5_v34 = 0x80010304, /* aka G: 3.4 */ | |
| 3969 | +#define CPU_POWERPC_74x7 CPU_POWERPC_74x7_v12 | |
| 3970 | + CPU_POWERPC_74x7_v10 = 0x80020100, /* aka A: 1.0 */ | |
| 3971 | + CPU_POWERPC_74x7_v11 = 0x80030101, /* aka B: 1.1 */ | |
| 3972 | + CPU_POWERPC_74x7_v12 = 0x80020102, /* aka C: 1.2 */ | |
| 3973 | + /* 64 bits PowerPC */ | |
| 3974 | + CPU_POWERPC_620 = 0x00140000, | |
| 3975 | + CPU_POWERPC_630 = 0x00400000, | |
| 3976 | + CPU_POWERPC_631 = 0x00410104, | |
| 3977 | + CPU_POWERPC_POWER4 = 0x00350000, | |
| 3978 | + CPU_POWERPC_POWER4P = 0x00380000, | |
| 3979 | + CPU_POWERPC_POWER5 = 0x003A0203, | |
| 3980 | +#define CPU_POWERPC_POWER5GR CPU_POWERPC_POWER5 | |
| 3981 | + CPU_POWERPC_POWER5P = 0x003B0000, | |
| 3982 | +#define CPU_POWERPC_POWER5GS CPU_POWERPC_POWER5P | |
| 3983 | + CPU_POWERPC_POWER6 = 0x003E0000, | |
| 3984 | + CPU_POWERPC_POWER6_5 = 0x0F000001, /* POWER6 running POWER5 mode */ | |
| 3985 | + CPU_POWERPC_POWER6A = 0x0F000002, | |
| 3986 | + CPU_POWERPC_970 = 0x00390202, | |
| 3987 | +#define CPU_POWERPC_970FX CPU_POWERPC_970FX_v31 | |
| 3988 | + CPU_POWERPC_970FX_v10 = 0x00391100, | |
| 3989 | + CPU_POWERPC_970FX_v20 = 0x003C0200, | |
| 3990 | + CPU_POWERPC_970FX_v21 = 0x003C0201, | |
| 3991 | + CPU_POWERPC_970FX_v30 = 0x003C0300, | |
| 3992 | + CPU_POWERPC_970FX_v31 = 0x003C0301, | |
| 3993 | + CPU_POWERPC_970GX = 0x00450000, | |
| 3994 | +#define CPU_POWERPC_970MP CPU_POWERPC_970MP_v11 | |
| 3995 | + CPU_POWERPC_970MP_v10 = 0x00440100, | |
| 3996 | + CPU_POWERPC_970MP_v11 = 0x00440101, | |
| 3997 | +#define CPU_POWERPC_CELL CPU_POWERPC_CELL_v32 | |
| 3998 | + CPU_POWERPC_CELL_v10 = 0x00700100, | |
| 3999 | + CPU_POWERPC_CELL_v20 = 0x00700400, | |
| 4000 | + CPU_POWERPC_CELL_v30 = 0x00700500, | |
| 4001 | + CPU_POWERPC_CELL_v31 = 0x00700501, | |
| 4002 | +#define CPU_POWERPC_CELL_v32 CPU_POWERPC_CELL_v31 | |
| 4003 | + CPU_POWERPC_RS64 = 0x00330000, | |
| 4004 | + CPU_POWERPC_RS64II = 0x00340000, | |
| 4005 | + CPU_POWERPC_RS64III = 0x00360000, | |
| 4006 | + CPU_POWERPC_RS64IV = 0x00370000, | |
| 4007 | + /* Original POWER */ | |
| 4008 | + /* XXX: should be POWER (RIOS), RSC3308, RSC4608, | |
| 4009 | + * POWER2 (RIOS2) & RSC2 (P2SC) here | |
| 4010 | + */ | |
| 4011 | +#if 0 | |
| 4012 | + CPU_POWER = xxx, /* 0x20000 ? 0x30000 for RSC ? */ | |
| 4013 | +#endif | |
| 4014 | +#if 0 | |
| 4015 | + CPU_POWER2 = xxx, /* 0x40000 ? */ | |
| 4016 | +#endif | |
| 4017 | + /* PA Semi core */ | |
| 4018 | + CPU_POWERPC_PA6T = 0x00900000, | |
| 4019 | +}; | |
| 4020 | + | |
| 4021 | +/* System version register (used on MPC 8xxx) */ | |
| 4022 | +enum { | |
| 4023 | + PPC_SVR_8540 = 0x80300000, | |
| 4024 | + PPC_SVR_8541E = 0x807A0010, | |
| 4025 | + PPC_SVR_8543v10 = 0x80320010, | |
| 4026 | + PPC_SVR_8543v11 = 0x80320011, | |
| 4027 | + PPC_SVR_8543v20 = 0x80320020, | |
| 4028 | + PPC_SVR_8543Ev10 = 0x803A0010, | |
| 4029 | + PPC_SVR_8543Ev11 = 0x803A0011, | |
| 4030 | + PPC_SVR_8543Ev20 = 0x803A0020, | |
| 4031 | + PPC_SVR_8545 = 0x80310220, | |
| 4032 | + PPC_SVR_8545E = 0x80390220, | |
| 4033 | + PPC_SVR_8547E = 0x80390120, | |
| 4034 | + PPC_SCR_8548v10 = 0x80310010, | |
| 4035 | + PPC_SCR_8548v11 = 0x80310011, | |
| 4036 | + PPC_SCR_8548v20 = 0x80310020, | |
| 4037 | + PPC_SVR_8548Ev10 = 0x80390010, | |
| 4038 | + PPC_SVR_8548Ev11 = 0x80390011, | |
| 4039 | + PPC_SVR_8548Ev20 = 0x80390020, | |
| 4040 | + PPC_SVR_8555E = 0x80790010, | |
| 4041 | + PPC_SVR_8560v10 = 0x80700010, | |
| 4042 | + PPC_SVR_8560v20 = 0x80700020, | |
| 4043 | +}; | |
| 4044 | + | |
| 2806 | 4045 | /*****************************************************************************/ |
| 2807 | -/* PowerPC CPU definitions */ | |
| 4046 | +/* PowerPC CPU definitions */ | |
| 4047 | +#define POWERPC_DEF(_name, _pvr, _pvr_mask, _type) \ | |
| 4048 | + { \ | |
| 4049 | + .name = _name, \ | |
| 4050 | + .pvr = _pvr, \ | |
| 4051 | + .pvr_mask = _pvr_mask, \ | |
| 4052 | + .insns_flags = glue(POWERPC_INSNS_,_type), \ | |
| 4053 | + .msr_mask = glue(POWERPC_MSRM_,_type), \ | |
| 4054 | + .mmu_model = glue(POWERPC_MMU_,_type), \ | |
| 4055 | + .excp_model = glue(POWERPC_EXCP_,_type), \ | |
| 4056 | + .bus_model = glue(POWERPC_INPUT_,_type), \ | |
| 4057 | + .init_proc = &glue(init_proc_,_type), \ | |
| 4058 | + } | |
| 4059 | + | |
| 2808 | 4060 | static ppc_def_t ppc_defs[] = { |
| 2809 | - /* Embedded PowerPC */ | |
| 4061 | + /* Embedded PowerPC */ | |
| 4062 | + /* PowerPC 401 family */ | |
| 2810 | 4063 | /* Generic PowerPC 401 */ |
| 2811 | - { | |
| 2812 | - .name = "401", | |
| 2813 | - .pvr = CPU_PPC_401, | |
| 2814 | - .pvr_mask = 0xFFFFFFFF, | |
| 2815 | - .insns_flags = PPC_INSNS_401, | |
| 2816 | - .flags = PPC_FLAGS_401, | |
| 2817 | - .msr_mask = 0x000FD201, | |
| 2818 | - }, | |
| 4064 | + POWERPC_DEF("401", CPU_POWERPC_401, 0xFFFF0000, 401), | |
| 4065 | + /* PowerPC 401 cores */ | |
| 2819 | 4066 | /* PowerPC 401A1 */ |
| 2820 | - { | |
| 2821 | - .name = "401a1", | |
| 2822 | - .pvr = CPU_PPC_401A1, | |
| 2823 | - .pvr_mask = 0xFFFFFFFF, | |
| 2824 | - .insns_flags = PPC_INSNS_401, | |
| 2825 | - .flags = PPC_FLAGS_401, | |
| 2826 | - .msr_mask = 0x000FD201, | |
| 2827 | - }, | |
| 2828 | - /* PowerPC 401B2 */ | |
| 2829 | - { | |
| 2830 | - .name = "401b2", | |
| 2831 | - .pvr = CPU_PPC_401B2, | |
| 2832 | - .pvr_mask = 0xFFFFFFFF, | |
| 2833 | - .insns_flags = PPC_INSNS_401, | |
| 2834 | - .flags = PPC_FLAGS_401, | |
| 2835 | - .msr_mask = 0x000FD201, | |
| 2836 | - }, | |
| 4067 | + POWERPC_DEF("401A1", CPU_POWERPC_401A1, 0xFFFFFFFF, 401), | |
| 4068 | + /* PowerPC 401B2 */ | |
| 4069 | + POWERPC_DEF("401B2", CPU_POWERPC_401B2, 0xFFFFFFFF, 401x2), | |
| 2837 | 4070 | #if defined (TODO) |
| 2838 | - /* PowerPC 401B3 */ | |
| 2839 | - { | |
| 2840 | - .name = "401b3", | |
| 2841 | - .pvr = CPU_PPC_401B3, | |
| 2842 | - .pvr_mask = 0xFFFFFFFF, | |
| 2843 | - .insns_flags = PPC_INSNS_401, | |
| 2844 | - .flags = PPC_FLAGS_401, | |
| 2845 | - .msr_mask = 0x000FD201, | |
| 2846 | - }, | |
| 2847 | -#endif | |
| 2848 | - /* PowerPC 401C2 */ | |
| 2849 | - { | |
| 2850 | - .name = "401c2", | |
| 2851 | - .pvr = CPU_PPC_401C2, | |
| 2852 | - .pvr_mask = 0xFFFFFFFF, | |
| 2853 | - .insns_flags = PPC_INSNS_401, | |
| 2854 | - .flags = PPC_FLAGS_401, | |
| 2855 | - .msr_mask = 0x000FD201, | |
| 2856 | - }, | |
| 2857 | - /* PowerPC 401D2 */ | |
| 2858 | - { | |
| 2859 | - .name = "401d2", | |
| 2860 | - .pvr = CPU_PPC_401D2, | |
| 2861 | - .pvr_mask = 0xFFFFFFFF, | |
| 2862 | - .insns_flags = PPC_INSNS_401, | |
| 2863 | - .flags = PPC_FLAGS_401, | |
| 2864 | - .msr_mask = 0x000FD201, | |
| 2865 | - }, | |
| 2866 | - /* PowerPC 401E2 */ | |
| 2867 | - { | |
| 2868 | - .name = "401e2", | |
| 2869 | - .pvr = CPU_PPC_401E2, | |
| 2870 | - .pvr_mask = 0xFFFFFFFF, | |
| 2871 | - .insns_flags = PPC_INSNS_401, | |
| 2872 | - .flags = PPC_FLAGS_401, | |
| 2873 | - .msr_mask = 0x000FD201, | |
| 2874 | - }, | |
| 2875 | - /* PowerPC 401F2 */ | |
| 2876 | - { | |
| 2877 | - .name = "401f2", | |
| 2878 | - .pvr = CPU_PPC_401F2, | |
| 2879 | - .pvr_mask = 0xFFFFFFFF, | |
| 2880 | - .insns_flags = PPC_INSNS_401, | |
| 2881 | - .flags = PPC_FLAGS_401, | |
| 2882 | - .msr_mask = 0x000FD201, | |
| 2883 | - }, | |
| 2884 | - /* PowerPC 401G2 */ | |
| 2885 | - { | |
| 2886 | - .name = "401g2", | |
| 2887 | - .pvr = CPU_PPC_401G2, | |
| 2888 | - .pvr_mask = 0xFFFFFFFF, | |
| 2889 | - .insns_flags = PPC_INSNS_401, | |
| 2890 | - .flags = PPC_FLAGS_401, | |
| 2891 | - .msr_mask = 0x000FD201, | |
| 2892 | - }, | |
| 4071 | + /* PowerPC 401B3 */ | |
| 4072 | + POWERPC_DEF("401B3", CPU_POWERPC_401B3, 0xFFFFFFFF, 401x3), | |
| 4073 | +#endif | |
| 4074 | + /* PowerPC 401C2 */ | |
| 4075 | + POWERPC_DEF("401C2", CPU_POWERPC_401C2, 0xFFFFFFFF, 401x2), | |
| 4076 | + /* PowerPC 401D2 */ | |
| 4077 | + POWERPC_DEF("401D2", CPU_POWERPC_401D2, 0xFFFFFFFF, 401x2), | |
| 4078 | + /* PowerPC 401E2 */ | |
| 4079 | + POWERPC_DEF("401E2", CPU_POWERPC_401E2, 0xFFFFFFFF, 401x2), | |
| 4080 | + /* PowerPC 401F2 */ | |
| 4081 | + POWERPC_DEF("401F2", CPU_POWERPC_401F2, 0xFFFFFFFF, 401x2), | |
| 4082 | + /* PowerPC 401G2 */ | |
| 4083 | + /* XXX: to be checked */ | |
| 4084 | + POWERPC_DEF("401G2", CPU_POWERPC_401G2, 0xFFFFFFFF, 401x2), | |
| 4085 | + /* PowerPC 401 microcontrolers */ | |
| 2893 | 4086 | #if defined (TODO) |
| 2894 | - /* PowerPC 401G2 */ | |
| 2895 | - { | |
| 2896 | - .name = "401gf", | |
| 2897 | - .pvr = CPU_PPC_401GF, | |
| 2898 | - .pvr_mask = 0xFFFFFFFF, | |
| 2899 | - .insns_flags = PPC_INSNS_401, | |
| 2900 | - .flags = PPC_FLAGS_401, | |
| 2901 | - .msr_mask = 0x000FD201, | |
| 2902 | - }, | |
| 4087 | + /* PowerPC 401GF */ | |
| 4088 | + POWERPC_DEF("401GF", CPU_POWERPC_401GF, 0xFFFFFFFF, 401), | |
| 2903 | 4089 | #endif |
| 4090 | + /* IOP480 (401 microcontroler) */ | |
| 4091 | + POWERPC_DEF("IOP480", CPU_POWERPC_IOP480, 0xFFFFFFFF, IOP480), | |
| 4092 | + /* IBM Processor for Network Resources */ | |
| 4093 | + POWERPC_DEF("Cobra", CPU_POWERPC_COBRA, 0xFFFFFFFF, 401), | |
| 2904 | 4094 | #if defined (TODO) |
| 2905 | - /* IOP480 (401 microcontroler) */ | |
| 2906 | - { | |
| 2907 | - .name = "iop480", | |
| 2908 | - .pvr = CPU_PPC_IOP480, | |
| 2909 | - .pvr_mask = 0xFFFFFFFF, | |
| 2910 | - .insns_flags = PPC_INSNS_401, | |
| 2911 | - .flags = PPC_FLAGS_401, | |
| 2912 | - .msr_mask = 0x000FD201, | |
| 2913 | - }, | |
| 4095 | + POWERPC_DEF("Xipchip", CPU_POWERPC_XIPCHIP, 0xFFFFFFFF, 401), | |
| 2914 | 4096 | #endif |
| 4097 | + /* PowerPC 403 family */ | |
| 4098 | + /* Generic PowerPC 403 */ | |
| 4099 | + POWERPC_DEF("403", CPU_POWERPC_403, 0xFFFF0000, 403), | |
| 4100 | + /* PowerPC 403 microcontrolers */ | |
| 4101 | + /* PowerPC 403 GA */ | |
| 4102 | + POWERPC_DEF("403GA", CPU_POWERPC_403GA, 0xFFFFFFFF, 403), | |
| 4103 | + /* PowerPC 403 GB */ | |
| 4104 | + POWERPC_DEF("403GB", CPU_POWERPC_403GB, 0xFFFFFFFF, 403), | |
| 4105 | + /* PowerPC 403 GC */ | |
| 4106 | + POWERPC_DEF("403GC", CPU_POWERPC_403GC, 0xFFFFFFFF, 403), | |
| 4107 | + /* PowerPC 403 GCX */ | |
| 4108 | + POWERPC_DEF("403GCX", CPU_POWERPC_403GCX, 0xFFFFFFFF, 403GCX), | |
| 2915 | 4109 | #if defined (TODO) |
| 2916 | - /* IBM Processor for Network Resources */ | |
| 2917 | - { | |
| 2918 | - .name = "Cobra", | |
| 2919 | - .pvr = CPU_PPC_COBRA, | |
| 2920 | - .pvr_mask = 0xFFFFFFFF, | |
| 2921 | - .insns_flags = PPC_INSNS_401, | |
| 2922 | - .flags = PPC_FLAGS_401, | |
| 2923 | - .msr_mask = 0x000FD201, | |
| 2924 | - }, | |
| 4110 | + /* PowerPC 403 GP */ | |
| 4111 | + POWERPC_DEF("403GP", CPU_POWERPC_403GP, 0xFFFFFFFF, 403), | |
| 2925 | 4112 | #endif |
| 2926 | - /* Generic PowerPC 403 */ | |
| 2927 | - { | |
| 2928 | - .name = "403", | |
| 2929 | - .pvr = CPU_PPC_403, | |
| 2930 | - .pvr_mask = 0xFFFFFFFF, | |
| 2931 | - .insns_flags = PPC_INSNS_403, | |
| 2932 | - .flags = PPC_FLAGS_403, | |
| 2933 | - .msr_mask = 0x000000000007D23DULL, | |
| 2934 | - }, | |
| 2935 | - /* PowerPC 403 GA */ | |
| 2936 | - { | |
| 2937 | - .name = "403ga", | |
| 2938 | - .pvr = CPU_PPC_403GA, | |
| 2939 | - .pvr_mask = 0xFFFFFFFF, | |
| 2940 | - .insns_flags = PPC_INSNS_403, | |
| 2941 | - .flags = PPC_FLAGS_403, | |
| 2942 | - .msr_mask = 0x000000000007D23DULL, | |
| 2943 | - }, | |
| 2944 | - /* PowerPC 403 GB */ | |
| 2945 | - { | |
| 2946 | - .name = "403gb", | |
| 2947 | - .pvr = CPU_PPC_403GB, | |
| 2948 | - .pvr_mask = 0xFFFFFFFF, | |
| 2949 | - .insns_flags = PPC_INSNS_403, | |
| 2950 | - .flags = PPC_FLAGS_403, | |
| 2951 | - .msr_mask = 0x000000000007D23DULL, | |
| 2952 | - }, | |
| 2953 | - /* PowerPC 403 GC */ | |
| 2954 | - { | |
| 2955 | - .name = "403gc", | |
| 2956 | - .pvr = CPU_PPC_403GC, | |
| 2957 | - .pvr_mask = 0xFFFFFFFF, | |
| 2958 | - .insns_flags = PPC_INSNS_403, | |
| 2959 | - .flags = PPC_FLAGS_403, | |
| 2960 | - .msr_mask = 0x000000000007D23DULL, | |
| 2961 | - }, | |
| 2962 | - /* PowerPC 403 GCX */ | |
| 2963 | - { | |
| 2964 | - .name = "403gcx", | |
| 2965 | - .pvr = CPU_PPC_403GCX, | |
| 2966 | - .pvr_mask = 0xFFFFFFFF, | |
| 2967 | - .insns_flags = PPC_INSNS_403, | |
| 2968 | - .flags = PPC_FLAGS_403, | |
| 2969 | - .msr_mask = 0x000000000007D23DULL, | |
| 2970 | - }, | |
| 4113 | + /* PowerPC 405 family */ | |
| 4114 | + /* Generic PowerPC 405 */ | |
| 4115 | + POWERPC_DEF("405", CPU_POWERPC_405, 0xFFFF0000, 405), | |
| 4116 | + /* PowerPC 405 cores */ | |
| 2971 | 4117 | #if defined (TODO) |
| 2972 | - /* PowerPC 403 GP */ | |
| 2973 | - { | |
| 2974 | - .name = "403gp", | |
| 2975 | - .pvr = CPU_PPC_403GP, | |
| 2976 | - .pvr_mask = 0xFFFFFFFF, | |
| 2977 | - .insns_flags = PPC_INSNS_403, | |
| 2978 | - .flags = PPC_FLAGS_403, | |
| 2979 | - .msr_mask = 0x000000000007D23DULL, | |
| 2980 | - }, | |
| 4118 | + /* PowerPC 405 A3 */ | |
| 4119 | + POWERPC_DEF("405A3", CPU_POWERPC_405A3, 0xFFFFFFFF, 405), | |
| 2981 | 4120 | #endif |
| 2982 | - /* Generic PowerPC 405 */ | |
| 2983 | - { | |
| 2984 | - .name = "405", | |
| 2985 | - .pvr = CPU_PPC_405, | |
| 2986 | - .pvr_mask = 0xFFFFFFFF, | |
| 2987 | - .insns_flags = PPC_INSNS_405, | |
| 2988 | - .flags = PPC_FLAGS_405, | |
| 2989 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 2990 | - }, | |
| 2991 | 4121 | #if defined (TODO) |
| 2992 | - /* PowerPC 405 A3 */ | |
| 2993 | - { | |
| 2994 | - .name = "405a3", | |
| 2995 | - .pvr = CPU_PPC_405A3, | |
| 2996 | - .pvr_mask = 0xFFFFFFFF, | |
| 2997 | - .insns_flags = PPC_INSNS_405, | |
| 2998 | - .flags = PPC_FLAGS_405, | |
| 2999 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3000 | - }, | |
| 4122 | + /* PowerPC 405 A4 */ | |
| 4123 | + POWERPC_DEF("405A4", CPU_POWERPC_405A4, 0xFFFFFFFF, 405), | |
| 3001 | 4124 | #endif |
| 3002 | 4125 | #if defined (TODO) |
| 3003 | - /* PowerPC 405 A4 */ | |
| 3004 | - { | |
| 3005 | - .name = "405a4", | |
| 3006 | - .pvr = CPU_PPC_405A4, | |
| 3007 | - .pvr_mask = 0xFFFFFFFF, | |
| 3008 | - .insns_flags = PPC_INSNS_405, | |
| 3009 | - .flags = PPC_FLAGS_405, | |
| 3010 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3011 | - }, | |
| 4126 | + /* PowerPC 405 B3 */ | |
| 4127 | + POWERPC_DEF("405B3", CPU_POWERPC_405B3, 0xFFFFFFFF, 405), | |
| 3012 | 4128 | #endif |
| 3013 | 4129 | #if defined (TODO) |
| 3014 | - /* PowerPC 405 B3 */ | |
| 3015 | - { | |
| 3016 | - .name = "405b3", | |
| 3017 | - .pvr = CPU_PPC_405B3, | |
| 3018 | - .pvr_mask = 0xFFFFFFFF, | |
| 3019 | - .insns_flags = PPC_INSNS_405, | |
| 3020 | - .flags = PPC_FLAGS_405, | |
| 3021 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3022 | - }, | |
| 3023 | -#endif | |
| 3024 | - /* PowerPC 405 D2 */ | |
| 3025 | - { | |
| 3026 | - .name = "405d2", | |
| 3027 | - .pvr = CPU_PPC_405D2, | |
| 3028 | - .pvr_mask = 0xFFFFFFFF, | |
| 3029 | - .insns_flags = PPC_INSNS_405, | |
| 3030 | - .flags = PPC_FLAGS_405, | |
| 3031 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3032 | - }, | |
| 3033 | - /* PowerPC 405 D4 */ | |
| 3034 | - { | |
| 3035 | - .name = "405d4", | |
| 3036 | - .pvr = CPU_PPC_405D4, | |
| 3037 | - .pvr_mask = 0xFFFFFFFF, | |
| 3038 | - .insns_flags = PPC_INSNS_405, | |
| 3039 | - .flags = PPC_FLAGS_405, | |
| 3040 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3041 | - }, | |
| 3042 | - /* PowerPC 405 CR */ | |
| 3043 | - { | |
| 3044 | - .name = "405cr", | |
| 3045 | - .pvr = CPU_PPC_405CR, | |
| 3046 | - .pvr_mask = 0xFFFFFFFF, | |
| 3047 | - .insns_flags = PPC_INSNS_405, | |
| 3048 | - .flags = PPC_FLAGS_405, | |
| 3049 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3050 | - }, | |
| 3051 | - /* PowerPC 405 GP */ | |
| 3052 | - { | |
| 3053 | - .name = "405gp", | |
| 3054 | - .pvr = CPU_PPC_405GP, | |
| 3055 | - .pvr_mask = 0xFFFFFFFF, | |
| 3056 | - .insns_flags = PPC_INSNS_405, | |
| 3057 | - .flags = PPC_FLAGS_405, | |
| 3058 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3059 | - }, | |
| 3060 | - /* PowerPC 405 EP */ | |
| 3061 | - { | |
| 3062 | - .name = "405ep", | |
| 3063 | - .pvr = CPU_PPC_405EP, | |
| 3064 | - .pvr_mask = 0xFFFFFFFF, | |
| 3065 | - .insns_flags = PPC_INSNS_405, | |
| 3066 | - .flags = PPC_FLAGS_405, | |
| 3067 | - .msr_mask = 0x00000000000ED630ULL, | |
| 3068 | - }, | |
| 4130 | + /* PowerPC 405 B4 */ | |
| 4131 | + POWERPC_DEF("405B4", CPU_POWERPC_405B4, 0xFFFFFFFF, 405), | |
| 4132 | +#endif | |
| 4133 | +#if defined (TODO) | |
| 4134 | + /* PowerPC 405 C3 */ | |
| 4135 | + POWERPC_DEF("405C3", CPU_POWERPC_405C3, 0xFFFFFFFF, 405), | |
| 4136 | +#endif | |
| 4137 | +#if defined (TODO) | |
| 4138 | + /* PowerPC 405 C4 */ | |
| 4139 | + POWERPC_DEF("405C4", CPU_POWERPC_405C4, 0xFFFFFFFF, 405), | |
| 4140 | +#endif | |
| 4141 | + /* PowerPC 405 D2 */ | |
| 4142 | + POWERPC_DEF("405D2", CPU_POWERPC_405D2, 0xFFFFFFFF, 405), | |
| 4143 | +#if defined (TODO) | |
| 4144 | + /* PowerPC 405 D3 */ | |
| 4145 | + POWERPC_DEF("405D3", CPU_POWERPC_405D3, 0xFFFFFFFF, 405), | |
| 4146 | +#endif | |
| 4147 | + /* PowerPC 405 D4 */ | |
| 4148 | + POWERPC_DEF("405D4", CPU_POWERPC_405D4, 0xFFFFFFFF, 405), | |
| 4149 | +#if defined (TODO) | |
| 4150 | + /* PowerPC 405 D5 */ | |
| 4151 | + POWERPC_DEF("405D5", CPU_POWERPC_405D5, 0xFFFFFFFF, 405), | |
| 4152 | +#endif | |
| 4153 | +#if defined (TODO) | |
| 4154 | + /* PowerPC 405 E4 */ | |
| 4155 | + POWERPC_DEF("405E4", CPU_POWERPC_405E4, 0xFFFFFFFF, 405), | |
| 4156 | +#endif | |
| 4157 | +#if defined (TODO) | |
| 4158 | + /* PowerPC 405 F4 */ | |
| 4159 | + POWERPC_DEF("405F4", CPU_POWERPC_405F4, 0xFFFFFFFF, 405), | |
| 4160 | +#endif | |
| 4161 | +#if defined (TODO) | |
| 4162 | + /* PowerPC 405 F5 */ | |
| 4163 | + POWERPC_DEF("405F5", CPU_POWERPC_405F5, 0xFFFFFFFF, 405), | |
| 4164 | +#endif | |
| 4165 | +#if defined (TODO) | |
| 4166 | + /* PowerPC 405 F6 */ | |
| 4167 | + POWERPC_DEF("405F6", CPU_POWERPC_405F6, 0xFFFFFFFF, 405), | |
| 4168 | +#endif | |
| 4169 | + /* PowerPC 405 microcontrolers */ | |
| 4170 | + /* PowerPC 405 CR */ | |
| 4171 | + POWERPC_DEF("405CR", CPU_POWERPC_405CR, 0xFFFFFFFF, 405), | |
| 4172 | + /* PowerPC 405 CRa */ | |
| 4173 | + POWERPC_DEF("405CRa", CPU_POWERPC_405CRa, 0xFFFFFFFF, 405), | |
| 4174 | + /* PowerPC 405 CRb */ | |
| 4175 | + POWERPC_DEF("405CRb", CPU_POWERPC_405CRb, 0xFFFFFFFF, 405), | |
| 4176 | + /* PowerPC 405 CRc */ | |
| 4177 | + POWERPC_DEF("405CRc", CPU_POWERPC_405CRc, 0xFFFFFFFF, 405), | |
| 4178 | + /* PowerPC 405 EP */ | |
| 4179 | + POWERPC_DEF("405EP", CPU_POWERPC_405EP, 0xFFFFFFFF, 405), | |
| 4180 | +#if defined(TODO) | |
| 4181 | + /* PowerPC 405 EXr */ | |
| 4182 | + POWERPC_DEF("405EXr", CPU_POWERPC_405EXr, 0xFFFFFFFF, 405), | |
| 4183 | +#endif | |
| 4184 | + /* PowerPC 405 EZ */ | |
| 4185 | + POWERPC_DEF("405EZ", CPU_POWERPC_405EZ, 0xFFFFFFFF, 405), | |
| 4186 | +#if defined(TODO) | |
| 4187 | + /* PowerPC 405 FX */ | |
| 4188 | + POWERPC_DEF("405FX", CPU_POWERPC_405FX, 0xFFFFFFFF, 405), | |
| 4189 | +#endif | |
| 4190 | + /* PowerPC 405 GP */ | |
| 4191 | + POWERPC_DEF("405GP", CPU_POWERPC_405GP, 0xFFFFFFFF, 405), | |
| 4192 | + /* PowerPC 405 GPa */ | |
| 4193 | + POWERPC_DEF("405GPa", CPU_POWERPC_405GPa, 0xFFFFFFFF, 405), | |
| 4194 | + /* PowerPC 405 GPb */ | |
| 4195 | + POWERPC_DEF("405GPb", CPU_POWERPC_405GPb, 0xFFFFFFFF, 405), | |
| 4196 | + /* PowerPC 405 GPc */ | |
| 4197 | + POWERPC_DEF("405GPc", CPU_POWERPC_405GPc, 0xFFFFFFFF, 405), | |
| 4198 | + /* PowerPC 405 GPd */ | |
| 4199 | + POWERPC_DEF("405GPd", CPU_POWERPC_405GPd, 0xFFFFFFFF, 405), | |
| 4200 | + /* PowerPC 405 GPe */ | |
| 4201 | + POWERPC_DEF("405GPe", CPU_POWERPC_405GPe, 0xFFFFFFFF, 405), | |
| 4202 | + /* PowerPC 405 GPR */ | |
| 4203 | + POWERPC_DEF("405GPR", CPU_POWERPC_405GPR, 0xFFFFFFFF, 405), | |
| 4204 | +#if defined(TODO) | |
| 4205 | + /* PowerPC 405 H */ | |
| 4206 | + POWERPC_DEF("405H", CPU_POWERPC_405H, 0xFFFFFFFF, 405), | |
| 4207 | +#endif | |
| 4208 | +#if defined(TODO) | |
| 4209 | + /* PowerPC 405 L */ | |
| 4210 | + POWERPC_DEF("405L", CPU_POWERPC_405L, 0xFFFFFFFF, 405), | |
| 4211 | +#endif | |
| 4212 | + /* PowerPC 405 LP */ | |
| 4213 | + POWERPC_DEF("405LP", CPU_POWERPC_405LP, 0xFFFFFFFF, 405), | |
| 4214 | +#if defined(TODO) | |
| 4215 | + /* PowerPC 405 PM */ | |
| 4216 | + POWERPC_DEF("405PM", CPU_POWERPC_405PM, 0xFFFFFFFF, 405), | |
| 4217 | +#endif | |
| 4218 | +#if defined(TODO) | |
| 4219 | + /* PowerPC 405 PS */ | |
| 4220 | + POWERPC_DEF("405PS", CPU_POWERPC_405PS, 0xFFFFFFFF, 405), | |
| 4221 | +#endif | |
| 4222 | +#if defined(TODO) | |
| 4223 | + /* PowerPC 405 S */ | |
| 4224 | + POWERPC_DEF("405S", CPU_POWERPC_405S, 0xFFFFFFFF, 405), | |
| 4225 | +#endif | |
| 4226 | + /* Npe405 H */ | |
| 4227 | + POWERPC_DEF("Npe405H", CPU_POWERPC_NPE405H, 0xFFFFFFFF, 405), | |
| 4228 | + /* Npe405 H2 */ | |
| 4229 | + POWERPC_DEF("Npe405H2", CPU_POWERPC_NPE405H2, 0xFFFFFFFF, 405), | |
| 4230 | + /* Npe405 L */ | |
| 4231 | + POWERPC_DEF("Npe405L", CPU_POWERPC_NPE405L, 0xFFFFFFFF, 405), | |
| 4232 | + /* Npe4GS3 */ | |
| 4233 | + POWERPC_DEF("Npe4GS3", CPU_POWERPC_NPE4GS3, 0xFFFFFFFF, 405), | |
| 4234 | +#if defined (TODO) | |
| 4235 | + POWERPC_DEF("Npcxx1", CPU_POWERPC_NPCxx1, 0xFFFFFFFF, 405), | |
| 4236 | +#endif | |
| 4237 | +#if defined (TODO) | |
| 4238 | + POWERPC_DEF("Npr161", CPU_POWERPC_NPR161, 0xFFFFFFFF, 405), | |
| 4239 | +#endif | |
| 4240 | +#if defined (TODO) | |
| 4241 | + /* PowerPC LC77700 (Sanyo) */ | |
| 4242 | + POWERPC_DEF("LC77700", CPU_POWERPC_LC77700, 0xFFFFFFFF, 405), | |
| 4243 | +#endif | |
| 4244 | + /* PowerPC 401/403/405 based set-top-box microcontrolers */ | |
| 4245 | +#if defined (TODO) | |
| 4246 | + /* STB010000 */ | |
| 4247 | + POWERPC_DEF("STB01000", CPU_POWERPC_STB01000, 0xFFFFFFFF, 401x2), | |
| 4248 | +#endif | |
| 4249 | +#if defined (TODO) | |
| 4250 | + /* STB01010 */ | |
| 4251 | + POWERPC_DEF("STB01010", CPU_POWERPC_STB01010, 0xFFFFFFFF, 401x2), | |
| 4252 | +#endif | |
| 4253 | +#if defined (TODO) | |
| 4254 | + /* STB0210 */ | |
| 4255 | + POWERPC_DEF("STB0210", CPU_POWERPC_STB0210, 0xFFFFFFFF, 401x3), | |
| 4256 | +#endif | |
| 4257 | + /* STB03xx */ | |
| 4258 | + POWERPC_DEF("STB03", CPU_POWERPC_STB03, 0xFFFFFFFF, 405), | |
| 4259 | +#if defined (TODO) | |
| 4260 | + /* STB043x */ | |
| 4261 | + POWERPC_DEF("STB043", CPU_POWERPC_STB043, 0xFFFFFFFF, 405), | |
| 4262 | +#endif | |
| 4263 | +#if defined (TODO) | |
| 4264 | + /* STB045x */ | |
| 4265 | + POWERPC_DEF("STB045", CPU_POWERPC_STB045, 0xFFFFFFFF, 405), | |
| 4266 | +#endif | |
| 4267 | + /* STB04xx */ | |
| 4268 | + POWERPC_DEF("STB04", CPU_POWERPC_STB04, 0xFFFF0000, 405), | |
| 4269 | + /* STB25xx */ | |
| 4270 | + POWERPC_DEF("STB25", CPU_POWERPC_STB25, 0xFFFFFFFF, 405), | |
| 4271 | +#if defined (TODO) | |
| 4272 | + /* STB130 */ | |
| 4273 | + POWERPC_DEF("STB130", CPU_POWERPC_STB130, 0xFFFFFFFF, 405), | |
| 4274 | +#endif | |
| 4275 | + /* Xilinx PowerPC 405 cores */ | |
| 4276 | + POWERPC_DEF("x2vp4", CPU_POWERPC_X2VP4, 0xFFFFFFFF, 405), | |
| 4277 | + POWERPC_DEF("x2vp7", CPU_POWERPC_X2VP7, 0xFFFFFFFF, 405), | |
| 4278 | + POWERPC_DEF("x2vp20", CPU_POWERPC_X2VP20, 0xFFFFFFFF, 405), | |
| 4279 | + POWERPC_DEF("x2vp50", CPU_POWERPC_X2VP50, 0xFFFFFFFF, 405), | |
| 4280 | +#if defined (TODO) | |
| 4281 | + /* Zarlink ZL10310 */ | |
| 4282 | + POWERPC_DEF("zl10310", CPU_POWERPC_ZL10310, 0xFFFFFFFF, 405), | |
| 4283 | +#endif | |
| 4284 | +#if defined (TODO) | |
| 4285 | + /* Zarlink ZL10311 */ | |
| 4286 | + POWERPC_DEF("zl10311", CPU_POWERPC_ZL10311, 0xFFFFFFFF, 405), | |
| 4287 | +#endif | |
| 4288 | +#if defined (TODO) | |
| 4289 | + /* Zarlink ZL10320 */ | |
| 4290 | + POWERPC_DEF("zl10320", CPU_POWERPC_ZL10320, 0xFFFFFFFF, 405), | |
| 4291 | +#endif | |
| 4292 | +#if defined (TODO) | |
| 4293 | + /* Zarlink ZL10321 */ | |
| 4294 | + POWERPC_DEF("zl10321", CPU_POWERPC_ZL10321, 0xFFFFFFFF, 405), | |
| 4295 | +#endif | |
| 4296 | + /* PowerPC 440 family */ | |
| 4297 | + /* Generic PowerPC 440 */ | |
| 4298 | + POWERPC_DEF("440", CPU_POWERPC_440, 0xFFFFFFFF, 440GP), | |
| 4299 | + /* PowerPC 440 cores */ | |
| 4300 | +#if defined (TODO) | |
| 4301 | + /* PowerPC 440 A4 */ | |
| 4302 | + POWERPC_DEF("440A4", CPU_POWERPC_440A4, 0xFFFFFFFF, 440x4), | |
| 4303 | +#endif | |
| 4304 | +#if defined (TODO) | |
| 4305 | + /* PowerPC 440 A5 */ | |
| 4306 | + POWERPC_DEF("440A5", CPU_POWERPC_440A5, 0xFFFFFFFF, 440x5), | |
| 4307 | +#endif | |
| 4308 | +#if defined (TODO) | |
| 4309 | + /* PowerPC 440 B4 */ | |
| 4310 | + POWERPC_DEF("440B4", CPU_POWERPC_440B4, 0xFFFFFFFF, 440x4), | |
| 4311 | +#endif | |
| 4312 | +#if defined (TODO) | |
| 4313 | + /* PowerPC 440 G4 */ | |
| 4314 | + POWERPC_DEF("440G4", CPU_POWERPC_440G4, 0xFFFFFFFF, 440x4), | |
| 4315 | +#endif | |
| 4316 | +#if defined (TODO) | |
| 4317 | + /* PowerPC 440 F5 */ | |
| 4318 | + POWERPC_DEF("440F5", CPU_POWERPC_440F5, 0xFFFFFFFF, 440x5), | |
| 4319 | +#endif | |
| 4320 | +#if defined (TODO) | |
| 4321 | + /* PowerPC 440 G5 */ | |
| 4322 | + POWERPC_DEF("440G5", CPU_POWERPC_440G5, 0xFFFFFFFF, 440x5), | |
| 4323 | +#endif | |
| 4324 | +#if defined (TODO) | |
| 4325 | + /* PowerPC 440H4 */ | |
| 4326 | + POWERPC_DEF("440H4", CPU_POWERPC_440H4, 0xFFFFFFFF, 440x4), | |
| 4327 | +#endif | |
| 4328 | +#if defined (TODO) | |
| 4329 | + /* PowerPC 440H6 */ | |
| 4330 | + POWERPC_DEF("440H6", CPU_POWERPC_440H6, 0xFFFFFFFF, 440Gx5), | |
| 4331 | +#endif | |
| 4332 | + /* PowerPC 440 microcontrolers */ | |
| 4333 | + /* PowerPC 440 EP */ | |
| 4334 | + POWERPC_DEF("440EP", CPU_POWERPC_440EP, 0xFFFFFFFF, 440EP), | |
| 4335 | + /* PowerPC 440 EPa */ | |
| 4336 | + POWERPC_DEF("440EPa", CPU_POWERPC_440EPa, 0xFFFFFFFF, 440EP), | |
| 4337 | + /* PowerPC 440 EPb */ | |
| 4338 | + POWERPC_DEF("440EPb", CPU_POWERPC_440EPb, 0xFFFFFFFF, 440EP), | |
| 4339 | + /* PowerPC 440 EPX */ | |
| 4340 | + POWERPC_DEF("440EPX", CPU_POWERPC_440EPX, 0xFFFFFFFF, 440EP), | |
| 4341 | + /* PowerPC 440 GP */ | |
| 4342 | + POWERPC_DEF("440GP", CPU_POWERPC_440GP, 0xFFFFFFFF, 440GP), | |
| 4343 | + /* PowerPC 440 GPb */ | |
| 4344 | + POWERPC_DEF("440GPb", CPU_POWERPC_440GPb, 0xFFFFFFFF, 440GP), | |
| 4345 | + /* PowerPC 440 GPc */ | |
| 4346 | + POWERPC_DEF("440GPc", CPU_POWERPC_440GPc, 0xFFFFFFFF, 440GP), | |
| 4347 | + /* PowerPC 440 GR */ | |
| 4348 | + POWERPC_DEF("440GR", CPU_POWERPC_440GR, 0xFFFFFFFF, 440x5), | |
| 4349 | + /* PowerPC 440 GRa */ | |
| 4350 | + POWERPC_DEF("440GRa", CPU_POWERPC_440GRa, 0xFFFFFFFF, 440x5), | |
| 4351 | + /* PowerPC 440 GRX */ | |
| 4352 | + POWERPC_DEF("440GRX", CPU_POWERPC_440GRX, 0xFFFFFFFF, 440x5), | |
| 4353 | + /* PowerPC 440 GX */ | |
| 4354 | + POWERPC_DEF("440GX", CPU_POWERPC_440GX, 0xFFFFFFFF, 440EP), | |
| 4355 | + /* PowerPC 440 GXa */ | |
| 4356 | + POWERPC_DEF("440GXa", CPU_POWERPC_440GXa, 0xFFFFFFFF, 440EP), | |
| 4357 | + /* PowerPC 440 GXb */ | |
| 4358 | + POWERPC_DEF("440GXb", CPU_POWERPC_440GXb, 0xFFFFFFFF, 440EP), | |
| 4359 | + /* PowerPC 440 GXc */ | |
| 4360 | + POWERPC_DEF("440GXc", CPU_POWERPC_440GXc, 0xFFFFFFFF, 440EP), | |
| 4361 | + /* PowerPC 440 GXf */ | |
| 4362 | + POWERPC_DEF("440GXf", CPU_POWERPC_440GXf, 0xFFFFFFFF, 440EP), | |
| 4363 | +#if defined(TODO) | |
| 4364 | + /* PowerPC 440 S */ | |
| 4365 | + POWERPC_DEF("440S", CPU_POWERPC_440S, 0xFFFFFFFF, 440), | |
| 4366 | +#endif | |
| 4367 | + /* PowerPC 440 SP */ | |
| 4368 | + POWERPC_DEF("440SP", CPU_POWERPC_440SP, 0xFFFFFFFF, 440EP), | |
| 4369 | + /* PowerPC 440 SP2 */ | |
| 4370 | + POWERPC_DEF("440SP2", CPU_POWERPC_440SP2, 0xFFFFFFFF, 440EP), | |
| 4371 | + /* PowerPC 440 SPE */ | |
| 4372 | + POWERPC_DEF("440SPE", CPU_POWERPC_440SPE, 0xFFFFFFFF, 440EP), | |
| 4373 | + /* PowerPC 460 family */ | |
| 4374 | +#if defined (TODO) | |
| 4375 | + /* Generic PowerPC 464 */ | |
| 4376 | + POWERPC_DEF("464", CPU_POWERPC_464, 0xFFFFFFFF, 460), | |
| 4377 | +#endif | |
| 4378 | + /* PowerPC 464 microcontrolers */ | |
| 4379 | +#if defined (TODO) | |
| 4380 | + /* PowerPC 464H90 */ | |
| 4381 | + POWERPC_DEF("464H90", CPU_POWERPC_464H90, 0xFFFFFFFF, 460), | |
| 4382 | +#endif | |
| 4383 | +#if defined (TODO) | |
| 4384 | + /* PowerPC 464H90F */ | |
| 4385 | + POWERPC_DEF("464H90F", CPU_POWERPC_464H90F, 0xFFFFFFFF, 460F), | |
| 4386 | +#endif | |
| 4387 | + /* Freescale embedded PowerPC cores */ | |
| 4388 | + /* e200 family */ | |
| 4389 | +#if defined (TODO) | |
| 4390 | + /* Generic PowerPC e200 core */ | |
| 4391 | + POWERPC_DEF("e200", CPU_POWERPC_e200, 0xFFFFFFFF, e200), | |
| 4392 | +#endif | |
| 4393 | +#if defined (TODO) | |
| 4394 | + /* PowerPC e200z5 core */ | |
| 4395 | + POWERPC_DEF("e200z5", CPU_POWERPC_e200z5, 0xFFFFFFFF, e200), | |
| 4396 | +#endif | |
| 4397 | +#if defined (TODO) | |
| 4398 | + /* PowerPC e200z6 core */ | |
| 4399 | + POWERPC_DEF("e200z6", CPU_POWERPC_e200z6, 0xFFFFFFFF, e200), | |
| 4400 | +#endif | |
| 4401 | + /* e300 family */ | |
| 4402 | +#if defined (TODO) | |
| 4403 | + /* Generic PowerPC e300 core */ | |
| 4404 | + POWERPC_DEF("e300", CPU_POWERPC_e300, 0xFFFFFFFF, e300), | |
| 4405 | +#endif | |
| 4406 | +#if defined (TODO) | |
| 4407 | + /* PowerPC e300c1 core */ | |
| 4408 | + POWERPC_DEF("e300c1", CPU_POWERPC_e300c1, 0xFFFFFFFF, e300), | |
| 4409 | +#endif | |
| 4410 | +#if defined (TODO) | |
| 4411 | + /* PowerPC e300c2 core */ | |
| 4412 | + POWERPC_DEF("e300c2", CPU_POWERPC_e300c2, 0xFFFFFFFF, e300), | |
| 4413 | +#endif | |
| 4414 | +#if defined (TODO) | |
| 4415 | + /* PowerPC e300c3 core */ | |
| 4416 | + POWERPC_DEF("e300c3", CPU_POWERPC_e300c3, 0xFFFFFFFF, e300), | |
| 4417 | +#endif | |
| 4418 | + /* e500 family */ | |
| 4419 | +#if defined (TODO) | |
| 4420 | + /* PowerPC e500 core */ | |
| 4421 | + POWERPC_DEF("e500", CPU_POWERPC_e500, 0xFFFFFFFF, e500), | |
| 4422 | +#endif | |
| 4423 | +#if defined (TODO) | |
| 4424 | + /* PowerPC e500 v1.1 core */ | |
| 4425 | + POWERPC_DEF("e500v1.1", CPU_POWERPC_e500_v11, 0xFFFFFFFF, e500), | |
| 4426 | +#endif | |
| 4427 | +#if defined (TODO) | |
| 4428 | + /* PowerPC e500 v1.2 core */ | |
| 4429 | + POWERPC_DEF("e500v1.2", CPU_POWERPC_e500_v12, 0xFFFFFFFF, e500), | |
| 4430 | +#endif | |
| 4431 | +#if defined (TODO) | |
| 4432 | + /* PowerPC e500 v2.1 core */ | |
| 4433 | + POWERPC_DEF("e500v2.1", CPU_POWERPC_e500_v21, 0xFFFFFFFF, e500), | |
| 4434 | +#endif | |
| 4435 | +#if defined (TODO) | |
| 4436 | + /* PowerPC e500 v2.2 core */ | |
| 4437 | + POWERPC_DEF("e500v2.2", CPU_POWERPC_e500_v22, 0xFFFFFFFF, e500), | |
| 4438 | +#endif | |
| 4439 | + /* e600 family */ | |
| 4440 | +#if defined (TODO) | |
| 4441 | + /* PowerPC e600 core */ | |
| 4442 | + POWERPC_DEF("e600", CPU_POWERPC_e600, 0xFFFFFFFF, e600), | |
| 4443 | +#endif | |
| 4444 | + /* PowerPC MPC 5xx cores */ | |
| 4445 | +#if defined (TODO) | |
| 4446 | + /* PowerPC MPC 5xx */ | |
| 4447 | + POWERPC_DEF("mpc5xx", CPU_POWERPC_5xx, 0xFFFFFFFF, 5xx), | |
| 4448 | +#endif | |
| 4449 | + /* PowerPC MPC 8xx cores */ | |
| 4450 | +#if defined (TODO) | |
| 4451 | + /* PowerPC MPC 8xx */ | |
| 4452 | + POWERPC_DEF("mpc8xx", CPU_POWERPC_8xx, 0xFFFFFFFF, 8xx), | |
| 4453 | +#endif | |
| 4454 | + /* PowerPC MPC 8xxx cores */ | |
| 4455 | +#if defined (TODO) | |
| 4456 | + /* PowerPC MPC 82xx HIP3 */ | |
| 4457 | + POWERPC_DEF("mpc82xxhip3", CPU_POWERPC_82xx_HIP3, 0xFFFFFFFF, 82xx), | |
| 4458 | +#endif | |
| 4459 | +#if defined (TODO) | |
| 4460 | + /* PowerPC MPC 82xx HIP4 */ | |
| 4461 | + POWERPC_DEF("mpc82xxhip4", CPU_POWERPC_82xx_HIP4, 0xFFFFFFFF, 82xx), | |
| 4462 | +#endif | |
| 4463 | +#if defined (TODO) | |
| 4464 | + /* PowerPC MPC 827x */ | |
| 4465 | + POWERPC_DEF("mpc827x", CPU_POWERPC_827x, 0xFFFFFFFF, 827x), | |
| 4466 | +#endif | |
| 4467 | + | |
| 4468 | + /* 32 bits "classic" PowerPC */ | |
| 4469 | + /* PowerPC 6xx family */ | |
| 4470 | + /* PowerPC 601 */ | |
| 4471 | + POWERPC_DEF("601", CPU_POWERPC_601, 0xFFFFFFFF, 601), | |
| 4472 | + /* PowerPC 601v2 */ | |
| 4473 | + POWERPC_DEF("601a", CPU_POWERPC_601a, 0xFFFFFFFF, 601), | |
| 4474 | + /* PowerPC 602 */ | |
| 4475 | + POWERPC_DEF("602", CPU_POWERPC_602, 0xFFFFFFFF, 602), | |
| 4476 | + /* PowerPC 603 */ | |
| 4477 | + POWERPC_DEF("603", CPU_POWERPC_603, 0xFFFFFFFF, 603), | |
| 4478 | + /* Code name for PowerPC 603 */ | |
| 4479 | + POWERPC_DEF("Vanilla", CPU_POWERPC_603, 0xFFFFFFFF, 603), | |
| 4480 | + /* PowerPC 603e */ | |
| 4481 | + POWERPC_DEF("603e", CPU_POWERPC_603E, 0xFFFFFFFF, 603E), | |
| 4482 | + /* Code name for PowerPC 603e */ | |
| 4483 | + POWERPC_DEF("Stretch", CPU_POWERPC_603E, 0xFFFFFFFF, 603E), | |
| 4484 | + /* PowerPC 603e v1.1 */ | |
| 4485 | + POWERPC_DEF("603e1.1", CPU_POWERPC_603E_v11, 0xFFFFFFFF, 603E), | |
| 4486 | + /* PowerPC 603e v1.2 */ | |
| 4487 | + POWERPC_DEF("603e1.2", CPU_POWERPC_603E_v12, 0xFFFFFFFF, 603E), | |
| 4488 | + /* PowerPC 603e v1.3 */ | |
| 4489 | + POWERPC_DEF("603e1.3", CPU_POWERPC_603E_v13, 0xFFFFFFFF, 603E), | |
| 4490 | + /* PowerPC 603e v1.4 */ | |
| 4491 | + POWERPC_DEF("603e1.4", CPU_POWERPC_603E_v14, 0xFFFFFFFF, 603E), | |
| 4492 | + /* PowerPC 603e v2.2 */ | |
| 4493 | + POWERPC_DEF("603e2.2", CPU_POWERPC_603E_v22, 0xFFFFFFFF, 603E), | |
| 4494 | + /* PowerPC 603e v3 */ | |
| 4495 | + POWERPC_DEF("603e3", CPU_POWERPC_603E_v3, 0xFFFFFFFF, 603E), | |
| 4496 | + /* PowerPC 603e v4 */ | |
| 4497 | + POWERPC_DEF("603e4", CPU_POWERPC_603E_v4, 0xFFFFFFFF, 603E), | |
| 4498 | + /* PowerPC 603e v4.1 */ | |
| 4499 | + POWERPC_DEF("603e4.1", CPU_POWERPC_603E_v41, 0xFFFFFFFF, 603E), | |
| 4500 | + /* PowerPC 603e */ | |
| 4501 | + POWERPC_DEF("603e7", CPU_POWERPC_603E7, 0xFFFFFFFF, 603E), | |
| 4502 | + /* PowerPC 603e7t */ | |
| 4503 | + POWERPC_DEF("603e7t", CPU_POWERPC_603E7t, 0xFFFFFFFF, 603E), | |
| 4504 | + /* PowerPC 603e7v */ | |
| 4505 | + POWERPC_DEF("603e7v", CPU_POWERPC_603E7v, 0xFFFFFFFF, 603E), | |
| 4506 | + /* Code name for PowerPC 603ev */ | |
| 4507 | + POWERPC_DEF("Vaillant", CPU_POWERPC_603E7v, 0xFFFFFFFF, 603E), | |
| 4508 | + /* PowerPC 603e7v1 */ | |
| 4509 | + POWERPC_DEF("603e7v1", CPU_POWERPC_603E7v1, 0xFFFFFFFF, 603E), | |
| 4510 | + /* PowerPC 603e7v2 */ | |
| 4511 | + POWERPC_DEF("603e7v2", CPU_POWERPC_603E7v2, 0xFFFFFFFF, 603E), | |
| 4512 | + /* PowerPC 603p */ | |
| 4513 | + /* to be checked */ | |
| 4514 | + POWERPC_DEF("603p", CPU_POWERPC_603P, 0xFFFFFFFF, 603), | |
| 4515 | + /* PowerPC 603r */ | |
| 4516 | + POWERPC_DEF("603r", CPU_POWERPC_603R, 0xFFFFFFFF, 603E), | |
| 4517 | + /* Code name for PowerPC 603r */ | |
| 4518 | + POWERPC_DEF("Goldeneye", CPU_POWERPC_603R, 0xFFFFFFFF, 603E), | |
| 4519 | + /* PowerPC G2 core */ | |
| 4520 | + POWERPC_DEF("G2", CPU_POWERPC_G2, 0xFFFFFFFF, G2), | |
| 4521 | + /* PowerPC G2 H4 */ | |
| 4522 | + POWERPC_DEF("G2H4", CPU_POWERPC_G2H4, 0xFFFFFFFF, G2), | |
| 4523 | + /* PowerPC G2 GP */ | |
| 4524 | + POWERPC_DEF("G2GP", CPU_POWERPC_G2gp, 0xFFFFFFFF, G2), | |
| 4525 | + /* PowerPC G2 LS */ | |
| 4526 | + POWERPC_DEF("G2LS", CPU_POWERPC_G2ls, 0xFFFFFFFF, G2), | |
| 4527 | + /* PowerPC G2LE */ | |
| 4528 | + /* Same as G2, with little-endian mode support */ | |
| 4529 | + POWERPC_DEF("G2le", CPU_POWERPC_G2LE, 0xFFFFFFFF, G2LE), | |
| 4530 | + /* PowerPC G2LE GP */ | |
| 4531 | + POWERPC_DEF("G2leGP", CPU_POWERPC_G2LEgp, 0xFFFFFFFF, G2LE), | |
| 4532 | + /* PowerPC G2LE LS */ | |
| 4533 | + POWERPC_DEF("G2leLS", CPU_POWERPC_G2LEls, 0xFFFFFFFF, G2LE), | |
| 4534 | + /* PowerPC 604 */ | |
| 4535 | + POWERPC_DEF("604", CPU_POWERPC_604, 0xFFFFFFFF, 604), | |
| 4536 | + /* PowerPC 604e */ | |
| 4537 | + POWERPC_DEF("604e", CPU_POWERPC_604E, 0xFFFFFFFF, 604), | |
| 4538 | + /* PowerPC 604e v1.0 */ | |
| 4539 | + POWERPC_DEF("604e1.0", CPU_POWERPC_604E_v10, 0xFFFFFFFF, 604), | |
| 4540 | + /* PowerPC 604e v2.2 */ | |
| 4541 | + POWERPC_DEF("604e2.2", CPU_POWERPC_604E_v22, 0xFFFFFFFF, 604), | |
| 4542 | + /* PowerPC 604e v2.4 */ | |
| 4543 | + POWERPC_DEF("604e2.4", CPU_POWERPC_604E_v24, 0xFFFFFFFF, 604), | |
| 4544 | + /* PowerPC 604r */ | |
| 4545 | + POWERPC_DEF("604r", CPU_POWERPC_604R, 0xFFFFFFFF, 604), | |
| 4546 | +#if defined(TODO) | |
| 4547 | + /* PowerPC 604ev */ | |
| 4548 | + POWERPC_DEF("604ev", CPU_POWERPC_604EV, 0xFFFFFFFF, 604), | |
| 4549 | +#endif | |
| 4550 | + /* PowerPC 7xx family */ | |
| 4551 | + /* Generic PowerPC 740 (G3) */ | |
| 4552 | + POWERPC_DEF("740", CPU_POWERPC_7x0, 0xFFFFFFFF, 7x0), | |
| 4553 | + /* Generic PowerPC 750 (G3) */ | |
| 4554 | + POWERPC_DEF("750", CPU_POWERPC_7x0, 0xFFFFFFFF, 7x0), | |
| 4555 | + /* Code name for generic PowerPC 740/750 (G3) */ | |
| 4556 | + POWERPC_DEF("Arthur", CPU_POWERPC_7x0, 0xFFFFFFFF, 7x0), | |
| 4557 | + /* PowerPC 740/750 is also known as G3 */ | |
| 4558 | + POWERPC_DEF("G3", CPU_POWERPC_7x0, 0xFFFFFFFF, 7x0), | |
| 4559 | + /* PowerPC 740 v2.0 (G3) */ | |
| 4560 | + POWERPC_DEF("740v2.0", CPU_POWERPC_7x0_v20, 0xFFFFFFFF, 7x0), | |
| 4561 | + /* PowerPC 750 v2.0 (G3) */ | |
| 4562 | + POWERPC_DEF("750v2.0", CPU_POWERPC_7x0_v20, 0xFFFFFFFF, 7x0), | |
| 4563 | + /* PowerPC 740 v2.1 (G3) */ | |
| 4564 | + POWERPC_DEF("740v2.1", CPU_POWERPC_7x0_v21, 0xFFFFFFFF, 7x0), | |
| 4565 | + /* PowerPC 750 v2.1 (G3) */ | |
| 4566 | + POWERPC_DEF("750v2.1", CPU_POWERPC_7x0_v21, 0xFFFFFFFF, 7x0), | |
| 4567 | + /* PowerPC 740 v2.2 (G3) */ | |
| 4568 | + POWERPC_DEF("740v2.2", CPU_POWERPC_7x0_v22, 0xFFFFFFFF, 7x0), | |
| 4569 | + /* PowerPC 750 v2.2 (G3) */ | |
| 4570 | + POWERPC_DEF("750v2.2", CPU_POWERPC_7x0_v22, 0xFFFFFFFF, 7x0), | |
| 4571 | + /* PowerPC 740 v3.0 (G3) */ | |
| 4572 | + POWERPC_DEF("740v3.0", CPU_POWERPC_7x0_v30, 0xFFFFFFFF, 7x0), | |
| 4573 | + /* PowerPC 750 v3.0 (G3) */ | |
| 4574 | + POWERPC_DEF("750v3.0", CPU_POWERPC_7x0_v30, 0xFFFFFFFF, 7x0), | |
| 4575 | + /* PowerPC 740 v3.1 (G3) */ | |
| 4576 | + POWERPC_DEF("740v3.1", CPU_POWERPC_7x0_v31, 0xFFFFFFFF, 7x0), | |
| 4577 | + /* PowerPC 750 v3.1 (G3) */ | |
| 4578 | + POWERPC_DEF("750v3.1", CPU_POWERPC_7x0_v31, 0xFFFFFFFF, 7x0), | |
| 4579 | + /* PowerPC 740E (G3) */ | |
| 4580 | + POWERPC_DEF("740e", CPU_POWERPC_740E, 0xFFFFFFFF, 7x0), | |
| 4581 | + /* PowerPC 740P (G3) */ | |
| 4582 | + POWERPC_DEF("740p", CPU_POWERPC_7x0P, 0xFFFFFFFF, 7x0), | |
| 4583 | + /* PowerPC 750P (G3) */ | |
| 4584 | + POWERPC_DEF("750p", CPU_POWERPC_7x0P, 0xFFFFFFFF, 7x0), | |
| 4585 | + /* Code name for PowerPC 740P/750P (G3) */ | |
| 4586 | + POWERPC_DEF("Conan/Doyle", CPU_POWERPC_7x0P, 0xFFFFFFFF, 7x0), | |
| 4587 | + /* PowerPC 750CL (G3 embedded) */ | |
| 4588 | + POWERPC_DEF("750cl", CPU_POWERPC_750CL, 0xFFFFFFFF, 7x0), | |
| 4589 | + /* PowerPC 750CX (G3 embedded) */ | |
| 4590 | + POWERPC_DEF("750cx", CPU_POWERPC_750CX, 0xFFFFFFFF, 7x0), | |
| 4591 | + /* PowerPC 750CX v2.1 (G3 embedded) */ | |
| 4592 | + POWERPC_DEF("750cx2.1", CPU_POWERPC_750CX_v21, 0xFFFFFFFF, 7x0), | |
| 4593 | + /* PowerPC 750CX v2.2 (G3 embedded) */ | |
| 4594 | + POWERPC_DEF("750cx2.2", CPU_POWERPC_750CX_v22, 0xFFFFFFFF, 7x0), | |
| 4595 | + /* PowerPC 750CXe (G3 embedded) */ | |
| 4596 | + POWERPC_DEF("750cxe", CPU_POWERPC_750CXE, 0xFFFFFFFF, 7x0), | |
| 4597 | + /* PowerPC 750CXe v2.1 (G3 embedded) */ | |
| 4598 | + POWERPC_DEF("750cxe21", CPU_POWERPC_750CXE_v21, 0xFFFFFFFF, 7x0), | |
| 4599 | + /* PowerPC 750CXe v2.2 (G3 embedded) */ | |
| 4600 | + POWERPC_DEF("750cxe22", CPU_POWERPC_750CXE_v22, 0xFFFFFFFF, 7x0), | |
| 4601 | + /* PowerPC 750CXe v2.3 (G3 embedded) */ | |
| 4602 | + POWERPC_DEF("750cxe23", CPU_POWERPC_750CXE_v23, 0xFFFFFFFF, 7x0), | |
| 4603 | + /* PowerPC 750CXe v2.4 (G3 embedded) */ | |
| 4604 | + POWERPC_DEF("750cxe24", CPU_POWERPC_750CXE_v24, 0xFFFFFFFF, 7x0), | |
| 4605 | + /* PowerPC 750CXe v2.4b (G3 embedded) */ | |
| 4606 | + POWERPC_DEF("750cxe24b", CPU_POWERPC_750CXE_v24b, 0xFFFFFFFF, 7x0), | |
| 4607 | + /* PowerPC 750CXe v3.1 (G3 embedded) */ | |
| 4608 | + POWERPC_DEF("750cxe31", CPU_POWERPC_750CXE_v31, 0xFFFFFFFF, 7x0), | |
| 4609 | + /* PowerPC 750CXe v3.1b (G3 embedded) */ | |
| 4610 | + POWERPC_DEF("750cxe3.1b", CPU_POWERPC_750CXE_v31b, 0xFFFFFFFF, 7x0), | |
| 4611 | + /* PowerPC 750CXr (G3 embedded) */ | |
| 4612 | + POWERPC_DEF("750cxr", CPU_POWERPC_750CXR, 0xFFFFFFFF, 7x0), | |
| 4613 | + /* PowerPC 750E (G3) */ | |
| 4614 | + POWERPC_DEF("750e", CPU_POWERPC_750E, 0xFFFFFFFF, 7x0), | |
| 4615 | + /* PowerPC 750FL (G3 embedded) */ | |
| 4616 | + POWERPC_DEF("750fl", CPU_POWERPC_750FL, 0xFFFFFFFF, 7x0), | |
| 4617 | + /* PowerPC 750FX (G3 embedded) */ | |
| 4618 | + POWERPC_DEF("750fx", CPU_POWERPC_750FX, 0xFFFFFFFF, 750fx), | |
| 4619 | + /* PowerPC 750FX v1.0 (G3 embedded) */ | |
| 4620 | + POWERPC_DEF("750fx1.0", CPU_POWERPC_750FX_v10, 0xFFFFFFFF, 750fx), | |
| 4621 | + /* PowerPC 750FX v2.0 (G3 embedded) */ | |
| 4622 | + POWERPC_DEF("750fx2.0", CPU_POWERPC_750FX_v20, 0xFFFFFFFF, 750fx), | |
| 4623 | + /* PowerPC 750FX v2.1 (G3 embedded) */ | |
| 4624 | + POWERPC_DEF("750fx2.1", CPU_POWERPC_750FX_v21, 0xFFFFFFFF, 750fx), | |
| 4625 | + /* PowerPC 750FX v2.2 (G3 embedded) */ | |
| 4626 | + POWERPC_DEF("750fx2.2", CPU_POWERPC_750FX_v22, 0xFFFFFFFF, 750fx), | |
| 4627 | + /* PowerPC 750FX v2.3 (G3 embedded) */ | |
| 4628 | + POWERPC_DEF("750fx2.3", CPU_POWERPC_750FX_v23, 0xFFFFFFFF, 750fx), | |
| 4629 | + /* PowerPC 750GL (G3 embedded) */ | |
| 4630 | + POWERPC_DEF("750gl", CPU_POWERPC_750GL, 0xFFFFFFFF, 7x0), | |
| 4631 | + /* PowerPC 750GX (G3 embedded) */ | |
| 4632 | + POWERPC_DEF("750gx", CPU_POWERPC_750GX, 0xFFFFFFFF, 750fx), | |
| 4633 | + /* PowerPC 750GX v1.0 (G3 embedded) */ | |
| 4634 | + POWERPC_DEF("750gx1.0", CPU_POWERPC_750GX_v10, 0xFFFFFFFF, 750fx), | |
| 4635 | + /* PowerPC 750GX v1.1 (G3 embedded) */ | |
| 4636 | + POWERPC_DEF("750gx1.1", CPU_POWERPC_750GX_v11, 0xFFFFFFFF, 750fx), | |
| 4637 | + /* PowerPC 750GX v1.2 (G3 embedded) */ | |
| 4638 | + POWERPC_DEF("750gx1.2", CPU_POWERPC_750GX_v12, 0xFFFFFFFF, 750fx), | |
| 4639 | + /* PowerPC 750L (G3 embedded) */ | |
| 4640 | + POWERPC_DEF("750l", CPU_POWERPC_750L, 0xFFFFFFFF, 7x0), | |
| 4641 | + /* Code name for PowerPC 750L (G3 embedded) */ | |
| 4642 | + POWERPC_DEF("LoneStar", CPU_POWERPC_750L, 0xFFFFFFFF, 7x0), | |
| 4643 | + /* PowerPC 750L v2.2 (G3 embedded) */ | |
| 4644 | + POWERPC_DEF("750l2.2", CPU_POWERPC_750L_v22, 0xFFFFFFFF, 7x0), | |
| 4645 | + /* PowerPC 750L v3.0 (G3 embedded) */ | |
| 4646 | + POWERPC_DEF("750l3.0", CPU_POWERPC_750L_v30, 0xFFFFFFFF, 7x0), | |
| 4647 | + /* PowerPC 750L v3.2 (G3 embedded) */ | |
| 4648 | + POWERPC_DEF("750l3.2", CPU_POWERPC_750L_v32, 0xFFFFFFFF, 7x0), | |
| 4649 | + /* Generic PowerPC 745 */ | |
| 4650 | + POWERPC_DEF("745", CPU_POWERPC_7x5, 0xFFFFFFFF, 7x5), | |
| 4651 | + /* Generic PowerPC 755 */ | |
| 4652 | + POWERPC_DEF("755", CPU_POWERPC_7x5, 0xFFFFFFFF, 7x5), | |
| 4653 | + /* Code name for PowerPC 745/755 */ | |
| 4654 | + POWERPC_DEF("Goldfinger", CPU_POWERPC_7x5, 0xFFFFFFFF, 7x5), | |
| 4655 | + /* PowerPC 745 v1.0 */ | |
| 4656 | + POWERPC_DEF("745v1.0", CPU_POWERPC_7x5_v10, 0xFFFFFFFF, 7x5), | |
| 4657 | + /* PowerPC 755 v1.0 */ | |
| 4658 | + POWERPC_DEF("755v1.0", CPU_POWERPC_7x5_v10, 0xFFFFFFFF, 7x5), | |
| 4659 | + /* PowerPC 745 v1.1 */ | |
| 4660 | + POWERPC_DEF("745v1.1", CPU_POWERPC_7x5_v11, 0xFFFFFFFF, 7x5), | |
| 4661 | + /* PowerPC 755 v1.1 */ | |
| 4662 | + POWERPC_DEF("755v1.1", CPU_POWERPC_7x5_v11, 0xFFFFFFFF, 7x5), | |
| 4663 | + /* PowerPC 745 v2.0 */ | |
| 4664 | + POWERPC_DEF("745v2.0", CPU_POWERPC_7x5_v20, 0xFFFFFFFF, 7x5), | |
| 4665 | + /* PowerPC 755 v2.0 */ | |
| 4666 | + POWERPC_DEF("755v2.0", CPU_POWERPC_7x5_v20, 0xFFFFFFFF, 7x5), | |
| 4667 | + /* PowerPC 745 v2.1 */ | |
| 4668 | + POWERPC_DEF("745v2.1", CPU_POWERPC_7x5_v21, 0xFFFFFFFF, 7x5), | |
| 4669 | + /* PowerPC 755 v2.1 */ | |
| 4670 | + POWERPC_DEF("755v2.1", CPU_POWERPC_7x5_v21, 0xFFFFFFFF, 7x5), | |
| 4671 | + /* PowerPC 745 v2.2 */ | |
| 4672 | + POWERPC_DEF("745v2.2", CPU_POWERPC_7x5_v22, 0xFFFFFFFF, 7x5), | |
| 4673 | + /* PowerPC 755 v2.2 */ | |
| 4674 | + POWERPC_DEF("755v2.2", CPU_POWERPC_7x5_v22, 0xFFFFFFFF, 7x5), | |
| 4675 | + /* PowerPC 745 v2.3 */ | |
| 4676 | + POWERPC_DEF("745v2.3", CPU_POWERPC_7x5_v23, 0xFFFFFFFF, 7x5), | |
| 4677 | + /* PowerPC 755 v2.3 */ | |
| 4678 | + POWERPC_DEF("755v2.3", CPU_POWERPC_7x5_v23, 0xFFFFFFFF, 7x5), | |
| 4679 | + /* PowerPC 745 v2.4 */ | |
| 4680 | + POWERPC_DEF("745v2.4", CPU_POWERPC_7x5_v24, 0xFFFFFFFF, 7x5), | |
| 4681 | + /* PowerPC 755 v2.4 */ | |
| 4682 | + POWERPC_DEF("755v2.4", CPU_POWERPC_7x5_v24, 0xFFFFFFFF, 7x5), | |
| 4683 | + /* PowerPC 745 v2.5 */ | |
| 4684 | + POWERPC_DEF("745v2.5", CPU_POWERPC_7x5_v25, 0xFFFFFFFF, 7x5), | |
| 4685 | + /* PowerPC 755 v2.5 */ | |
| 4686 | + POWERPC_DEF("755v2.5", CPU_POWERPC_7x5_v25, 0xFFFFFFFF, 7x5), | |
| 4687 | + /* PowerPC 745 v2.6 */ | |
| 4688 | + POWERPC_DEF("745v2.6", CPU_POWERPC_7x5_v26, 0xFFFFFFFF, 7x5), | |
| 4689 | + /* PowerPC 755 v2.6 */ | |
| 4690 | + POWERPC_DEF("755v2.6", CPU_POWERPC_7x5_v26, 0xFFFFFFFF, 7x5), | |
| 4691 | + /* PowerPC 745 v2.7 */ | |
| 4692 | + POWERPC_DEF("745v2.7", CPU_POWERPC_7x5_v27, 0xFFFFFFFF, 7x5), | |
| 4693 | + /* PowerPC 755 v2.7 */ | |
| 4694 | + POWERPC_DEF("755v2.7", CPU_POWERPC_7x5_v27, 0xFFFFFFFF, 7x5), | |
| 4695 | + /* PowerPC 745 v2.8 */ | |
| 4696 | + POWERPC_DEF("745v2.8", CPU_POWERPC_7x5_v28, 0xFFFFFFFF, 7x5), | |
| 4697 | + /* PowerPC 755 v2.8 */ | |
| 4698 | + POWERPC_DEF("755v2.8", CPU_POWERPC_7x5_v28, 0xFFFFFFFF, 7x5), | |
| 4699 | +#if defined (TODO) | |
| 4700 | + /* PowerPC 745P (G3) */ | |
| 4701 | + POWERPC_DEF("745p", CPU_POWERPC_7x5P, 0xFFFFFFFF, 7x5), | |
| 4702 | + /* PowerPC 755P (G3) */ | |
| 4703 | + POWERPC_DEF("755p", CPU_POWERPC_7x5P, 0xFFFFFFFF, 7x5), | |
| 4704 | +#endif | |
| 4705 | + /* PowerPC 74xx family */ | |
| 4706 | + /* PowerPC 7400 (G4) */ | |
| 4707 | + POWERPC_DEF("7400", CPU_POWERPC_7400, 0xFFFFFFFF, 7400), | |
| 4708 | + /* Code name for PowerPC 7400 */ | |
| 4709 | + POWERPC_DEF("Max", CPU_POWERPC_7400, 0xFFFFFFFF, 7400), | |
| 4710 | + /* PowerPC 74xx is also well known as G4 */ | |
| 4711 | + POWERPC_DEF("G4", CPU_POWERPC_7400, 0xFFFFFFFF, 7400), | |
| 4712 | + /* PowerPC 7400 v1.0 (G4) */ | |
| 4713 | + POWERPC_DEF("7400v1.0", CPU_POWERPC_7400_v10, 0xFFFFFFFF, 7400), | |
| 4714 | + /* PowerPC 7400 v1.1 (G4) */ | |
| 4715 | + POWERPC_DEF("7400v1.1", CPU_POWERPC_7400_v11, 0xFFFFFFFF, 7400), | |
| 4716 | + /* PowerPC 7400 v2.0 (G4) */ | |
| 4717 | + POWERPC_DEF("7400v2.0", CPU_POWERPC_7400_v20, 0xFFFFFFFF, 7400), | |
| 4718 | + /* PowerPC 7400 v2.2 (G4) */ | |
| 4719 | + POWERPC_DEF("7400v2.2", CPU_POWERPC_7400_v22, 0xFFFFFFFF, 7400), | |
| 4720 | + /* PowerPC 7400 v2.6 (G4) */ | |
| 4721 | + POWERPC_DEF("7400v2.6", CPU_POWERPC_7400_v26, 0xFFFFFFFF, 7400), | |
| 4722 | + /* PowerPC 7400 v2.7 (G4) */ | |
| 4723 | + POWERPC_DEF("7400v2.7", CPU_POWERPC_7400_v27, 0xFFFFFFFF, 7400), | |
| 4724 | + /* PowerPC 7400 v2.8 (G4) */ | |
| 4725 | + POWERPC_DEF("7400v2.8", CPU_POWERPC_7400_v28, 0xFFFFFFFF, 7400), | |
| 4726 | + /* PowerPC 7400 v2.9 (G4) */ | |
| 4727 | + POWERPC_DEF("7400v2.9", CPU_POWERPC_7400_v29, 0xFFFFFFFF, 7400), | |
| 4728 | + /* PowerPC 7410 (G4) */ | |
| 4729 | + POWERPC_DEF("7410", CPU_POWERPC_7410, 0xFFFFFFFF, 7410), | |
| 4730 | + /* Code name for PowerPC 7410 */ | |
| 4731 | + POWERPC_DEF("Nitro", CPU_POWERPC_7410, 0xFFFFFFFF, 7410), | |
| 4732 | + /* PowerPC 7410 v1.0 (G4) */ | |
| 4733 | + POWERPC_DEF("7410v1.0", CPU_POWERPC_7410_v10, 0xFFFFFFFF, 7410), | |
| 4734 | + /* PowerPC 7410 v1.1 (G4) */ | |
| 4735 | + POWERPC_DEF("7410v1.1", CPU_POWERPC_7410_v11, 0xFFFFFFFF, 7410), | |
| 4736 | + /* PowerPC 7410 v1.2 (G4) */ | |
| 4737 | + POWERPC_DEF("7410v1.2", CPU_POWERPC_7410_v12, 0xFFFFFFFF, 7410), | |
| 4738 | + /* PowerPC 7410 v1.3 (G4) */ | |
| 4739 | + POWERPC_DEF("7410v1.3", CPU_POWERPC_7410_v13, 0xFFFFFFFF, 7410), | |
| 4740 | + /* PowerPC 7410 v1.4 (G4) */ | |
| 4741 | + POWERPC_DEF("7410v1.4", CPU_POWERPC_7410_v14, 0xFFFFFFFF, 7410), | |
| 4742 | + /* PowerPC 7448 (G4) */ | |
| 4743 | + POWERPC_DEF("7448", CPU_POWERPC_7448, 0xFFFFFFFF, 7400), | |
| 4744 | + /* PowerPC 7448 v1.0 (G4) */ | |
| 4745 | + POWERPC_DEF("7448v1.0", CPU_POWERPC_7448_v10, 0xFFFFFFFF, 7400), | |
| 4746 | + /* PowerPC 7448 v1.1 (G4) */ | |
| 4747 | + POWERPC_DEF("7448v1.1", CPU_POWERPC_7448_v11, 0xFFFFFFFF, 7400), | |
| 4748 | + /* PowerPC 7448 v2.0 (G4) */ | |
| 4749 | + POWERPC_DEF("7448v2.0", CPU_POWERPC_7448_v20, 0xFFFFFFFF, 7400), | |
| 4750 | + /* PowerPC 7448 v2.1 (G4) */ | |
| 4751 | + POWERPC_DEF("7448v2.1", CPU_POWERPC_7448_v21, 0xFFFFFFFF, 7400), | |
| 4752 | +#if defined (TODO) | |
| 4753 | + /* PowerPC 7450 (G4) */ | |
| 4754 | + POWERPC_DEF("7450", CPU_POWERPC_7450, 0xFFFFFFFF, 7450), | |
| 4755 | + /* Code name for PowerPC 7450 */ | |
| 4756 | + POWERPC_DEF("Vger", CPU_POWERPC_7450, 0xFFFFFFFF, 7450), | |
| 4757 | +#endif | |
| 4758 | +#if defined (TODO) | |
| 4759 | + /* PowerPC 7450 v1.0 (G4) */ | |
| 4760 | + POWERPC_DEF("7450v1.0", CPU_POWERPC_7450_v10, 0xFFFFFFFF, 7450), | |
| 4761 | +#endif | |
| 4762 | +#if defined (TODO) | |
| 4763 | + /* PowerPC 7450 v1.1 (G4) */ | |
| 4764 | + POWERPC_DEF("7450v1.1", CPU_POWERPC_7450_v11, 0xFFFFFFFF, 7450), | |
| 4765 | +#endif | |
| 4766 | +#if defined (TODO) | |
| 4767 | + /* PowerPC 7450 v1.2 (G4) */ | |
| 4768 | + POWERPC_DEF("7450v1.2", CPU_POWERPC_7450_v12, 0xFFFFFFFF, 7450), | |
| 4769 | +#endif | |
| 4770 | +#if defined (TODO) | |
| 4771 | + /* PowerPC 7450 v2.0 (G4) */ | |
| 4772 | + POWERPC_DEF("7450v2.0", CPU_POWERPC_7450_v20, 0xFFFFFFFF, 7450), | |
| 4773 | +#endif | |
| 4774 | +#if defined (TODO) | |
| 4775 | + /* PowerPC 7450 v2.1 (G4) */ | |
| 4776 | + POWERPC_DEF("7450v2.1", CPU_POWERPC_7450_v21, 0xFFFFFFFF, 7450), | |
| 4777 | +#endif | |
| 4778 | +#if defined (TODO) | |
| 4779 | + /* PowerPC 7441 (G4) */ | |
| 4780 | + POWERPC_DEF("7441", CPU_POWERPC_74x1, 0xFFFFFFFF, 7440), | |
| 4781 | + /* PowerPC 7451 (G4) */ | |
| 4782 | + POWERPC_DEF("7451", CPU_POWERPC_74x1, 0xFFFFFFFF, 7450), | |
| 4783 | +#endif | |
| 3069 | 4784 | #if defined (TODO) |
| 3070 | - /* PowerPC 405 EZ */ | |
| 3071 | - { | |
| 3072 | - .name = "405ez", | |
| 3073 | - .pvr = CPU_PPC_405EZ, | |
| 3074 | - .pvr_mask = 0xFFFFFFFF, | |
| 3075 | - .insns_flags = PPC_INSNS_405, | |
| 3076 | - .flags = PPC_FLAGS_405, | |
| 3077 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3078 | - }, | |
| 4785 | + /* PowerPC 7441g (G4) */ | |
| 4786 | + POWERPC_DEF("7441g", CPU_POWERPC_74x1G, 0xFFFFFFFF, 7440), | |
| 4787 | + /* PowerPC 7451g (G4) */ | |
| 4788 | + POWERPC_DEF("7451g", CPU_POWERPC_74x1G, 0xFFFFFFFF, 7450), | |
| 3079 | 4789 | #endif |
| 3080 | 4790 | #if defined (TODO) |
| 3081 | - /* PowerPC 405 GPR */ | |
| 3082 | - { | |
| 3083 | - .name = "405gpr", | |
| 3084 | - .pvr = CPU_PPC_405GPR, | |
| 3085 | - .pvr_mask = 0xFFFFFFFF, | |
| 3086 | - .insns_flags = PPC_INSNS_405, | |
| 3087 | - .flags = PPC_FLAGS_405, | |
| 3088 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3089 | - }, | |
| 4791 | + /* PowerPC 7445 (G4) */ | |
| 4792 | + POWERPC_DEF("7445", CPU_POWERPC_74x5, 0xFFFFFFFF, 7445), | |
| 4793 | + /* PowerPC 7455 (G4) */ | |
| 4794 | + POWERPC_DEF("7455", CPU_POWERPC_74x5, 0xFFFFFFFF, 7455), | |
| 4795 | + /* Code name for PowerPC 7445/7455 */ | |
| 4796 | + POWERPC_DEF("Apollo6", CPU_POWERPC_74x5, 0xFFFFFFFF, 7455), | |
| 3090 | 4797 | #endif |
| 3091 | 4798 | #if defined (TODO) |
| 3092 | - /* PowerPC 405 LP */ | |
| 3093 | - { | |
| 3094 | - .name = "405lp", | |
| 3095 | - .pvr = CPU_PPC_405EZ, | |
| 3096 | - .pvr_mask = 0xFFFFFFFF, | |
| 3097 | - .insns_flags = PPC_INSNS_405, | |
| 3098 | - .flags = PPC_FLAGS_405, | |
| 3099 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3100 | - }, | |
| 3101 | -#endif | |
| 3102 | - /* Npe405 H */ | |
| 3103 | - { | |
| 3104 | - .name = "Npe405H", | |
| 3105 | - .pvr = CPU_PPC_NPE405H, | |
| 3106 | - .pvr_mask = 0xFFFFFFFF, | |
| 3107 | - .insns_flags = PPC_INSNS_405, | |
| 3108 | - .flags = PPC_FLAGS_405, | |
| 3109 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3110 | - }, | |
| 3111 | - /* Npe405 H2 */ | |
| 3112 | - { | |
| 3113 | - .name = "Npe405H2", | |
| 3114 | - .pvr = CPU_PPC_NPE405H2, | |
| 3115 | - .pvr_mask = 0xFFFFFFFF, | |
| 3116 | - .insns_flags = PPC_INSNS_405, | |
| 3117 | - .flags = PPC_FLAGS_405, | |
| 3118 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3119 | - }, | |
| 3120 | - /* Npe405 L */ | |
| 3121 | - { | |
| 3122 | - .name = "Npe405L", | |
| 3123 | - .pvr = CPU_PPC_NPE405L, | |
| 3124 | - .pvr_mask = 0xFFFFFFFF, | |
| 3125 | - .insns_flags = PPC_INSNS_405, | |
| 3126 | - .flags = PPC_FLAGS_405, | |
| 3127 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3128 | - }, | |
| 4799 | + /* PowerPC 7445 v1.0 (G4) */ | |
| 4800 | + POWERPC_DEF("7445v1.0", CPU_POWERPC_74x5_v10, 0xFFFFFFFF, 7445), | |
| 4801 | + /* PowerPC 7455 v1.0 (G4) */ | |
| 4802 | + POWERPC_DEF("7455v1.0", CPU_POWERPC_74x5_v10, 0xFFFFFFFF, 7455), | |
| 4803 | +#endif | |
| 3129 | 4804 | #if defined (TODO) |
| 3130 | - /* PowerPC LP777000 */ | |
| 3131 | - { | |
| 3132 | - .name = "lp777000", | |
| 3133 | - .pvr = CPU_PPC_LP777000, | |
| 3134 | - .pvr_mask = 0xFFFFFFFF, | |
| 3135 | - .insns_flags = PPC_INSNS_405, | |
| 3136 | - .flags = PPC_FLAGS_405, | |
| 3137 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3138 | - }, | |
| 4805 | + /* PowerPC 7445 v2.1 (G4) */ | |
| 4806 | + POWERPC_DEF("7445v2.1", CPU_POWERPC_74x5_v21, 0xFFFFFFFF, 7445), | |
| 4807 | + /* PowerPC 7455 v2.1 (G4) */ | |
| 4808 | + POWERPC_DEF("7455v2.1", CPU_POWERPC_74x5_v21, 0xFFFFFFFF, 7455), | |
| 3139 | 4809 | #endif |
| 3140 | 4810 | #if defined (TODO) |
| 3141 | - /* STB010000 */ | |
| 3142 | - { | |
| 3143 | - .name = "STB01000", | |
| 3144 | - .pvr = CPU_PPC_STB01000, | |
| 3145 | - .pvr_mask = 0xFFFFFFFF, | |
| 3146 | - .insns_flags = PPC_INSNS_405, | |
| 3147 | - .flags = PPC_FLAGS_405, | |
| 3148 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3149 | - }, | |
| 4811 | + /* PowerPC 7445 v3.2 (G4) */ | |
| 4812 | + POWERPC_DEF("7445v3.2", CPU_POWERPC_74x5_v32, 0xFFFFFFFF, 7445), | |
| 4813 | + /* PowerPC 7455 v3.2 (G4) */ | |
| 4814 | + POWERPC_DEF("7455v3.2", CPU_POWERPC_74x5_v32, 0xFFFFFFFF, 7455), | |
| 3150 | 4815 | #endif |
| 3151 | 4816 | #if defined (TODO) |
| 3152 | - /* STB01010 */ | |
| 3153 | - { | |
| 3154 | - .name = "STB01010", | |
| 3155 | - .pvr = CPU_PPC_STB01010, | |
| 3156 | - .pvr_mask = 0xFFFFFFFF, | |
| 3157 | - .insns_flags = PPC_INSNS_405, | |
| 3158 | - .flags = PPC_FLAGS_405, | |
| 3159 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3160 | - }, | |
| 4817 | + /* PowerPC 7445 v3.3 (G4) */ | |
| 4818 | + POWERPC_DEF("7445v3.3", CPU_POWERPC_74x5_v33, 0xFFFFFFFF, 7445), | |
| 4819 | + /* PowerPC 7455 v3.3 (G4) */ | |
| 4820 | + POWERPC_DEF("7455v3.3", CPU_POWERPC_74x5_v33, 0xFFFFFFFF, 7455), | |
| 3161 | 4821 | #endif |
| 3162 | 4822 | #if defined (TODO) |
| 3163 | - /* STB0210 */ | |
| 3164 | - { | |
| 3165 | - .name = "STB0210", | |
| 3166 | - .pvr = CPU_PPC_STB0210, | |
| 3167 | - .pvr_mask = 0xFFFFFFFF, | |
| 3168 | - .insns_flags = PPC_INSNS_405, | |
| 3169 | - .flags = PPC_FLAGS_405, | |
| 3170 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3171 | - }, | |
| 4823 | + /* PowerPC 7445 v3.4 (G4) */ | |
| 4824 | + POWERPC_DEF("7445v3.4", CPU_POWERPC_74x5_v34, 0xFFFFFFFF, 7445), | |
| 4825 | + /* PowerPC 7455 v3.4 (G4) */ | |
| 4826 | + POWERPC_DEF("7455v3.4", CPU_POWERPC_74x5_v34, 0xFFFFFFFF, 7455), | |
| 3172 | 4827 | #endif |
| 3173 | 4828 | #if defined (TODO) |
| 3174 | - /* STB03xx */ | |
| 3175 | - { | |
| 3176 | - .name = "STB03", | |
| 3177 | - .pvr = CPU_PPC_STB03, | |
| 3178 | - .pvr_mask = 0xFFFFFFFF, | |
| 3179 | - .insns_flags = PPC_INSNS_405, | |
| 3180 | - .flags = PPC_FLAGS_405, | |
| 3181 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3182 | - }, | |
| 4829 | + /* PowerPC 7447 (G4) */ | |
| 4830 | + POWERPC_DEF("7447", CPU_POWERPC_74x7, 0xFFFFFFFF, 7445), | |
| 4831 | + /* PowerPC 7457 (G4) */ | |
| 4832 | + POWERPC_DEF("7457", CPU_POWERPC_74x7, 0xFFFFFFFF, 7455), | |
| 4833 | + /* Code name for PowerPC 7447/7457 */ | |
| 4834 | + POWERPC_DEF("Apollo7", CPU_POWERPC_74x7, 0xFFFFFFFF, 7455), | |
| 3183 | 4835 | #endif |
| 3184 | 4836 | #if defined (TODO) |
| 3185 | - /* STB043x */ | |
| 3186 | - { | |
| 3187 | - .name = "STB043", | |
| 3188 | - .pvr = CPU_PPC_STB043, | |
| 3189 | - .pvr_mask = 0xFFFFFFFF, | |
| 3190 | - .insns_flags = PPC_INSNS_405, | |
| 3191 | - .flags = PPC_FLAGS_405, | |
| 3192 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3193 | - }, | |
| 4837 | + /* PowerPC 7447 v1.0 (G4) */ | |
| 4838 | + POWERPC_DEF("7447v1.0", CPU_POWERPC_74x7_v10, 0xFFFFFFFF, 7445), | |
| 4839 | + /* PowerPC 7457 v1.0 (G4) */ | |
| 4840 | + POWERPC_DEF("7457v1.0", CPU_POWERPC_74x7_v10, 0xFFFFFFFF, 7455), | |
| 4841 | + /* Code name for PowerPC 7447A/7457A */ | |
| 4842 | + POWERPC_DEF("Apollo7PM", CPU_POWERPC_74x7_v10, 0xFFFFFFFF, 7455), | |
| 3194 | 4843 | #endif |
| 3195 | 4844 | #if defined (TODO) |
| 3196 | - /* STB045x */ | |
| 3197 | - { | |
| 3198 | - .name = "STB045", | |
| 3199 | - .pvr = CPU_PPC_STB045, | |
| 3200 | - .pvr_mask = 0xFFFFFFFF, | |
| 3201 | - .insns_flags = PPC_INSNS_405, | |
| 3202 | - .flags = PPC_FLAGS_405, | |
| 3203 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3204 | - }, | |
| 3205 | -#endif | |
| 3206 | -#if defined (TODO) || 1 | |
| 3207 | - /* STB25xx */ | |
| 3208 | - { | |
| 3209 | - .name = "STB25", | |
| 3210 | - .pvr = CPU_PPC_STB25, | |
| 3211 | - .pvr_mask = 0xFFFFFFFF, | |
| 3212 | - .insns_flags = PPC_INSNS_405, | |
| 3213 | - .flags = PPC_FLAGS_405, | |
| 3214 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3215 | - }, | |
| 4845 | + /* PowerPC 7447 v1.1 (G4) */ | |
| 4846 | + POWERPC_DEF("7447v1.1", CPU_POWERPC_74x7_v11, 0xFFFFFFFF, 7445), | |
| 4847 | + /* PowerPC 7457 v1.1 (G4) */ | |
| 4848 | + POWERPC_DEF("7457v1.1", CPU_POWERPC_74x7_v11, 0xFFFFFFFF, 7455), | |
| 3216 | 4849 | #endif |
| 3217 | 4850 | #if defined (TODO) |
| 3218 | - /* STB130 */ | |
| 3219 | - { | |
| 3220 | - .name = "STB130", | |
| 3221 | - .pvr = CPU_PPC_STB130, | |
| 3222 | - .pvr_mask = 0xFFFFFFFF, | |
| 3223 | - .insns_flags = PPC_INSNS_405, | |
| 3224 | - .flags = PPC_FLAGS_405, | |
| 3225 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3226 | - }, | |
| 3227 | -#endif | |
| 3228 | - /* Xilinx PowerPC 405 cores */ | |
| 4851 | + /* PowerPC 7447 v1.2 (G4) */ | |
| 4852 | + POWERPC_DEF("7447v1.2", CPU_POWERPC_74x7_v12, 0xFFFFFFFF, 7445), | |
| 4853 | + /* PowerPC 7457 v1.2 (G4) */ | |
| 4854 | + POWERPC_DEF("7457v1.2", CPU_POWERPC_74x7_v12, 0xFFFFFFFF, 7455), | |
| 4855 | +#endif | |
| 4856 | + /* 64 bits PowerPC */ | |
| 4857 | +#if defined (TARGET_PPC64) | |
| 3229 | 4858 | #if defined (TODO) |
| 3230 | - { | |
| 3231 | - .name = "x2vp4", | |
| 3232 | - .pvr = CPU_PPC_X2VP4, | |
| 3233 | - .pvr_mask = 0xFFFFFFFF, | |
| 3234 | - .insns_flags = PPC_INSNS_405, | |
| 3235 | - .flags = PPC_FLAGS_405, | |
| 3236 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3237 | - }, | |
| 3238 | - { | |
| 3239 | - .name = "x2vp7", | |
| 3240 | - .pvr = CPU_PPC_X2VP7, | |
| 3241 | - .pvr_mask = 0xFFFFFFFF, | |
| 3242 | - .insns_flags = PPC_INSNS_405, | |
| 3243 | - .flags = PPC_FLAGS_405, | |
| 3244 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3245 | - }, | |
| 3246 | - { | |
| 3247 | - .name = "x2vp20", | |
| 3248 | - .pvr = CPU_PPC_X2VP20, | |
| 3249 | - .pvr_mask = 0xFFFFFFFF, | |
| 3250 | - .insns_flags = PPC_INSNS_405, | |
| 3251 | - .flags = PPC_FLAGS_405, | |
| 3252 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3253 | - }, | |
| 3254 | - { | |
| 3255 | - .name = "x2vp50", | |
| 3256 | - .pvr = CPU_PPC_X2VP50, | |
| 3257 | - .pvr_mask = 0xFFFFFFFF, | |
| 3258 | - .insns_flags = PPC_INSNS_405, | |
| 3259 | - .flags = PPC_FLAGS_405, | |
| 3260 | - .msr_mask = 0x00000000020EFF30ULL, | |
| 3261 | - }, | |
| 3262 | -#endif | |
| 3263 | - /* PowerPC 440 EP */ | |
| 3264 | - { | |
| 3265 | - .name = "440ep", | |
| 3266 | - .pvr = CPU_PPC_440EP, | |
| 3267 | - .pvr_mask = 0xFFFFFFFF, | |
| 3268 | - .insns_flags = PPC_INSNS_440, | |
| 3269 | - .flags = PPC_FLAGS_440, | |
| 3270 | - .msr_mask = 0x000000000006D630ULL, | |
| 3271 | - }, | |
| 3272 | - /* PowerPC 440 GR */ | |
| 3273 | - { | |
| 3274 | - .name = "440gr", | |
| 3275 | - .pvr = CPU_PPC_440GR, | |
| 3276 | - .pvr_mask = 0xFFFFFFFF, | |
| 3277 | - .insns_flags = PPC_INSNS_440, | |
| 3278 | - .flags = PPC_FLAGS_440, | |
| 3279 | - .msr_mask = 0x000000000006D630ULL, | |
| 3280 | - }, | |
| 3281 | - /* PowerPC 440 GP */ | |
| 3282 | - { | |
| 3283 | - .name = "440gp", | |
| 3284 | - .pvr = CPU_PPC_440GP, | |
| 3285 | - .pvr_mask = 0xFFFFFFFF, | |
| 3286 | - .insns_flags = PPC_INSNS_440, | |
| 3287 | - .flags = PPC_FLAGS_440, | |
| 3288 | - .msr_mask = 0x000000000006D630ULL, | |
| 3289 | - }, | |
| 4859 | + /* PowerPC 620 */ | |
| 4860 | + POWERPC_DEF("620", CPU_POWERPC_620, 0xFFFFFFFF, 620), | |
| 4861 | +#endif | |
| 3290 | 4862 | #if defined (TODO) |
| 3291 | - /* PowerPC 440 GRX */ | |
| 3292 | - { | |
| 3293 | - .name = "440grx", | |
| 3294 | - .pvr = CPU_PPC_440GRX, | |
| 3295 | - .pvr_mask = 0xFFFFFFFF, | |
| 3296 | - .insns_flags = PPC_INSNS_440, | |
| 3297 | - .flags = PPC_FLAGS_440, | |
| 3298 | - .msr_mask = 0x000000000006D630ULL, | |
| 3299 | - }, | |
| 3300 | -#endif | |
| 3301 | - /* PowerPC 440 GX */ | |
| 3302 | - { | |
| 3303 | - .name = "440gx", | |
| 3304 | - .pvr = CPU_PPC_440GX, | |
| 3305 | - .pvr_mask = 0xFFFFFFFF, | |
| 3306 | - .insns_flags = PPC_INSNS_440, | |
| 3307 | - .flags = PPC_FLAGS_440, | |
| 3308 | - .msr_mask = 0x000000000006D630ULL, | |
| 3309 | - }, | |
| 3310 | - /* PowerPC 440 GXc */ | |
| 3311 | - { | |
| 3312 | - .name = "440gxc", | |
| 3313 | - .pvr = CPU_PPC_440GXc, | |
| 3314 | - .pvr_mask = 0xFFFFFFFF, | |
| 3315 | - .insns_flags = PPC_INSNS_440, | |
| 3316 | - .flags = PPC_FLAGS_440, | |
| 3317 | - .msr_mask = 0x000000000006D630ULL, | |
| 3318 | - }, | |
| 3319 | - /* PowerPC 440 GXf */ | |
| 3320 | - { | |
| 3321 | - .name = "440gxf", | |
| 3322 | - .pvr = CPU_PPC_440GXf, | |
| 3323 | - .pvr_mask = 0xFFFFFFFF, | |
| 3324 | - .insns_flags = PPC_INSNS_440, | |
| 3325 | - .flags = PPC_FLAGS_440, | |
| 3326 | - .msr_mask = 0x000000000006D630ULL, | |
| 3327 | - }, | |
| 3328 | - /* PowerPC 440 SP */ | |
| 3329 | - { | |
| 3330 | - .name = "440sp", | |
| 3331 | - .pvr = CPU_PPC_440SP, | |
| 3332 | - .pvr_mask = 0xFFFFFFFF, | |
| 3333 | - .insns_flags = PPC_INSNS_440, | |
| 3334 | - .flags = PPC_FLAGS_440, | |
| 3335 | - .msr_mask = 0x000000000006D630ULL, | |
| 3336 | - }, | |
| 3337 | - /* PowerPC 440 SP2 */ | |
| 3338 | - { | |
| 3339 | - .name = "440sp2", | |
| 3340 | - .pvr = CPU_PPC_440SP2, | |
| 3341 | - .pvr_mask = 0xFFFFFFFF, | |
| 3342 | - .insns_flags = PPC_INSNS_440, | |
| 3343 | - .flags = PPC_FLAGS_440, | |
| 3344 | - .msr_mask = 0x000000000006D630ULL, | |
| 3345 | - }, | |
| 3346 | - /* PowerPC 440 SPE */ | |
| 3347 | - { | |
| 3348 | - .name = "440spe", | |
| 3349 | - .pvr = CPU_PPC_440SPE, | |
| 3350 | - .pvr_mask = 0xFFFFFFFF, | |
| 3351 | - .insns_flags = PPC_INSNS_440, | |
| 3352 | - .flags = PPC_FLAGS_440, | |
| 3353 | - .msr_mask = 0x000000000006D630ULL, | |
| 3354 | - }, | |
| 3355 | - /* Fake generic BookE PowerPC */ | |
| 3356 | - { | |
| 3357 | - .name = "BookE", | |
| 3358 | - .pvr = CPU_PPC_e500, | |
| 3359 | - .pvr_mask = 0xFFFFFFFF, | |
| 3360 | - .insns_flags = PPC_INSNS_BOOKE, | |
| 3361 | - .flags = PPC_FLAGS_BOOKE, | |
| 3362 | - .msr_mask = 0x000000000006D630ULL, | |
| 3363 | - }, | |
| 3364 | - /* PowerPC 460 cores - TODO */ | |
| 3365 | - /* PowerPC MPC 5xx cores - TODO */ | |
| 3366 | - /* PowerPC MPC 8xx cores - TODO */ | |
| 3367 | - /* PowerPC MPC 8xxx cores - TODO */ | |
| 3368 | - /* e200 cores - TODO */ | |
| 3369 | - /* e500 cores - TODO */ | |
| 3370 | - /* e600 cores - TODO */ | |
| 3371 | - | |
| 3372 | - /* 32 bits "classic" PowerPC */ | |
| 4863 | + /* PowerPC 630 (POWER3) */ | |
| 4864 | + POWERPC_DEF("630", CPU_POWERPC_630, 0xFFFFFFFF, 630), | |
| 4865 | + POWERPC_DEF("POWER3", CPU_POWERPC_630, 0xFFFFFFFF, 630), | |
| 4866 | +#endif | |
| 3373 | 4867 | #if defined (TODO) |
| 3374 | - /* PowerPC 601 */ | |
| 3375 | - { | |
| 3376 | - .name = "601", | |
| 3377 | - .pvr = CPU_PPC_601, | |
| 3378 | - .pvr_mask = 0xFFFFFFFF, | |
| 3379 | - .insns_flags = PPC_INSNS_601, | |
| 3380 | - .flags = PPC_FLAGS_601, | |
| 3381 | - .msr_mask = 0x000000000000FD70ULL, | |
| 3382 | - }, | |
| 4868 | + /* PowerPC 631 (Power 3+) */ | |
| 4869 | + POWERPC_DEF("631", CPU_POWERPC_631, 0xFFFFFFFF, 631), | |
| 4870 | + POWERPC_DEF("POWER3+", CPU_POWERPC_631, 0xFFFFFFFF, 631), | |
| 3383 | 4871 | #endif |
| 3384 | 4872 | #if defined (TODO) |
| 3385 | - /* PowerPC 602 */ | |
| 3386 | - { | |
| 3387 | - .name = "602", | |
| 3388 | - .pvr = CPU_PPC_602, | |
| 3389 | - .pvr_mask = 0xFFFFFFFF, | |
| 3390 | - .insns_flags = PPC_INSNS_602, | |
| 3391 | - .flags = PPC_FLAGS_602, | |
| 3392 | - .msr_mask = 0x0000000000C7FF73ULL, | |
| 3393 | - }, | |
| 3394 | -#endif | |
| 3395 | - /* PowerPC 603 */ | |
| 3396 | - { | |
| 3397 | - .name = "603", | |
| 3398 | - .pvr = CPU_PPC_603, | |
| 3399 | - .pvr_mask = 0xFFFFFFFF, | |
| 3400 | - .insns_flags = PPC_INSNS_603, | |
| 3401 | - .flags = PPC_FLAGS_603, | |
| 3402 | - .msr_mask = 0x000000000007FF73ULL, | |
| 3403 | - }, | |
| 3404 | - /* PowerPC 603e */ | |
| 3405 | - { | |
| 3406 | - .name = "603e", | |
| 3407 | - .pvr = CPU_PPC_603E, | |
| 3408 | - .pvr_mask = 0xFFFFFFFF, | |
| 3409 | - .insns_flags = PPC_INSNS_603, | |
| 3410 | - .flags = PPC_FLAGS_603, | |
| 3411 | - .msr_mask = 0x000000000007FF73ULL, | |
| 3412 | - }, | |
| 3413 | - { | |
| 3414 | - .name = "Stretch", | |
| 3415 | - .pvr = CPU_PPC_603E, | |
| 3416 | - .pvr_mask = 0xFFFFFFFF, | |
| 3417 | - .insns_flags = PPC_INSNS_603, | |
| 3418 | - .flags = PPC_FLAGS_603, | |
| 3419 | - .msr_mask = 0x000000000007FF73ULL, | |
| 3420 | - }, | |
| 3421 | - /* PowerPC 603p */ | |
| 3422 | - { | |
| 3423 | - .name = "603p", | |
| 3424 | - .pvr = CPU_PPC_603P, | |
| 3425 | - .pvr_mask = 0xFFFFFFFF, | |
| 3426 | - .insns_flags = PPC_INSNS_603, | |
| 3427 | - .flags = PPC_FLAGS_603, | |
| 3428 | - .msr_mask = 0x000000000007FF73ULL, | |
| 3429 | - }, | |
| 3430 | - /* PowerPC 603e7 */ | |
| 3431 | - { | |
| 3432 | - .name = "603e7", | |
| 3433 | - .pvr = CPU_PPC_603E7, | |
| 3434 | - .pvr_mask = 0xFFFFFFFF, | |
| 3435 | - .insns_flags = PPC_INSNS_603, | |
| 3436 | - .flags = PPC_FLAGS_603, | |
| 3437 | - .msr_mask = 0x000000000007FF73ULL, | |
| 3438 | - }, | |
| 3439 | - /* PowerPC 603e7v */ | |
| 3440 | - { | |
| 3441 | - .name = "603e7v", | |
| 3442 | - .pvr = CPU_PPC_603E7v, | |
| 3443 | - .pvr_mask = 0xFFFFFFFF, | |
| 3444 | - .insns_flags = PPC_INSNS_603, | |
| 3445 | - .flags = PPC_FLAGS_603, | |
| 3446 | - .msr_mask = 0x000000000007FF73ULL, | |
| 3447 | - }, | |
| 3448 | - /* PowerPC 603e7v2 */ | |
| 3449 | - { | |
| 3450 | - .name = "603e7v2", | |
| 3451 | - .pvr = CPU_PPC_603E7v2, | |
| 3452 | - .pvr_mask = 0xFFFFFFFF, | |
| 3453 | - .insns_flags = PPC_INSNS_603, | |
| 3454 | - .flags = PPC_FLAGS_603, | |
| 3455 | - .msr_mask = 0x000000000007FF73ULL, | |
| 3456 | - }, | |
| 3457 | - /* PowerPC 603r */ | |
| 3458 | - { | |
| 3459 | - .name = "603r", | |
| 3460 | - .pvr = CPU_PPC_603R, | |
| 3461 | - .pvr_mask = 0xFFFFFFFF, | |
| 3462 | - .insns_flags = PPC_INSNS_603, | |
| 3463 | - .flags = PPC_FLAGS_603, | |
| 3464 | - .msr_mask = 0x000000000007FF73ULL, | |
| 3465 | - }, | |
| 3466 | - { | |
| 3467 | - .name = "Goldeneye", | |
| 3468 | - .pvr = CPU_PPC_603R, | |
| 3469 | - .pvr_mask = 0xFFFFFFFF, | |
| 3470 | - .insns_flags = PPC_INSNS_603, | |
| 3471 | - .flags = PPC_FLAGS_603, | |
| 3472 | - .msr_mask = 0x000000000007FF73ULL, | |
| 3473 | - }, | |
| 4873 | + /* POWER4 */ | |
| 4874 | + POWERPC_DEF("POWER4", CPU_POWERPC_POWER4, 0xFFFFFFFF, POWER4), | |
| 4875 | +#endif | |
| 3474 | 4876 | #if defined (TODO) |
| 3475 | - /* XXX: TODO: according to Motorola UM, this is a derivative to 603e */ | |
| 3476 | - { | |
| 3477 | - .name = "G2", | |
| 3478 | - .pvr = CPU_PPC_G2, | |
| 3479 | - .pvr_mask = 0xFFFFFFFF, | |
| 3480 | - .insns_flags = PPC_INSNS_G2, | |
| 3481 | - .flags = PPC_FLAGS_G2, | |
| 3482 | - .msr_mask = 0x000000000006FFF2ULL, | |
| 3483 | - }, | |
| 3484 | - { | |
| 3485 | - .name = "G2h4", | |
| 3486 | - .pvr = CPU_PPC_G2H4, | |
| 3487 | - .pvr_mask = 0xFFFFFFFF, | |
| 3488 | - .insns_flags = PPC_INSNS_G2, | |
| 3489 | - .flags = PPC_FLAGS_G2, | |
| 3490 | - .msr_mask = 0x000000000006FFF2ULL, | |
| 3491 | - }, | |
| 3492 | - { | |
| 3493 | - .name = "G2gp", | |
| 3494 | - .pvr = CPU_PPC_G2gp, | |
| 3495 | - .pvr_mask = 0xFFFFFFFF, | |
| 3496 | - .insns_flags = PPC_INSNS_G2, | |
| 3497 | - .flags = PPC_FLAGS_G2, | |
| 3498 | - .msr_mask = 0x000000000006FFF2ULL, | |
| 3499 | - }, | |
| 3500 | - { | |
| 3501 | - .name = "G2ls", | |
| 3502 | - .pvr = CPU_PPC_G2ls, | |
| 3503 | - .pvr_mask = 0xFFFFFFFF, | |
| 3504 | - .insns_flags = PPC_INSNS_G2, | |
| 3505 | - .flags = PPC_FLAGS_G2, | |
| 3506 | - .msr_mask = 0x000000000006FFF2ULL, | |
| 3507 | - }, | |
| 3508 | - { /* Same as G2, with LE mode support */ | |
| 3509 | - .name = "G2le", | |
| 3510 | - .pvr = CPU_PPC_G2LE, | |
| 3511 | - .pvr_mask = 0xFFFFFFFF, | |
| 3512 | - .insns_flags = PPC_INSNS_G2, | |
| 3513 | - .flags = PPC_FLAGS_G2, | |
| 3514 | - .msr_mask = 0x000000000007FFF3ULL, | |
| 3515 | - }, | |
| 3516 | - { | |
| 3517 | - .name = "G2legp", | |
| 3518 | - .pvr = CPU_PPC_G2LEgp, | |
| 3519 | - .pvr_mask = 0xFFFFFFFF, | |
| 3520 | - .insns_flags = PPC_INSNS_G2, | |
| 3521 | - .flags = PPC_FLAGS_G2, | |
| 3522 | - .msr_mask = 0x000000000007FFF3ULL, | |
| 3523 | - }, | |
| 3524 | - { | |
| 3525 | - .name = "G2lels", | |
| 3526 | - .pvr = CPU_PPC_G2LEls, | |
| 3527 | - .pvr_mask = 0xFFFFFFFF, | |
| 3528 | - .insns_flags = PPC_INSNS_G2, | |
| 3529 | - .flags = PPC_FLAGS_G2, | |
| 3530 | - .msr_mask = 0x000000000007FFF3ULL, | |
| 3531 | - }, | |
| 3532 | -#endif | |
| 3533 | - /* PowerPC 604 */ | |
| 3534 | - { | |
| 3535 | - .name = "604", | |
| 3536 | - .pvr = CPU_PPC_604, | |
| 3537 | - .pvr_mask = 0xFFFFFFFF, | |
| 3538 | - .insns_flags = PPC_INSNS_604, | |
| 3539 | - .flags = PPC_FLAGS_604, | |
| 3540 | - .msr_mask = 0x000000000005FF77ULL, | |
| 3541 | - }, | |
| 3542 | - /* PowerPC 604e */ | |
| 3543 | - { | |
| 3544 | - .name = "604e", | |
| 3545 | - .pvr = CPU_PPC_604E, | |
| 3546 | - .pvr_mask = 0xFFFFFFFF, | |
| 3547 | - .insns_flags = PPC_INSNS_604, | |
| 3548 | - .flags = PPC_FLAGS_604, | |
| 3549 | - .msr_mask = 0x000000000005FF77ULL, | |
| 3550 | - }, | |
| 3551 | - /* PowerPC 604r */ | |
| 3552 | - { | |
| 3553 | - .name = "604r", | |
| 3554 | - .pvr = CPU_PPC_604R, | |
| 3555 | - .pvr_mask = 0xFFFFFFFF, | |
| 3556 | - .insns_flags = PPC_INSNS_604, | |
| 3557 | - .flags = PPC_FLAGS_604, | |
| 3558 | - .msr_mask = 0x000000000005FF77ULL, | |
| 3559 | - }, | |
| 3560 | - /* generic G3 */ | |
| 3561 | - { | |
| 3562 | - .name = "G3", | |
| 3563 | - .pvr = CPU_PPC_74x, | |
| 3564 | - .pvr_mask = 0xFFFFFFFF, | |
| 3565 | - .insns_flags = PPC_INSNS_7x0, | |
| 3566 | - .flags = PPC_FLAGS_7x0, | |
| 3567 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3568 | - }, | |
| 3569 | - /* MPC740 (G3) */ | |
| 3570 | - { | |
| 3571 | - .name = "740", | |
| 3572 | - .pvr = CPU_PPC_74x, | |
| 3573 | - .pvr_mask = 0xFFFFFFFF, | |
| 3574 | - .insns_flags = PPC_INSNS_7x0, | |
| 3575 | - .flags = PPC_FLAGS_7x0, | |
| 3576 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3577 | - }, | |
| 3578 | - { | |
| 3579 | - .name = "Arthur", | |
| 3580 | - .pvr = CPU_PPC_74x, | |
| 3581 | - .pvr_mask = 0xFFFFFFFF, | |
| 3582 | - .insns_flags = PPC_INSNS_7x0, | |
| 3583 | - .flags = PPC_FLAGS_7x0, | |
| 3584 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3585 | - }, | |
| 3586 | - /* 740E (G3) */ | |
| 3587 | - { | |
| 3588 | - .name = "740e", | |
| 3589 | - .pvr = CPU_PPC_740E, | |
| 3590 | - .pvr_mask = 0xFFFFFFFF, | |
| 3591 | - .insns_flags = PPC_INSNS_7x0, | |
| 3592 | - .flags = PPC_FLAGS_7x0, | |
| 3593 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3594 | - }, | |
| 3595 | - /* MPC740P (G3) */ | |
| 3596 | - { | |
| 3597 | - .name = "740p", | |
| 3598 | - .pvr = CPU_PPC_74xP, | |
| 3599 | - .pvr_mask = 0xFFFFFFFF, | |
| 3600 | - .insns_flags = PPC_INSNS_7x0, | |
| 3601 | - .flags = PPC_FLAGS_7x0, | |
| 3602 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3603 | - }, | |
| 3604 | - { | |
| 3605 | - .name = "Conan/Doyle", | |
| 3606 | - .pvr = CPU_PPC_74xP, | |
| 3607 | - .pvr_mask = 0xFFFFFFFF, | |
| 3608 | - .insns_flags = PPC_INSNS_7x0, | |
| 3609 | - .flags = PPC_FLAGS_7x0, | |
| 3610 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3611 | - }, | |
| 4877 | + /* POWER4p */ | |
| 4878 | + POWERPC_DEF("POWER4+", CPU_POWERPC_POWER4P, 0xFFFFFFFF, POWER4P), | |
| 4879 | +#endif | |
| 3612 | 4880 | #if defined (TODO) |
| 3613 | - /* MPC745 (G3) */ | |
| 3614 | - { | |
| 3615 | - .name = "745", | |
| 3616 | - .pvr = CPU_PPC_74x, | |
| 3617 | - .pvr_mask = 0xFFFFFFFF, | |
| 3618 | - .insns_flags = PPC_INSNS_7x5, | |
| 3619 | - .flags = PPC_FLAGS_7x5, | |
| 3620 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3621 | - }, | |
| 3622 | - { | |
| 3623 | - .name = "Goldfinger", | |
| 3624 | - .pvr = CPU_PPC_74x, | |
| 3625 | - .pvr_mask = 0xFFFFFFFF, | |
| 3626 | - .insns_flags = PPC_INSNS_7x5, | |
| 3627 | - .flags = PPC_FLAGS_7x5, | |
| 3628 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3629 | - }, | |
| 4881 | + /* POWER5 */ | |
| 4882 | + POWERPC_DEF("POWER5", CPU_POWERPC_POWER5, 0xFFFFFFFF, POWER5), | |
| 4883 | + /* POWER5GR */ | |
| 4884 | + POWERPC_DEF("POWER5gr", CPU_POWERPC_POWER5GR, 0xFFFFFFFF, POWER5), | |
| 3630 | 4885 | #endif |
| 3631 | 4886 | #if defined (TODO) |
| 3632 | - /* MPC745P (G3) */ | |
| 3633 | - { | |
| 3634 | - .name = "745p", | |
| 3635 | - .pvr = CPU_PPC_74xP, | |
| 3636 | - .pvr_mask = 0xFFFFFFFF, | |
| 3637 | - .insns_flags = PPC_INSNS_7x5, | |
| 3638 | - .flags = PPC_FLAGS_7x5, | |
| 3639 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3640 | - }, | |
| 3641 | -#endif | |
| 3642 | - /* MPC750 (G3) */ | |
| 3643 | - { | |
| 3644 | - .name = "750", | |
| 3645 | - .pvr = CPU_PPC_74x, | |
| 3646 | - .pvr_mask = 0xFFFFFFFF, | |
| 3647 | - .insns_flags = PPC_INSNS_7x0, | |
| 3648 | - .flags = PPC_FLAGS_7x0, | |
| 3649 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3650 | - }, | |
| 3651 | - /* MPC750P (G3) */ | |
| 3652 | - { | |
| 3653 | - .name = "750p", | |
| 3654 | - .pvr = CPU_PPC_74xP, | |
| 3655 | - .pvr_mask = 0xFFFFFFFF, | |
| 3656 | - .insns_flags = PPC_INSNS_7x0, | |
| 3657 | - .flags = PPC_FLAGS_7x0, | |
| 3658 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3659 | - }, | |
| 3660 | - /* 750E (G3) */ | |
| 3661 | - { | |
| 3662 | - .name = "750e", | |
| 3663 | - .pvr = CPU_PPC_750E, | |
| 3664 | - .pvr_mask = 0xFFFFFFFF, | |
| 3665 | - .insns_flags = PPC_INSNS_7x0, | |
| 3666 | - .flags = PPC_FLAGS_7x0, | |
| 3667 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3668 | - }, | |
| 3669 | - /* IBM 750CXe (G3 embedded) */ | |
| 3670 | - { | |
| 3671 | - .name = "750cxe", | |
| 3672 | - .pvr = CPU_PPC_750CXE, | |
| 3673 | - .pvr_mask = 0xFFFFFFFF, | |
| 3674 | - .insns_flags = PPC_INSNS_7x0, | |
| 3675 | - .flags = PPC_FLAGS_7x0, | |
| 3676 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3677 | - }, | |
| 3678 | - /* IBM 750CXr (G3 embedded) */ | |
| 3679 | - { | |
| 3680 | - .name = "750cxr", | |
| 3681 | - .pvr = CPU_PPC_750CXR, | |
| 3682 | - .pvr_mask = 0xFFFFFFFF, | |
| 3683 | - .insns_flags = PPC_INSNS_7x0, | |
| 3684 | - .flags = PPC_FLAGS_7x0, | |
| 3685 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3686 | - }, | |
| 3687 | - /* IBM 750FX (G3 embedded) */ | |
| 3688 | - { | |
| 3689 | - .name = "750fx", | |
| 3690 | - .pvr = CPU_PPC_750FX, | |
| 3691 | - .pvr_mask = 0xFFFFFFFF, | |
| 3692 | - .insns_flags = PPC_INSNS_7x0, | |
| 3693 | - .flags = PPC_FLAGS_7x0, | |
| 3694 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3695 | - }, | |
| 3696 | - /* IBM 750FL (G3 embedded) */ | |
| 3697 | - { | |
| 3698 | - .name = "750fl", | |
| 3699 | - .pvr = CPU_PPC_750FL, | |
| 3700 | - .pvr_mask = 0xFFFFFFFF, | |
| 3701 | - .insns_flags = PPC_INSNS_7x0, | |
| 3702 | - .flags = PPC_FLAGS_7x0, | |
| 3703 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3704 | - }, | |
| 3705 | - /* IBM 750GX (G3 embedded) */ | |
| 3706 | - { | |
| 3707 | - .name = "750gx", | |
| 3708 | - .pvr = CPU_PPC_750GX, | |
| 3709 | - .pvr_mask = 0xFFFFFFFF, | |
| 3710 | - .insns_flags = PPC_INSNS_7x0, | |
| 3711 | - .flags = PPC_FLAGS_7x0, | |
| 3712 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3713 | - }, | |
| 3714 | - /* IBM 750L (G3 embedded) */ | |
| 3715 | - { | |
| 3716 | - .name = "750l", | |
| 3717 | - .pvr = CPU_PPC_750L, | |
| 3718 | - .pvr_mask = 0xFFFFFFFF, | |
| 3719 | - .insns_flags = PPC_INSNS_7x0, | |
| 3720 | - .flags = PPC_FLAGS_7x0, | |
| 3721 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3722 | - }, | |
| 3723 | - /* IBM 750CL (G3 embedded) */ | |
| 3724 | - { | |
| 3725 | - .name = "750cl", | |
| 3726 | - .pvr = CPU_PPC_750CL, | |
| 3727 | - .pvr_mask = 0xFFFFFFFF, | |
| 3728 | - .insns_flags = PPC_INSNS_7x0, | |
| 3729 | - .flags = PPC_FLAGS_7x0, | |
| 3730 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3731 | - }, | |
| 4887 | + /* POWER5+ */ | |
| 4888 | + POWERPC_DEF("POWER5+", CPU_POWERPC_POWER5P, 0xFFFFFFFF, POWER5P), | |
| 4889 | + /* POWER5GS */ | |
| 4890 | + POWERPC_DEF("POWER5gs", CPU_POWERPC_POWER5GS, 0xFFFFFFFF, POWER5P), | |
| 4891 | +#endif | |
| 3732 | 4892 | #if defined (TODO) |
| 3733 | - /* MPC755 (G3) */ | |
| 3734 | - { | |
| 3735 | - .name = "755", | |
| 3736 | - .pvr = CPU_PPC_755, | |
| 3737 | - .pvr_mask = 0xFFFFFFFF, | |
| 3738 | - .insns_flags = PPC_INSNS_7x5, | |
| 3739 | - .flags = PPC_FLAGS_7x5, | |
| 3740 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3741 | - }, | |
| 4893 | + /* POWER6 */ | |
| 4894 | + POWERPC_DEF("POWER6", CPU_POWERPC_POWER6, 0xFFFFFFFF, POWER6), | |
| 4895 | + /* POWER6 running in POWER5 mode */ | |
| 4896 | + POWERPC_DEF("POWER6_5", CPU_POWERPC_POWER6_5, 0xFFFFFFFF, POWER5), | |
| 4897 | + /* POWER6A */ | |
| 4898 | + POWERPC_DEF("POWER6A", CPU_POWERPC_POWER6A, 0xFFFFFFFF, POWER6), | |
| 3742 | 4899 | #endif |
| 3743 | 4900 | #if defined (TODO) |
| 3744 | - /* MPC755D (G3) */ | |
| 3745 | - { | |
| 3746 | - .name = "755d", | |
| 3747 | - .pvr = CPU_PPC_755D, | |
| 3748 | - .pvr_mask = 0xFFFFFFFF, | |
| 3749 | - .insns_flags = PPC_INSNS_7x5, | |
| 3750 | - .flags = PPC_FLAGS_7x5, | |
| 3751 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3752 | - }, | |
| 4901 | + /* PowerPC 970 */ | |
| 4902 | + POWERPC_DEF("970", CPU_POWERPC_970, 0xFFFFFFFF, 970), | |
| 3753 | 4903 | #endif |
| 3754 | 4904 | #if defined (TODO) |
| 3755 | - /* MPC755E (G3) */ | |
| 3756 | - { | |
| 3757 | - .name = "755e", | |
| 3758 | - .pvr = CPU_PPC_755E, | |
| 3759 | - .pvr_mask = 0xFFFFFFFF, | |
| 3760 | - .insns_flags = PPC_INSNS_7x5, | |
| 3761 | - .flags = PPC_FLAGS_7x5, | |
| 3762 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3763 | - }, | |
| 4905 | + /* PowerPC 970FX (G5) */ | |
| 4906 | + POWERPC_DEF("970fx", CPU_POWERPC_970FX, 0xFFFFFFFF, 970FX), | |
| 3764 | 4907 | #endif |
| 3765 | 4908 | #if defined (TODO) |
| 3766 | - /* MPC755P (G3) */ | |
| 3767 | - { | |
| 3768 | - .name = "755p", | |
| 3769 | - .pvr = CPU_PPC_74xP, | |
| 3770 | - .pvr_mask = 0xFFFFFFFF, | |
| 3771 | - .insns_flags = PPC_INSNS_7x5, | |
| 3772 | - .flags = PPC_FLAGS_7x5, | |
| 3773 | - .msr_mask = 0x000000000007FF77ULL, | |
| 3774 | - }, | |
| 4909 | + /* PowerPC 970FX v1.0 (G5) */ | |
| 4910 | + POWERPC_DEF("970fx1.0", CPU_POWERPC_970FX_v10, 0xFFFFFFFF, 970FX), | |
| 3775 | 4911 | #endif |
| 3776 | 4912 | #if defined (TODO) |
| 3777 | - /* generic G4 */ | |
| 3778 | - { | |
| 3779 | - .name = "G4", | |
| 3780 | - .pvr = CPU_PPC_7400, | |
| 3781 | - .pvr_mask = 0xFFFFFFFF, | |
| 3782 | - .insns_flags = PPC_INSNS_74xx, | |
| 3783 | - .flags = PPC_FLAGS_74xx, | |
| 3784 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3785 | - }, | |
| 4913 | + /* PowerPC 970FX v2.0 (G5) */ | |
| 4914 | + POWERPC_DEF("970fx2.0", CPU_POWERPC_970FX_v20, 0xFFFFFFFF, 970FX), | |
| 3786 | 4915 | #endif |
| 3787 | 4916 | #if defined (TODO) |
| 3788 | - /* PowerPC 7400 (G4) */ | |
| 3789 | - { | |
| 3790 | - .name = "7400", | |
| 3791 | - .pvr = CPU_PPC_7400, | |
| 3792 | - .pvr_mask = 0xFFFFFFFF, | |
| 3793 | - .insns_flags = PPC_INSNS_74xx, | |
| 3794 | - .flags = PPC_FLAGS_74xx, | |
| 3795 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3796 | - }, | |
| 3797 | - { | |
| 3798 | - .name = "Max", | |
| 3799 | - .pvr = CPU_PPC_7400, | |
| 3800 | - .pvr_mask = 0xFFFFFFFF, | |
| 3801 | - .insns_flags = PPC_INSNS_74xx, | |
| 3802 | - .flags = PPC_FLAGS_74xx, | |
| 3803 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3804 | - }, | |
| 4917 | + /* PowerPC 970FX v2.1 (G5) */ | |
| 4918 | + POWERPC_DEF("970fx2.1", CPU_POWERPC_970FX_v21, 0xFFFFFFFF, 970FX), | |
| 3805 | 4919 | #endif |
| 3806 | 4920 | #if defined (TODO) |
| 3807 | - /* PowerPC 7410 (G4) */ | |
| 3808 | - { | |
| 3809 | - .name = "7410", | |
| 3810 | - .pvr = CPU_PPC_7410, | |
| 3811 | - .pvr_mask = 0xFFFFFFFF, | |
| 3812 | - .insns_flags = PPC_INSNS_74xx, | |
| 3813 | - .flags = PPC_FLAGS_74xx, | |
| 3814 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3815 | - }, | |
| 3816 | - { | |
| 3817 | - .name = "Nitro", | |
| 3818 | - .pvr = CPU_PPC_7410, | |
| 3819 | - .pvr_mask = 0xFFFFFFFF, | |
| 3820 | - .insns_flags = PPC_INSNS_74xx, | |
| 3821 | - .flags = PPC_FLAGS_74xx, | |
| 3822 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3823 | - }, | |
| 4921 | + /* PowerPC 970FX v3.0 (G5) */ | |
| 4922 | + POWERPC_DEF("970fx3.0", CPU_POWERPC_970FX_v30, 0xFFFFFFFF, 970FX), | |
| 3824 | 4923 | #endif |
| 3825 | 4924 | #if defined (TODO) |
| 3826 | - /* PowerPC 7441 (G4) */ | |
| 3827 | - { | |
| 3828 | - .name = "7441", | |
| 3829 | - .pvr = CPU_PPC_7441, | |
| 3830 | - .pvr_mask = 0xFFFFFFFF, | |
| 3831 | - .insns_flags = PPC_INSNS_74xx, | |
| 3832 | - .flags = PPC_FLAGS_74xx, | |
| 3833 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3834 | - }, | |
| 4925 | + /* PowerPC 970FX v3.1 (G5) */ | |
| 4926 | + POWERPC_DEF("970fx3.1", CPU_POWERPC_970FX_v31, 0xFFFFFFFF, 970FX), | |
| 3835 | 4927 | #endif |
| 3836 | 4928 | #if defined (TODO) |
| 3837 | - /* PowerPC 7445 (G4) */ | |
| 3838 | - { | |
| 3839 | - .name = "7445", | |
| 3840 | - .pvr = CPU_PPC_7445, | |
| 3841 | - .pvr_mask = 0xFFFFFFFF, | |
| 3842 | - .insns_flags = PPC_INSNS_74xx, | |
| 3843 | - .flags = PPC_FLAGS_74xx, | |
| 3844 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3845 | - }, | |
| 4929 | + /* PowerPC 970GX (G5) */ | |
| 4930 | + POWERPC_DEF("970gx", CPU_POWERPC_970GX, 0xFFFFFFFF, 970GX), | |
| 3846 | 4931 | #endif |
| 3847 | 4932 | #if defined (TODO) |
| 3848 | - /* PowerPC 7447 (G4) */ | |
| 3849 | - { | |
| 3850 | - .name = "7447", | |
| 3851 | - .pvr = CPU_PPC_7447, | |
| 3852 | - .pvr_mask = 0xFFFFFFFF, | |
| 3853 | - .insns_flags = PPC_INSNS_74xx, | |
| 3854 | - .flags = PPC_FLAGS_74xx, | |
| 3855 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3856 | - }, | |
| 4933 | + /* PowerPC 970MP */ | |
| 4934 | + POWERPC_DEF("970mp", CPU_POWERPC_970MP, 0xFFFFFFFF, 970), | |
| 3857 | 4935 | #endif |
| 3858 | 4936 | #if defined (TODO) |
| 3859 | - /* PowerPC 7447A (G4) */ | |
| 3860 | - { | |
| 3861 | - .name = "7447A", | |
| 3862 | - .pvr = CPU_PPC_7447A, | |
| 3863 | - .pvr_mask = 0xFFFFFFFF, | |
| 3864 | - .insns_flags = PPC_INSNS_74xx, | |
| 3865 | - .flags = PPC_FLAGS_74xx, | |
| 3866 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3867 | - }, | |
| 4937 | + /* PowerPC 970MP v1.0 */ | |
| 4938 | + POWERPC_DEF("970mp1.0", CPU_POWERPC_970MP_v10, 0xFFFFFFFF, 970), | |
| 3868 | 4939 | #endif |
| 3869 | 4940 | #if defined (TODO) |
| 3870 | - /* PowerPC 7448 (G4) */ | |
| 3871 | - { | |
| 3872 | - .name = "7448", | |
| 3873 | - .pvr = CPU_PPC_7448, | |
| 3874 | - .pvr_mask = 0xFFFFFFFF, | |
| 3875 | - .insns_flags = PPC_INSNS_74xx, | |
| 3876 | - .flags = PPC_FLAGS_74xx, | |
| 3877 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3878 | - }, | |
| 4941 | + /* PowerPC 970MP v1.1 */ | |
| 4942 | + POWERPC_DEF("970mp1.1", CPU_POWERPC_970MP_v11, 0xFFFFFFFF, 970), | |
| 3879 | 4943 | #endif |
| 3880 | 4944 | #if defined (TODO) |
| 3881 | - /* PowerPC 7450 (G4) */ | |
| 3882 | - { | |
| 3883 | - .name = "7450", | |
| 3884 | - .pvr = CPU_PPC_7450, | |
| 3885 | - .pvr_mask = 0xFFFFFFFF, | |
| 3886 | - .insns_flags = PPC_INSNS_74xx, | |
| 3887 | - .flags = PPC_FLAGS_74xx, | |
| 3888 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3889 | - }, | |
| 3890 | - { | |
| 3891 | - .name = "Vger", | |
| 3892 | - .pvr = CPU_PPC_7450, | |
| 3893 | - .pvr_mask = 0xFFFFFFFF, | |
| 3894 | - .insns_flags = PPC_INSNS_74xx, | |
| 3895 | - .flags = PPC_FLAGS_74xx, | |
| 3896 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3897 | - }, | |
| 4945 | + /* PowerPC Cell */ | |
| 4946 | + POWERPC_DEF("Cell", CPU_POWERPC_CELL, 0xFFFFFFFF, 970), | |
| 3898 | 4947 | #endif |
| 3899 | 4948 | #if defined (TODO) |
| 3900 | - /* PowerPC 7450b (G4) */ | |
| 3901 | - { | |
| 3902 | - .name = "7450b", | |
| 3903 | - .pvr = CPU_PPC_7450B, | |
| 3904 | - .pvr_mask = 0xFFFFFFFF, | |
| 3905 | - .insns_flags = PPC_INSNS_74xx, | |
| 3906 | - .flags = PPC_FLAGS_74xx, | |
| 3907 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3908 | - }, | |
| 4949 | + /* PowerPC Cell v1.0 */ | |
| 4950 | + POWERPC_DEF("Cell1.0", CPU_POWERPC_CELL_v10, 0xFFFFFFFF, 970), | |
| 3909 | 4951 | #endif |
| 3910 | 4952 | #if defined (TODO) |
| 3911 | - /* PowerPC 7451 (G4) */ | |
| 3912 | - { | |
| 3913 | - .name = "7451", | |
| 3914 | - .pvr = CPU_PPC_7451, | |
| 3915 | - .pvr_mask = 0xFFFFFFFF, | |
| 3916 | - .insns_flags = PPC_INSNS_74xx, | |
| 3917 | - .flags = PPC_FLAGS_74xx, | |
| 3918 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3919 | - }, | |
| 4953 | + /* PowerPC Cell v2.0 */ | |
| 4954 | + POWERPC_DEF("Cell2.0", CPU_POWERPC_CELL_v20, 0xFFFFFFFF, 970), | |
| 3920 | 4955 | #endif |
| 3921 | 4956 | #if defined (TODO) |
| 3922 | - /* PowerPC 7451g (G4) */ | |
| 3923 | - { | |
| 3924 | - .name = "7451g", | |
| 3925 | - .pvr = CPU_PPC_7451G, | |
| 3926 | - .pvr_mask = 0xFFFFFFFF, | |
| 3927 | - .insns_flags = PPC_INSNS_74xx, | |
| 3928 | - .flags = PPC_FLAGS_74xx, | |
| 3929 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3930 | - }, | |
| 4957 | + /* PowerPC Cell v3.0 */ | |
| 4958 | + POWERPC_DEF("Cell3.0", CPU_POWERPC_CELL_v30, 0xFFFFFFFF, 970), | |
| 3931 | 4959 | #endif |
| 3932 | 4960 | #if defined (TODO) |
| 3933 | - /* PowerPC 7455 (G4) */ | |
| 3934 | - { | |
| 3935 | - .name = "7455", | |
| 3936 | - .pvr = CPU_PPC_7455, | |
| 3937 | - .pvr_mask = 0xFFFFFFFF, | |
| 3938 | - .insns_flags = PPC_INSNS_74xx, | |
| 3939 | - .flags = PPC_FLAGS_74xx, | |
| 3940 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3941 | - }, | |
| 3942 | - { | |
| 3943 | - .name = "Apollo 6", | |
| 3944 | - .pvr = CPU_PPC_7455, | |
| 3945 | - .pvr_mask = 0xFFFFFFFF, | |
| 3946 | - .insns_flags = PPC_INSNS_74xx, | |
| 3947 | - .flags = PPC_FLAGS_74xx, | |
| 3948 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3949 | - }, | |
| 4961 | + /* PowerPC Cell v3.1 */ | |
| 4962 | + POWERPC_DEF("Cell3.1", CPU_POWERPC_CELL_v31, 0xFFFFFFFF, 970), | |
| 3950 | 4963 | #endif |
| 3951 | 4964 | #if defined (TODO) |
| 3952 | - /* PowerPC 7455F (G4) */ | |
| 3953 | - { | |
| 3954 | - .name = "7455f", | |
| 3955 | - .pvr = CPU_PPC_7455F, | |
| 3956 | - .pvr_mask = 0xFFFFFFFF, | |
| 3957 | - .insns_flags = PPC_INSNS_74xx, | |
| 3958 | - .flags = PPC_FLAGS_74xx, | |
| 3959 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3960 | - }, | |
| 4965 | + /* PowerPC Cell v3.2 */ | |
| 4966 | + POWERPC_DEF("Cell3.2", CPU_POWERPC_CELL_v32, 0xFFFFFFFF, 970), | |
| 3961 | 4967 | #endif |
| 3962 | 4968 | #if defined (TODO) |
| 3963 | - /* PowerPC 7455G (G4) */ | |
| 3964 | - { | |
| 3965 | - .name = "7455g", | |
| 3966 | - .pvr = CPU_PPC_7455G, | |
| 3967 | - .pvr_mask = 0xFFFFFFFF, | |
| 3968 | - .insns_flags = PPC_INSNS_74xx, | |
| 3969 | - .flags = PPC_FLAGS_74xx, | |
| 3970 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3971 | - }, | |
| 4969 | + /* RS64 (Apache/A35) */ | |
| 4970 | + /* This one seems to support the whole POWER2 instruction set | |
| 4971 | + * and the PowerPC 64 one. | |
| 4972 | + */ | |
| 4973 | + /* What about A10 & A30 ? */ | |
| 4974 | + POWERPC_DEF("RS64", CPU_POWERPC_RS64, 0xFFFFFFFF, RS64), | |
| 4975 | + POWERPC_DEF("Apache", CPU_POWERPC_RS64, 0xFFFFFFFF, RS64), | |
| 4976 | + POWERPC_DEF("A35", CPU_POWERPC_RS64, 0xFFFFFFFF, RS64), | |
| 3972 | 4977 | #endif |
| 3973 | 4978 | #if defined (TODO) |
| 3974 | - /* PowerPC 7457 (G4) */ | |
| 3975 | - { | |
| 3976 | - .name = "7457", | |
| 3977 | - .pvr = CPU_PPC_7457, | |
| 3978 | - .pvr_mask = 0xFFFFFFFF, | |
| 3979 | - .insns_flags = PPC_INSNS_74xx, | |
| 3980 | - .flags = PPC_FLAGS_74xx, | |
| 3981 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3982 | - }, | |
| 3983 | - { | |
| 3984 | - .name = "Apollo 7", | |
| 3985 | - .pvr = CPU_PPC_7457, | |
| 3986 | - .pvr_mask = 0xFFFFFFFF, | |
| 3987 | - .insns_flags = PPC_INSNS_74xx, | |
| 3988 | - .flags = PPC_FLAGS_74xx, | |
| 3989 | - .msr_mask = 0x000000000205FF77ULL, | |
| 3990 | - }, | |
| 4979 | + /* RS64-II (NorthStar/A50) */ | |
| 4980 | + POWERPC_DEF("RS64-II", CPU_POWERPC_RS64II, 0xFFFFFFFF, RS64), | |
| 4981 | + POWERPC_DEF("NorthStar", CPU_POWERPC_RS64II, 0xFFFFFFFF, RS64), | |
| 4982 | + POWERPC_DEF("A50", CPU_POWERPC_RS64II, 0xFFFFFFFF, RS64), | |
| 3991 | 4983 | #endif |
| 3992 | 4984 | #if defined (TODO) |
| 3993 | - /* PowerPC 7457A (G4) */ | |
| 3994 | - { | |
| 3995 | - .name = "7457A", | |
| 3996 | - .pvr = CPU_PPC_7457A, | |
| 3997 | - .pvr_mask = 0xFFFFFFFF, | |
| 3998 | - .insns_flags = PPC_INSNS_74xx, | |
| 3999 | - .flags = PPC_FLAGS_74xx, | |
| 4000 | - .msr_mask = 0x000000000205FF77ULL, | |
| 4001 | - }, | |
| 4002 | - { | |
| 4003 | - .name = "Apollo 7 PM", | |
| 4004 | - .pvr = CPU_PPC_7457A, | |
| 4005 | - .pvr_mask = 0xFFFFFFFF, | |
| 4006 | - .insns_flags = PPC_INSNS_74xx, | |
| 4007 | - .flags = PPC_FLAGS_74xx, | |
| 4008 | - .msr_mask = 0x000000000205FF77ULL, | |
| 4009 | - }, | |
| 4985 | + /* RS64-III (Pulsar) */ | |
| 4986 | + POWERPC_DEF("RS64-III", CPU_POWERPC_RS64III, 0xFFFFFFFF, RS64), | |
| 4987 | + POWERPC_DEF("Pulsar", CPU_POWERPC_RS64III, 0xFFFFFFFF, RS64), | |
| 4010 | 4988 | #endif |
| 4011 | 4989 | #if defined (TODO) |
| 4012 | - /* PowerPC 7457C (G4) */ | |
| 4013 | - { | |
| 4014 | - .name = "7457c", | |
| 4015 | - .pvr = CPU_PPC_7457C, | |
| 4016 | - .pvr_mask = 0xFFFFFFFF, | |
| 4017 | - .insns_flags = PPC_INSNS_74xx, | |
| 4018 | - .flags = PPC_FLAGS_74xx, | |
| 4019 | - .msr_mask = 0x000000000205FF77ULL, | |
| 4020 | - }, | |
| 4990 | + /* RS64-IV (IceStar/IStar/SStar) */ | |
| 4991 | + POWERPC_DEF("RS64-IV", CPU_POWERPC_RS64IV, 0xFFFFFFFF, RS64), | |
| 4992 | + POWERPC_DEF("IceStar", CPU_POWERPC_RS64IV, 0xFFFFFFFF, RS64), | |
| 4993 | + POWERPC_DEF("IStar", CPU_POWERPC_RS64IV, 0xFFFFFFFF, RS64), | |
| 4994 | + POWERPC_DEF("SStar", CPU_POWERPC_RS64IV, 0xFFFFFFFF, RS64), | |
| 4021 | 4995 | #endif |
| 4022 | - /* 64 bits PowerPC */ | |
| 4023 | -#if defined (TARGET_PPC64) | |
| 4996 | +#endif /* defined (TARGET_PPC64) */ | |
| 4997 | + /* POWER */ | |
| 4024 | 4998 | #if defined (TODO) |
| 4025 | - /* PowerPC 620 */ | |
| 4026 | - { | |
| 4027 | - .name = "620", | |
| 4028 | - .pvr = CPU_PPC_620, | |
| 4029 | - .pvr_mask = 0xFFFFFFFF, | |
| 4030 | - .insns_flags = PPC_INSNS_620, | |
| 4031 | - .flags = PPC_FLAGS_620, | |
| 4032 | - .msr_mask = 0x800000000005FF73ULL, | |
| 4033 | - }, | |
| 4999 | + /* Original POWER */ | |
| 5000 | + POWERPC_DEF("POWER", CPU_POWERPC_POWER, 0xFFFFFFFF, POWER), | |
| 5001 | + POWERPC_DEF("RIOS", CPU_POWERPC_POWER, 0xFFFFFFFF, POWER), | |
| 5002 | + POWERPC_DEF("RSC", CPU_POWERPC_POWER, 0xFFFFFFFF, POWER), | |
| 5003 | + POWERPC_DEF("RSC3308", CPU_POWERPC_POWER, 0xFFFFFFFF, POWER), | |
| 5004 | + POWERPC_DEF("RSC4608", CPU_POWERPC_POWER, 0xFFFFFFFF, POWER), | |
| 4034 | 5005 | #endif |
| 4035 | 5006 | #if defined (TODO) |
| 4036 | - /* PowerPC 630 (POWER3) */ | |
| 4037 | - { | |
| 4038 | - .name = "630", | |
| 4039 | - .pvr = CPU_PPC_630, | |
| 4040 | - .pvr_mask = 0xFFFFFFFF, | |
| 4041 | - .insns_flags = PPC_INSNS_630, | |
| 4042 | - .flags = PPC_FLAGS_630, | |
| 4043 | - .msr_mask = xxx, | |
| 5007 | + /* POWER2 */ | |
| 5008 | + POWERPC_DEF("POWER2", CPU_POWERPC_POWER2, 0xFFFFFFFF, POWER), | |
| 5009 | + POWERPC_DEF("RSC2", CPU_POWERPC_POWER2, 0xFFFFFFFF, POWER), | |
| 5010 | + POWERPC_DEF("P2SC", CPU_POWERPC_POWER2, 0xFFFFFFFF, POWER), | |
| 5011 | +#endif | |
| 5012 | + /* PA semi cores */ | |
| 5013 | +#if defined (TODO) | |
| 5014 | + /* PA PA6T */ | |
| 5015 | + POWERPC_DEF("PA6T", CPU_POWERPC_PA6T, 0xFFFFFFFF, PA6T), | |
| 5016 | +#endif | |
| 5017 | + /* Generic PowerPCs */ | |
| 5018 | +#if defined (TARGET_PPC64) | |
| 5019 | +#if defined (TODO) | |
| 5020 | + POWERPC_DEF("ppc64", CPU_POWERPC_PPC64, 0xFFFFFFFF, PPC64), | |
| 5021 | +#endif | |
| 5022 | +#endif | |
| 5023 | + POWERPC_DEF("ppc32", CPU_POWERPC_PPC32, 0xFFFFFFFF, PPC32), | |
| 5024 | + /* Fallback */ | |
| 5025 | + POWERPC_DEF("ppc", CPU_POWERPC_PPC, 0xFFFFFFFF, PPC), | |
| 5026 | +}; | |
| 5027 | + | |
| 5028 | +/*****************************************************************************/ | |
| 5029 | +/* Generic CPU instanciation routine */ | |
| 5030 | +static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) | |
| 5031 | +{ | |
| 5032 | +#if !defined(CONFIG_USER_ONLY) | |
| 5033 | + env->irq_inputs = NULL; | |
| 5034 | +#endif | |
| 5035 | + /* Default MMU definitions */ | |
| 5036 | + env->nb_BATs = 0; | |
| 5037 | + env->nb_tlb = 0; | |
| 5038 | + env->nb_ways = 0; | |
| 5039 | + /* Register SPR common to all PowerPC implementations */ | |
| 5040 | + gen_spr_generic(env); | |
| 5041 | + spr_register(env, SPR_PVR, "PVR", | |
| 5042 | + SPR_NOACCESS, SPR_NOACCESS, | |
| 5043 | + &spr_read_generic, SPR_NOACCESS, | |
| 5044 | + def->pvr); | |
| 5045 | + /* PowerPC implementation specific initialisations (SPRs, timers, ...) */ | |
| 5046 | + (*def->init_proc)(env); | |
| 5047 | + /* Allocate TLBs buffer when needed */ | |
| 5048 | + if (env->nb_tlb != 0) { | |
| 5049 | + int nb_tlb = env->nb_tlb; | |
| 5050 | + if (env->id_tlbs != 0) | |
| 5051 | + nb_tlb *= 2; | |
| 5052 | + env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t)); | |
| 5053 | + /* Pre-compute some useful values */ | |
| 5054 | + env->tlb_per_way = env->nb_tlb / env->nb_ways; | |
| 5055 | + } | |
| 5056 | +#if !defined(CONFIG_USER_ONLY) | |
| 5057 | + if (env->irq_inputs == NULL) { | |
| 5058 | + fprintf(stderr, "WARNING: no internal IRQ controller registered.\n" | |
| 5059 | + " Attempt Qemu to crash very soon !\n"); | |
| 5060 | + } | |
| 5061 | +#endif | |
| 5062 | +} | |
| 5063 | + | |
| 5064 | +#if defined(PPC_DUMP_CPU) | |
| 5065 | +static void dump_ppc_sprs (CPUPPCState *env) | |
| 5066 | +{ | |
| 5067 | + ppc_spr_t *spr; | |
| 5068 | +#if !defined(CONFIG_USER_ONLY) | |
| 5069 | + uint32_t sr, sw; | |
| 5070 | +#endif | |
| 5071 | + uint32_t ur, uw; | |
| 5072 | + int i, j, n; | |
| 5073 | + | |
| 5074 | + printf("Special purpose registers:\n"); | |
| 5075 | + for (i = 0; i < 32; i++) { | |
| 5076 | + for (j = 0; j < 32; j++) { | |
| 5077 | + n = (i << 5) | j; | |
| 5078 | + spr = &env->spr_cb[n]; | |
| 5079 | + uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS; | |
| 5080 | + ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS; | |
| 5081 | +#if !defined(CONFIG_USER_ONLY) | |
| 5082 | + sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS; | |
| 5083 | + sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS; | |
| 5084 | + if (sw || sr || uw || ur) { | |
| 5085 | + printf("SPR: %4d (%03x) %-8s s%c%c u%c%c\n", | |
| 5086 | + (i << 5) | j, (i << 5) | j, spr->name, | |
| 5087 | + sw ? 'w' : '-', sr ? 'r' : '-', | |
| 5088 | + uw ? 'w' : '-', ur ? 'r' : '-'); | |
| 5089 | + } | |
| 5090 | +#else | |
| 5091 | + if (uw || ur) { | |
| 5092 | + printf("SPR: %4d (%03x) %-8s u%c%c\n", | |
| 5093 | + (i << 5) | j, (i << 5) | j, spr->name, | |
| 5094 | + uw ? 'w' : '-', ur ? 'r' : '-'); | |
| 5095 | + } | |
| 5096 | +#endif | |
| 5097 | + } | |
| 5098 | + } | |
| 5099 | + fflush(stdout); | |
| 5100 | + fflush(stderr); | |
| 5101 | +} | |
| 5102 | +#endif | |
| 5103 | + | |
| 5104 | +/*****************************************************************************/ | |
| 5105 | +#include <stdlib.h> | |
| 5106 | +#include <string.h> | |
| 5107 | + | |
| 5108 | +int fflush (FILE *stream); | |
| 5109 | + | |
| 5110 | +/* Opcode types */ | |
| 5111 | +enum { | |
| 5112 | + PPC_DIRECT = 0, /* Opcode routine */ | |
| 5113 | + PPC_INDIRECT = 1, /* Indirect opcode table */ | |
| 5114 | +}; | |
| 5115 | + | |
| 5116 | +static inline int is_indirect_opcode (void *handler) | |
| 5117 | +{ | |
| 5118 | + return ((unsigned long)handler & 0x03) == PPC_INDIRECT; | |
| 5119 | +} | |
| 5120 | + | |
| 5121 | +static inline opc_handler_t **ind_table(void *handler) | |
| 5122 | +{ | |
| 5123 | + return (opc_handler_t **)((unsigned long)handler & ~3); | |
| 5124 | +} | |
| 5125 | + | |
| 5126 | +/* Instruction table creation */ | |
| 5127 | +/* Opcodes tables creation */ | |
| 5128 | +static void fill_new_table (opc_handler_t **table, int len) | |
| 5129 | +{ | |
| 5130 | + int i; | |
| 5131 | + | |
| 5132 | + for (i = 0; i < len; i++) | |
| 5133 | + table[i] = &invalid_handler; | |
| 5134 | +} | |
| 5135 | + | |
| 5136 | +static int create_new_table (opc_handler_t **table, unsigned char idx) | |
| 5137 | +{ | |
| 5138 | + opc_handler_t **tmp; | |
| 5139 | + | |
| 5140 | + tmp = malloc(0x20 * sizeof(opc_handler_t)); | |
| 5141 | + if (tmp == NULL) | |
| 5142 | + return -1; | |
| 5143 | + fill_new_table(tmp, 0x20); | |
| 5144 | + table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT); | |
| 5145 | + | |
| 5146 | + return 0; | |
| 5147 | +} | |
| 5148 | + | |
| 5149 | +static int insert_in_table (opc_handler_t **table, unsigned char idx, | |
| 5150 | + opc_handler_t *handler) | |
| 5151 | +{ | |
| 5152 | + if (table[idx] != &invalid_handler) | |
| 5153 | + return -1; | |
| 5154 | + table[idx] = handler; | |
| 5155 | + | |
| 5156 | + return 0; | |
| 5157 | +} | |
| 5158 | + | |
| 5159 | +static int register_direct_insn (opc_handler_t **ppc_opcodes, | |
| 5160 | + unsigned char idx, opc_handler_t *handler) | |
| 5161 | +{ | |
| 5162 | + if (insert_in_table(ppc_opcodes, idx, handler) < 0) { | |
| 5163 | + printf("*** ERROR: opcode %02x already assigned in main " | |
| 5164 | + "opcode table\n", idx); | |
| 5165 | + return -1; | |
| 5166 | + } | |
| 5167 | + | |
| 5168 | + return 0; | |
| 5169 | +} | |
| 5170 | + | |
| 5171 | +static int register_ind_in_table (opc_handler_t **table, | |
| 5172 | + unsigned char idx1, unsigned char idx2, | |
| 5173 | + opc_handler_t *handler) | |
| 5174 | +{ | |
| 5175 | + if (table[idx1] == &invalid_handler) { | |
| 5176 | + if (create_new_table(table, idx1) < 0) { | |
| 5177 | + printf("*** ERROR: unable to create indirect table " | |
| 5178 | + "idx=%02x\n", idx1); | |
| 5179 | + return -1; | |
| 5180 | + } | |
| 5181 | + } else { | |
| 5182 | + if (!is_indirect_opcode(table[idx1])) { | |
| 5183 | + printf("*** ERROR: idx %02x already assigned to a direct " | |
| 5184 | + "opcode\n", idx1); | |
| 5185 | + return -1; | |
| 5186 | + } | |
| 4044 | 5187 | } |
| 4045 | - { | |
| 4046 | - .name = "POWER3", | |
| 4047 | - .pvr = CPU_PPC_630, | |
| 4048 | - .pvr_mask = 0xFFFFFFFF, | |
| 4049 | - .insns_flags = PPC_INSNS_630, | |
| 4050 | - .flags = PPC_FLAGS_630, | |
| 4051 | - .msr_mask = xxx, | |
| 5188 | + if (handler != NULL && | |
| 5189 | + insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) { | |
| 5190 | + printf("*** ERROR: opcode %02x already assigned in " | |
| 5191 | + "opcode table %02x\n", idx2, idx1); | |
| 5192 | + return -1; | |
| 4052 | 5193 | } |
| 5194 | + | |
| 5195 | + return 0; | |
| 5196 | +} | |
| 5197 | + | |
| 5198 | +static int register_ind_insn (opc_handler_t **ppc_opcodes, | |
| 5199 | + unsigned char idx1, unsigned char idx2, | |
| 5200 | + opc_handler_t *handler) | |
| 5201 | +{ | |
| 5202 | + int ret; | |
| 5203 | + | |
| 5204 | + ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler); | |
| 5205 | + | |
| 5206 | + return ret; | |
| 5207 | +} | |
| 5208 | + | |
| 5209 | +static int register_dblind_insn (opc_handler_t **ppc_opcodes, | |
| 5210 | + unsigned char idx1, unsigned char idx2, | |
| 5211 | + unsigned char idx3, opc_handler_t *handler) | |
| 5212 | +{ | |
| 5213 | + if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) { | |
| 5214 | + printf("*** ERROR: unable to join indirect table idx " | |
| 5215 | + "[%02x-%02x]\n", idx1, idx2); | |
| 5216 | + return -1; | |
| 5217 | + } | |
| 5218 | + if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3, | |
| 5219 | + handler) < 0) { | |
| 5220 | + printf("*** ERROR: unable to insert opcode " | |
| 5221 | + "[%02x-%02x-%02x]\n", idx1, idx2, idx3); | |
| 5222 | + return -1; | |
| 5223 | + } | |
| 5224 | + | |
| 5225 | + return 0; | |
| 5226 | +} | |
| 5227 | + | |
| 5228 | +static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn) | |
| 5229 | +{ | |
| 5230 | + if (insn->opc2 != 0xFF) { | |
| 5231 | + if (insn->opc3 != 0xFF) { | |
| 5232 | + if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2, | |
| 5233 | + insn->opc3, &insn->handler) < 0) | |
| 5234 | + return -1; | |
| 5235 | + } else { | |
| 5236 | + if (register_ind_insn(ppc_opcodes, insn->opc1, | |
| 5237 | + insn->opc2, &insn->handler) < 0) | |
| 5238 | + return -1; | |
| 5239 | + } | |
| 5240 | + } else { | |
| 5241 | + if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0) | |
| 5242 | + return -1; | |
| 5243 | + } | |
| 5244 | + | |
| 5245 | + return 0; | |
| 5246 | +} | |
| 5247 | + | |
| 5248 | +static int test_opcode_table (opc_handler_t **table, int len) | |
| 5249 | +{ | |
| 5250 | + int i, count, tmp; | |
| 5251 | + | |
| 5252 | + for (i = 0, count = 0; i < len; i++) { | |
| 5253 | + /* Consistency fixup */ | |
| 5254 | + if (table[i] == NULL) | |
| 5255 | + table[i] = &invalid_handler; | |
| 5256 | + if (table[i] != &invalid_handler) { | |
| 5257 | + if (is_indirect_opcode(table[i])) { | |
| 5258 | + tmp = test_opcode_table(ind_table(table[i]), 0x20); | |
| 5259 | + if (tmp == 0) { | |
| 5260 | + free(table[i]); | |
| 5261 | + table[i] = &invalid_handler; | |
| 5262 | + } else { | |
| 5263 | + count++; | |
| 5264 | + } | |
| 5265 | + } else { | |
| 5266 | + count++; | |
| 5267 | + } | |
| 5268 | + } | |
| 5269 | + } | |
| 5270 | + | |
| 5271 | + return count; | |
| 5272 | +} | |
| 5273 | + | |
| 5274 | +static void fix_opcode_tables (opc_handler_t **ppc_opcodes) | |
| 5275 | +{ | |
| 5276 | + if (test_opcode_table(ppc_opcodes, 0x40) == 0) | |
| 5277 | + printf("*** WARNING: no opcode defined !\n"); | |
| 5278 | +} | |
| 5279 | + | |
| 5280 | +/*****************************************************************************/ | |
| 5281 | +static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def) | |
| 5282 | +{ | |
| 5283 | + opcode_t *opc, *start, *end; | |
| 5284 | + | |
| 5285 | + fill_new_table(env->opcodes, 0x40); | |
| 5286 | + if (&opc_start < &opc_end) { | |
| 5287 | + start = &opc_start; | |
| 5288 | + end = &opc_end; | |
| 5289 | + } else { | |
| 5290 | + start = &opc_end; | |
| 5291 | + end = &opc_start; | |
| 5292 | + } | |
| 5293 | + for (opc = start + 1; opc != end; opc++) { | |
| 5294 | + if ((opc->handler.type & def->insns_flags) != 0) { | |
| 5295 | + if (register_insn(env->opcodes, opc) < 0) { | |
| 5296 | + printf("*** ERROR initializing PowerPC instruction " | |
| 5297 | + "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2, | |
| 5298 | + opc->opc3); | |
| 5299 | + return -1; | |
| 5300 | + } | |
| 5301 | + } | |
| 5302 | + } | |
| 5303 | + fix_opcode_tables(env->opcodes); | |
| 5304 | + fflush(stdout); | |
| 5305 | + fflush(stderr); | |
| 5306 | + | |
| 5307 | + return 0; | |
| 5308 | +} | |
| 5309 | + | |
| 5310 | +#if defined(PPC_DUMP_CPU) | |
| 5311 | +static int dump_ppc_insns (CPUPPCState *env) | |
| 5312 | +{ | |
| 5313 | + opc_handler_t **table, *handler; | |
| 5314 | + uint8_t opc1, opc2, opc3; | |
| 5315 | + | |
| 5316 | + printf("Instructions set:\n"); | |
| 5317 | + /* opc1 is 6 bits long */ | |
| 5318 | + for (opc1 = 0x00; opc1 < 0x40; opc1++) { | |
| 5319 | + table = env->opcodes; | |
| 5320 | + handler = table[opc1]; | |
| 5321 | + if (is_indirect_opcode(handler)) { | |
| 5322 | + /* opc2 is 5 bits long */ | |
| 5323 | + for (opc2 = 0; opc2 < 0x20; opc2++) { | |
| 5324 | + table = env->opcodes; | |
| 5325 | + handler = env->opcodes[opc1]; | |
| 5326 | + table = ind_table(handler); | |
| 5327 | + handler = table[opc2]; | |
| 5328 | + if (is_indirect_opcode(handler)) { | |
| 5329 | + table = ind_table(handler); | |
| 5330 | + /* opc3 is 5 bits long */ | |
| 5331 | + for (opc3 = 0; opc3 < 0x20; opc3++) { | |
| 5332 | + handler = table[opc3]; | |
| 5333 | + if (handler->handler != &gen_invalid) { | |
| 5334 | + printf("INSN: %02x %02x %02x (%02d %04d) : %s\n", | |
| 5335 | + opc1, opc2, opc3, opc1, (opc3 << 5) | opc2, | |
| 5336 | + handler->oname); | |
| 5337 | + } | |
| 5338 | + } | |
| 5339 | + } else { | |
| 5340 | + if (handler->handler != &gen_invalid) { | |
| 5341 | + printf("INSN: %02x %02x -- (%02d %04d) : %s\n", | |
| 5342 | + opc1, opc2, opc1, opc2, handler->oname); | |
| 5343 | + } | |
| 5344 | + } | |
| 5345 | + } | |
| 5346 | + } else { | |
| 5347 | + if (handler->handler != &gen_invalid) { | |
| 5348 | + printf("INSN: %02x -- -- (%02d ----) : %s\n", | |
| 5349 | + opc1, opc1, handler->oname); | |
| 5350 | + } | |
| 5351 | + } | |
| 5352 | + } | |
| 5353 | +} | |
| 4053 | 5354 | #endif |
| 4054 | -#if defined (TODO) | |
| 4055 | - /* PowerPC 631 (Power 3+)*/ | |
| 4056 | - { | |
| 4057 | - .name = "631", | |
| 4058 | - .pvr = CPU_PPC_631, | |
| 4059 | - .pvr_mask = 0xFFFFFFFF, | |
| 4060 | - .insns_flags = PPC_INSNS_631, | |
| 4061 | - .flags = PPC_FLAGS_631, | |
| 4062 | - .msr_mask = xxx, | |
| 4063 | - }, | |
| 4064 | - { | |
| 4065 | - .name = "POWER3+", | |
| 4066 | - .pvr = CPU_PPC_631, | |
| 4067 | - .pvr_mask = 0xFFFFFFFF, | |
| 4068 | - .insns_flags = PPC_INSNS_631, | |
| 4069 | - .flags = PPC_FLAGS_631, | |
| 4070 | - .msr_mask = xxx, | |
| 4071 | - }, | |
| 4072 | -#endif | |
| 4073 | -#if defined (TODO) | |
| 4074 | - /* POWER4 */ | |
| 4075 | - { | |
| 4076 | - .name = "POWER4", | |
| 4077 | - .pvr = CPU_PPC_POWER4, | |
| 4078 | - .pvr_mask = 0xFFFFFFFF, | |
| 4079 | - .insns_flags = PPC_INSNS_POWER4, | |
| 4080 | - .flags = PPC_FLAGS_POWER4, | |
| 4081 | - .msr_mask = xxx, | |
| 4082 | - }, | |
| 4083 | -#endif | |
| 4084 | -#if defined (TODO) | |
| 4085 | - /* POWER4p */ | |
| 4086 | - { | |
| 4087 | - .name = "POWER4+", | |
| 4088 | - .pvr = CPU_PPC_POWER4P, | |
| 4089 | - .pvr_mask = 0xFFFFFFFF, | |
| 4090 | - .insns_flags = PPC_INSNS_POWER4, | |
| 4091 | - .flags = PPC_FLAGS_POWER4, | |
| 4092 | - .msr_mask = xxx, | |
| 4093 | - }, | |
| 4094 | -#endif | |
| 4095 | -#if defined (TODO) | |
| 4096 | - /* POWER5 */ | |
| 4097 | - { | |
| 4098 | - .name = "POWER5", | |
| 4099 | - .pvr = CPU_PPC_POWER5, | |
| 4100 | - .pvr_mask = 0xFFFFFFFF, | |
| 4101 | - .insns_flags = PPC_INSNS_POWER5, | |
| 4102 | - .flags = PPC_FLAGS_POWER5, | |
| 4103 | - .msr_mask = xxx, | |
| 4104 | - }, | |
| 4105 | -#endif | |
| 4106 | -#if defined (TODO) | |
| 4107 | - /* POWER5+ */ | |
| 4108 | - { | |
| 4109 | - .name = "POWER5+", | |
| 4110 | - .pvr = CPU_PPC_POWER5P, | |
| 4111 | - .pvr_mask = 0xFFFFFFFF, | |
| 4112 | - .insns_flags = PPC_INSNS_POWER5, | |
| 4113 | - .flags = PPC_FLAGS_POWER5, | |
| 4114 | - .msr_mask = xxx, | |
| 4115 | - }, | |
| 4116 | -#endif | |
| 4117 | -#if defined (TODO) | |
| 4118 | - /* POWER6 */ | |
| 4119 | - { | |
| 4120 | - .name = "POWER6", | |
| 4121 | - .pvr = CPU_PPC_POWER6, | |
| 4122 | - .pvr_mask = 0xFFFFFFFF, | |
| 4123 | - .insns_flags = PPC_INSNS_POWER6, | |
| 4124 | - .flags = PPC_FLAGS_POWER6, | |
| 4125 | - .msr_mask = xxx, | |
| 4126 | - }, | |
| 4127 | -#endif | |
| 4128 | -#if defined (TODO) | |
| 4129 | - /* PowerPC 970 */ | |
| 4130 | - { | |
| 4131 | - .name = "970", | |
| 4132 | - .pvr = CPU_PPC_970, | |
| 4133 | - .pvr_mask = 0xFFFFFFFF, | |
| 4134 | - .insns_flags = PPC_INSNS_970, | |
| 4135 | - .flags = PPC_FLAGS_970, | |
| 4136 | - .msr_mask = 0x900000000204FF36ULL, | |
| 4137 | - }, | |
| 4138 | -#endif | |
| 4139 | -#if defined (TODO) | |
| 4140 | - /* PowerPC 970FX (G5) */ | |
| 4141 | - { | |
| 4142 | - .name = "970fx", | |
| 4143 | - .pvr = CPU_PPC_970FX, | |
| 4144 | - .pvr_mask = 0xFFFFFFFF, | |
| 4145 | - .insns_flags = PPC_INSNS_970FX, | |
| 4146 | - .flags = PPC_FLAGS_970FX, | |
| 4147 | - .msr_mask = 0x800000000204FF36ULL, | |
| 4148 | - }, | |
| 4149 | -#endif | |
| 4150 | -#if defined (TODO) | |
| 4151 | - /* PowerPC 970MP */ | |
| 4152 | - { | |
| 4153 | - .name = "970MP", | |
| 4154 | - .pvr = CPU_PPC_970MP, | |
| 4155 | - .pvr_mask = 0xFFFFFFFF, | |
| 4156 | - .insns_flags = PPC_INSNS_970, | |
| 4157 | - .flags = PPC_FLAGS_970, | |
| 4158 | - .msr_mask = 0x900000000204FF36ULL, | |
| 4159 | - }, | |
| 4160 | -#endif | |
| 4161 | -#if defined (TODO) | |
| 4162 | - /* PowerPC Cell */ | |
| 4163 | - { | |
| 4164 | - .name = "Cell", | |
| 4165 | - .pvr = CPU_PPC_CELL, | |
| 4166 | - .pvr_mask = 0xFFFFFFFF, | |
| 4167 | - .insns_flags = PPC_INSNS_970, | |
| 4168 | - .flags = PPC_FLAGS_970, | |
| 4169 | - .msr_mask = 0x900000000204FF36ULL, | |
| 4170 | - }, | |
| 4171 | -#endif | |
| 4172 | -#if defined (TODO) | |
| 4173 | - /* RS64 (Apache/A35) */ | |
| 4174 | - /* This one seems to support the whole POWER2 instruction set | |
| 4175 | - * and the PowerPC 64 one. | |
| 4176 | - */ | |
| 4177 | - { | |
| 4178 | - .name = "RS64", | |
| 4179 | - .pvr = CPU_PPC_RS64, | |
| 4180 | - .pvr_mask = 0xFFFFFFFF, | |
| 4181 | - .insns_flags = PPC_INSNS_RS64, | |
| 4182 | - .flags = PPC_FLAGS_RS64, | |
| 4183 | - .msr_mask = xxx, | |
| 4184 | - }, | |
| 4185 | - { | |
| 4186 | - .name = "Apache", | |
| 4187 | - .pvr = CPU_PPC_RS64, | |
| 4188 | - .pvr_mask = 0xFFFFFFFF, | |
| 4189 | - .insns_flags = PPC_INSNS_RS64, | |
| 4190 | - .flags = PPC_FLAGS_RS64, | |
| 4191 | - .msr_mask = xxx, | |
| 4192 | - }, | |
| 4193 | - { | |
| 4194 | - .name = "A35", | |
| 4195 | - .pvr = CPU_PPC_RS64, | |
| 4196 | - .pvr_mask = 0xFFFFFFFF, | |
| 4197 | - .insns_flags = PPC_INSNS_RS64, | |
| 4198 | - .flags = PPC_FLAGS_RS64, | |
| 4199 | - .msr_mask = xxx, | |
| 4200 | - }, | |
| 4201 | -#endif | |
| 4202 | -#if defined (TODO) | |
| 4203 | - /* RS64-II (NorthStar/A50) */ | |
| 4204 | - { | |
| 4205 | - .name = "RS64-II", | |
| 4206 | - .pvr = CPU_PPC_RS64II, | |
| 4207 | - .pvr_mask = 0xFFFFFFFF, | |
| 4208 | - .insns_flags = PPC_INSNS_RS64, | |
| 4209 | - .flags = PPC_FLAGS_RS64, | |
| 4210 | - .msr_mask = xxx, | |
| 4211 | - }, | |
| 4212 | - { | |
| 4213 | - .name = "NortStar", | |
| 4214 | - .pvr = CPU_PPC_RS64II, | |
| 4215 | - .pvr_mask = 0xFFFFFFFF, | |
| 4216 | - .insns_flags = PPC_INSNS_RS64, | |
| 4217 | - .flags = PPC_FLAGS_RS64, | |
| 4218 | - .msr_mask = xxx, | |
| 4219 | - }, | |
| 4220 | - { | |
| 4221 | - .name = "A50", | |
| 4222 | - .pvr = CPU_PPC_RS64II, | |
| 4223 | - .pvr_mask = 0xFFFFFFFF, | |
| 4224 | - .insns_flags = PPC_INSNS_RS64, | |
| 4225 | - .flags = PPC_FLAGS_RS64, | |
| 4226 | - .msr_mask = xxx, | |
| 4227 | - }, | |
| 4228 | -#endif | |
| 4229 | -#if defined (TODO) | |
| 4230 | - /* RS64-III (Pulsar) */ | |
| 4231 | - { | |
| 4232 | - .name = "RS64-III", | |
| 4233 | - .pvr = CPU_PPC_RS64III, | |
| 4234 | - .pvr_mask = 0xFFFFFFFF, | |
| 4235 | - .insns_flags = PPC_INSNS_RS64, | |
| 4236 | - .flags = PPC_FLAGS_RS64, | |
| 4237 | - .msr_mask = xxx, | |
| 4238 | - }, | |
| 4239 | - { | |
| 4240 | - .name = "Pulsar", | |
| 4241 | - .pvr = CPU_PPC_RS64III, | |
| 4242 | - .pvr_mask = 0xFFFFFFFF, | |
| 4243 | - .insns_flags = PPC_INSNS_RS64, | |
| 4244 | - .flags = PPC_FLAGS_RS64, | |
| 4245 | - .msr_mask = xxx, | |
| 4246 | - }, | |
| 4247 | -#endif | |
| 4248 | -#if defined (TODO) | |
| 4249 | - /* RS64-IV (IceStar/IStar/SStar) */ | |
| 4250 | - { | |
| 4251 | - .name = "RS64-IV", | |
| 4252 | - .pvr = CPU_PPC_RS64IV, | |
| 4253 | - .pvr_mask = 0xFFFFFFFF, | |
| 4254 | - .insns_flags = PPC_INSNS_RS64, | |
| 4255 | - .flags = PPC_FLAGS_RS64, | |
| 4256 | - .msr_mask = xxx, | |
| 4257 | - }, | |
| 4258 | - { | |
| 4259 | - .name = "IceStar", | |
| 4260 | - .pvr = CPU_PPC_RS64IV, | |
| 4261 | - .pvr_mask = 0xFFFFFFFF, | |
| 4262 | - .insns_flags = PPC_INSNS_RS64, | |
| 4263 | - .flags = PPC_FLAGS_RS64, | |
| 4264 | - .msr_mask = xxx, | |
| 4265 | - }, | |
| 4266 | - { | |
| 4267 | - .name = "IStar", | |
| 4268 | - .pvr = CPU_PPC_RS64IV, | |
| 4269 | - .pvr_mask = 0xFFFFFFFF, | |
| 4270 | - .insns_flags = PPC_INSNS_RS64, | |
| 4271 | - .flags = PPC_FLAGS_RS64, | |
| 4272 | - .msr_mask = xxx, | |
| 4273 | - }, | |
| 4274 | - { | |
| 4275 | - .name = "SStar", | |
| 4276 | - .pvr = CPU_PPC_RS64IV, | |
| 4277 | - .pvr_mask = 0xFFFFFFFF, | |
| 4278 | - .insns_flags = PPC_INSNS_RS64, | |
| 4279 | - .flags = PPC_FLAGS_RS64, | |
| 4280 | - .msr_mask = xxx, | |
| 4281 | - }, | |
| 4282 | -#endif | |
| 4283 | - /* POWER */ | |
| 4284 | -#if defined (TODO) | |
| 4285 | - /* Original POWER */ | |
| 4286 | - { | |
| 4287 | - .name = "POWER", | |
| 4288 | - .pvr = CPU_POWER, | |
| 4289 | - .pvr_mask = 0xFFFFFFFF, | |
| 4290 | - .insns_flags = PPC_INSNS_POWER, | |
| 4291 | - .flags = PPC_FLAGS_POWER, | |
| 4292 | - .msr_mask = xxx, | |
| 4293 | - }, | |
| 4294 | -#endif | |
| 4295 | -#endif /* defined (TARGET_PPC64) */ | |
| 4296 | -#if defined (TODO) | |
| 4297 | - /* POWER2 */ | |
| 4298 | - { | |
| 4299 | - .name = "POWER2", | |
| 4300 | - .pvr = CPU_POWER2, | |
| 4301 | - .pvr_mask = 0xFFFFFFFF, | |
| 4302 | - .insns_flags = PPC_INSNS_POWER, | |
| 4303 | - .flags = PPC_FLAGS_POWER, | |
| 4304 | - .msr_mask = xxx, | |
| 4305 | - }, | |
| 4306 | -#endif | |
| 4307 | - /* Generic PowerPCs */ | |
| 4308 | -#if defined (TODO) | |
| 5355 | + | |
| 5356 | +int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def) | |
| 5357 | +{ | |
| 5358 | + env->msr_mask = def->msr_mask; | |
| 5359 | + env->mmu_model = def->mmu_model; | |
| 5360 | + env->excp_model = def->excp_model; | |
| 5361 | + env->bus_model = def->bus_model; | |
| 5362 | + if (create_ppc_opcodes(env, def) < 0) | |
| 5363 | + return -1; | |
| 5364 | + init_ppc_proc(env, def); | |
| 5365 | +#if defined(PPC_DUMP_CPU) | |
| 4309 | 5366 | { |
| 4310 | - .name = "ppc64", | |
| 4311 | - .pvr = CPU_PPC_970FX, | |
| 4312 | - .pvr_mask = 0xFFFFFFFF, | |
| 4313 | - .insns_flags = PPC_INSNS_PPC64, | |
| 4314 | - .flags = PPC_FLAGS_PPC64, | |
| 4315 | - .msr_mask = 0xA00000000204FF36ULL, | |
| 4316 | - }, | |
| 5367 | + const unsigned char *mmu_model, *excp_model, *bus_model; | |
| 5368 | + switch (env->mmu_model) { | |
| 5369 | + case POWERPC_MMU_32B: | |
| 5370 | + mmu_model = "PowerPC 32"; | |
| 5371 | + break; | |
| 5372 | + case POWERPC_MMU_64B: | |
| 5373 | + mmu_model = "PowerPC 64"; | |
| 5374 | + break; | |
| 5375 | + case POWERPC_MMU_601: | |
| 5376 | + mmu_model = "PowerPC 601"; | |
| 5377 | + break; | |
| 5378 | + case POWERPC_MMU_SOFT_6xx: | |
| 5379 | + mmu_model = "PowerPC 6xx/7xx with software driven TLBs"; | |
| 5380 | + break; | |
| 5381 | + case POWERPC_MMU_SOFT_74xx: | |
| 5382 | + mmu_model = "PowerPC 74xx with software driven TLBs"; | |
| 5383 | + break; | |
| 5384 | + case POWERPC_MMU_SOFT_4xx: | |
| 5385 | + mmu_model = "PowerPC 4xx with software driven TLBs"; | |
| 5386 | + break; | |
| 5387 | + case POWERPC_MMU_SOFT_4xx_Z: | |
| 5388 | + mmu_model = "PowerPC 4xx with software driven TLBs " | |
| 5389 | + "and zones protections"; | |
| 5390 | + break; | |
| 5391 | + case POWERPC_MMU_REAL_4xx: | |
| 5392 | + mmu_model = "PowerPC 4xx real mode only"; | |
| 5393 | + break; | |
| 5394 | + case POWERPC_MMU_BOOKE: | |
| 5395 | + mmu_model = "PowerPC BookE"; | |
| 5396 | + break; | |
| 5397 | + case POWERPC_MMU_BOOKE_FSL: | |
| 5398 | + mmu_model = "PowerPC BookE FSL"; | |
| 5399 | + break; | |
| 5400 | + case POWERPC_MMU_64BRIDGE: | |
| 5401 | + mmu_model = "PowerPC 64 bridge"; | |
| 5402 | + break; | |
| 5403 | + default: | |
| 5404 | + mmu_model = "Unknown or invalid"; | |
| 5405 | + break; | |
| 5406 | + } | |
| 5407 | + switch (env->excp_model) { | |
| 5408 | + case POWERPC_EXCP_STD: | |
| 5409 | + excp_model = "PowerPC"; | |
| 5410 | + break; | |
| 5411 | + case POWERPC_EXCP_40x: | |
| 5412 | + excp_model = "PowerPC 40x"; | |
| 5413 | + break; | |
| 5414 | + case POWERPC_EXCP_601: | |
| 5415 | + excp_model = "PowerPC 601"; | |
| 5416 | + break; | |
| 5417 | + case POWERPC_EXCP_602: | |
| 5418 | + excp_model = "PowerPC 602"; | |
| 5419 | + break; | |
| 5420 | + case POWERPC_EXCP_603: | |
| 5421 | + excp_model = "PowerPC 603"; | |
| 5422 | + break; | |
| 5423 | + case POWERPC_EXCP_603E: | |
| 5424 | + excp_model = "PowerPC 603e"; | |
| 5425 | + break; | |
| 5426 | + case POWERPC_EXCP_604: | |
| 5427 | + excp_model = "PowerPC 604"; | |
| 5428 | + break; | |
| 5429 | + case POWERPC_EXCP_7x0: | |
| 5430 | + excp_model = "PowerPC 740/750"; | |
| 5431 | + break; | |
| 5432 | + case POWERPC_EXCP_7x5: | |
| 5433 | + excp_model = "PowerPC 745/755"; | |
| 5434 | + break; | |
| 5435 | + case POWERPC_EXCP_74xx: | |
| 5436 | + excp_model = "PowerPC 74xx"; | |
| 5437 | + break; | |
| 5438 | + case POWERPC_EXCP_970: | |
| 5439 | + excp_model = "PowerPC 970"; | |
| 5440 | + break; | |
| 5441 | + case POWERPC_EXCP_BOOKE: | |
| 5442 | + excp_model = "PowerPC BookE"; | |
| 5443 | + break; | |
| 5444 | + default: | |
| 5445 | + excp_model = "Unknown or invalid"; | |
| 5446 | + break; | |
| 5447 | + } | |
| 5448 | + switch (env->bus_model) { | |
| 5449 | + case PPC_FLAGS_INPUT_6xx: | |
| 5450 | + bus_model = "PowerPC 6xx"; | |
| 5451 | + break; | |
| 5452 | + case PPC_FLAGS_INPUT_BookE: | |
| 5453 | + bus_model = "PowerPC BookE"; | |
| 5454 | + break; | |
| 5455 | + case PPC_FLAGS_INPUT_405: | |
| 5456 | + bus_model = "PowerPC 405"; | |
| 5457 | + break; | |
| 5458 | + case PPC_FLAGS_INPUT_970: | |
| 5459 | + bus_model = "PowerPC 970"; | |
| 5460 | + break; | |
| 5461 | + case PPC_FLAGS_INPUT_401: | |
| 5462 | + bus_model = "PowerPC 401/403"; | |
| 5463 | + break; | |
| 5464 | + default: | |
| 5465 | + bus_model = "Unknown or invalid"; | |
| 5466 | + break; | |
| 5467 | + } | |
| 5468 | + printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n" | |
| 5469 | + " MMU model : %s\n", | |
| 5470 | + def->name, def->pvr, def->msr_mask, mmu_model); | |
| 5471 | + if (env->tlb != NULL) { | |
| 5472 | + printf(" %d %s TLB in %d ways\n", | |
| 5473 | + env->nb_tlb, env->id_tlbs ? "splitted" : "merged", | |
| 5474 | + env->nb_ways); | |
| 5475 | + } | |
| 5476 | + printf(" Exceptions model : %s\n" | |
| 5477 | + " Bus model : %s\n", | |
| 5478 | + excp_model, bus_model); | |
| 5479 | + } | |
| 5480 | + dump_ppc_insns(env); | |
| 5481 | + dump_ppc_sprs(env); | |
| 5482 | + fflush(stdout); | |
| 4317 | 5483 | #endif |
| 4318 | - { | |
| 4319 | - .name = "ppc32", | |
| 4320 | - .pvr = CPU_PPC_604, | |
| 4321 | - .pvr_mask = 0xFFFFFFFF, | |
| 4322 | - .insns_flags = PPC_INSNS_PPC32, | |
| 4323 | - .flags = PPC_FLAGS_PPC32, | |
| 4324 | - .msr_mask = 0x000000000005FF77ULL, | |
| 4325 | - }, | |
| 4326 | - /* Fallback */ | |
| 4327 | - { | |
| 4328 | - .name = "ppc", | |
| 4329 | - .pvr = CPU_PPC_604, | |
| 4330 | - .pvr_mask = 0xFFFFFFFF, | |
| 4331 | - .insns_flags = PPC_INSNS_PPC32, | |
| 4332 | - .flags = PPC_FLAGS_PPC32, | |
| 4333 | - .msr_mask = 0x000000000005FF77ULL, | |
| 4334 | - }, | |
| 4335 | -}; | |
| 5484 | + | |
| 5485 | + return 0; | |
| 5486 | +} | |
| 4336 | 5487 | |
| 4337 | 5488 | int ppc_find_by_name (const unsigned char *name, ppc_def_t **def) |
| 4338 | 5489 | { |
| ... | ... | @@ -4374,9 +5525,8 @@ void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...)) |
| 4374 | 5525 | int i; |
| 4375 | 5526 | |
| 4376 | 5527 | for (i = 0; ; i++) { |
| 4377 | - (*cpu_fprintf)(f, "PowerPC %16s PVR %08x mask %08x\n", | |
| 4378 | - ppc_defs[i].name, | |
| 4379 | - ppc_defs[i].pvr, ppc_defs[i].pvr_mask); | |
| 5528 | + (*cpu_fprintf)(f, "PowerPC %-16s PVR %08x\n", | |
| 5529 | + ppc_defs[i].name, ppc_defs[i].pvr); | |
| 4380 | 5530 | if (strcmp(ppc_defs[i].name, "ppc") == 0) |
| 4381 | 5531 | break; |
| 4382 | 5532 | } | ... | ... |