Statistics
| Branch: | Revision:

root / target-ppc / translate_init.c @ e9df014c

History | View | Annotate | Download (128.2 kB)

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