]> git.proxmox.com Git - mirror_qemu.git/blob - target-ppc/translate_init.c
Duplicated SPR fix for BookE PowerPC by Guglielmo Morandin
[mirror_qemu.git] / target-ppc / translate_init.c
1 /*
2 * PowerPC CPU initialization for qemu.
3 *
4 * Copyright (c) 2003-2007 Jocelyn Mayer
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 /* A lot of PowerPC definition have been included here.
22 * Most of them are not usable for now but have been kept
23 * inside "#if defined(TODO) ... #endif" statements to make tests easier.
24 */
25
26 //#define PPC_DUMP_CPU
27 //#define PPC_DEBUG_SPR
28 //#define PPC_DEBUG_IRQ
29
30 struct ppc_def_t {
31 const unsigned char *name;
32 uint32_t pvr;
33 uint32_t pvr_mask;
34 uint64_t insns_flags;
35 uint32_t flags;
36 uint64_t msr_mask;
37 };
38
39 /* For user-mode emulation, we don't emulate any IRQ controller */
40 #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 { \
44 }
45 #else
46 #define PPC_IRQ_INIT_FN(name) \
47 void glue(glue(ppc, name),_irq_init) (CPUPPCState *env);
48 #endif
49 PPC_IRQ_INIT_FN(405);
50 PPC_IRQ_INIT_FN(6xx);
51 PPC_IRQ_INIT_FN(970);
52
53 /* Generic callbacks:
54 * do nothing but store/retrieve spr value
55 */
56 #ifdef PPC_DUMP_SPR_ACCESSES
57 static void spr_read_generic (void *opaque, int sprn)
58 {
59 gen_op_load_dump_spr(sprn);
60 }
61
62 static void spr_write_generic (void *opaque, int sprn)
63 {
64 gen_op_store_dump_spr(sprn);
65 }
66 #else
67 static void spr_read_generic (void *opaque, int sprn)
68 {
69 gen_op_load_spr(sprn);
70 }
71
72 static void spr_write_generic (void *opaque, int sprn)
73 {
74 gen_op_store_spr(sprn);
75 }
76 #endif
77
78 #if !defined(CONFIG_USER_ONLY)
79 static void spr_write_clear (void *opaque, int sprn)
80 {
81 gen_op_mask_spr(sprn);
82 }
83 #endif
84
85 /* SPR common to all PowerPC */
86 /* XER */
87 static void spr_read_xer (void *opaque, int sprn)
88 {
89 gen_op_load_xer();
90 }
91
92 static void spr_write_xer (void *opaque, int sprn)
93 {
94 gen_op_store_xer();
95 }
96
97 /* LR */
98 static void spr_read_lr (void *opaque, int sprn)
99 {
100 gen_op_load_lr();
101 }
102
103 static void spr_write_lr (void *opaque, int sprn)
104 {
105 gen_op_store_lr();
106 }
107
108 /* CTR */
109 static void spr_read_ctr (void *opaque, int sprn)
110 {
111 gen_op_load_ctr();
112 }
113
114 static void spr_write_ctr (void *opaque, int sprn)
115 {
116 gen_op_store_ctr();
117 }
118
119 /* User read access to SPR */
120 /* USPRx */
121 /* UMMCRx */
122 /* UPMCx */
123 /* USIA */
124 /* UDECR */
125 static void spr_read_ureg (void *opaque, int sprn)
126 {
127 gen_op_load_spr(sprn + 0x10);
128 }
129
130 /* SPR common to all non-embedded PowerPC */
131 /* DECR */
132 #if !defined(CONFIG_USER_ONLY)
133 static void spr_read_decr (void *opaque, int sprn)
134 {
135 gen_op_load_decr();
136 }
137
138 static void spr_write_decr (void *opaque, int sprn)
139 {
140 gen_op_store_decr();
141 }
142 #endif
143
144 /* SPR common to all non-embedded PowerPC, except 601 */
145 /* Time base */
146 static void spr_read_tbl (void *opaque, int sprn)
147 {
148 gen_op_load_tbl();
149 }
150
151 static void spr_read_tbu (void *opaque, int sprn)
152 {
153 gen_op_load_tbu();
154 }
155
156 #if !defined(CONFIG_USER_ONLY)
157 static void spr_write_tbl (void *opaque, int sprn)
158 {
159 gen_op_store_tbl();
160 }
161
162 static void spr_write_tbu (void *opaque, int sprn)
163 {
164 gen_op_store_tbu();
165 }
166 #endif
167
168 #if !defined(CONFIG_USER_ONLY)
169 /* IBAT0U...IBAT0U */
170 /* IBAT0L...IBAT7L */
171 static void spr_read_ibat (void *opaque, int sprn)
172 {
173 gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
174 }
175
176 static void spr_read_ibat_h (void *opaque, int sprn)
177 {
178 gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT4U) / 2);
179 }
180
181 static void spr_write_ibatu (void *opaque, int sprn)
182 {
183 DisasContext *ctx = opaque;
184
185 gen_op_store_ibatu((sprn - SPR_IBAT0U) / 2);
186 RET_STOP(ctx);
187 }
188
189 static void spr_write_ibatu_h (void *opaque, int sprn)
190 {
191 DisasContext *ctx = opaque;
192
193 gen_op_store_ibatu((sprn - SPR_IBAT4U) / 2);
194 RET_STOP(ctx);
195 }
196
197 static void spr_write_ibatl (void *opaque, int sprn)
198 {
199 DisasContext *ctx = opaque;
200
201 gen_op_store_ibatl((sprn - SPR_IBAT0L) / 2);
202 RET_STOP(ctx);
203 }
204
205 static void spr_write_ibatl_h (void *opaque, int sprn)
206 {
207 DisasContext *ctx = opaque;
208
209 gen_op_store_ibatl((sprn - SPR_IBAT4L) / 2);
210 RET_STOP(ctx);
211 }
212
213 /* DBAT0U...DBAT7U */
214 /* DBAT0L...DBAT7L */
215 static void spr_read_dbat (void *opaque, int sprn)
216 {
217 gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT0U) / 2);
218 }
219
220 static void spr_read_dbat_h (void *opaque, int sprn)
221 {
222 gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT4U) / 2);
223 }
224
225 static void spr_write_dbatu (void *opaque, int sprn)
226 {
227 DisasContext *ctx = opaque;
228
229 gen_op_store_dbatu((sprn - SPR_DBAT0U) / 2);
230 RET_STOP(ctx);
231 }
232
233 static void spr_write_dbatu_h (void *opaque, int sprn)
234 {
235 DisasContext *ctx = opaque;
236
237 gen_op_store_dbatu((sprn - SPR_DBAT4U) / 2);
238 RET_STOP(ctx);
239 }
240
241 static void spr_write_dbatl (void *opaque, int sprn)
242 {
243 DisasContext *ctx = opaque;
244
245 gen_op_store_dbatl((sprn - SPR_DBAT0L) / 2);
246 RET_STOP(ctx);
247 }
248
249 static void spr_write_dbatl_h (void *opaque, int sprn)
250 {
251 DisasContext *ctx = opaque;
252
253 gen_op_store_dbatl((sprn - SPR_DBAT4L) / 2);
254 RET_STOP(ctx);
255 }
256
257 /* SDR1 */
258 static void spr_read_sdr1 (void *opaque, int sprn)
259 {
260 gen_op_load_sdr1();
261 }
262
263 static void spr_write_sdr1 (void *opaque, int sprn)
264 {
265 DisasContext *ctx = opaque;
266
267 gen_op_store_sdr1();
268 RET_STOP(ctx);
269 }
270
271 /* 64 bits PowerPC specific SPRs */
272 /* ASR */
273 #if defined(TARGET_PPC64)
274 static void spr_read_asr (void *opaque, int sprn)
275 {
276 gen_op_load_asr();
277 }
278
279 static void spr_write_asr (void *opaque, int sprn)
280 {
281 DisasContext *ctx = opaque;
282
283 gen_op_store_asr();
284 RET_STOP(ctx);
285 }
286 #endif
287 #endif /* !defined(CONFIG_USER_ONLY) */
288
289 /* PowerPC 601 specific registers */
290 /* RTC */
291 static void spr_read_601_rtcl (void *opaque, int sprn)
292 {
293 gen_op_load_601_rtcl();
294 }
295
296 static void spr_read_601_rtcu (void *opaque, int sprn)
297 {
298 gen_op_load_601_rtcu();
299 }
300
301 #if !defined(CONFIG_USER_ONLY)
302 static void spr_write_601_rtcu (void *opaque, int sprn)
303 {
304 gen_op_store_601_rtcu();
305 }
306
307 static void spr_write_601_rtcl (void *opaque, int sprn)
308 {
309 gen_op_store_601_rtcl();
310 }
311 #endif
312
313 /* Unified bats */
314 #if !defined(CONFIG_USER_ONLY)
315 static void spr_read_601_ubat (void *opaque, int sprn)
316 {
317 gen_op_load_601_bat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
318 }
319
320 static void spr_write_601_ubatu (void *opaque, int sprn)
321 {
322 DisasContext *ctx = opaque;
323
324 gen_op_store_601_batu((sprn - SPR_IBAT0U) / 2);
325 RET_STOP(ctx);
326 }
327
328 static void spr_write_601_ubatl (void *opaque, int sprn)
329 {
330 DisasContext *ctx = opaque;
331
332 gen_op_store_601_batl((sprn - SPR_IBAT0L) / 2);
333 RET_STOP(ctx);
334 }
335 #endif
336
337 /* PowerPC 40x specific registers */
338 #if !defined(CONFIG_USER_ONLY)
339 static void spr_read_40x_pit (void *opaque, int sprn)
340 {
341 gen_op_load_40x_pit();
342 }
343
344 static void spr_write_40x_pit (void *opaque, int sprn)
345 {
346 gen_op_store_40x_pit();
347 }
348
349 static void spr_write_40x_dbcr0 (void *opaque, int sprn)
350 {
351 DisasContext *ctx = opaque;
352
353 gen_op_store_40x_dbcr0();
354 /* We must stop translation as we may have rebooted */
355 RET_STOP(ctx);
356 }
357
358 static void spr_write_booke_tcr (void *opaque, int sprn)
359 {
360 gen_op_store_booke_tcr();
361 }
362
363 static void spr_write_booke_tsr (void *opaque, int sprn)
364 {
365 gen_op_store_booke_tsr();
366 }
367 #endif
368
369 /* PowerPC 403 specific registers */
370 /* PBL1 / PBU1 / PBL2 / PBU2 */
371 #if !defined(CONFIG_USER_ONLY)
372 static void spr_read_403_pbr (void *opaque, int sprn)
373 {
374 gen_op_load_403_pb(sprn - SPR_403_PBL1);
375 }
376
377 static void spr_write_403_pbr (void *opaque, int sprn)
378 {
379 DisasContext *ctx = opaque;
380
381 gen_op_store_403_pb(sprn - SPR_403_PBL1);
382 RET_STOP(ctx);
383 }
384
385 static void spr_write_pir (void *opaque, int sprn)
386 {
387 gen_op_store_pir();
388 }
389 #endif
390
391 #if defined(CONFIG_USER_ONLY)
392 #define spr_register(env, num, name, uea_read, uea_write, \
393 oea_read, oea_write, initial_value) \
394 do { \
395 _spr_register(env, num, name, uea_read, uea_write, initial_value); \
396 } while (0)
397 static inline void _spr_register (CPUPPCState *env, int num,
398 const unsigned char *name,
399 void (*uea_read)(void *opaque, int sprn),
400 void (*uea_write)(void *opaque, int sprn),
401 target_ulong initial_value)
402 #else
403 static inline void spr_register (CPUPPCState *env, int num,
404 const unsigned char *name,
405 void (*uea_read)(void *opaque, int sprn),
406 void (*uea_write)(void *opaque, int sprn),
407 void (*oea_read)(void *opaque, int sprn),
408 void (*oea_write)(void *opaque, int sprn),
409 target_ulong initial_value)
410 #endif
411 {
412 ppc_spr_t *spr;
413
414 spr = &env->spr_cb[num];
415 if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
416 #if !defined(CONFIG_USER_ONLY)
417 spr->oea_read != NULL || spr->oea_write != NULL ||
418 #endif
419 spr->uea_read != NULL || spr->uea_write != NULL) {
420 printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
421 exit(1);
422 }
423 #if defined(PPC_DEBUG_SPR)
424 printf("*** register spr %d (%03x) %s val " ADDRX "\n", num, num, name,
425 initial_value);
426 #endif
427 spr->name = name;
428 spr->uea_read = uea_read;
429 spr->uea_write = uea_write;
430 #if !defined(CONFIG_USER_ONLY)
431 spr->oea_read = oea_read;
432 spr->oea_write = oea_write;
433 #endif
434 env->spr[num] = initial_value;
435 }
436
437 /* Generic PowerPC SPRs */
438 static void gen_spr_generic (CPUPPCState *env)
439 {
440 /* Integer processing */
441 spr_register(env, SPR_XER, "XER",
442 &spr_read_xer, &spr_write_xer,
443 &spr_read_xer, &spr_write_xer,
444 0x00000000);
445 /* Branch contol */
446 spr_register(env, SPR_LR, "LR",
447 &spr_read_lr, &spr_write_lr,
448 &spr_read_lr, &spr_write_lr,
449 0x00000000);
450 spr_register(env, SPR_CTR, "CTR",
451 &spr_read_ctr, &spr_write_ctr,
452 &spr_read_ctr, &spr_write_ctr,
453 0x00000000);
454 /* Interrupt processing */
455 spr_register(env, SPR_SRR0, "SRR0",
456 SPR_NOACCESS, SPR_NOACCESS,
457 &spr_read_generic, &spr_write_generic,
458 0x00000000);
459 spr_register(env, SPR_SRR1, "SRR1",
460 SPR_NOACCESS, SPR_NOACCESS,
461 &spr_read_generic, &spr_write_generic,
462 0x00000000);
463 /* Processor control */
464 spr_register(env, SPR_SPRG0, "SPRG0",
465 SPR_NOACCESS, SPR_NOACCESS,
466 &spr_read_generic, &spr_write_generic,
467 0x00000000);
468 spr_register(env, SPR_SPRG1, "SPRG1",
469 SPR_NOACCESS, SPR_NOACCESS,
470 &spr_read_generic, &spr_write_generic,
471 0x00000000);
472 spr_register(env, SPR_SPRG2, "SPRG2",
473 SPR_NOACCESS, SPR_NOACCESS,
474 &spr_read_generic, &spr_write_generic,
475 0x00000000);
476 spr_register(env, SPR_SPRG3, "SPRG3",
477 SPR_NOACCESS, SPR_NOACCESS,
478 &spr_read_generic, &spr_write_generic,
479 0x00000000);
480 }
481
482 /* SPR common to all non-embedded PowerPC, including 601 */
483 static void gen_spr_ne_601 (CPUPPCState *env)
484 {
485 /* Exception processing */
486 spr_register(env, SPR_DSISR, "DSISR",
487 SPR_NOACCESS, SPR_NOACCESS,
488 &spr_read_generic, &spr_write_generic,
489 0x00000000);
490 spr_register(env, SPR_DAR, "DAR",
491 SPR_NOACCESS, SPR_NOACCESS,
492 &spr_read_generic, &spr_write_generic,
493 0x00000000);
494 /* Timer */
495 spr_register(env, SPR_DECR, "DECR",
496 SPR_NOACCESS, SPR_NOACCESS,
497 &spr_read_decr, &spr_write_decr,
498 0x00000000);
499 /* Memory management */
500 spr_register(env, SPR_SDR1, "SDR1",
501 SPR_NOACCESS, SPR_NOACCESS,
502 &spr_read_sdr1, &spr_write_sdr1,
503 0x00000000);
504 }
505
506 /* BATs 0-3 */
507 static void gen_low_BATs (CPUPPCState *env)
508 {
509 spr_register(env, SPR_IBAT0U, "IBAT0U",
510 SPR_NOACCESS, SPR_NOACCESS,
511 &spr_read_ibat, &spr_write_ibatu,
512 0x00000000);
513 spr_register(env, SPR_IBAT0L, "IBAT0L",
514 SPR_NOACCESS, SPR_NOACCESS,
515 &spr_read_ibat, &spr_write_ibatl,
516 0x00000000);
517 spr_register(env, SPR_IBAT1U, "IBAT1U",
518 SPR_NOACCESS, SPR_NOACCESS,
519 &spr_read_ibat, &spr_write_ibatu,
520 0x00000000);
521 spr_register(env, SPR_IBAT1L, "IBAT1L",
522 SPR_NOACCESS, SPR_NOACCESS,
523 &spr_read_ibat, &spr_write_ibatl,
524 0x00000000);
525 spr_register(env, SPR_IBAT2U, "IBAT2U",
526 SPR_NOACCESS, SPR_NOACCESS,
527 &spr_read_ibat, &spr_write_ibatu,
528 0x00000000);
529 spr_register(env, SPR_IBAT2L, "IBAT2L",
530 SPR_NOACCESS, SPR_NOACCESS,
531 &spr_read_ibat, &spr_write_ibatl,
532 0x00000000);
533 spr_register(env, SPR_IBAT3U, "IBAT3U",
534 SPR_NOACCESS, SPR_NOACCESS,
535 &spr_read_ibat, &spr_write_ibatu,
536 0x00000000);
537 spr_register(env, SPR_IBAT3L, "IBAT3L",
538 SPR_NOACCESS, SPR_NOACCESS,
539 &spr_read_ibat, &spr_write_ibatl,
540 0x00000000);
541 spr_register(env, SPR_DBAT0U, "DBAT0U",
542 SPR_NOACCESS, SPR_NOACCESS,
543 &spr_read_dbat, &spr_write_dbatu,
544 0x00000000);
545 spr_register(env, SPR_DBAT0L, "DBAT0L",
546 SPR_NOACCESS, SPR_NOACCESS,
547 &spr_read_dbat, &spr_write_dbatl,
548 0x00000000);
549 spr_register(env, SPR_DBAT1U, "DBAT1U",
550 SPR_NOACCESS, SPR_NOACCESS,
551 &spr_read_dbat, &spr_write_dbatu,
552 0x00000000);
553 spr_register(env, SPR_DBAT1L, "DBAT1L",
554 SPR_NOACCESS, SPR_NOACCESS,
555 &spr_read_dbat, &spr_write_dbatl,
556 0x00000000);
557 spr_register(env, SPR_DBAT2U, "DBAT2U",
558 SPR_NOACCESS, SPR_NOACCESS,
559 &spr_read_dbat, &spr_write_dbatu,
560 0x00000000);
561 spr_register(env, SPR_DBAT2L, "DBAT2L",
562 SPR_NOACCESS, SPR_NOACCESS,
563 &spr_read_dbat, &spr_write_dbatl,
564 0x00000000);
565 spr_register(env, SPR_DBAT3U, "DBAT3U",
566 SPR_NOACCESS, SPR_NOACCESS,
567 &spr_read_dbat, &spr_write_dbatu,
568 0x00000000);
569 spr_register(env, SPR_DBAT3L, "DBAT3L",
570 SPR_NOACCESS, SPR_NOACCESS,
571 &spr_read_dbat, &spr_write_dbatl,
572 0x00000000);
573 env->nb_BATs = 4;
574 }
575
576 /* BATs 4-7 */
577 static void gen_high_BATs (CPUPPCState *env)
578 {
579 spr_register(env, SPR_IBAT4U, "IBAT4U",
580 SPR_NOACCESS, SPR_NOACCESS,
581 &spr_read_ibat_h, &spr_write_ibatu_h,
582 0x00000000);
583 spr_register(env, SPR_IBAT4L, "IBAT4L",
584 SPR_NOACCESS, SPR_NOACCESS,
585 &spr_read_ibat_h, &spr_write_ibatl_h,
586 0x00000000);
587 spr_register(env, SPR_IBAT5U, "IBAT5U",
588 SPR_NOACCESS, SPR_NOACCESS,
589 &spr_read_ibat_h, &spr_write_ibatu_h,
590 0x00000000);
591 spr_register(env, SPR_IBAT5L, "IBAT5L",
592 SPR_NOACCESS, SPR_NOACCESS,
593 &spr_read_ibat_h, &spr_write_ibatl_h,
594 0x00000000);
595 spr_register(env, SPR_IBAT6U, "IBAT6U",
596 SPR_NOACCESS, SPR_NOACCESS,
597 &spr_read_ibat_h, &spr_write_ibatu_h,
598 0x00000000);
599 spr_register(env, SPR_IBAT6L, "IBAT6L",
600 SPR_NOACCESS, SPR_NOACCESS,
601 &spr_read_ibat_h, &spr_write_ibatl_h,
602 0x00000000);
603 spr_register(env, SPR_IBAT7U, "IBAT7U",
604 SPR_NOACCESS, SPR_NOACCESS,
605 &spr_read_ibat_h, &spr_write_ibatu_h,
606 0x00000000);
607 spr_register(env, SPR_IBAT7L, "IBAT7L",
608 SPR_NOACCESS, SPR_NOACCESS,
609 &spr_read_ibat_h, &spr_write_ibatl_h,
610 0x00000000);
611 spr_register(env, SPR_DBAT4U, "DBAT4U",
612 SPR_NOACCESS, SPR_NOACCESS,
613 &spr_read_dbat_h, &spr_write_dbatu_h,
614 0x00000000);
615 spr_register(env, SPR_DBAT4L, "DBAT4L",
616 SPR_NOACCESS, SPR_NOACCESS,
617 &spr_read_dbat_h, &spr_write_dbatl_h,
618 0x00000000);
619 spr_register(env, SPR_DBAT5U, "DBAT5U",
620 SPR_NOACCESS, SPR_NOACCESS,
621 &spr_read_dbat_h, &spr_write_dbatu_h,
622 0x00000000);
623 spr_register(env, SPR_DBAT5L, "DBAT5L",
624 SPR_NOACCESS, SPR_NOACCESS,
625 &spr_read_dbat_h, &spr_write_dbatl_h,
626 0x00000000);
627 spr_register(env, SPR_DBAT6U, "DBAT6U",
628 SPR_NOACCESS, SPR_NOACCESS,
629 &spr_read_dbat_h, &spr_write_dbatu_h,
630 0x00000000);
631 spr_register(env, SPR_DBAT6L, "DBAT6L",
632 SPR_NOACCESS, SPR_NOACCESS,
633 &spr_read_dbat_h, &spr_write_dbatl_h,
634 0x00000000);
635 spr_register(env, SPR_DBAT7U, "DBAT7U",
636 SPR_NOACCESS, SPR_NOACCESS,
637 &spr_read_dbat_h, &spr_write_dbatu_h,
638 0x00000000);
639 spr_register(env, SPR_DBAT7L, "DBAT7L",
640 SPR_NOACCESS, SPR_NOACCESS,
641 &spr_read_dbat_h, &spr_write_dbatl_h,
642 0x00000000);
643 env->nb_BATs = 8;
644 }
645
646 /* Generic PowerPC time base */
647 static void gen_tbl (CPUPPCState *env)
648 {
649 spr_register(env, SPR_VTBL, "TBL",
650 &spr_read_tbl, SPR_NOACCESS,
651 &spr_read_tbl, SPR_NOACCESS,
652 0x00000000);
653 spr_register(env, SPR_TBL, "TBL",
654 SPR_NOACCESS, SPR_NOACCESS,
655 SPR_NOACCESS, &spr_write_tbl,
656 0x00000000);
657 spr_register(env, SPR_VTBU, "TBU",
658 &spr_read_tbu, SPR_NOACCESS,
659 &spr_read_tbu, SPR_NOACCESS,
660 0x00000000);
661 spr_register(env, SPR_TBU, "TBU",
662 SPR_NOACCESS, SPR_NOACCESS,
663 SPR_NOACCESS, &spr_write_tbu,
664 0x00000000);
665 }
666
667 /* Softare table search registers */
668 static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
669 {
670 env->nb_tlb = nb_tlbs;
671 env->nb_ways = nb_ways;
672 env->id_tlbs = 1;
673 spr_register(env, SPR_DMISS, "DMISS",
674 SPR_NOACCESS, SPR_NOACCESS,
675 &spr_read_generic, SPR_NOACCESS,
676 0x00000000);
677 spr_register(env, SPR_DCMP, "DCMP",
678 SPR_NOACCESS, SPR_NOACCESS,
679 &spr_read_generic, SPR_NOACCESS,
680 0x00000000);
681 spr_register(env, SPR_HASH1, "HASH1",
682 SPR_NOACCESS, SPR_NOACCESS,
683 &spr_read_generic, SPR_NOACCESS,
684 0x00000000);
685 spr_register(env, SPR_HASH2, "HASH2",
686 SPR_NOACCESS, SPR_NOACCESS,
687 &spr_read_generic, SPR_NOACCESS,
688 0x00000000);
689 spr_register(env, SPR_IMISS, "IMISS",
690 SPR_NOACCESS, SPR_NOACCESS,
691 &spr_read_generic, SPR_NOACCESS,
692 0x00000000);
693 spr_register(env, SPR_ICMP, "ICMP",
694 SPR_NOACCESS, SPR_NOACCESS,
695 &spr_read_generic, SPR_NOACCESS,
696 0x00000000);
697 spr_register(env, SPR_RPA, "RPA",
698 SPR_NOACCESS, SPR_NOACCESS,
699 &spr_read_generic, &spr_write_generic,
700 0x00000000);
701 }
702
703 /* SPR common to MPC755 and G2 */
704 static void gen_spr_G2_755 (CPUPPCState *env)
705 {
706 /* SGPRs */
707 spr_register(env, SPR_SPRG4, "SPRG4",
708 SPR_NOACCESS, SPR_NOACCESS,
709 &spr_read_generic, &spr_write_generic,
710 0x00000000);
711 spr_register(env, SPR_SPRG5, "SPRG5",
712 SPR_NOACCESS, SPR_NOACCESS,
713 &spr_read_generic, &spr_write_generic,
714 0x00000000);
715 spr_register(env, SPR_SPRG6, "SPRG6",
716 SPR_NOACCESS, SPR_NOACCESS,
717 &spr_read_generic, &spr_write_generic,
718 0x00000000);
719 spr_register(env, SPR_SPRG7, "SPRG7",
720 SPR_NOACCESS, SPR_NOACCESS,
721 &spr_read_generic, &spr_write_generic,
722 0x00000000);
723 /* External access control */
724 /* XXX : not implemented */
725 spr_register(env, SPR_EAR, "EAR",
726 SPR_NOACCESS, SPR_NOACCESS,
727 &spr_read_generic, &spr_write_generic,
728 0x00000000);
729 }
730
731 /* SPR common to all 7xx PowerPC implementations */
732 static void gen_spr_7xx (CPUPPCState *env)
733 {
734 /* Breakpoints */
735 /* XXX : not implemented */
736 spr_register(env, SPR_DABR, "DABR",
737 SPR_NOACCESS, SPR_NOACCESS,
738 &spr_read_generic, &spr_write_generic,
739 0x00000000);
740 /* XXX : not implemented */
741 spr_register(env, SPR_IABR, "IABR",
742 SPR_NOACCESS, SPR_NOACCESS,
743 &spr_read_generic, &spr_write_generic,
744 0x00000000);
745 /* Cache management */
746 /* XXX : not implemented */
747 spr_register(env, SPR_ICTC, "ICTC",
748 SPR_NOACCESS, SPR_NOACCESS,
749 &spr_read_generic, &spr_write_generic,
750 0x00000000);
751 /* XXX : not implemented */
752 spr_register(env, SPR_L2CR, "L2CR",
753 SPR_NOACCESS, SPR_NOACCESS,
754 &spr_read_generic, &spr_write_generic,
755 0x00000000);
756 /* Performance monitors */
757 /* XXX : not implemented */
758 spr_register(env, SPR_MMCR0, "MMCR0",
759 SPR_NOACCESS, SPR_NOACCESS,
760 &spr_read_generic, &spr_write_generic,
761 0x00000000);
762 /* XXX : not implemented */
763 spr_register(env, SPR_MMCR1, "MMCR1",
764 SPR_NOACCESS, SPR_NOACCESS,
765 &spr_read_generic, &spr_write_generic,
766 0x00000000);
767 /* XXX : not implemented */
768 spr_register(env, SPR_PMC1, "PMC1",
769 SPR_NOACCESS, SPR_NOACCESS,
770 &spr_read_generic, &spr_write_generic,
771 0x00000000);
772 /* XXX : not implemented */
773 spr_register(env, SPR_PMC2, "PMC2",
774 SPR_NOACCESS, SPR_NOACCESS,
775 &spr_read_generic, &spr_write_generic,
776 0x00000000);
777 /* XXX : not implemented */
778 spr_register(env, SPR_PMC3, "PMC3",
779 SPR_NOACCESS, SPR_NOACCESS,
780 &spr_read_generic, &spr_write_generic,
781 0x00000000);
782 /* XXX : not implemented */
783 spr_register(env, SPR_PMC4, "PMC4",
784 SPR_NOACCESS, SPR_NOACCESS,
785 &spr_read_generic, &spr_write_generic,
786 0x00000000);
787 /* XXX : not implemented */
788 spr_register(env, SPR_SIA, "SIA",
789 SPR_NOACCESS, SPR_NOACCESS,
790 &spr_read_generic, SPR_NOACCESS,
791 0x00000000);
792 spr_register(env, SPR_UMMCR0, "UMMCR0",
793 &spr_read_ureg, SPR_NOACCESS,
794 &spr_read_ureg, SPR_NOACCESS,
795 0x00000000);
796 spr_register(env, SPR_UMMCR1, "UMMCR1",
797 &spr_read_ureg, SPR_NOACCESS,
798 &spr_read_ureg, SPR_NOACCESS,
799 0x00000000);
800 spr_register(env, SPR_UPMC1, "UPMC1",
801 &spr_read_ureg, SPR_NOACCESS,
802 &spr_read_ureg, SPR_NOACCESS,
803 0x00000000);
804 spr_register(env, SPR_UPMC2, "UPMC2",
805 &spr_read_ureg, SPR_NOACCESS,
806 &spr_read_ureg, SPR_NOACCESS,
807 0x00000000);
808 spr_register(env, SPR_UPMC3, "UPMC3",
809 &spr_read_ureg, SPR_NOACCESS,
810 &spr_read_ureg, SPR_NOACCESS,
811 0x00000000);
812 spr_register(env, SPR_UPMC4, "UPMC4",
813 &spr_read_ureg, SPR_NOACCESS,
814 &spr_read_ureg, SPR_NOACCESS,
815 0x00000000);
816 spr_register(env, SPR_USIA, "USIA",
817 &spr_read_ureg, SPR_NOACCESS,
818 &spr_read_ureg, SPR_NOACCESS,
819 0x00000000);
820 /* Thermal management */
821 /* XXX : not implemented */
822 spr_register(env, SPR_THRM1, "THRM1",
823 SPR_NOACCESS, SPR_NOACCESS,
824 &spr_read_generic, &spr_write_generic,
825 0x00000000);
826 /* XXX : not implemented */
827 spr_register(env, SPR_THRM2, "THRM2",
828 SPR_NOACCESS, SPR_NOACCESS,
829 &spr_read_generic, &spr_write_generic,
830 0x00000000);
831 /* XXX : not implemented */
832 spr_register(env, SPR_THRM3, "THRM3",
833 SPR_NOACCESS, SPR_NOACCESS,
834 &spr_read_generic, &spr_write_generic,
835 0x00000000);
836 /* External access control */
837 /* XXX : not implemented */
838 spr_register(env, SPR_EAR, "EAR",
839 SPR_NOACCESS, SPR_NOACCESS,
840 &spr_read_generic, &spr_write_generic,
841 0x00000000);
842 }
843
844 /* SPR specific to PowerPC 604 implementation */
845 static void gen_spr_604 (CPUPPCState *env)
846 {
847 /* Processor identification */
848 spr_register(env, SPR_PIR, "PIR",
849 SPR_NOACCESS, SPR_NOACCESS,
850 &spr_read_generic, &spr_write_pir,
851 0x00000000);
852 /* Breakpoints */
853 /* XXX : not implemented */
854 spr_register(env, SPR_IABR, "IABR",
855 SPR_NOACCESS, SPR_NOACCESS,
856 &spr_read_generic, &spr_write_generic,
857 0x00000000);
858 /* XXX : not implemented */
859 spr_register(env, SPR_DABR, "DABR",
860 SPR_NOACCESS, SPR_NOACCESS,
861 &spr_read_generic, &spr_write_generic,
862 0x00000000);
863 /* Performance counters */
864 /* XXX : not implemented */
865 spr_register(env, SPR_MMCR0, "MMCR0",
866 SPR_NOACCESS, SPR_NOACCESS,
867 &spr_read_generic, &spr_write_generic,
868 0x00000000);
869 /* XXX : not implemented */
870 spr_register(env, SPR_MMCR1, "MMCR1",
871 SPR_NOACCESS, SPR_NOACCESS,
872 &spr_read_generic, &spr_write_generic,
873 0x00000000);
874 /* XXX : not implemented */
875 spr_register(env, SPR_PMC1, "PMC1",
876 SPR_NOACCESS, SPR_NOACCESS,
877 &spr_read_generic, &spr_write_generic,
878 0x00000000);
879 /* XXX : not implemented */
880 spr_register(env, SPR_PMC2, "PMC2",
881 SPR_NOACCESS, SPR_NOACCESS,
882 &spr_read_generic, &spr_write_generic,
883 0x00000000);
884 /* XXX : not implemented */
885 spr_register(env, SPR_PMC3, "PMC3",
886 SPR_NOACCESS, SPR_NOACCESS,
887 &spr_read_generic, &spr_write_generic,
888 0x00000000);
889 /* XXX : not implemented */
890 spr_register(env, SPR_PMC4, "PMC4",
891 SPR_NOACCESS, SPR_NOACCESS,
892 &spr_read_generic, &spr_write_generic,
893 0x00000000);
894 /* XXX : not implemented */
895 spr_register(env, SPR_SIA, "SIA",
896 SPR_NOACCESS, SPR_NOACCESS,
897 &spr_read_generic, SPR_NOACCESS,
898 0x00000000);
899 /* XXX : not implemented */
900 spr_register(env, SPR_SDA, "SDA",
901 SPR_NOACCESS, SPR_NOACCESS,
902 &spr_read_generic, SPR_NOACCESS,
903 0x00000000);
904 /* External access control */
905 /* XXX : not implemented */
906 spr_register(env, SPR_EAR, "EAR",
907 SPR_NOACCESS, SPR_NOACCESS,
908 &spr_read_generic, &spr_write_generic,
909 0x00000000);
910 }
911
912 /* SPR specific to PowerPC 603 implementation */
913 static void gen_spr_603 (CPUPPCState *env)
914 {
915 /* External access control */
916 /* XXX : not implemented */
917 spr_register(env, SPR_EAR, "EAR",
918 SPR_NOACCESS, SPR_NOACCESS,
919 &spr_read_generic, &spr_write_generic,
920 0x00000000);
921 }
922
923 /* SPR specific to PowerPC G2 implementation */
924 static void gen_spr_G2 (CPUPPCState *env)
925 {
926 /* Memory base address */
927 /* MBAR */
928 spr_register(env, SPR_MBAR, "MBAR",
929 SPR_NOACCESS, SPR_NOACCESS,
930 &spr_read_generic, &spr_write_generic,
931 0x00000000);
932 /* System version register */
933 /* SVR */
934 spr_register(env, SPR_SVR, "SVR",
935 SPR_NOACCESS, SPR_NOACCESS,
936 &spr_read_generic, SPR_NOACCESS,
937 0x00000000);
938 /* Exception processing */
939 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
940 SPR_NOACCESS, SPR_NOACCESS,
941 &spr_read_generic, &spr_write_generic,
942 0x00000000);
943 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
944 SPR_NOACCESS, SPR_NOACCESS,
945 &spr_read_generic, &spr_write_generic,
946 0x00000000);
947 /* Breakpoints */
948 /* XXX : not implemented */
949 spr_register(env, SPR_DABR, "DABR",
950 SPR_NOACCESS, SPR_NOACCESS,
951 &spr_read_generic, &spr_write_generic,
952 0x00000000);
953 /* XXX : not implemented */
954 spr_register(env, SPR_DABR2, "DABR2",
955 SPR_NOACCESS, SPR_NOACCESS,
956 &spr_read_generic, &spr_write_generic,
957 0x00000000);
958 /* XXX : not implemented */
959 spr_register(env, SPR_IABR, "IABR",
960 SPR_NOACCESS, SPR_NOACCESS,
961 &spr_read_generic, &spr_write_generic,
962 0x00000000);
963 /* XXX : not implemented */
964 spr_register(env, SPR_IABR2, "IABR2",
965 SPR_NOACCESS, SPR_NOACCESS,
966 &spr_read_generic, &spr_write_generic,
967 0x00000000);
968 /* XXX : not implemented */
969 spr_register(env, SPR_IBCR, "IBCR",
970 SPR_NOACCESS, SPR_NOACCESS,
971 &spr_read_generic, &spr_write_generic,
972 0x00000000);
973 /* XXX : not implemented */
974 spr_register(env, SPR_DBCR, "DBCR",
975 SPR_NOACCESS, SPR_NOACCESS,
976 &spr_read_generic, &spr_write_generic,
977 0x00000000);
978 }
979
980 /* SPR specific to PowerPC 602 implementation */
981 static void gen_spr_602 (CPUPPCState *env)
982 {
983 /* ESA registers */
984 /* XXX : not implemented */
985 spr_register(env, SPR_SER, "SER",
986 SPR_NOACCESS, SPR_NOACCESS,
987 &spr_read_generic, &spr_write_generic,
988 0x00000000);
989 /* XXX : not implemented */
990 spr_register(env, SPR_SEBR, "SEBR",
991 SPR_NOACCESS, SPR_NOACCESS,
992 &spr_read_generic, &spr_write_generic,
993 0x00000000);
994 /* XXX : not implemented */
995 spr_register(env, SPR_ESASR, "ESASR",
996 SPR_NOACCESS, SPR_NOACCESS,
997 &spr_read_generic, &spr_write_generic,
998 0x00000000);
999 /* Floating point status */
1000 /* XXX : not implemented */
1001 spr_register(env, SPR_SP, "SP",
1002 SPR_NOACCESS, SPR_NOACCESS,
1003 &spr_read_generic, &spr_write_generic,
1004 0x00000000);
1005 /* XXX : not implemented */
1006 spr_register(env, SPR_LT, "LT",
1007 SPR_NOACCESS, SPR_NOACCESS,
1008 &spr_read_generic, &spr_write_generic,
1009 0x00000000);
1010 /* Watchdog timer */
1011 /* XXX : not implemented */
1012 spr_register(env, SPR_TCR, "TCR",
1013 SPR_NOACCESS, SPR_NOACCESS,
1014 &spr_read_generic, &spr_write_generic,
1015 0x00000000);
1016 /* Interrupt base */
1017 spr_register(env, SPR_IBR, "IBR",
1018 SPR_NOACCESS, SPR_NOACCESS,
1019 &spr_read_generic, &spr_write_generic,
1020 0x00000000);
1021 }
1022
1023 /* SPR specific to PowerPC 601 implementation */
1024 static void gen_spr_601 (CPUPPCState *env)
1025 {
1026 /* Multiplication/division register */
1027 /* MQ */
1028 spr_register(env, SPR_MQ, "MQ",
1029 &spr_read_generic, &spr_write_generic,
1030 &spr_read_generic, &spr_write_generic,
1031 0x00000000);
1032 /* RTC registers */
1033 spr_register(env, SPR_601_RTCU, "RTCU",
1034 SPR_NOACCESS, SPR_NOACCESS,
1035 SPR_NOACCESS, &spr_write_601_rtcu,
1036 0x00000000);
1037 spr_register(env, SPR_601_VRTCU, "RTCU",
1038 &spr_read_601_rtcu, SPR_NOACCESS,
1039 &spr_read_601_rtcu, SPR_NOACCESS,
1040 0x00000000);
1041 spr_register(env, SPR_601_RTCL, "RTCL",
1042 SPR_NOACCESS, SPR_NOACCESS,
1043 SPR_NOACCESS, &spr_write_601_rtcl,
1044 0x00000000);
1045 spr_register(env, SPR_601_VRTCL, "RTCL",
1046 &spr_read_601_rtcl, SPR_NOACCESS,
1047 &spr_read_601_rtcl, SPR_NOACCESS,
1048 0x00000000);
1049 /* Timer */
1050 #if 0 /* ? */
1051 spr_register(env, SPR_601_UDECR, "UDECR",
1052 &spr_read_decr, SPR_NOACCESS,
1053 &spr_read_decr, SPR_NOACCESS,
1054 0x00000000);
1055 #endif
1056 /* External access control */
1057 /* XXX : not implemented */
1058 spr_register(env, SPR_EAR, "EAR",
1059 SPR_NOACCESS, SPR_NOACCESS,
1060 &spr_read_generic, &spr_write_generic,
1061 0x00000000);
1062 /* Memory management */
1063 spr_register(env, SPR_IBAT0U, "IBAT0U",
1064 SPR_NOACCESS, SPR_NOACCESS,
1065 &spr_read_601_ubat, &spr_write_601_ubatu,
1066 0x00000000);
1067 spr_register(env, SPR_IBAT0L, "IBAT0L",
1068 SPR_NOACCESS, SPR_NOACCESS,
1069 &spr_read_601_ubat, &spr_write_601_ubatl,
1070 0x00000000);
1071 spr_register(env, SPR_IBAT1U, "IBAT1U",
1072 SPR_NOACCESS, SPR_NOACCESS,
1073 &spr_read_601_ubat, &spr_write_601_ubatu,
1074 0x00000000);
1075 spr_register(env, SPR_IBAT1L, "IBAT1L",
1076 SPR_NOACCESS, SPR_NOACCESS,
1077 &spr_read_601_ubat, &spr_write_601_ubatl,
1078 0x00000000);
1079 spr_register(env, SPR_IBAT2U, "IBAT2U",
1080 SPR_NOACCESS, SPR_NOACCESS,
1081 &spr_read_601_ubat, &spr_write_601_ubatu,
1082 0x00000000);
1083 spr_register(env, SPR_IBAT2L, "IBAT2L",
1084 SPR_NOACCESS, SPR_NOACCESS,
1085 &spr_read_601_ubat, &spr_write_601_ubatl,
1086 0x00000000);
1087 spr_register(env, SPR_IBAT3U, "IBAT3U",
1088 SPR_NOACCESS, SPR_NOACCESS,
1089 &spr_read_601_ubat, &spr_write_601_ubatu,
1090 0x00000000);
1091 spr_register(env, SPR_IBAT3L, "IBAT3L",
1092 SPR_NOACCESS, SPR_NOACCESS,
1093 &spr_read_601_ubat, &spr_write_601_ubatl,
1094 0x00000000);
1095 }
1096
1097 /* PowerPC BookE SPR */
1098 static void gen_spr_BookE (CPUPPCState *env)
1099 {
1100 /* Processor identification */
1101 spr_register(env, SPR_BOOKE_PIR, "PIR",
1102 SPR_NOACCESS, SPR_NOACCESS,
1103 &spr_read_generic, &spr_write_pir,
1104 0x00000000);
1105 /* Interrupt processing */
1106 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1107 SPR_NOACCESS, SPR_NOACCESS,
1108 &spr_read_generic, &spr_write_generic,
1109 0x00000000);
1110 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1111 SPR_NOACCESS, SPR_NOACCESS,
1112 &spr_read_generic, &spr_write_generic,
1113 0x00000000);
1114 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
1115 SPR_NOACCESS, SPR_NOACCESS,
1116 &spr_read_generic, &spr_write_generic,
1117 0x00000000);
1118 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
1119 SPR_NOACCESS, SPR_NOACCESS,
1120 &spr_read_generic, &spr_write_generic,
1121 0x00000000);
1122 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
1123 SPR_NOACCESS, SPR_NOACCESS,
1124 &spr_read_generic, &spr_write_generic,
1125 0x00000000);
1126 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
1127 SPR_NOACCESS, SPR_NOACCESS,
1128 &spr_read_generic, &spr_write_generic,
1129 0x00000000);
1130 /* Debug */
1131 /* XXX : not implemented */
1132 spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1133 SPR_NOACCESS, SPR_NOACCESS,
1134 &spr_read_generic, &spr_write_generic,
1135 0x00000000);
1136 /* XXX : not implemented */
1137 spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1138 SPR_NOACCESS, SPR_NOACCESS,
1139 &spr_read_generic, &spr_write_generic,
1140 0x00000000);
1141 /* XXX : not implemented */
1142 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
1143 SPR_NOACCESS, SPR_NOACCESS,
1144 &spr_read_generic, &spr_write_generic,
1145 0x00000000);
1146 /* XXX : not implemented */
1147 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
1148 SPR_NOACCESS, SPR_NOACCESS,
1149 &spr_read_generic, &spr_write_generic,
1150 0x00000000);
1151 /* XXX : not implemented */
1152 spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1153 SPR_NOACCESS, SPR_NOACCESS,
1154 &spr_read_generic, &spr_write_generic,
1155 0x00000000);
1156 /* XXX : not implemented */
1157 spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1158 SPR_NOACCESS, SPR_NOACCESS,
1159 &spr_read_generic, &spr_write_generic,
1160 0x00000000);
1161 /* XXX : not implemented */
1162 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
1163 SPR_NOACCESS, SPR_NOACCESS,
1164 &spr_read_generic, &spr_write_generic,
1165 0x00000000);
1166 /* XXX : not implemented */
1167 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
1168 SPR_NOACCESS, SPR_NOACCESS,
1169 &spr_read_generic, &spr_write_generic,
1170 0x00000000);
1171 /* XXX : not implemented */
1172 spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1173 SPR_NOACCESS, SPR_NOACCESS,
1174 &spr_read_generic, &spr_write_generic,
1175 0x00000000);
1176 /* XXX : not implemented */
1177 spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1178 SPR_NOACCESS, SPR_NOACCESS,
1179 &spr_read_generic, &spr_write_generic,
1180 0x00000000);
1181 /* XXX : not implemented */
1182 spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1183 SPR_NOACCESS, SPR_NOACCESS,
1184 &spr_read_generic, &spr_write_generic,
1185 0x00000000);
1186 /* XXX : not implemented */
1187 spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1188 SPR_NOACCESS, SPR_NOACCESS,
1189 &spr_read_generic, &spr_write_clear,
1190 0x00000000);
1191 spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1192 SPR_NOACCESS, SPR_NOACCESS,
1193 &spr_read_generic, &spr_write_generic,
1194 0x00000000);
1195 spr_register(env, SPR_BOOKE_ESR, "ESR",
1196 SPR_NOACCESS, SPR_NOACCESS,
1197 &spr_read_generic, &spr_write_generic,
1198 0x00000000);
1199 spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1200 SPR_NOACCESS, SPR_NOACCESS,
1201 &spr_read_generic, &spr_write_generic,
1202 0x00000000);
1203 /* Exception vectors */
1204 spr_register(env, SPR_BOOKE_IVOR0, "IVOR0",
1205 SPR_NOACCESS, SPR_NOACCESS,
1206 &spr_read_generic, &spr_write_generic,
1207 0x00000000);
1208 spr_register(env, SPR_BOOKE_IVOR1, "IVOR1",
1209 SPR_NOACCESS, SPR_NOACCESS,
1210 &spr_read_generic, &spr_write_generic,
1211 0x00000000);
1212 spr_register(env, SPR_BOOKE_IVOR2, "IVOR2",
1213 SPR_NOACCESS, SPR_NOACCESS,
1214 &spr_read_generic, &spr_write_generic,
1215 0x00000000);
1216 spr_register(env, SPR_BOOKE_IVOR3, "IVOR3",
1217 SPR_NOACCESS, SPR_NOACCESS,
1218 &spr_read_generic, &spr_write_generic,
1219 0x00000000);
1220 spr_register(env, SPR_BOOKE_IVOR4, "IVOR4",
1221 SPR_NOACCESS, SPR_NOACCESS,
1222 &spr_read_generic, &spr_write_generic,
1223 0x00000000);
1224 spr_register(env, SPR_BOOKE_IVOR5, "IVOR5",
1225 SPR_NOACCESS, SPR_NOACCESS,
1226 &spr_read_generic, &spr_write_generic,
1227 0x00000000);
1228 spr_register(env, SPR_BOOKE_IVOR6, "IVOR6",
1229 SPR_NOACCESS, SPR_NOACCESS,
1230 &spr_read_generic, &spr_write_generic,
1231 0x00000000);
1232 spr_register(env, SPR_BOOKE_IVOR7, "IVOR7",
1233 SPR_NOACCESS, SPR_NOACCESS,
1234 &spr_read_generic, &spr_write_generic,
1235 0x00000000);
1236 spr_register(env, SPR_BOOKE_IVOR8, "IVOR8",
1237 SPR_NOACCESS, SPR_NOACCESS,
1238 &spr_read_generic, &spr_write_generic,
1239 0x00000000);
1240 spr_register(env, SPR_BOOKE_IVOR9, "IVOR9",
1241 SPR_NOACCESS, SPR_NOACCESS,
1242 &spr_read_generic, &spr_write_generic,
1243 0x00000000);
1244 spr_register(env, SPR_BOOKE_IVOR10, "IVOR10",
1245 SPR_NOACCESS, SPR_NOACCESS,
1246 &spr_read_generic, &spr_write_generic,
1247 0x00000000);
1248 spr_register(env, SPR_BOOKE_IVOR11, "IVOR11",
1249 SPR_NOACCESS, SPR_NOACCESS,
1250 &spr_read_generic, &spr_write_generic,
1251 0x00000000);
1252 spr_register(env, SPR_BOOKE_IVOR12, "IVOR12",
1253 SPR_NOACCESS, SPR_NOACCESS,
1254 &spr_read_generic, &spr_write_generic,
1255 0x00000000);
1256 spr_register(env, SPR_BOOKE_IVOR13, "IVOR13",
1257 SPR_NOACCESS, SPR_NOACCESS,
1258 &spr_read_generic, &spr_write_generic,
1259 0x00000000);
1260 spr_register(env, SPR_BOOKE_IVOR14, "IVOR14",
1261 SPR_NOACCESS, SPR_NOACCESS,
1262 &spr_read_generic, &spr_write_generic,
1263 0x00000000);
1264 spr_register(env, SPR_BOOKE_IVOR15, "IVOR15",
1265 SPR_NOACCESS, SPR_NOACCESS,
1266 &spr_read_generic, &spr_write_generic,
1267 0x00000000);
1268 spr_register(env, SPR_BOOKE_IVOR32, "IVOR32",
1269 SPR_NOACCESS, SPR_NOACCESS,
1270 &spr_read_generic, &spr_write_generic,
1271 0x00000000);
1272 spr_register(env, SPR_BOOKE_IVOR33, "IVOR33",
1273 SPR_NOACCESS, SPR_NOACCESS,
1274 &spr_read_generic, &spr_write_generic,
1275 0x00000000);
1276 spr_register(env, SPR_BOOKE_IVOR34, "IVOR34",
1277 SPR_NOACCESS, SPR_NOACCESS,
1278 &spr_read_generic, &spr_write_generic,
1279 0x00000000);
1280 spr_register(env, SPR_BOOKE_IVOR35, "IVOR35",
1281 SPR_NOACCESS, SPR_NOACCESS,
1282 &spr_read_generic, &spr_write_generic,
1283 0x00000000);
1284 spr_register(env, SPR_BOOKE_IVOR36, "IVOR36",
1285 SPR_NOACCESS, SPR_NOACCESS,
1286 &spr_read_generic, &spr_write_generic,
1287 0x00000000);
1288 spr_register(env, SPR_BOOKE_IVOR37, "IVOR37",
1289 SPR_NOACCESS, SPR_NOACCESS,
1290 &spr_read_generic, &spr_write_generic,
1291 0x00000000);
1292 spr_register(env, SPR_BOOKE_PID, "PID",
1293 SPR_NOACCESS, SPR_NOACCESS,
1294 &spr_read_generic, &spr_write_generic,
1295 0x00000000);
1296 spr_register(env, SPR_BOOKE_TCR, "TCR",
1297 SPR_NOACCESS, SPR_NOACCESS,
1298 &spr_read_generic, &spr_write_booke_tcr,
1299 0x00000000);
1300 spr_register(env, SPR_BOOKE_TSR, "TSR",
1301 SPR_NOACCESS, SPR_NOACCESS,
1302 &spr_read_generic, &spr_write_booke_tsr,
1303 0x00000000);
1304 /* Timer */
1305 spr_register(env, SPR_DECR, "DECR",
1306 SPR_NOACCESS, SPR_NOACCESS,
1307 &spr_read_decr, &spr_write_decr,
1308 0x00000000);
1309 spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1310 SPR_NOACCESS, SPR_NOACCESS,
1311 SPR_NOACCESS, &spr_write_generic,
1312 0x00000000);
1313 /* SPRGs */
1314 spr_register(env, SPR_USPRG0, "USPRG0",
1315 &spr_read_generic, &spr_write_generic,
1316 &spr_read_generic, &spr_write_generic,
1317 0x00000000);
1318 spr_register(env, SPR_SPRG4, "SPRG4",
1319 SPR_NOACCESS, SPR_NOACCESS,
1320 &spr_read_generic, &spr_write_generic,
1321 0x00000000);
1322 spr_register(env, SPR_USPRG4, "USPRG4",
1323 &spr_read_ureg, SPR_NOACCESS,
1324 &spr_read_ureg, SPR_NOACCESS,
1325 0x00000000);
1326 spr_register(env, SPR_SPRG5, "SPRG5",
1327 SPR_NOACCESS, SPR_NOACCESS,
1328 &spr_read_generic, &spr_write_generic,
1329 0x00000000);
1330 spr_register(env, SPR_USPRG5, "USPRG5",
1331 &spr_read_ureg, SPR_NOACCESS,
1332 &spr_read_ureg, SPR_NOACCESS,
1333 0x00000000);
1334 spr_register(env, SPR_SPRG6, "SPRG6",
1335 SPR_NOACCESS, SPR_NOACCESS,
1336 &spr_read_generic, &spr_write_generic,
1337 0x00000000);
1338 spr_register(env, SPR_USPRG6, "USPRG6",
1339 &spr_read_ureg, SPR_NOACCESS,
1340 &spr_read_ureg, SPR_NOACCESS,
1341 0x00000000);
1342 spr_register(env, SPR_SPRG7, "SPRG7",
1343 SPR_NOACCESS, SPR_NOACCESS,
1344 &spr_read_generic, &spr_write_generic,
1345 0x00000000);
1346 spr_register(env, SPR_USPRG7, "USPRG7",
1347 &spr_read_ureg, SPR_NOACCESS,
1348 &spr_read_ureg, SPR_NOACCESS,
1349 0x00000000);
1350 }
1351
1352 /* FSL storage control registers */
1353 static void gen_spr_BookE_FSL (CPUPPCState *env)
1354 {
1355 /* TLB assist registers */
1356 spr_register(env, SPR_BOOKE_MAS0, "MAS0",
1357 SPR_NOACCESS, SPR_NOACCESS,
1358 &spr_read_generic, &spr_write_generic,
1359 0x00000000);
1360 spr_register(env, SPR_BOOKE_MAS1, "MAS2",
1361 SPR_NOACCESS, SPR_NOACCESS,
1362 &spr_read_generic, &spr_write_generic,
1363 0x00000000);
1364 spr_register(env, SPR_BOOKE_MAS2, "MAS3",
1365 SPR_NOACCESS, SPR_NOACCESS,
1366 &spr_read_generic, &spr_write_generic,
1367 0x00000000);
1368 spr_register(env, SPR_BOOKE_MAS3, "MAS4",
1369 SPR_NOACCESS, SPR_NOACCESS,
1370 &spr_read_generic, &spr_write_generic,
1371 0x00000000);
1372 spr_register(env, SPR_BOOKE_MAS4, "MAS5",
1373 SPR_NOACCESS, SPR_NOACCESS,
1374 &spr_read_generic, &spr_write_generic,
1375 0x00000000);
1376 spr_register(env, SPR_BOOKE_MAS6, "MAS6",
1377 SPR_NOACCESS, SPR_NOACCESS,
1378 &spr_read_generic, &spr_write_generic,
1379 0x00000000);
1380 spr_register(env, SPR_BOOKE_MAS7, "MAS7",
1381 SPR_NOACCESS, SPR_NOACCESS,
1382 &spr_read_generic, &spr_write_generic,
1383 0x00000000);
1384 if (env->nb_pids > 1) {
1385 spr_register(env, SPR_BOOKE_PID1, "PID1",
1386 SPR_NOACCESS, SPR_NOACCESS,
1387 &spr_read_generic, &spr_write_generic,
1388 0x00000000);
1389 }
1390 if (env->nb_pids > 2) {
1391 spr_register(env, SPR_BOOKE_PID2, "PID2",
1392 SPR_NOACCESS, SPR_NOACCESS,
1393 &spr_read_generic, &spr_write_generic,
1394 0x00000000);
1395 }
1396 spr_register(env, SPR_BOOKE_MMUCFG, "MMUCFG",
1397 SPR_NOACCESS, SPR_NOACCESS,
1398 &spr_read_generic, SPR_NOACCESS,
1399 0x00000000); /* TOFIX */
1400 spr_register(env, SPR_BOOKE_MMUCSR0, "MMUCSR0",
1401 SPR_NOACCESS, SPR_NOACCESS,
1402 &spr_read_generic, &spr_write_generic,
1403 0x00000000); /* TOFIX */
1404 switch (env->nb_ways) {
1405 case 4:
1406 spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1407 SPR_NOACCESS, SPR_NOACCESS,
1408 &spr_read_generic, SPR_NOACCESS,
1409 0x00000000); /* TOFIX */
1410 /* Fallthru */
1411 case 3:
1412 spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1413 SPR_NOACCESS, SPR_NOACCESS,
1414 &spr_read_generic, SPR_NOACCESS,
1415 0x00000000); /* TOFIX */
1416 /* Fallthru */
1417 case 2:
1418 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1419 SPR_NOACCESS, SPR_NOACCESS,
1420 &spr_read_generic, SPR_NOACCESS,
1421 0x00000000); /* TOFIX */
1422 /* Fallthru */
1423 case 1:
1424 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1425 SPR_NOACCESS, SPR_NOACCESS,
1426 &spr_read_generic, SPR_NOACCESS,
1427 0x00000000); /* TOFIX */
1428 /* Fallthru */
1429 case 0:
1430 default:
1431 break;
1432 }
1433 }
1434
1435 /* SPR specific to PowerPC 440 implementation */
1436 static void gen_spr_440 (CPUPPCState *env)
1437 {
1438 /* Cache control */
1439 /* XXX : not implemented */
1440 spr_register(env, SPR_440_DNV0, "DNV0",
1441 SPR_NOACCESS, SPR_NOACCESS,
1442 &spr_read_generic, &spr_write_generic,
1443 0x00000000);
1444 /* XXX : not implemented */
1445 spr_register(env, SPR_440_DNV1, "DNV1",
1446 SPR_NOACCESS, SPR_NOACCESS,
1447 &spr_read_generic, &spr_write_generic,
1448 0x00000000);
1449 /* XXX : not implemented */
1450 spr_register(env, SPR_440_DNV2, "DNV2",
1451 SPR_NOACCESS, SPR_NOACCESS,
1452 &spr_read_generic, &spr_write_generic,
1453 0x00000000);
1454 /* XXX : not implemented */
1455 spr_register(env, SPR_440_DNV3, "DNV3",
1456 SPR_NOACCESS, SPR_NOACCESS,
1457 &spr_read_generic, &spr_write_generic,
1458 0x00000000);
1459 /* XXX : not implemented */
1460 spr_register(env, SPR_440_DVT0, "DVT0",
1461 SPR_NOACCESS, SPR_NOACCESS,
1462 &spr_read_generic, &spr_write_generic,
1463 0x00000000);
1464 /* XXX : not implemented */
1465 spr_register(env, SPR_440_DVT1, "DVT1",
1466 SPR_NOACCESS, SPR_NOACCESS,
1467 &spr_read_generic, &spr_write_generic,
1468 0x00000000);
1469 /* XXX : not implemented */
1470 spr_register(env, SPR_440_DVT2, "DVT2",
1471 SPR_NOACCESS, SPR_NOACCESS,
1472 &spr_read_generic, &spr_write_generic,
1473 0x00000000);
1474 /* XXX : not implemented */
1475 spr_register(env, SPR_440_DVT3, "DVT3",
1476 SPR_NOACCESS, SPR_NOACCESS,
1477 &spr_read_generic, &spr_write_generic,
1478 0x00000000);
1479 /* XXX : not implemented */
1480 spr_register(env, SPR_440_DVLIM, "DVLIM",
1481 SPR_NOACCESS, SPR_NOACCESS,
1482 &spr_read_generic, &spr_write_generic,
1483 0x00000000);
1484 /* XXX : not implemented */
1485 spr_register(env, SPR_440_INV0, "INV0",
1486 SPR_NOACCESS, SPR_NOACCESS,
1487 &spr_read_generic, &spr_write_generic,
1488 0x00000000);
1489 /* XXX : not implemented */
1490 spr_register(env, SPR_440_INV1, "INV1",
1491 SPR_NOACCESS, SPR_NOACCESS,
1492 &spr_read_generic, &spr_write_generic,
1493 0x00000000);
1494 /* XXX : not implemented */
1495 spr_register(env, SPR_440_INV2, "INV2",
1496 SPR_NOACCESS, SPR_NOACCESS,
1497 &spr_read_generic, &spr_write_generic,
1498 0x00000000);
1499 /* XXX : not implemented */
1500 spr_register(env, SPR_440_INV3, "INV3",
1501 SPR_NOACCESS, SPR_NOACCESS,
1502 &spr_read_generic, &spr_write_generic,
1503 0x00000000);
1504 /* XXX : not implemented */
1505 spr_register(env, SPR_440_IVT0, "IVT0",
1506 SPR_NOACCESS, SPR_NOACCESS,
1507 &spr_read_generic, &spr_write_generic,
1508 0x00000000);
1509 /* XXX : not implemented */
1510 spr_register(env, SPR_440_IVT1, "IVT1",
1511 SPR_NOACCESS, SPR_NOACCESS,
1512 &spr_read_generic, &spr_write_generic,
1513 0x00000000);
1514 /* XXX : not implemented */
1515 spr_register(env, SPR_440_IVT2, "IVT2",
1516 SPR_NOACCESS, SPR_NOACCESS,
1517 &spr_read_generic, &spr_write_generic,
1518 0x00000000);
1519 /* XXX : not implemented */
1520 spr_register(env, SPR_440_IVT3, "IVT3",
1521 SPR_NOACCESS, SPR_NOACCESS,
1522 &spr_read_generic, &spr_write_generic,
1523 0x00000000);
1524 /* XXX : not implemented */
1525 spr_register(env, SPR_440_IVLIM, "IVLIM",
1526 SPR_NOACCESS, SPR_NOACCESS,
1527 &spr_read_generic, &spr_write_generic,
1528 0x00000000);
1529 /* Cache debug */
1530 /* XXX : not implemented */
1531 spr_register(env, SPR_BOOKE_DCBTRH, "DCBTRH",
1532 SPR_NOACCESS, SPR_NOACCESS,
1533 &spr_read_generic, SPR_NOACCESS,
1534 0x00000000);
1535 /* XXX : not implemented */
1536 spr_register(env, SPR_BOOKE_DCBTRL, "DCBTRL",
1537 SPR_NOACCESS, SPR_NOACCESS,
1538 &spr_read_generic, SPR_NOACCESS,
1539 0x00000000);
1540 /* XXX : not implemented */
1541 spr_register(env, SPR_BOOKE_ICBDR, "ICBDR",
1542 SPR_NOACCESS, SPR_NOACCESS,
1543 &spr_read_generic, SPR_NOACCESS,
1544 0x00000000);
1545 /* XXX : not implemented */
1546 spr_register(env, SPR_BOOKE_ICBTRH, "ICBTRH",
1547 SPR_NOACCESS, SPR_NOACCESS,
1548 &spr_read_generic, SPR_NOACCESS,
1549 0x00000000);
1550 /* XXX : not implemented */
1551 spr_register(env, SPR_BOOKE_ICBTRL, "ICBTRL",
1552 SPR_NOACCESS, SPR_NOACCESS,
1553 &spr_read_generic, SPR_NOACCESS,
1554 0x00000000);
1555 /* XXX : not implemented */
1556 spr_register(env, SPR_440_DBDR, "DBDR",
1557 SPR_NOACCESS, SPR_NOACCESS,
1558 &spr_read_generic, &spr_write_generic,
1559 0x00000000);
1560 /* Processor control */
1561 spr_register(env, SPR_4xx_CCR0, "CCR0",
1562 SPR_NOACCESS, SPR_NOACCESS,
1563 &spr_read_generic, &spr_write_generic,
1564 0x00000000);
1565 spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1566 SPR_NOACCESS, SPR_NOACCESS,
1567 &spr_read_generic, SPR_NOACCESS,
1568 0x00000000);
1569 /* Storage control */
1570 spr_register(env, SPR_440_MMUCR, "MMUCR",
1571 SPR_NOACCESS, SPR_NOACCESS,
1572 &spr_read_generic, &spr_write_generic,
1573 0x00000000);
1574 }
1575
1576 /* SPR shared between PowerPC 40x implementations */
1577 static void gen_spr_40x (CPUPPCState *env)
1578 {
1579 /* Cache */
1580 /* XXX : not implemented */
1581 spr_register(env, SPR_40x_DCCR, "DCCR",
1582 SPR_NOACCESS, SPR_NOACCESS,
1583 &spr_read_generic, &spr_write_generic,
1584 0x00000000);
1585 /* XXX : not implemented */
1586 spr_register(env, SPR_40x_DCWR, "DCWR",
1587 SPR_NOACCESS, SPR_NOACCESS,
1588 &spr_read_generic, &spr_write_generic,
1589 0x00000000);
1590 /* XXX : not implemented */
1591 spr_register(env, SPR_40x_ICCR, "ICCR",
1592 SPR_NOACCESS, SPR_NOACCESS,
1593 &spr_read_generic, &spr_write_generic,
1594 0x00000000);
1595 /* XXX : not implemented */
1596 spr_register(env, SPR_BOOKE_ICBDR, "ICBDR",
1597 SPR_NOACCESS, SPR_NOACCESS,
1598 &spr_read_generic, SPR_NOACCESS,
1599 0x00000000);
1600 /* Bus access control */
1601 spr_register(env, SPR_40x_SGR, "SGR",
1602 SPR_NOACCESS, SPR_NOACCESS,
1603 &spr_read_generic, &spr_write_generic,
1604 0xFFFFFFFF);
1605 spr_register(env, SPR_40x_ZPR, "ZPR",
1606 SPR_NOACCESS, SPR_NOACCESS,
1607 &spr_read_generic, &spr_write_generic,
1608 0x00000000);
1609 /* MMU */
1610 spr_register(env, SPR_40x_PID, "PID",
1611 SPR_NOACCESS, SPR_NOACCESS,
1612 &spr_read_generic, &spr_write_generic,
1613 0x00000000);
1614 /* Exception */
1615 spr_register(env, SPR_40x_DEAR, "DEAR",
1616 SPR_NOACCESS, SPR_NOACCESS,
1617 &spr_read_generic, &spr_write_generic,
1618 0x00000000);
1619 spr_register(env, SPR_40x_ESR, "ESR",
1620 SPR_NOACCESS, SPR_NOACCESS,
1621 &spr_read_generic, &spr_write_generic,
1622 0x00000000);
1623 spr_register(env, SPR_40x_EVPR, "EVPR",
1624 SPR_NOACCESS, SPR_NOACCESS,
1625 &spr_read_generic, &spr_write_generic,
1626 0x00000000);
1627 spr_register(env, SPR_40x_SRR2, "SRR2",
1628 &spr_read_generic, &spr_write_generic,
1629 &spr_read_generic, &spr_write_generic,
1630 0x00000000);
1631 spr_register(env, SPR_40x_SRR3, "SRR3",
1632 &spr_read_generic, &spr_write_generic,
1633 &spr_read_generic, &spr_write_generic,
1634 0x00000000);
1635 /* Timers */
1636 spr_register(env, SPR_40x_PIT, "PIT",
1637 SPR_NOACCESS, SPR_NOACCESS,
1638 &spr_read_40x_pit, &spr_write_40x_pit,
1639 0x00000000);
1640 spr_register(env, SPR_40x_TCR, "TCR",
1641 SPR_NOACCESS, SPR_NOACCESS,
1642 &spr_read_generic, &spr_write_booke_tcr,
1643 0x00000000);
1644 spr_register(env, SPR_40x_TSR, "TSR",
1645 SPR_NOACCESS, SPR_NOACCESS,
1646 &spr_read_generic, &spr_write_booke_tsr,
1647 0x00000000);
1648 /* Debug interface */
1649 /* XXX : not implemented */
1650 spr_register(env, SPR_40x_DAC1, "DAC1",
1651 SPR_NOACCESS, SPR_NOACCESS,
1652 &spr_read_generic, &spr_write_generic,
1653 0x00000000);
1654 spr_register(env, SPR_40x_DAC2, "DAC2",
1655 SPR_NOACCESS, SPR_NOACCESS,
1656 &spr_read_generic, &spr_write_generic,
1657 0x00000000);
1658 /* XXX : not implemented */
1659 spr_register(env, SPR_40x_DBCR0, "DBCR0",
1660 SPR_NOACCESS, SPR_NOACCESS,
1661 &spr_read_generic, &spr_write_40x_dbcr0,
1662 0x00000000);
1663 /* XXX : not implemented */
1664 spr_register(env, SPR_40x_DBSR, "DBSR",
1665 SPR_NOACCESS, SPR_NOACCESS,
1666 &spr_read_generic, &spr_write_clear,
1667 /* Last reset was system reset */
1668 0x00000300);
1669 /* XXX : not implemented */
1670 spr_register(env, SPR_40x_IAC1, "IAC1",
1671 SPR_NOACCESS, SPR_NOACCESS,
1672 &spr_read_generic, &spr_write_generic,
1673 0x00000000);
1674 spr_register(env, SPR_40x_IAC2, "IAC2",
1675 SPR_NOACCESS, SPR_NOACCESS,
1676 &spr_read_generic, &spr_write_generic,
1677 0x00000000);
1678 }
1679
1680 /* SPR specific to PowerPC 405 implementation */
1681 static void gen_spr_405 (CPUPPCState *env)
1682 {
1683 spr_register(env, SPR_4xx_CCR0, "CCR0",
1684 SPR_NOACCESS, SPR_NOACCESS,
1685 &spr_read_generic, &spr_write_generic,
1686 0x00700000);
1687 /* Debug */
1688 /* XXX : not implemented */
1689 spr_register(env, SPR_405_DBCR1, "DBCR1",
1690 SPR_NOACCESS, SPR_NOACCESS,
1691 &spr_read_generic, &spr_write_generic,
1692 0x00000000);
1693 /* XXX : not implemented */
1694 spr_register(env, SPR_405_DVC1, "DVC1",
1695 SPR_NOACCESS, SPR_NOACCESS,
1696 &spr_read_generic, &spr_write_generic,
1697 0x00000000);
1698 /* XXX : not implemented */
1699 spr_register(env, SPR_405_DVC2, "DVC2",
1700 SPR_NOACCESS, SPR_NOACCESS,
1701 &spr_read_generic, &spr_write_generic,
1702 0x00000000);
1703 /* XXX : not implemented */
1704 spr_register(env, SPR_405_IAC3, "IAC3",
1705 SPR_NOACCESS, SPR_NOACCESS,
1706 &spr_read_generic, &spr_write_generic,
1707 0x00000000);
1708 /* XXX : not implemented */
1709 spr_register(env, SPR_405_IAC4, "IAC4",
1710 SPR_NOACCESS, SPR_NOACCESS,
1711 &spr_read_generic, &spr_write_generic,
1712 0x00000000);
1713 /* Storage control */
1714 /* XXX : not implemented */
1715 spr_register(env, SPR_405_SLER, "SLER",
1716 SPR_NOACCESS, SPR_NOACCESS,
1717 &spr_read_generic, &spr_write_generic,
1718 0x00000000);
1719 /* XXX : not implemented */
1720 spr_register(env, SPR_405_SU0R, "SU0R",
1721 SPR_NOACCESS, SPR_NOACCESS,
1722 &spr_read_generic, &spr_write_generic,
1723 0x00000000);
1724 /* SPRG */
1725 spr_register(env, SPR_USPRG0, "USPRG0",
1726 &spr_read_ureg, SPR_NOACCESS,
1727 &spr_read_ureg, SPR_NOACCESS,
1728 0x00000000);
1729 spr_register(env, SPR_SPRG4, "SPRG4",
1730 SPR_NOACCESS, SPR_NOACCESS,
1731 &spr_read_generic, &spr_write_generic,
1732 0x00000000);
1733 spr_register(env, SPR_USPRG4, "USPRG4",
1734 &spr_read_ureg, SPR_NOACCESS,
1735 &spr_read_ureg, SPR_NOACCESS,
1736 0x00000000);
1737 spr_register(env, SPR_SPRG5, "SPRG5",
1738 SPR_NOACCESS, SPR_NOACCESS,
1739 spr_read_generic, &spr_write_generic,
1740 0x00000000);
1741 spr_register(env, SPR_USPRG5, "USPRG5",
1742 &spr_read_ureg, SPR_NOACCESS,
1743 &spr_read_ureg, SPR_NOACCESS,
1744 0x00000000);
1745 spr_register(env, SPR_SPRG6, "SPRG6",
1746 SPR_NOACCESS, SPR_NOACCESS,
1747 spr_read_generic, &spr_write_generic,
1748 0x00000000);
1749 spr_register(env, SPR_USPRG6, "USPRG6",
1750 &spr_read_ureg, SPR_NOACCESS,
1751 &spr_read_ureg, SPR_NOACCESS,
1752 0x00000000);
1753 spr_register(env, SPR_SPRG7, "SPRG7",
1754 SPR_NOACCESS, SPR_NOACCESS,
1755 spr_read_generic, &spr_write_generic,
1756 0x00000000);
1757 spr_register(env, SPR_USPRG7, "USPRG7",
1758 &spr_read_ureg, SPR_NOACCESS,
1759 &spr_read_ureg, SPR_NOACCESS,
1760 0x00000000);
1761 }
1762
1763 /* SPR shared between PowerPC 401 & 403 implementations */
1764 static void gen_spr_401_403 (CPUPPCState *env)
1765 {
1766 /* Time base */
1767 spr_register(env, SPR_403_VTBL, "TBL",
1768 &spr_read_tbl, SPR_NOACCESS,
1769 &spr_read_tbl, SPR_NOACCESS,
1770 0x00000000);
1771 spr_register(env, SPR_403_TBL, "TBL",
1772 SPR_NOACCESS, SPR_NOACCESS,
1773 SPR_NOACCESS, &spr_write_tbl,
1774 0x00000000);
1775 spr_register(env, SPR_403_VTBU, "TBU",
1776 &spr_read_tbu, SPR_NOACCESS,
1777 &spr_read_tbu, SPR_NOACCESS,
1778 0x00000000);
1779 spr_register(env, SPR_403_TBU, "TBU",
1780 SPR_NOACCESS, SPR_NOACCESS,
1781 SPR_NOACCESS, &spr_write_tbu,
1782 0x00000000);
1783 /* Debug */
1784 /* XXX: not implemented */
1785 spr_register(env, SPR_403_CDBCR, "CDBCR",
1786 SPR_NOACCESS, SPR_NOACCESS,
1787 &spr_read_generic, &spr_write_generic,
1788 0x00000000);
1789 }
1790
1791 /* SPR specific to PowerPC 403 implementation */
1792 static void gen_spr_403 (CPUPPCState *env)
1793 {
1794 /* MMU */
1795 spr_register(env, SPR_403_PBL1, "PBL1",
1796 SPR_NOACCESS, SPR_NOACCESS,
1797 &spr_read_403_pbr, &spr_write_403_pbr,
1798 0x00000000);
1799 spr_register(env, SPR_403_PBU1, "PBU1",
1800 SPR_NOACCESS, SPR_NOACCESS,
1801 &spr_read_403_pbr, &spr_write_403_pbr,
1802 0x00000000);
1803 spr_register(env, SPR_403_PBL2, "PBL2",
1804 SPR_NOACCESS, SPR_NOACCESS,
1805 &spr_read_403_pbr, &spr_write_403_pbr,
1806 0x00000000);
1807 spr_register(env, SPR_403_PBU2, "PBU2",
1808 SPR_NOACCESS, SPR_NOACCESS,
1809 &spr_read_403_pbr, &spr_write_403_pbr,
1810 0x00000000);
1811 /* Debug */
1812 /* XXX : not implemented */
1813 spr_register(env, SPR_40x_DAC2, "DAC2",
1814 SPR_NOACCESS, SPR_NOACCESS,
1815 &spr_read_generic, &spr_write_generic,
1816 0x00000000);
1817 /* XXX : not implemented */
1818 spr_register(env, SPR_40x_IAC2, "IAC2",
1819 SPR_NOACCESS, SPR_NOACCESS,
1820 &spr_read_generic, &spr_write_generic,
1821 0x00000000);
1822 }
1823
1824 /* SPR specific to PowerPC compression coprocessor extension */
1825 #if defined (TODO)
1826 static void gen_spr_compress (CPUPPCState *env)
1827 {
1828 spr_register(env, SPR_401_SKR, "SKR",
1829 SPR_NOACCESS, SPR_NOACCESS,
1830 &spr_read_generic, &spr_write_generic,
1831 0x00000000);
1832 }
1833 #endif
1834
1835 // XXX: TODO (64 bits PowerPC SPRs)
1836 /*
1837 * ASR => SPR 280 (64 bits)
1838 * FPECR => SPR 1022 (?)
1839 * VRSAVE => SPR 256 (Altivec)
1840 * SCOMC => SPR 276 (64 bits ?)
1841 * SCOMD => SPR 277 (64 bits ?)
1842 * HSPRG0 => SPR 304 (hypervisor)
1843 * HSPRG1 => SPR 305 (hypervisor)
1844 * HDEC => SPR 310 (hypervisor)
1845 * HIOR => SPR 311 (hypervisor)
1846 * RMOR => SPR 312 (970)
1847 * HRMOR => SPR 313 (hypervisor)
1848 * HSRR0 => SPR 314 (hypervisor)
1849 * HSRR1 => SPR 315 (hypervisor)
1850 * LPCR => SPR 316 (970)
1851 * LPIDR => SPR 317 (970)
1852 * ... and more (thermal management, performance counters, ...)
1853 */
1854
1855 static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def)
1856 {
1857 env->reserve = -1;
1858 /* Default MMU definitions */
1859 env->nb_BATs = -1;
1860 env->nb_tlb = 0;
1861 env->nb_ways = 0;
1862 /* XXX: missing:
1863 * 32 bits PowerPC:
1864 * - MPC5xx(x)
1865 * - MPC8xx(x)
1866 * - RCPU (same as MPC5xx ?)
1867 */
1868 spr_register(env, SPR_PVR, "PVR",
1869 SPR_NOACCESS, SPR_NOACCESS,
1870 &spr_read_generic, SPR_NOACCESS,
1871 def->pvr);
1872 printf("%s: PVR %08x mask %08x => %08x\n", __func__,
1873 def->pvr, def->pvr_mask, def->pvr & def->pvr_mask);
1874 switch (def->pvr) {
1875 /* Embedded PowerPC from IBM */
1876 case CPU_PPC_401A1: /* 401 A1 family */
1877 case CPU_PPC_401B2: /* 401 B2 family */
1878 case CPU_PPC_401C2: /* 401 C2 family */
1879 case CPU_PPC_401D2: /* 401 D2 family */
1880 case CPU_PPC_401E2: /* 401 E2 family */
1881 case CPU_PPC_401F2: /* 401 F2 family */
1882 case CPU_PPC_401G2: /* 401 G2 family */
1883 case CPU_PPC_IOP480: /* IOP 480 family */
1884 case CPU_PPC_COBRA: /* IBM Processor for Network Resources */
1885 gen_spr_generic(env);
1886 gen_spr_40x(env);
1887 gen_spr_401_403(env);
1888 #if defined (TODO)
1889 /* XXX: optional ? */
1890 gen_spr_compress(env);
1891 #endif
1892 env->nb_BATs = 0;
1893 env->nb_tlb = 64;
1894 env->nb_ways = 1;
1895 env->id_tlbs = 0;
1896 /* XXX: TODO: allocate internal IRQ controller */
1897 break;
1898
1899 case CPU_PPC_403GA: /* 403 GA family */
1900 case CPU_PPC_403GB: /* 403 GB family */
1901 case CPU_PPC_403GC: /* 403 GC family */
1902 case CPU_PPC_403GCX: /* 403 GCX family */
1903 gen_spr_generic(env);
1904 gen_spr_40x(env);
1905 gen_spr_401_403(env);
1906 gen_spr_403(env);
1907 env->nb_BATs = 0;
1908 env->nb_tlb = 64;
1909 env->nb_ways = 1;
1910 env->id_tlbs = 0;
1911 /* XXX: TODO: allocate internal IRQ controller */
1912 break;
1913
1914 case CPU_PPC_405CR: /* 405 GP/CR family */
1915 case CPU_PPC_405EP: /* 405 EP family */
1916 case CPU_PPC_405GPR: /* 405 GPR family */
1917 case CPU_PPC_405D2: /* 405 D2 family */
1918 case CPU_PPC_405D4: /* 405 D4 family */
1919 gen_spr_generic(env);
1920 /* Time base */
1921 gen_tbl(env);
1922 gen_spr_40x(env);
1923 gen_spr_405(env);
1924 env->nb_BATs = 0;
1925 env->nb_tlb = 64;
1926 env->nb_ways = 1;
1927 env->id_tlbs = 0;
1928 /* Allocate hardware IRQ controller */
1929 ppc405_irq_init(env);
1930 break;
1931
1932 case CPU_PPC_NPE405H: /* NPe405 H family */
1933 case CPU_PPC_NPE405H2:
1934 case CPU_PPC_NPE405L: /* Npe405 L family */
1935 gen_spr_generic(env);
1936 /* Time base */
1937 gen_tbl(env);
1938 gen_spr_40x(env);
1939 gen_spr_405(env);
1940 env->nb_BATs = 0;
1941 env->nb_tlb = 64;
1942 env->nb_ways = 1;
1943 env->id_tlbs = 0;
1944 /* Allocate hardware IRQ controller */
1945 ppc405_irq_init(env);
1946 break;
1947
1948 #if defined (TODO)
1949 case CPU_PPC_STB01000:
1950 #endif
1951 #if defined (TODO)
1952 case CPU_PPC_STB01010:
1953 #endif
1954 #if defined (TODO)
1955 case CPU_PPC_STB0210:
1956 #endif
1957 case CPU_PPC_STB03: /* STB03 family */
1958 #if defined (TODO)
1959 case CPU_PPC_STB043: /* STB043 family */
1960 #endif
1961 #if defined (TODO)
1962 case CPU_PPC_STB045: /* STB045 family */
1963 #endif
1964 case CPU_PPC_STB25: /* STB25 family */
1965 #if defined (TODO)
1966 case CPU_PPC_STB130: /* STB130 family */
1967 #endif
1968 gen_spr_generic(env);
1969 /* Time base */
1970 gen_tbl(env);
1971 gen_spr_40x(env);
1972 gen_spr_405(env);
1973 env->nb_BATs = 0;
1974 env->nb_tlb = 64;
1975 env->nb_ways = 1;
1976 env->id_tlbs = 0;
1977 /* Allocate hardware IRQ controller */
1978 ppc405_irq_init(env);
1979 break;
1980
1981 case CPU_PPC_440EP: /* 440 EP family */
1982 case CPU_PPC_440GP: /* 440 GP family */
1983 case CPU_PPC_440GX: /* 440 GX family */
1984 case CPU_PPC_440GXc: /* 440 GXc family */
1985 case CPU_PPC_440GXf: /* 440 GXf family */
1986 case CPU_PPC_440SP: /* 440 SP family */
1987 case CPU_PPC_440SP2:
1988 case CPU_PPC_440SPE: /* 440 SPE family */
1989 gen_spr_generic(env);
1990 /* Time base */
1991 gen_tbl(env);
1992 gen_spr_BookE(env);
1993 gen_spr_440(env);
1994 env->nb_BATs = 0;
1995 env->nb_tlb = 64;
1996 env->nb_ways = 1;
1997 env->id_tlbs = 0;
1998 /* XXX: TODO: allocate internal IRQ controller */
1999 break;
2000
2001 /* Embedded PowerPC from Freescale */
2002 #if defined (TODO)
2003 case CPU_PPC_5xx:
2004 break;
2005 #endif
2006 #if defined (TODO)
2007 case CPU_PPC_8xx: /* MPC821 / 823 / 850 / 860 */
2008 break;
2009 #endif
2010 #if defined (TODO)
2011 case CPU_PPC_82xx_HIP3: /* MPC8240 / 8260 */
2012 case CPU_PPC_82xx_HIP4: /* MPC8240 / 8260 */
2013 break;
2014 #endif
2015 #if defined (TODO)
2016 case CPU_PPC_827x: /* MPC 827x / 828x */
2017 break;
2018 #endif
2019
2020 /* XXX: Use MPC8540 PVR to implement a test PowerPC BookE target */
2021 case CPU_PPC_e500v110:
2022 case CPU_PPC_e500v120:
2023 case CPU_PPC_e500v210:
2024 case CPU_PPC_e500v220:
2025 gen_spr_generic(env);
2026 /* Time base */
2027 gen_tbl(env);
2028 gen_spr_BookE(env);
2029 gen_spr_BookE_FSL(env);
2030 env->nb_BATs = 0;
2031 env->nb_tlb = 64;
2032 env->nb_ways = 1;
2033 env->id_tlbs = 0;
2034 /* XXX: TODO: allocate internal IRQ controller */
2035 break;
2036
2037 #if defined (TODO)
2038 case CPU_PPC_e600:
2039 break;
2040 #endif
2041
2042 /* 32 bits PowerPC */
2043 case CPU_PPC_601: /* PowerPC 601 */
2044 gen_spr_generic(env);
2045 gen_spr_ne_601(env);
2046 gen_spr_601(env);
2047 /* Hardware implementation registers */
2048 /* XXX : not implemented */
2049 spr_register(env, SPR_HID0, "HID0",
2050 SPR_NOACCESS, SPR_NOACCESS,
2051 &spr_read_generic, &spr_write_generic,
2052 0x00000000);
2053 /* XXX : not implemented */
2054 spr_register(env, SPR_HID1, "HID1",
2055 SPR_NOACCESS, SPR_NOACCESS,
2056 &spr_read_generic, &spr_write_generic,
2057 0x00000000);
2058 /* XXX : not implemented */
2059 spr_register(env, SPR_601_HID2, "HID2",
2060 SPR_NOACCESS, SPR_NOACCESS,
2061 &spr_read_generic, &spr_write_generic,
2062 0x00000000);
2063 /* XXX : not implemented */
2064 spr_register(env, SPR_601_HID5, "HID5",
2065 SPR_NOACCESS, SPR_NOACCESS,
2066 &spr_read_generic, &spr_write_generic,
2067 0x00000000);
2068 /* XXX : not implemented */
2069 #if 0 /* ? */
2070 spr_register(env, SPR_601_HID15, "HID15",
2071 SPR_NOACCESS, SPR_NOACCESS,
2072 &spr_read_generic, &spr_write_generic,
2073 0x00000000);
2074 #endif
2075 env->nb_tlb = 64;
2076 env->nb_ways = 2;
2077 env->id_tlbs = 0;
2078 env->id_tlbs = 0;
2079 /* XXX: TODO: allocate internal IRQ controller */
2080 break;
2081
2082 case CPU_PPC_602: /* PowerPC 602 */
2083 gen_spr_generic(env);
2084 gen_spr_ne_601(env);
2085 /* Memory management */
2086 gen_low_BATs(env);
2087 /* Time base */
2088 gen_tbl(env);
2089 gen_6xx_7xx_soft_tlb(env, 64, 2);
2090 gen_spr_602(env);
2091 /* hardware implementation registers */
2092 /* XXX : not implemented */
2093 spr_register(env, SPR_HID0, "HID0",
2094 SPR_NOACCESS, SPR_NOACCESS,
2095 &spr_read_generic, &spr_write_generic,
2096 0x00000000);
2097 /* XXX : not implemented */
2098 spr_register(env, SPR_HID1, "HID1",
2099 SPR_NOACCESS, SPR_NOACCESS,
2100 &spr_read_generic, &spr_write_generic,
2101 0x00000000);
2102 /* Allocate hardware IRQ controller */
2103 ppc6xx_irq_init(env);
2104 break;
2105
2106 case CPU_PPC_603: /* PowerPC 603 */
2107 case CPU_PPC_603E: /* PowerPC 603e */
2108 case CPU_PPC_603E7v:
2109 case CPU_PPC_603E7v2:
2110 case CPU_PPC_603P: /* PowerPC 603p */
2111 case CPU_PPC_603R: /* PowerPC 603r */
2112 gen_spr_generic(env);
2113 gen_spr_ne_601(env);
2114 /* Memory management */
2115 gen_low_BATs(env);
2116 /* Time base */
2117 gen_tbl(env);
2118 gen_6xx_7xx_soft_tlb(env, 64, 2);
2119 gen_spr_603(env);
2120 /* hardware implementation registers */
2121 /* XXX : not implemented */
2122 spr_register(env, SPR_HID0, "HID0",
2123 SPR_NOACCESS, SPR_NOACCESS,
2124 &spr_read_generic, &spr_write_generic,
2125 0x00000000);
2126 /* XXX : not implemented */
2127 spr_register(env, SPR_HID1, "HID1",
2128 SPR_NOACCESS, SPR_NOACCESS,
2129 &spr_read_generic, &spr_write_generic,
2130 0x00000000);
2131 /* Allocate hardware IRQ controller */
2132 ppc6xx_irq_init(env);
2133 break;
2134
2135 case CPU_PPC_G2: /* PowerPC G2 family */
2136 case CPU_PPC_G2H4:
2137 case CPU_PPC_G2gp:
2138 case CPU_PPC_G2ls:
2139 case CPU_PPC_G2LE: /* PowerPC G2LE family */
2140 case CPU_PPC_G2LEgp:
2141 case CPU_PPC_G2LEls:
2142 gen_spr_generic(env);
2143 gen_spr_ne_601(env);
2144 /* Memory management */
2145 gen_low_BATs(env);
2146 /* Time base */
2147 gen_tbl(env);
2148 /* Memory management */
2149 gen_high_BATs(env);
2150 gen_6xx_7xx_soft_tlb(env, 64, 2);
2151 gen_spr_G2_755(env);
2152 gen_spr_G2(env);
2153 /* Hardware implementation register */
2154 /* XXX : not implemented */
2155 spr_register(env, SPR_HID0, "HID0",
2156 SPR_NOACCESS, SPR_NOACCESS,
2157 &spr_read_generic, &spr_write_generic,
2158 0x00000000);
2159 /* XXX : not implemented */
2160 spr_register(env, SPR_HID1, "HID1",
2161 SPR_NOACCESS, SPR_NOACCESS,
2162 &spr_read_generic, &spr_write_generic,
2163 0x00000000);
2164 /* XXX : not implemented */
2165 spr_register(env, SPR_HID2, "HID2",
2166 SPR_NOACCESS, SPR_NOACCESS,
2167 &spr_read_generic, &spr_write_generic,
2168 0x00000000);
2169 /* Allocate hardware IRQ controller */
2170 ppc6xx_irq_init(env);
2171 break;
2172
2173 case CPU_PPC_604: /* PowerPC 604 */
2174 case CPU_PPC_604E: /* PowerPC 604e */
2175 case CPU_PPC_604R: /* PowerPC 604r */
2176 gen_spr_generic(env);
2177 gen_spr_ne_601(env);
2178 /* Memory management */
2179 gen_low_BATs(env);
2180 /* Time base */
2181 gen_tbl(env);
2182 gen_spr_604(env);
2183 /* Hardware implementation registers */
2184 /* XXX : not implemented */
2185 spr_register(env, SPR_HID0, "HID0",
2186 SPR_NOACCESS, SPR_NOACCESS,
2187 &spr_read_generic, &spr_write_generic,
2188 0x00000000);
2189 /* XXX : not implemented */
2190 spr_register(env, SPR_HID1, "HID1",
2191 SPR_NOACCESS, SPR_NOACCESS,
2192 &spr_read_generic, &spr_write_generic,
2193 0x00000000);
2194 /* Allocate hardware IRQ controller */
2195 ppc6xx_irq_init(env);
2196 break;
2197
2198 case CPU_PPC_74x: /* PowerPC 740 / 750 */
2199 case CPU_PPC_740E:
2200 case CPU_PPC_750E:
2201 case CPU_PPC_74xP: /* PowerPC 740P / 750P */
2202 case CPU_PPC_750CXE21: /* IBM PowerPC 750cxe */
2203 case CPU_PPC_750CXE22:
2204 case CPU_PPC_750CXE23:
2205 case CPU_PPC_750CXE24:
2206 case CPU_PPC_750CXE24b:
2207 case CPU_PPC_750CXE31:
2208 case CPU_PPC_750CXE31b:
2209 case CPU_PPC_750CXR:
2210 gen_spr_generic(env);
2211 gen_spr_ne_601(env);
2212 /* Memory management */
2213 gen_low_BATs(env);
2214 /* Time base */
2215 gen_tbl(env);
2216 gen_spr_7xx(env);
2217 /* Hardware implementation registers */
2218 /* XXX : not implemented */
2219 spr_register(env, SPR_HID0, "HID0",
2220 SPR_NOACCESS, SPR_NOACCESS,
2221 &spr_read_generic, &spr_write_generic,
2222 0x00000000);
2223 /* XXX : not implemented */
2224 spr_register(env, SPR_HID1, "HID1",
2225 SPR_NOACCESS, SPR_NOACCESS,
2226 &spr_read_generic, &spr_write_generic,
2227 0x00000000);
2228 /* Allocate hardware IRQ controller */
2229 ppc6xx_irq_init(env);
2230 break;
2231
2232 case CPU_PPC_750FX10: /* IBM PowerPC 750 FX */
2233 case CPU_PPC_750FX20:
2234 case CPU_PPC_750FX21:
2235 case CPU_PPC_750FX22:
2236 case CPU_PPC_750FX23:
2237 case CPU_PPC_750GX10: /* IBM PowerPC 750 GX */
2238 case CPU_PPC_750GX11:
2239 case CPU_PPC_750GX12:
2240 gen_spr_generic(env);
2241 gen_spr_ne_601(env);
2242 /* Memory management */
2243 gen_low_BATs(env);
2244 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
2245 gen_high_BATs(env);
2246 /* Time base */
2247 gen_tbl(env);
2248 gen_spr_7xx(env);
2249 /* Hardware implementation registers */
2250 /* XXX : not implemented */
2251 spr_register(env, SPR_HID0, "HID0",
2252 SPR_NOACCESS, SPR_NOACCESS,
2253 &spr_read_generic, &spr_write_generic,
2254 0x00000000);
2255 /* XXX : not implemented */
2256 spr_register(env, SPR_HID1, "HID1",
2257 SPR_NOACCESS, SPR_NOACCESS,
2258 &spr_read_generic, &spr_write_generic,
2259 0x00000000);
2260 /* XXX : not implemented */
2261 spr_register(env, SPR_750_HID2, "HID2",
2262 SPR_NOACCESS, SPR_NOACCESS,
2263 &spr_read_generic, &spr_write_generic,
2264 0x00000000);
2265 /* Allocate hardware IRQ controller */
2266 ppc6xx_irq_init(env);
2267 break;
2268
2269 case CPU_PPC_755_10: /* PowerPC 755 */
2270 case CPU_PPC_755_11:
2271 case CPU_PPC_755_20:
2272 case CPU_PPC_755D:
2273 case CPU_PPC_755E:
2274 gen_spr_generic(env);
2275 gen_spr_ne_601(env);
2276 /* Memory management */
2277 gen_low_BATs(env);
2278 /* Time base */
2279 gen_tbl(env);
2280 /* Memory management */
2281 gen_high_BATs(env);
2282 gen_6xx_7xx_soft_tlb(env, 64, 2);
2283 gen_spr_G2_755(env);
2284 /* L2 cache control */
2285 /* XXX : not implemented */
2286 spr_register(env, SPR_ICTC, "ICTC",
2287 SPR_NOACCESS, SPR_NOACCESS,
2288 &spr_read_generic, &spr_write_generic,
2289 0x00000000);
2290 /* XXX : not implemented */
2291 spr_register(env, SPR_L2PM, "L2PM",
2292 SPR_NOACCESS, SPR_NOACCESS,
2293 &spr_read_generic, &spr_write_generic,
2294 0x00000000);
2295 /* Hardware implementation registers */
2296 /* XXX : not implemented */
2297 spr_register(env, SPR_HID0, "HID0",
2298 SPR_NOACCESS, SPR_NOACCESS,
2299 &spr_read_generic, &spr_write_generic,
2300 0x00000000);
2301 /* XXX : not implemented */
2302 spr_register(env, SPR_HID1, "HID1",
2303 SPR_NOACCESS, SPR_NOACCESS,
2304 &spr_read_generic, &spr_write_generic,
2305 0x00000000);
2306 /* XXX : not implemented */
2307 spr_register(env, SPR_HID2, "HID2",
2308 SPR_NOACCESS, SPR_NOACCESS,
2309 &spr_read_generic, &spr_write_generic,
2310 0x00000000);
2311 /* Allocate hardware IRQ controller */
2312 ppc6xx_irq_init(env);
2313 break;
2314
2315 #if defined (TODO)
2316 /* G4 family */
2317 case CPU_PPC_7400: /* PowerPC 7400 */
2318 case CPU_PPC_7410C: /* PowerPC 7410 */
2319 case CPU_PPC_7410D:
2320 case CPU_PPC_7410E:
2321 case CPU_PPC_7441: /* PowerPC 7441 */
2322 case CPU_PPC_7445: /* PowerPC 7445 */
2323 case CPU_PPC_7447: /* PowerPC 7447 */
2324 case CPU_PPC_7447A: /* PowerPC 7447A */
2325 case CPU_PPC_7448: /* PowerPC 7448 */
2326 case CPU_PPC_7450: /* PowerPC 7450 */
2327 case CPU_PPC_7450b:
2328 case CPU_PPC_7451: /* PowerPC 7451 */
2329 case CPU_PPC_7451G:
2330 case CPU_PPC_7455: /* PowerPC 7455 */
2331 case CPU_PPC_7455F:
2332 case CPU_PPC_7455G:
2333 case CPU_PPC_7457: /* PowerPC 7457 */
2334 case CPU_PPC_7457C:
2335 case CPU_PPC_7457A: /* PowerPC 7457A */
2336 break;
2337 #endif
2338
2339 /* 64 bits PowerPC */
2340 #if defined (TARGET_PPC64)
2341 #if defined (TODO)
2342 case CPU_PPC_620: /* PowerPC 620 */
2343 case CPU_PPC_630: /* PowerPC 630 (Power 3) */
2344 case CPU_PPC_631: /* PowerPC 631 (Power 3+) */
2345 case CPU_PPC_POWER4: /* Power 4 */
2346 case CPU_PPC_POWER4P: /* Power 4+ */
2347 case CPU_PPC_POWER5: /* Power 5 */
2348 case CPU_PPC_POWER5P: /* Power 5+ */
2349 #endif
2350 break;
2351
2352 case CPU_PPC_970: /* PowerPC 970 */
2353 case CPU_PPC_970FX10: /* PowerPC 970 FX */
2354 case CPU_PPC_970FX20:
2355 case CPU_PPC_970FX21:
2356 case CPU_PPC_970FX30:
2357 case CPU_PPC_970FX31:
2358 case CPU_PPC_970MP10: /* PowerPC 970 MP */
2359 case CPU_PPC_970MP11:
2360 gen_spr_generic(env);
2361 gen_spr_ne_601(env);
2362 /* XXX: not correct */
2363 gen_low_BATs(env);
2364 /* Time base */
2365 gen_tbl(env);
2366 gen_spr_7xx(env);
2367 /* Hardware implementation registers */
2368 /* XXX : not implemented */
2369 spr_register(env, SPR_HID0, "HID0",
2370 SPR_NOACCESS, SPR_NOACCESS,
2371 &spr_read_generic, &spr_write_generic,
2372 0x00000000);
2373 /* XXX : not implemented */
2374 spr_register(env, SPR_HID1, "HID1",
2375 SPR_NOACCESS, SPR_NOACCESS,
2376 &spr_read_generic, &spr_write_generic,
2377 0x00000000);
2378 /* XXX : not implemented */
2379 spr_register(env, SPR_750_HID2, "HID2",
2380 SPR_NOACCESS, SPR_NOACCESS,
2381 &spr_read_generic, &spr_write_generic,
2382 0x00000000);
2383 /* Allocate hardware IRQ controller */
2384 ppc970_irq_init(env);
2385 break;
2386
2387 #if defined (TODO)
2388 case CPU_PPC_CELL10: /* Cell family */
2389 case CPU_PPC_CELL20:
2390 case CPU_PPC_CELL30:
2391 case CPU_PPC_CELL31:
2392 #endif
2393 break;
2394
2395 #if defined (TODO)
2396 case CPU_PPC_RS64: /* Apache (RS64/A35) */
2397 case CPU_PPC_RS64II: /* NorthStar (RS64-II/A50) */
2398 case CPU_PPC_RS64III: /* Pulsar (RS64-III) */
2399 case CPU_PPC_RS64IV: /* IceStar/IStar/SStar (RS64-IV) */
2400 #endif
2401 break;
2402 #endif /* defined (TARGET_PPC64) */
2403
2404 #if defined (TODO)
2405 /* POWER */
2406 case CPU_POWER: /* POWER */
2407 case CPU_POWER2: /* POWER2 */
2408 break;
2409 #endif
2410
2411 default:
2412 gen_spr_generic(env);
2413 /* XXX: TODO: allocate internal IRQ controller */
2414 break;
2415 }
2416 if (env->nb_BATs == -1)
2417 env->nb_BATs = 4;
2418 /* Allocate TLBs buffer when needed */
2419 if (env->nb_tlb != 0) {
2420 int nb_tlb = env->nb_tlb;
2421 if (env->id_tlbs != 0)
2422 nb_tlb *= 2;
2423 env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t));
2424 /* Pre-compute some useful values */
2425 env->tlb_per_way = env->nb_tlb / env->nb_ways;
2426 }
2427 }
2428
2429 #if defined(PPC_DUMP_CPU)
2430 static void dump_sprs (CPUPPCState *env)
2431 {
2432 ppc_spr_t *spr;
2433 uint32_t pvr = env->spr[SPR_PVR];
2434 uint32_t sr, sw, ur, uw;
2435 int i, j, n;
2436
2437 printf("* SPRs for PVR=%08x\n", pvr);
2438 for (i = 0; i < 32; i++) {
2439 for (j = 0; j < 32; j++) {
2440 n = (i << 5) | j;
2441 spr = &env->spr_cb[n];
2442 #if !defined(CONFIG_USER_ONLY)
2443 sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
2444 sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
2445 #else
2446 sw = 0;
2447 sr = 0;
2448 #endif
2449 uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
2450 ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
2451 if (sw || sr || uw || ur) {
2452 printf("%4d (%03x) %8s s%c%c u%c%c\n",
2453 (i << 5) | j, (i << 5) | j, spr->name,
2454 sw ? 'w' : '-', sr ? 'r' : '-',
2455 uw ? 'w' : '-', ur ? 'r' : '-');
2456 }
2457 }
2458 }
2459 fflush(stdout);
2460 fflush(stderr);
2461 }
2462 #endif
2463
2464 /*****************************************************************************/
2465 #include <stdlib.h>
2466 #include <string.h>
2467
2468 int fflush (FILE *stream);
2469
2470 /* Opcode types */
2471 enum {
2472 PPC_DIRECT = 0, /* Opcode routine */
2473 PPC_INDIRECT = 1, /* Indirect opcode table */
2474 };
2475
2476 static inline int is_indirect_opcode (void *handler)
2477 {
2478 return ((unsigned long)handler & 0x03) == PPC_INDIRECT;
2479 }
2480
2481 static inline opc_handler_t **ind_table(void *handler)
2482 {
2483 return (opc_handler_t **)((unsigned long)handler & ~3);
2484 }
2485
2486 /* Instruction table creation */
2487 /* Opcodes tables creation */
2488 static void fill_new_table (opc_handler_t **table, int len)
2489 {
2490 int i;
2491
2492 for (i = 0; i < len; i++)
2493 table[i] = &invalid_handler;
2494 }
2495
2496 static int create_new_table (opc_handler_t **table, unsigned char idx)
2497 {
2498 opc_handler_t **tmp;
2499
2500 tmp = malloc(0x20 * sizeof(opc_handler_t));
2501 if (tmp == NULL)
2502 return -1;
2503 fill_new_table(tmp, 0x20);
2504 table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT);
2505
2506 return 0;
2507 }
2508
2509 static int insert_in_table (opc_handler_t **table, unsigned char idx,
2510 opc_handler_t *handler)
2511 {
2512 if (table[idx] != &invalid_handler)
2513 return -1;
2514 table[idx] = handler;
2515
2516 return 0;
2517 }
2518
2519 static int register_direct_insn (opc_handler_t **ppc_opcodes,
2520 unsigned char idx, opc_handler_t *handler)
2521 {
2522 if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
2523 printf("*** ERROR: opcode %02x already assigned in main "
2524 "opcode table\n", idx);
2525 return -1;
2526 }
2527
2528 return 0;
2529 }
2530
2531 static int register_ind_in_table (opc_handler_t **table,
2532 unsigned char idx1, unsigned char idx2,
2533 opc_handler_t *handler)
2534 {
2535 if (table[idx1] == &invalid_handler) {
2536 if (create_new_table(table, idx1) < 0) {
2537 printf("*** ERROR: unable to create indirect table "
2538 "idx=%02x\n", idx1);
2539 return -1;
2540 }
2541 } else {
2542 if (!is_indirect_opcode(table[idx1])) {
2543 printf("*** ERROR: idx %02x already assigned to a direct "
2544 "opcode\n", idx1);
2545 return -1;
2546 }
2547 }
2548 if (handler != NULL &&
2549 insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
2550 printf("*** ERROR: opcode %02x already assigned in "
2551 "opcode table %02x\n", idx2, idx1);
2552 return -1;
2553 }
2554
2555 return 0;
2556 }
2557
2558 static int register_ind_insn (opc_handler_t **ppc_opcodes,
2559 unsigned char idx1, unsigned char idx2,
2560 opc_handler_t *handler)
2561 {
2562 int ret;
2563
2564 ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
2565
2566 return ret;
2567 }
2568
2569 static int register_dblind_insn (opc_handler_t **ppc_opcodes,
2570 unsigned char idx1, unsigned char idx2,
2571 unsigned char idx3, opc_handler_t *handler)
2572 {
2573 if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
2574 printf("*** ERROR: unable to join indirect table idx "
2575 "[%02x-%02x]\n", idx1, idx2);
2576 return -1;
2577 }
2578 if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
2579 handler) < 0) {
2580 printf("*** ERROR: unable to insert opcode "
2581 "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
2582 return -1;
2583 }
2584
2585 return 0;
2586 }
2587
2588 static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
2589 {
2590 if (insn->opc2 != 0xFF) {
2591 if (insn->opc3 != 0xFF) {
2592 if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
2593 insn->opc3, &insn->handler) < 0)
2594 return -1;
2595 } else {
2596 if (register_ind_insn(ppc_opcodes, insn->opc1,
2597 insn->opc2, &insn->handler) < 0)
2598 return -1;
2599 }
2600 } else {
2601 if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
2602 return -1;
2603 }
2604
2605 return 0;
2606 }
2607
2608 static int test_opcode_table (opc_handler_t **table, int len)
2609 {
2610 int i, count, tmp;
2611
2612 for (i = 0, count = 0; i < len; i++) {
2613 /* Consistency fixup */
2614 if (table[i] == NULL)
2615 table[i] = &invalid_handler;
2616 if (table[i] != &invalid_handler) {
2617 if (is_indirect_opcode(table[i])) {
2618 tmp = test_opcode_table(ind_table(table[i]), 0x20);
2619 if (tmp == 0) {
2620 free(table[i]);
2621 table[i] = &invalid_handler;
2622 } else {
2623 count++;
2624 }
2625 } else {
2626 count++;
2627 }
2628 }
2629 }
2630
2631 return count;
2632 }
2633
2634 static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
2635 {
2636 if (test_opcode_table(ppc_opcodes, 0x40) == 0)
2637 printf("*** WARNING: no opcode defined !\n");
2638 }
2639
2640 /*****************************************************************************/
2641 static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def)
2642 {
2643 opcode_t *opc, *start, *end;
2644
2645 fill_new_table(env->opcodes, 0x40);
2646 #if defined(PPC_DUMP_CPU)
2647 printf("* PowerPC instructions for PVR %08x: %s flags %016" PRIx64
2648 " %08x\n",
2649 def->pvr, def->name, def->insns_flags, def->flags);
2650 #endif
2651 if (&opc_start < &opc_end) {
2652 start = &opc_start;
2653 end = &opc_end;
2654 } else {
2655 start = &opc_end;
2656 end = &opc_start;
2657 }
2658 for (opc = start + 1; opc != end; opc++) {
2659 if ((opc->handler.type & def->insns_flags) != 0) {
2660 if (register_insn(env->opcodes, opc) < 0) {
2661 printf("*** ERROR initializing PowerPC instruction "
2662 "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2,
2663 opc->opc3);
2664 return -1;
2665 }
2666 #if defined(PPC_DUMP_CPU)
2667 if (opc1 != 0x00) {
2668 if (opc->opc3 == 0xFF) {
2669 if (opc->opc2 == 0xFF) {
2670 printf(" %02x -- -- (%2d ----) : %s\n",
2671 opc->opc1, opc->opc1, opc->oname);
2672 } else {
2673 printf(" %02x %02x -- (%2d %4d) : %s\n",
2674 opc->opc1, opc->opc2, opc->opc1, opc->opc2,
2675 opc->oname);
2676 }
2677 } else {
2678 printf(" %02x %02x %02x (%2d %4d) : %s\n",
2679 opc->opc1, opc->opc2, opc->opc3,
2680 opc->opc1, (opc->opc3 << 5) | opc->opc2,
2681 opc->oname);
2682 }
2683 }
2684 #endif
2685 }
2686 }
2687 fix_opcode_tables(env->opcodes);
2688 fflush(stdout);
2689 fflush(stderr);
2690
2691 return 0;
2692 }
2693
2694 int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def)
2695 {
2696 env->msr_mask = def->msr_mask;
2697 env->flags = def->flags;
2698 if (create_ppc_opcodes(env, def) < 0)
2699 return -1;
2700 init_ppc_proc(env, def);
2701 #if defined(PPC_DUMP_CPU)
2702 dump_sprs(env);
2703 if (env->tlb != NULL) {
2704 printf("%d %s TLB in %d ways\n", env->nb_tlb,
2705 env->id_tlbs ? "splitted" : "merged", env->nb_ways);
2706 }
2707 #endif
2708
2709 return 0;
2710 }
2711
2712 /*****************************************************************************/
2713 /* PowerPC CPU definitions */
2714 static ppc_def_t ppc_defs[] = {
2715 /* Embedded PowerPC */
2716 #if defined (TODO)
2717 /* PowerPC 401 */
2718 {
2719 .name = "401",
2720 .pvr = CPU_PPC_401,
2721 .pvr_mask = 0xFFFF0000,
2722 .insns_flags = PPC_INSNS_401,
2723 .flags = PPC_FLAGS_401,
2724 .msr_mask = xxx,
2725 },
2726 #endif
2727 #if defined (TODO)
2728 /* IOP480 (401 microcontroler) */
2729 {
2730 .name = "iop480",
2731 .pvr = CPU_PPC_IOP480,
2732 .pvr_mask = 0xFFFF0000,
2733 .insns_flags = PPC_INSNS_401,
2734 .flags = PPC_FLAGS_401,
2735 .msr_mask = xxx,
2736 },
2737 #endif
2738 #if defined (TODO)
2739 /* IBM Processor for Network Resources */
2740 {
2741 .name = "Cobra",
2742 .pvr = CPU_PPC_COBRA,
2743 .pvr_mask = 0xFFFF0000,
2744 .insns_flags = PPC_INSNS_401,
2745 .flags = PPC_FLAGS_401,
2746 .msr_mask = xxx,
2747 },
2748 #endif
2749 #if defined (TODO)
2750 /* Generic PowerPC 403 */
2751 {
2752 .name = "403",
2753 .pvr = CPU_PPC_403,
2754 .pvr_mask = 0xFFFFFF00,
2755 .insns_flags = PPC_INSNS_403,
2756 .flags = PPC_FLAGS_403,
2757 .msr_mask = 0x000000000007D23DULL,
2758 },
2759 #endif
2760 #if defined (TODO)
2761 /* PowerPC 403 GA */
2762 {
2763 .name = "403ga",
2764 .pvr = CPU_PPC_403GA,
2765 .pvr_mask = 0xFFFFFF00,
2766 .insns_flags = PPC_INSNS_403,
2767 .flags = PPC_FLAGS_403,
2768 .msr_mask = 0x000000000007D23DULL,
2769 },
2770 #endif
2771 #if defined (TODO)
2772 /* PowerPC 403 GB */
2773 {
2774 .name = "403gb",
2775 .pvr = CPU_PPC_403GB,
2776 .pvr_mask = 0xFFFFFF00,
2777 .insns_flags = PPC_INSNS_403,
2778 .flags = PPC_FLAGS_403,
2779 .msr_mask = 0x000000000007D23DULL,
2780 },
2781 #endif
2782 #if defined (TODO)
2783 /* PowerPC 403 GC */
2784 {
2785 .name = "403gc",
2786 .pvr = CPU_PPC_403GC,
2787 .pvr_mask = 0xFFFFFF00,
2788 .insns_flags = PPC_INSNS_403,
2789 .flags = PPC_FLAGS_403,
2790 .msr_mask = 0x000000000007D23DULL,
2791 },
2792 #endif
2793 #if defined (TODO)
2794 /* PowerPC 403 GCX */
2795 {
2796 .name = "403gcx",
2797 .pvr = CPU_PPC_403GCX,
2798 .pvr_mask = 0xFFFFFF00,
2799 .insns_flags = PPC_INSNS_403,
2800 .flags = PPC_FLAGS_403,
2801 .msr_mask = 0x000000000007D23DULL,
2802 },
2803 #endif
2804 /* Generic PowerPC 405 */
2805 {
2806 .name = "405",
2807 .pvr = CPU_PPC_405,
2808 .pvr_mask = 0xFFFF0000,
2809 .insns_flags = PPC_INSNS_405,
2810 .flags = PPC_FLAGS_405,
2811 .msr_mask = 0x00000000020EFF30ULL,
2812 },
2813 /* PowerPC 405 CR */
2814 {
2815 .name = "405cr",
2816 .pvr = CPU_PPC_405,
2817 .pvr_mask = 0xFFFFFFFF,
2818 .insns_flags = PPC_INSNS_405,
2819 .flags = PPC_FLAGS_405,
2820 .msr_mask = 0x00000000020EFF30ULL,
2821 },
2822 #if defined (TODO)
2823 /* PowerPC 405 GP */
2824 {
2825 .name = "405gp",
2826 .pvr = CPU_PPC_405,
2827 .pvr_mask = 0xFFFFFFFF,
2828 .insns_flags = PPC_INSNS_405,
2829 .flags = PPC_FLAGS_405,
2830 .msr_mask = 0x00000000020EFF30ULL,
2831 },
2832 #endif
2833 /* PowerPC 405 EP */
2834 {
2835 .name = "405ep",
2836 .pvr = CPU_PPC_405EP,
2837 .pvr_mask = 0xFFFFFFFF,
2838 .insns_flags = PPC_INSNS_405,
2839 .flags = PPC_FLAGS_405,
2840 .msr_mask = 0x00000000020EFF30ULL,
2841 },
2842 #if defined (TODO)
2843 /* PowerPC 405 EZ */
2844 {
2845 .name = "405ez",
2846 .pvr = CPU_PPC_405EZ,
2847 .pvr_mask = 0xFFFFFFFF,
2848 .insns_flags = PPC_INSNS_405,
2849 .flags = PPC_FLAGS_405,
2850 .msr_mask = 0x00000000020EFF30ULL,
2851 },
2852 #endif
2853 #if defined (TODO)
2854 /* PowerPC 405 GPR */
2855 {
2856 .name = "405gpr",
2857 .pvr = CPU_PPC_405GPR,
2858 .pvr_mask = 0xFFFFFFFF,
2859 .insns_flags = PPC_INSNS_405,
2860 .flags = PPC_FLAGS_405,
2861 .msr_mask = 0x00000000020EFF30ULL,
2862 },
2863 #endif
2864 /* PowerPC 405 D2 */
2865 {
2866 .name = "405d2",
2867 .pvr = CPU_PPC_405D2,
2868 .pvr_mask = 0xFFFFFFFF,
2869 .insns_flags = PPC_INSNS_405,
2870 .flags = PPC_FLAGS_405,
2871 .msr_mask = 0x00000000020EFF30ULL,
2872 },
2873 /* PowerPC 405 D4 */
2874 {
2875 .name = "405d4",
2876 .pvr = CPU_PPC_405D4,
2877 .pvr_mask = 0xFFFFFFFF,
2878 .insns_flags = PPC_INSNS_405,
2879 .flags = PPC_FLAGS_405,
2880 .msr_mask = 0x00000000020EFF30ULL,
2881 },
2882 #if defined (TODO)
2883 /* Npe405 H */
2884 {
2885 .name = "Npe405H",
2886 .pvr = CPU_PPC_NPE405H,
2887 .pvr_mask = 0xFFFFFFFF,
2888 .insns_flags = PPC_INSNS_405,
2889 .flags = PPC_FLAGS_405,
2890 .msr_mask = 0x00000000020EFF30ULL,
2891 },
2892 #endif
2893 #if defined (TODO)
2894 /* Npe405 L */
2895 {
2896 .name = "Npe405L",
2897 .pvr = CPU_PPC_NPE405L,
2898 .pvr_mask = 0xFFFFFFFF,
2899 .insns_flags = PPC_INSNS_405,
2900 .flags = PPC_FLAGS_405,
2901 .msr_mask = 0x00000000020EFF30ULL,
2902 },
2903 #endif
2904 #if defined (TODO)
2905 /* STB010000 */
2906 {
2907 .name = "STB01000",
2908 .pvr = CPU_PPC_STB01000,
2909 .pvr_mask = 0xFFFFFFFF,
2910 .insns_flags = PPC_INSNS_405,
2911 .flags = PPC_FLAGS_405,
2912 .msr_mask = 0x00000000020EFF30ULL,
2913 },
2914 #endif
2915 #if defined (TODO)
2916 /* STB01010 */
2917 {
2918 .name = "STB01010",
2919 .pvr = CPU_PPC_STB01010,
2920 .pvr_mask = 0xFFFFFFFF,
2921 .insns_flags = PPC_INSNS_405,
2922 .flags = PPC_FLAGS_405,
2923 .msr_mask = 0x00000000020EFF30ULL,
2924 },
2925 #endif
2926 #if defined (TODO)
2927 /* STB0210 */
2928 {
2929 .name = "STB0210",
2930 .pvr = CPU_PPC_STB0210,
2931 .pvr_mask = 0xFFFFFFFF,
2932 .insns_flags = PPC_INSNS_405,
2933 .flags = PPC_FLAGS_405,
2934 .msr_mask = 0x00000000020EFF30ULL,
2935 },
2936 #endif
2937 #if defined (TODO)
2938 /* STB03xx */
2939 {
2940 .name = "STB03",
2941 .pvr = CPU_PPC_STB03,
2942 .pvr_mask = 0xFFFFFFFF,
2943 .insns_flags = PPC_INSNS_405,
2944 .flags = PPC_FLAGS_405,
2945 .msr_mask = 0x00000000020EFF30ULL,
2946 },
2947 #endif
2948 #if defined (TODO)
2949 /* STB043x */
2950 {
2951 .name = "STB043",
2952 .pvr = CPU_PPC_STB043,
2953 .pvr_mask = 0xFFFFFFFF,
2954 .insns_flags = PPC_INSNS_405,
2955 .flags = PPC_FLAGS_405,
2956 .msr_mask = 0x00000000020EFF30ULL,
2957 },
2958 #endif
2959 #if defined (TODO)
2960 /* STB045x */
2961 {
2962 .name = "STB045",
2963 .pvr = CPU_PPC_STB045,
2964 .pvr_mask = 0xFFFFFFFF,
2965 .insns_flags = PPC_INSNS_405,
2966 .flags = PPC_FLAGS_405,
2967 .msr_mask = 0x00000000020EFF30ULL,
2968 },
2969 #endif
2970 #if defined (TODO)
2971 /* STB25xx */
2972 {
2973 .name = "STB25",
2974 .pvr = CPU_PPC_STB25,
2975 .pvr_mask = 0xFFFFFFFF,
2976 .insns_flags = PPC_INSNS_405,
2977 .flags = PPC_FLAGS_405,
2978 .msr_mask = 0x00000000020EFF30ULL,
2979 },
2980 #endif
2981 #if defined (TODO)
2982 /* STB130 */
2983 {
2984 .name = "STB130",
2985 .pvr = CPU_PPC_STB130,
2986 .pvr_mask = 0xFFFFFFFF,
2987 .insns_flags = PPC_INSNS_405,
2988 .flags = PPC_FLAGS_405,
2989 .msr_mask = 0x00000000020EFF30ULL,
2990 },
2991 #endif
2992 /* Xilinx PowerPC 405 cores */
2993 #if defined (TODO)
2994 {
2995 .name = "x2vp4",
2996 .pvr = CPU_PPC_X2VP4,
2997 .pvr_mask = 0xFFFFFFFF,
2998 .insns_flags = PPC_INSNS_405,
2999 .flags = PPC_FLAGS_405,
3000 .msr_mask = 0x00000000020EFF30ULL,
3001 },
3002 {
3003 .name = "x2vp7",
3004 .pvr = CPU_PPC_X2VP7,
3005 .pvr_mask = 0xFFFFFFFF,
3006 .insns_flags = PPC_INSNS_405,
3007 .flags = PPC_FLAGS_405,
3008 .msr_mask = 0x00000000020EFF30ULL,
3009 },
3010 {
3011 .name = "x2vp20",
3012 .pvr = CPU_PPC_X2VP20,
3013 .pvr_mask = 0xFFFFFFFF,
3014 .insns_flags = PPC_INSNS_405,
3015 .flags = PPC_FLAGS_405,
3016 .msr_mask = 0x00000000020EFF30ULL,
3017 },
3018 {
3019 .name = "x2vp50",
3020 .pvr = CPU_PPC_X2VP50,
3021 .pvr_mask = 0xFFFFFFFF,
3022 .insns_flags = PPC_INSNS_405,
3023 .flags = PPC_FLAGS_405,
3024 .msr_mask = 0x00000000020EFF30ULL,
3025 },
3026 #endif
3027 #if defined (TODO)
3028 /* PowerPC 440 EP */
3029 {
3030 .name = "440ep",
3031 .pvr = CPU_PPC_440EP,
3032 .pvr_mask = 0xFFFF0000,
3033 .insns_flags = PPC_INSNS_440,
3034 .flags = PPC_FLAGS_440,
3035 .msr_mask = 0x000000000006D630ULL,
3036 },
3037 #endif
3038 #if defined (TODO)
3039 /* PowerPC 440 GR */
3040 {
3041 .name = "440gr",
3042 .pvr = CPU_PPC_440GR,
3043 .pvr_mask = 0xFFFF0000,
3044 .insns_flags = PPC_INSNS_440,
3045 .flags = PPC_FLAGS_440,
3046 .msr_mask = 0x000000000006D630ULL,
3047 },
3048 #endif
3049 #if defined (TODO)
3050 /* PowerPC 440 GP */
3051 {
3052 .name = "440gp",
3053 .pvr = CPU_PPC_440GP,
3054 .pvr_mask = 0xFFFFFF00,
3055 .insns_flags = PPC_INSNS_440,
3056 .flags = PPC_FLAGS_440,
3057 .msr_mask = 0x000000000006D630ULL,
3058 },
3059 #endif
3060 #if defined (TODO)
3061 /* PowerPC 440 GX */
3062 {
3063 .name = "440gx",
3064 .pvr = CPU_PPC_440GX,
3065 .pvr_mask = 0xFFFF0000,
3066 .insns_flags = PPC_INSNS_405,
3067 .flags = PPC_FLAGS_440,
3068 .msr_mask = 0x000000000006D630ULL,
3069 },
3070 #endif
3071 #if defined (TODO)
3072 /* PowerPC 440 GXc */
3073 {
3074 .name = "440gxc",
3075 .pvr = CPU_PPC_440GXC,
3076 .pvr_mask = 0xFFFF0000,
3077 .insns_flags = PPC_INSNS_405,
3078 .flags = PPC_FLAGS_440,
3079 .msr_mask = 0x000000000006D630ULL,
3080 },
3081 #endif
3082 #if defined (TODO)
3083 /* PowerPC 440 GXf */
3084 {
3085 .name = "440gxf",
3086 .pvr = CPU_PPC_440GXF,
3087 .pvr_mask = 0xFFFF0000,
3088 .insns_flags = PPC_INSNS_405,
3089 .flags = PPC_FLAGS_440,
3090 .msr_mask = 0x000000000006D630ULL,
3091 },
3092 #endif
3093 #if defined (TODO)
3094 /* PowerPC 440 SP */
3095 {
3096 .name = "440sp",
3097 .pvr = CPU_PPC_440SP,
3098 .pvr_mask = 0xFFFF0000,
3099 .insns_flags = PPC_INSNS_405,
3100 .flags = PPC_FLAGS_440,
3101 .msr_mask = 0x000000000006D630ULL,
3102 },
3103 #endif
3104 #if defined (TODO)
3105 /* PowerPC 440 SP2 */
3106 {
3107 .name = "440sp2",
3108 .pvr = CPU_PPC_440SP2,
3109 .pvr_mask = 0xFFFF0000,
3110 .insns_flags = PPC_INSNS_405,
3111 .flags = PPC_FLAGS_440,
3112 .msr_mask = 0x000000000006D630ULL,
3113 },
3114 #endif
3115 #if defined (TODO)
3116 /* PowerPC 440 SPE */
3117 {
3118 .name = "440spe",
3119 .pvr = CPU_PPC_440SPE,
3120 .pvr_mask = 0xFFFF0000,
3121 .insns_flags = PPC_INSNS_405,
3122 .flags = PPC_FLAGS_440,
3123 .msr_mask = 0x000000000006D630ULL,
3124 },
3125 #endif
3126 /* Fake generic BookE PowerPC */
3127 {
3128 .name = "BookE",
3129 .pvr = CPU_PPC_e500,
3130 .pvr_mask = 0xFFFFFFFF,
3131 .insns_flags = PPC_INSNS_BOOKE,
3132 .flags = PPC_FLAGS_BOOKE,
3133 .msr_mask = 0x000000000006D630ULL,
3134 },
3135 /* PowerPC 460 cores - TODO */
3136 /* PowerPC MPC 5xx cores - TODO */
3137 /* PowerPC MPC 8xx cores - TODO */
3138 /* PowerPC MPC 8xxx cores - TODO */
3139 /* e200 cores - TODO */
3140 /* e500 cores - TODO */
3141 /* e600 cores - TODO */
3142
3143 /* 32 bits "classic" PowerPC */
3144 #if defined (TODO)
3145 /* PowerPC 601 */
3146 {
3147 .name = "601",
3148 .pvr = CPU_PPC_601,
3149 .pvr_mask = 0xFFFF0000,
3150 .insns_flags = PPC_INSNS_601,
3151 .flags = PPC_FLAGS_601,
3152 .msr_mask = 0x000000000000FD70ULL,
3153 },
3154 #endif
3155 #if defined (TODO)
3156 /* PowerPC 602 */
3157 {
3158 .name = "602",
3159 .pvr = CPU_PPC_602,
3160 .pvr_mask = 0xFFFF0000,
3161 .insns_flags = PPC_INSNS_602,
3162 .flags = PPC_FLAGS_602,
3163 .msr_mask = 0x0000000000C7FF73ULL,
3164 },
3165 #endif
3166 /* PowerPC 603 */
3167 {
3168 .name = "603",
3169 .pvr = CPU_PPC_603,
3170 .pvr_mask = 0xFFFFFFFF,
3171 .insns_flags = PPC_INSNS_603,
3172 .flags = PPC_FLAGS_603,
3173 .msr_mask = 0x000000000007FF73ULL,
3174 },
3175 /* PowerPC 603e */
3176 {
3177 .name = "603e",
3178 .pvr = CPU_PPC_603E,
3179 .pvr_mask = 0xFFFFFFFF,
3180 .insns_flags = PPC_INSNS_603,
3181 .flags = PPC_FLAGS_603,
3182 .msr_mask = 0x000000000007FF73ULL,
3183 },
3184 {
3185 .name = "Stretch",
3186 .pvr = CPU_PPC_603E,
3187 .pvr_mask = 0xFFFFFFFF,
3188 .insns_flags = PPC_INSNS_603,
3189 .flags = PPC_FLAGS_603,
3190 .msr_mask = 0x000000000007FF73ULL,
3191 },
3192 /* PowerPC 603p */
3193 {
3194 .name = "603p",
3195 .pvr = CPU_PPC_603P,
3196 .pvr_mask = 0xFFFFFFFF,
3197 .insns_flags = PPC_INSNS_603,
3198 .flags = PPC_FLAGS_603,
3199 .msr_mask = 0x000000000007FF73ULL,
3200 },
3201 /* PowerPC 603e7 */
3202 {
3203 .name = "603e7",
3204 .pvr = CPU_PPC_603E7,
3205 .pvr_mask = 0xFFFFFFFF,
3206 .insns_flags = PPC_INSNS_603,
3207 .flags = PPC_FLAGS_603,
3208 .msr_mask = 0x000000000007FF73ULL,
3209 },
3210 /* PowerPC 603e7v */
3211 {
3212 .name = "603e7v",
3213 .pvr = CPU_PPC_603E7v,
3214 .pvr_mask = 0xFFFFFFFF,
3215 .insns_flags = PPC_INSNS_603,
3216 .flags = PPC_FLAGS_603,
3217 .msr_mask = 0x000000000007FF73ULL,
3218 },
3219 /* PowerPC 603e7v2 */
3220 {
3221 .name = "603e7v2",
3222 .pvr = CPU_PPC_603E7v2,
3223 .pvr_mask = 0xFFFFFFFF,
3224 .insns_flags = PPC_INSNS_603,
3225 .flags = PPC_FLAGS_603,
3226 .msr_mask = 0x000000000007FF73ULL,
3227 },
3228 /* PowerPC 603r */
3229 {
3230 .name = "603r",
3231 .pvr = CPU_PPC_603R,
3232 .pvr_mask = 0xFFFFFFFF,
3233 .insns_flags = PPC_INSNS_603,
3234 .flags = PPC_FLAGS_603,
3235 .msr_mask = 0x000000000007FF73ULL,
3236 },
3237 {
3238 .name = "Goldeneye",
3239 .pvr = CPU_PPC_603R,
3240 .pvr_mask = 0xFFFFFFFF,
3241 .insns_flags = PPC_INSNS_603,
3242 .flags = PPC_FLAGS_603,
3243 .msr_mask = 0x000000000007FF73ULL,
3244 },
3245 #if defined (TODO)
3246 /* XXX: TODO: according to Motorola UM, this is a derivative to 603e */
3247 {
3248 .name = "G2",
3249 .pvr = CPU_PPC_G2,
3250 .pvr_mask = 0xFFFF0000,
3251 .insns_flags = PPC_INSNS_G2,
3252 .flags = PPC_FLAGS_G2,
3253 .msr_mask = 0x000000000006FFF2ULL,
3254 },
3255 {
3256 .name = "G2h4",
3257 .pvr = CPU_PPC_G2H4,
3258 .pvr_mask = 0xFFFF0000,
3259 .insns_flags = PPC_INSNS_G2,
3260 .flags = PPC_FLAGS_G2,
3261 .msr_mask = 0x000000000006FFF2ULL,
3262 },
3263 {
3264 .name = "G2gp",
3265 .pvr = CPU_PPC_G2gp,
3266 .pvr_mask = 0xFFFF0000,
3267 .insns_flags = PPC_INSNS_G2,
3268 .flags = PPC_FLAGS_G2,
3269 .msr_mask = 0x000000000006FFF2ULL,
3270 },
3271 {
3272 .name = "G2ls",
3273 .pvr = CPU_PPC_G2ls,
3274 .pvr_mask = 0xFFFF0000,
3275 .insns_flags = PPC_INSNS_G2,
3276 .flags = PPC_FLAGS_G2,
3277 .msr_mask = 0x000000000006FFF2ULL,
3278 },
3279 { /* Same as G2, with LE mode support */
3280 .name = "G2le",
3281 .pvr = CPU_PPC_G2LE,
3282 .pvr_mask = 0xFFFF0000,
3283 .insns_flags = PPC_INSNS_G2,
3284 .flags = PPC_FLAGS_G2,
3285 .msr_mask = 0x000000000007FFF3ULL,
3286 },
3287 {
3288 .name = "G2legp",
3289 .pvr = CPU_PPC_G2LEgp,
3290 .pvr_mask = 0xFFFF0000,
3291 .insns_flags = PPC_INSNS_G2,
3292 .flags = PPC_FLAGS_G2,
3293 .msr_mask = 0x000000000007FFF3ULL,
3294 },
3295 {
3296 .name = "G2lels",
3297 .pvr = CPU_PPC_G2LEls,
3298 .pvr_mask = 0xFFFF0000,
3299 .insns_flags = PPC_INSNS_G2,
3300 .flags = PPC_FLAGS_G2,
3301 .msr_mask = 0x000000000007FFF3ULL,
3302 },
3303 #endif
3304 /* PowerPC 604 */
3305 {
3306 .name = "604",
3307 .pvr = CPU_PPC_604,
3308 .pvr_mask = 0xFFFFFFFF,
3309 .insns_flags = PPC_INSNS_604,
3310 .flags = PPC_FLAGS_604,
3311 .msr_mask = 0x000000000005FF77ULL,
3312 },
3313 /* PowerPC 604e */
3314 {
3315 .name = "604e",
3316 .pvr = CPU_PPC_604E,
3317 .pvr_mask = 0xFFFFFFFF,
3318 .insns_flags = PPC_INSNS_604,
3319 .flags = PPC_FLAGS_604,
3320 .msr_mask = 0x000000000005FF77ULL,
3321 },
3322 /* PowerPC 604r */
3323 {
3324 .name = "604r",
3325 .pvr = CPU_PPC_604R,
3326 .pvr_mask = 0xFFFFFFFF,
3327 .insns_flags = PPC_INSNS_604,
3328 .flags = PPC_FLAGS_604,
3329 .msr_mask = 0x000000000005FF77ULL,
3330 },
3331 /* generic G3 */
3332 {
3333 .name = "G3",
3334 .pvr = CPU_PPC_74x,
3335 .pvr_mask = 0xFFFFFFFF,
3336 .insns_flags = PPC_INSNS_7x0,
3337 .flags = PPC_FLAGS_7x0,
3338 .msr_mask = 0x000000000007FF77ULL,
3339 },
3340 /* MPC740 (G3) */
3341 {
3342 .name = "740",
3343 .pvr = CPU_PPC_74x,
3344 .pvr_mask = 0xFFFFFFFF,
3345 .insns_flags = PPC_INSNS_7x0,
3346 .flags = PPC_FLAGS_7x0,
3347 .msr_mask = 0x000000000007FF77ULL,
3348 },
3349 {
3350 .name = "Arthur",
3351 .pvr = CPU_PPC_74x,
3352 .pvr_mask = 0xFFFFFFFF,
3353 .insns_flags = PPC_INSNS_7x0,
3354 .flags = PPC_FLAGS_7x0,
3355 .msr_mask = 0x000000000007FF77ULL,
3356 },
3357 #if defined (TODO)
3358 /* MPC745 (G3) */
3359 {
3360 .name = "745",
3361 .pvr = CPU_PPC_74x,
3362 .pvr_mask = 0xFFFFF000,
3363 .insns_flags = PPC_INSNS_7x5,
3364 .flags = PPC_FLAGS_7x5,
3365 .msr_mask = 0x000000000007FF77ULL,
3366 },
3367 {
3368 .name = "Goldfinger",
3369 .pvr = CPU_PPC_74x,
3370 .pvr_mask = 0xFFFFF000,
3371 .insns_flags = PPC_INSNS_7x5,
3372 .flags = PPC_FLAGS_7x5,
3373 .msr_mask = 0x000000000007FF77ULL,
3374 },
3375 #endif
3376 /* MPC750 (G3) */
3377 {
3378 .name = "750",
3379 .pvr = CPU_PPC_74x,
3380 .pvr_mask = 0xFFFFFFFF,
3381 .insns_flags = PPC_INSNS_7x0,
3382 .flags = PPC_FLAGS_7x0,
3383 .msr_mask = 0x000000000007FF77ULL,
3384 },
3385 #if defined (TODO)
3386 /* MPC755 (G3) */
3387 {
3388 .name = "755",
3389 .pvr = CPU_PPC_755,
3390 .pvr_mask = 0xFFFFF000,
3391 .insns_flags = PPC_INSNS_7x5,
3392 .flags = PPC_FLAGS_7x5,
3393 .msr_mask = 0x000000000007FF77ULL,
3394 },
3395 #endif
3396 /* MPC740P (G3) */
3397 {
3398 .name = "740p",
3399 .pvr = CPU_PPC_74xP,
3400 .pvr_mask = 0xFFFFFFFF,
3401 .insns_flags = PPC_INSNS_7x0,
3402 .flags = PPC_FLAGS_7x0,
3403 .msr_mask = 0x000000000007FF77ULL,
3404 },
3405 {
3406 .name = "Conan/Doyle",
3407 .pvr = CPU_PPC_74xP,
3408 .pvr_mask = 0xFFFFFFFF,
3409 .insns_flags = PPC_INSNS_7x0,
3410 .flags = PPC_FLAGS_7x0,
3411 .msr_mask = 0x000000000007FF77ULL,
3412 },
3413 #if defined (TODO)
3414 /* MPC745P (G3) */
3415 {
3416 .name = "745p",
3417 .pvr = CPU_PPC_74xP,
3418 .pvr_mask = 0xFFFFF000,
3419 .insns_flags = PPC_INSNS_7x5,
3420 .flags = PPC_FLAGS_7x5,
3421 .msr_mask = 0x000000000007FF77ULL,
3422 },
3423 #endif
3424 /* MPC750P (G3) */
3425 {
3426 .name = "750p",
3427 .pvr = CPU_PPC_74xP,
3428 .pvr_mask = 0xFFFFFFFF,
3429 .insns_flags = PPC_INSNS_7x0,
3430 .flags = PPC_FLAGS_7x0,
3431 .msr_mask = 0x000000000007FF77ULL,
3432 },
3433 #if defined (TODO)
3434 /* MPC755P (G3) */
3435 {
3436 .name = "755p",
3437 .pvr = CPU_PPC_74xP,
3438 .pvr_mask = 0xFFFFF000,
3439 .insns_flags = PPC_INSNS_7x5,
3440 .flags = PPC_FLAGS_7x5,
3441 .msr_mask = 0x000000000007FF77ULL,
3442 },
3443 #endif
3444 /* IBM 750CXe (G3 embedded) */
3445 {
3446 .name = "750cxe",
3447 .pvr = CPU_PPC_750CXE,
3448 .pvr_mask = 0xFFFFFFFF,
3449 .insns_flags = PPC_INSNS_7x0,
3450 .flags = PPC_FLAGS_7x0,
3451 .msr_mask = 0x000000000007FF77ULL,
3452 },
3453 /* IBM 750FX (G3 embedded) */
3454 {
3455 .name = "750fx",
3456 .pvr = CPU_PPC_750FX,
3457 .pvr_mask = 0xFFFFFFFF,
3458 .insns_flags = PPC_INSNS_7x0,
3459 .flags = PPC_FLAGS_7x0,
3460 .msr_mask = 0x000000000007FF77ULL,
3461 },
3462 /* IBM 750GX (G3 embedded) */
3463 {
3464 .name = "750gx",
3465 .pvr = CPU_PPC_750GX,
3466 .pvr_mask = 0xFFFFFFFF,
3467 .insns_flags = PPC_INSNS_7x0,
3468 .flags = PPC_FLAGS_7x0,
3469 .msr_mask = 0x000000000007FF77ULL,
3470 },
3471 #if defined (TODO)
3472 /* generic G4 */
3473 {
3474 .name = "G4",
3475 .pvr = CPU_PPC_7400,
3476 .pvr_mask = 0xFFFF0000,
3477 .insns_flags = PPC_INSNS_74xx,
3478 .flags = PPC_FLAGS_74xx,
3479 .msr_mask = 0x000000000205FF77ULL,
3480 },
3481 #endif
3482 #if defined (TODO)
3483 /* PowerPC 7400 (G4) */
3484 {
3485 .name = "7400",
3486 .pvr = CPU_PPC_7400,
3487 .pvr_mask = 0xFFFF0000,
3488 .insns_flags = PPC_INSNS_74xx,
3489 .flags = PPC_FLAGS_74xx,
3490 .msr_mask = 0x000000000205FF77ULL,
3491 },
3492 {
3493 .name = "Max",
3494 .pvr = CPU_PPC_7400,
3495 .pvr_mask = 0xFFFF0000,
3496 .insns_flags = PPC_INSNS_74xx,
3497 .flags = PPC_FLAGS_74xx,
3498 .msr_mask = 0x000000000205FF77ULL,
3499 },
3500 #endif
3501 #if defined (TODO)
3502 /* PowerPC 7410 (G4) */
3503 {
3504 .name = "7410",
3505 .pvr = CPU_PPC_7410,
3506 .pvr_mask = 0xFFFF0000,
3507 .insns_flags = PPC_INSNS_74xx,
3508 .flags = PPC_FLAGS_74xx,
3509 .msr_mask = 0x000000000205FF77ULL,
3510 },
3511 {
3512 .name = "Nitro",
3513 .pvr = CPU_PPC_7410,
3514 .pvr_mask = 0xFFFF0000,
3515 .insns_flags = PPC_INSNS_74xx,
3516 .flags = PPC_FLAGS_74xx,
3517 .msr_mask = 0x000000000205FF77ULL,
3518 },
3519 #endif
3520 /* XXX: 7441 */
3521 /* XXX: 7445 */
3522 /* XXX: 7447 */
3523 /* XXX: 7447A */
3524 #if defined (TODO)
3525 /* PowerPC 7450 (G4) */
3526 {
3527 .name = "7450",
3528 .pvr = CPU_PPC_7450,
3529 .pvr_mask = 0xFFFF0000,
3530 .insns_flags = PPC_INSNS_74xx,
3531 .flags = PPC_FLAGS_74xx,
3532 .msr_mask = 0x000000000205FF77ULL,
3533 },
3534 {
3535 .name = "Vger",
3536 .pvr = CPU_PPC_7450,
3537 .pvr_mask = 0xFFFF0000,
3538 .insns_flags = PPC_INSNS_74xx,
3539 .flags = PPC_FLAGS_74xx,
3540 .msr_mask = 0x000000000205FF77ULL,
3541 },
3542 #endif
3543 /* XXX: 7451 */
3544 #if defined (TODO)
3545 /* PowerPC 7455 (G4) */
3546 {
3547 .name = "7455",
3548 .pvr = CPU_PPC_7455,
3549 .pvr_mask = 0xFFFF0000,
3550 .insns_flags = PPC_INSNS_74xx,
3551 .flags = PPC_FLAGS_74xx,
3552 .msr_mask = 0x000000000205FF77ULL,
3553 },
3554 {
3555 .name = "Apollo 6",
3556 .pvr = CPU_PPC_7455,
3557 .pvr_mask = 0xFFFF0000,
3558 .insns_flags = PPC_INSNS_74xx,
3559 .flags = PPC_FLAGS_74xx,
3560 .msr_mask = 0x000000000205FF77ULL,
3561 },
3562 #endif
3563 #if defined (TODO)
3564 /* PowerPC 7457 (G4) */
3565 {
3566 .name = "7457",
3567 .pvr = CPU_PPC_7457,
3568 .pvr_mask = 0xFFFF0000,
3569 .insns_flags = PPC_INSNS_74xx,
3570 .flags = PPC_FLAGS_74xx,
3571 .msr_mask = 0x000000000205FF77ULL,
3572 },
3573 {
3574 .name = "Apollo 7",
3575 .pvr = CPU_PPC_7457,
3576 .pvr_mask = 0xFFFF0000,
3577 .insns_flags = PPC_INSNS_74xx,
3578 .flags = PPC_FLAGS_74xx,
3579 .msr_mask = 0x000000000205FF77ULL,
3580 },
3581 #endif
3582 #if defined (TODO)
3583 /* PowerPC 7457A (G4) */
3584 {
3585 .name = "7457A",
3586 .pvr = CPU_PPC_7457A,
3587 .pvr_mask = 0xFFFF0000,
3588 .insns_flags = PPC_INSNS_74xx,
3589 .flags = PPC_FLAGS_74xx,
3590 .msr_mask = 0x000000000205FF77ULL,
3591 },
3592 {
3593 .name = "Apollo 7 PM",
3594 .pvr = CPU_PPC_7457A,
3595 .pvr_mask = 0xFFFF0000,
3596 .insns_flags = PPC_INSNS_74xx,
3597 .flags = PPC_FLAGS_74xx,
3598 .msr_mask = 0x000000000205FF77ULL,
3599 },
3600 #endif
3601 /* 64 bits PowerPC */
3602 #if defined (TARGET_PPC64)
3603 #if defined (TODO)
3604 /* PowerPC 620 */
3605 {
3606 .name = "620",
3607 .pvr = CPU_PPC_620,
3608 .pvr_mask = 0xFFFF0000,
3609 .insns_flags = PPC_INSNS_620,
3610 .flags = PPC_FLAGS_620,
3611 .msr_mask = 0x800000000005FF73ULL,
3612 },
3613 #endif
3614 #if defined (TODO)
3615 /* PowerPC 630 (POWER3) */
3616 {
3617 .name = "630",
3618 .pvr = CPU_PPC_630,
3619 .pvr_mask = 0xFFFF0000,
3620 .insns_flags = PPC_INSNS_630,
3621 .flags = PPC_FLAGS_630,
3622 .msr_mask = xxx,
3623 }
3624 {
3625 .name = "POWER3",
3626 .pvr = CPU_PPC_630,
3627 .pvr_mask = 0xFFFF0000,
3628 .insns_flags = PPC_INSNS_630,
3629 .flags = PPC_FLAGS_630,
3630 .msr_mask = xxx,
3631 }
3632 #endif
3633 #if defined (TODO)
3634 /* PowerPC 631 (Power 3+)*/
3635 {
3636 .name = "631",
3637 .pvr = CPU_PPC_631,
3638 .pvr_mask = 0xFFFF0000,
3639 .insns_flags = PPC_INSNS_631,
3640 .flags = PPC_FLAGS_631,
3641 .msr_mask = xxx,
3642 },
3643 {
3644 .name = "POWER3+",
3645 .pvr = CPU_PPC_631,
3646 .pvr_mask = 0xFFFF0000,
3647 .insns_flags = PPC_INSNS_631,
3648 .flags = PPC_FLAGS_631,
3649 .msr_mask = xxx,
3650 },
3651 #endif
3652 #if defined (TODO)
3653 /* POWER4 */
3654 {
3655 .name = "POWER4",
3656 .pvr = CPU_PPC_POWER4,
3657 .pvr_mask = 0xFFFF0000,
3658 .insns_flags = PPC_INSNS_POWER4,
3659 .flags = PPC_FLAGS_POWER4,
3660 .msr_mask = xxx,
3661 },
3662 #endif
3663 #if defined (TODO)
3664 /* POWER4p */
3665 {
3666 .name = "POWER4+",
3667 .pvr = CPU_PPC_POWER4P,
3668 .pvr_mask = 0xFFFF0000,
3669 .insns_flags = PPC_INSNS_POWER4,
3670 .flags = PPC_FLAGS_POWER4,
3671 .msr_mask = xxx,
3672 },
3673 #endif
3674 #if defined (TODO)
3675 /* POWER5 */
3676 {
3677 .name = "POWER5",
3678 .pvr = CPU_PPC_POWER5,
3679 .pvr_mask = 0xFFFF0000,
3680 .insns_flags = PPC_INSNS_POWER5,
3681 .flags = PPC_FLAGS_POWER5,
3682 .msr_mask = xxx,
3683 },
3684 #endif
3685 #if defined (TODO)
3686 /* POWER5+ */
3687 {
3688 .name = "POWER5+",
3689 .pvr = CPU_PPC_POWER5P,
3690 .pvr_mask = 0xFFFF0000,
3691 .insns_flags = PPC_INSNS_POWER5,
3692 .flags = PPC_FLAGS_POWER5,
3693 .msr_mask = xxx,
3694 },
3695 #endif
3696 #if defined (TODO)
3697 /* PowerPC 970 */
3698 {
3699 .name = "970",
3700 .pvr = CPU_PPC_970,
3701 .pvr_mask = 0xFFFF0000,
3702 .insns_flags = PPC_INSNS_970,
3703 .flags = PPC_FLAGS_970,
3704 .msr_mask = 0x900000000204FF36ULL,
3705 },
3706 #endif
3707 #if defined (TODO)
3708 /* PowerPC 970FX (G5) */
3709 {
3710 .name = "970fx",
3711 .pvr = CPU_PPC_970FX,
3712 .pvr_mask = 0xFFFF0000,
3713 .insns_flags = PPC_INSNS_970FX,
3714 .flags = PPC_FLAGS_970FX,
3715 .msr_mask = 0x800000000204FF36ULL,
3716 },
3717 #endif
3718 #if defined (TODO)
3719 /* RS64 (Apache/A35) */
3720 /* This one seems to support the whole POWER2 instruction set
3721 * and the PowerPC 64 one.
3722 */
3723 {
3724 .name = "RS64",
3725 .pvr = CPU_PPC_RS64,
3726 .pvr_mask = 0xFFFF0000,
3727 .insns_flags = PPC_INSNS_RS64,
3728 .flags = PPC_FLAGS_RS64,
3729 .msr_mask = xxx,
3730 },
3731 {
3732 .name = "Apache",
3733 .pvr = CPU_PPC_RS64,
3734 .pvr_mask = 0xFFFF0000,
3735 .insns_flags = PPC_INSNS_RS64,
3736 .flags = PPC_FLAGS_RS64,
3737 .msr_mask = xxx,
3738 },
3739 {
3740 .name = "A35",
3741 .pvr = CPU_PPC_RS64,
3742 .pvr_mask = 0xFFFF0000,
3743 .insns_flags = PPC_INSNS_RS64,
3744 .flags = PPC_FLAGS_RS64,
3745 .msr_mask = xxx,
3746 },
3747 #endif
3748 #if defined (TODO)
3749 /* RS64-II (NorthStar/A50) */
3750 {
3751 .name = "RS64-II",
3752 .pvr = CPU_PPC_RS64II,
3753 .pvr_mask = 0xFFFF0000,
3754 .insns_flags = PPC_INSNS_RS64,
3755 .flags = PPC_FLAGS_RS64,
3756 .msr_mask = xxx,
3757 },
3758 {
3759 .name = "NortStar",
3760 .pvr = CPU_PPC_RS64II,
3761 .pvr_mask = 0xFFFF0000,
3762 .insns_flags = PPC_INSNS_RS64,
3763 .flags = PPC_FLAGS_RS64,
3764 .msr_mask = xxx,
3765 },
3766 {
3767 .name = "A50",
3768 .pvr = CPU_PPC_RS64II,
3769 .pvr_mask = 0xFFFF0000,
3770 .insns_flags = PPC_INSNS_RS64,
3771 .flags = PPC_FLAGS_RS64,
3772 .msr_mask = xxx,
3773 },
3774 #endif
3775 #if defined (TODO)
3776 /* RS64-III (Pulsar) */
3777 {
3778 .name = "RS64-III",
3779 .pvr = CPU_PPC_RS64III,
3780 .pvr_mask = 0xFFFF0000,
3781 .insns_flags = PPC_INSNS_RS64,
3782 .flags = PPC_FLAGS_RS64,
3783 .msr_mask = xxx,
3784 },
3785 {
3786 .name = "Pulsar",
3787 .pvr = CPU_PPC_RS64III,
3788 .pvr_mask = 0xFFFF0000,
3789 .insns_flags = PPC_INSNS_RS64,
3790 .flags = PPC_FLAGS_RS64,
3791 .msr_mask = xxx,
3792 },
3793 #endif
3794 #if defined (TODO)
3795 /* RS64-IV (IceStar/IStar/SStar) */
3796 {
3797 .name = "RS64-IV",
3798 .pvr = CPU_PPC_RS64IV,
3799 .pvr_mask = 0xFFFF0000,
3800 .insns_flags = PPC_INSNS_RS64,
3801 .flags = PPC_FLAGS_RS64,
3802 .msr_mask = xxx,
3803 },
3804 {
3805 .name = "IceStar",
3806 .pvr = CPU_PPC_RS64IV,
3807 .pvr_mask = 0xFFFF0000,
3808 .insns_flags = PPC_INSNS_RS64,
3809 .flags = PPC_FLAGS_RS64,
3810 .msr_mask = xxx,
3811 },
3812 {
3813 .name = "IStar",
3814 .pvr = CPU_PPC_RS64IV,
3815 .pvr_mask = 0xFFFF0000,
3816 .insns_flags = PPC_INSNS_RS64,
3817 .flags = PPC_FLAGS_RS64,
3818 .msr_mask = xxx,
3819 },
3820 {
3821 .name = "SStar",
3822 .pvr = CPU_PPC_RS64IV,
3823 .pvr_mask = 0xFFFF0000,
3824 .insns_flags = PPC_INSNS_RS64,
3825 .flags = PPC_FLAGS_RS64,
3826 .msr_mask = xxx,
3827 },
3828 #endif
3829 /* POWER */
3830 #if defined (TODO)
3831 /* Original POWER */
3832 {
3833 .name = "POWER",
3834 .pvr = CPU_POWER,
3835 .pvr_mask = 0xFFFF0000,
3836 .insns_flags = PPC_INSNS_POWER,
3837 .flags = PPC_FLAGS_POWER,
3838 .msr_mask = xxx,
3839 },
3840 #endif
3841 #endif /* defined (TARGET_PPC64) */
3842 #if defined (TODO)
3843 /* POWER2 */
3844 {
3845 .name = "POWER2",
3846 .pvr = CPU_POWER2,
3847 .pvr_mask = 0xFFFF0000,
3848 .insns_flags = PPC_INSNS_POWER,
3849 .flags = PPC_FLAGS_POWER,
3850 .msr_mask = xxx,
3851 },
3852 #endif
3853 /* Generic PowerPCs */
3854 #if defined (TODO)
3855 {
3856 .name = "ppc64",
3857 .pvr = CPU_PPC_970,
3858 .pvr_mask = 0xFFFF0000,
3859 .insns_flags = PPC_INSNS_PPC64,
3860 .flags = PPC_FLAGS_PPC64,
3861 .msr_mask = 0xA00000000204FF36ULL,
3862 },
3863 #endif
3864 {
3865 .name = "ppc32",
3866 .pvr = CPU_PPC_604,
3867 .pvr_mask = 0xFFFFFFFF,
3868 .insns_flags = PPC_INSNS_PPC32,
3869 .flags = PPC_FLAGS_PPC32,
3870 .msr_mask = 0x000000000005FF77ULL,
3871 },
3872 /* Fallback */
3873 {
3874 .name = "ppc",
3875 .pvr = CPU_PPC_604,
3876 .pvr_mask = 0xFFFFFFFF,
3877 .insns_flags = PPC_INSNS_PPC32,
3878 .flags = PPC_FLAGS_PPC32,
3879 .msr_mask = 0x000000000005FF77ULL,
3880 },
3881 };
3882
3883 int ppc_find_by_name (const unsigned char *name, ppc_def_t **def)
3884 {
3885 int i, ret;
3886
3887 ret = -1;
3888 *def = NULL;
3889 for (i = 0; strcmp(ppc_defs[i].name, "ppc") != 0; i++) {
3890 if (strcasecmp(name, ppc_defs[i].name) == 0) {
3891 *def = &ppc_defs[i];
3892 ret = 0;
3893 break;
3894 }
3895 }
3896
3897 return ret;
3898 }
3899
3900 int ppc_find_by_pvr (uint32_t pvr, ppc_def_t **def)
3901 {
3902 int i, ret;
3903
3904 ret = -1;
3905 *def = NULL;
3906 for (i = 0; ppc_defs[i].name != NULL; i++) {
3907 if ((pvr & ppc_defs[i].pvr_mask) ==
3908 (ppc_defs[i].pvr & ppc_defs[i].pvr_mask)) {
3909 *def = &ppc_defs[i];
3910 ret = 0;
3911 break;
3912 }
3913 }
3914
3915 return ret;
3916 }
3917
3918 void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
3919 {
3920 int i;
3921
3922 for (i = 0; ; i++) {
3923 (*cpu_fprintf)(f, "PowerPC %16s PVR %08x mask %08x\n",
3924 ppc_defs[i].name,
3925 ppc_defs[i].pvr, ppc_defs[i].pvr_mask);
3926 if (strcmp(ppc_defs[i].name, "ppc") == 0)
3927 break;
3928 }
3929 }