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