Statistics
| Branch: | Revision:

root / target-ppc / translate_init.c @ caa4039c

History | View | Annotate | Download (125.2 kB)

1 3fc6c082 bellard
/*
2 3fc6c082 bellard
 *  PowerPC CPU initialization for qemu.
3 5fafdf24 ths
 *
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 a496775f j_mayer
//#define PPC_DEBUG_IRQ
29 3fc6c082 bellard
30 3fc6c082 bellard
struct ppc_def_t {
31 3fc6c082 bellard
    const unsigned char *name;
32 3fc6c082 bellard
    uint32_t pvr;
33 3fc6c082 bellard
    uint32_t pvr_mask;
34 0487d6a8 j_mayer
    uint64_t insns_flags;
35 3fc6c082 bellard
    uint32_t flags;
36 3fc6c082 bellard
    uint64_t msr_mask;
37 3fc6c082 bellard
};
38 3fc6c082 bellard
39 e9df014c j_mayer
/* For user-mode emulation, we don't emulate any IRQ controller */
40 e9df014c j_mayer
#if defined(CONFIG_USER_ONLY)
41 e9df014c j_mayer
#define PPC_IRQ_INIT_FN(name)                                         \
42 e9df014c j_mayer
static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env) \
43 e9df014c j_mayer
{                                                                     \
44 e9df014c j_mayer
}
45 e9df014c j_mayer
#else
46 e9df014c j_mayer
#define PPC_IRQ_INIT_FN(name)                                         \
47 e9df014c j_mayer
void glue(glue(ppc, name),_irq_init) (CPUPPCState *env);
48 e9df014c j_mayer
#endif
49 24be5ae3 j_mayer
PPC_IRQ_INIT_FN(405);
50 e9df014c j_mayer
PPC_IRQ_INIT_FN(6xx);
51 d0dfae6e j_mayer
PPC_IRQ_INIT_FN(970);
52 e9df014c j_mayer
53 3fc6c082 bellard
/* Generic callbacks:
54 3fc6c082 bellard
 * do nothing but store/retrieve spr value
55 3fc6c082 bellard
 */
56 04f20795 j_mayer
#ifdef PPC_DUMP_SPR_ACCESSES
57 3fc6c082 bellard
static void spr_read_generic (void *opaque, int sprn)
58 3fc6c082 bellard
{
59 04f20795 j_mayer
    gen_op_load_dump_spr(sprn);
60 3fc6c082 bellard
}
61 3fc6c082 bellard
62 3fc6c082 bellard
static void spr_write_generic (void *opaque, int sprn)
63 3fc6c082 bellard
{
64 04f20795 j_mayer
    gen_op_store_dump_spr(sprn);
65 3fc6c082 bellard
}
66 04f20795 j_mayer
#else
67 04f20795 j_mayer
static void spr_read_generic (void *opaque, int sprn)
68 a496775f j_mayer
{
69 04f20795 j_mayer
    gen_op_load_spr(sprn);
70 a496775f j_mayer
}
71 a496775f j_mayer
72 04f20795 j_mayer
static void spr_write_generic (void *opaque, int sprn)
73 a496775f j_mayer
{
74 04f20795 j_mayer
    gen_op_store_spr(sprn);
75 a496775f j_mayer
}
76 04f20795 j_mayer
#endif
77 a496775f j_mayer
78 a496775f j_mayer
#if !defined(CONFIG_USER_ONLY)
79 a496775f j_mayer
static void spr_write_clear (void *opaque, int sprn)
80 a496775f j_mayer
{
81 a496775f j_mayer
    gen_op_mask_spr(sprn);
82 a496775f j_mayer
}
83 a496775f j_mayer
#endif
84 a496775f j_mayer
85 76a66253 j_mayer
/* SPR common to all PowerPC */
86 3fc6c082 bellard
/* XER */
87 3fc6c082 bellard
static void spr_read_xer (void *opaque, int sprn)
88 3fc6c082 bellard
{
89 3fc6c082 bellard
    gen_op_load_xer();
90 3fc6c082 bellard
}
91 3fc6c082 bellard
92 3fc6c082 bellard
static void spr_write_xer (void *opaque, int sprn)
93 3fc6c082 bellard
{
94 3fc6c082 bellard
    gen_op_store_xer();
95 3fc6c082 bellard
}
96 3fc6c082 bellard
97 3fc6c082 bellard
/* LR */
98 3fc6c082 bellard
static void spr_read_lr (void *opaque, int sprn)
99 3fc6c082 bellard
{
100 3fc6c082 bellard
    gen_op_load_lr();
101 3fc6c082 bellard
}
102 3fc6c082 bellard
103 3fc6c082 bellard
static void spr_write_lr (void *opaque, int sprn)
104 3fc6c082 bellard
{
105 3fc6c082 bellard
    gen_op_store_lr();
106 3fc6c082 bellard
}
107 3fc6c082 bellard
108 3fc6c082 bellard
/* CTR */
109 3fc6c082 bellard
static void spr_read_ctr (void *opaque, int sprn)
110 3fc6c082 bellard
{
111 3fc6c082 bellard
    gen_op_load_ctr();
112 3fc6c082 bellard
}
113 3fc6c082 bellard
114 3fc6c082 bellard
static void spr_write_ctr (void *opaque, int sprn)
115 3fc6c082 bellard
{
116 3fc6c082 bellard
    gen_op_store_ctr();
117 3fc6c082 bellard
}
118 3fc6c082 bellard
119 3fc6c082 bellard
/* User read access to SPR */
120 3fc6c082 bellard
/* USPRx */
121 3fc6c082 bellard
/* UMMCRx */
122 3fc6c082 bellard
/* UPMCx */
123 3fc6c082 bellard
/* USIA */
124 3fc6c082 bellard
/* UDECR */
125 3fc6c082 bellard
static void spr_read_ureg (void *opaque, int sprn)
126 3fc6c082 bellard
{
127 3fc6c082 bellard
    gen_op_load_spr(sprn + 0x10);
128 3fc6c082 bellard
}
129 3fc6c082 bellard
130 76a66253 j_mayer
/* SPR common to all non-embedded PowerPC */
131 3fc6c082 bellard
/* DECR */
132 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
133 3fc6c082 bellard
static void spr_read_decr (void *opaque, int sprn)
134 3fc6c082 bellard
{
135 3fc6c082 bellard
    gen_op_load_decr();
136 3fc6c082 bellard
}
137 3fc6c082 bellard
138 3fc6c082 bellard
static void spr_write_decr (void *opaque, int sprn)
139 3fc6c082 bellard
{
140 3fc6c082 bellard
    gen_op_store_decr();
141 3fc6c082 bellard
}
142 76a66253 j_mayer
#endif
143 3fc6c082 bellard
144 76a66253 j_mayer
/* SPR common to all non-embedded PowerPC, except 601 */
145 3fc6c082 bellard
/* Time base */
146 3fc6c082 bellard
static void spr_read_tbl (void *opaque, int sprn)
147 3fc6c082 bellard
{
148 3fc6c082 bellard
    gen_op_load_tbl();
149 3fc6c082 bellard
}
150 3fc6c082 bellard
151 76a66253 j_mayer
static void spr_read_tbu (void *opaque, int sprn)
152 3fc6c082 bellard
{
153 76a66253 j_mayer
    gen_op_load_tbu();
154 3fc6c082 bellard
}
155 3fc6c082 bellard
156 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
157 76a66253 j_mayer
static void spr_write_tbl (void *opaque, int sprn)
158 3fc6c082 bellard
{
159 76a66253 j_mayer
    gen_op_store_tbl();
160 3fc6c082 bellard
}
161 3fc6c082 bellard
162 3fc6c082 bellard
static void spr_write_tbu (void *opaque, int sprn)
163 3fc6c082 bellard
{
164 3fc6c082 bellard
    gen_op_store_tbu();
165 3fc6c082 bellard
}
166 76a66253 j_mayer
#endif
167 3fc6c082 bellard
168 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
169 3fc6c082 bellard
/* IBAT0U...IBAT0U */
170 3fc6c082 bellard
/* IBAT0L...IBAT7L */
171 3fc6c082 bellard
static void spr_read_ibat (void *opaque, int sprn)
172 3fc6c082 bellard
{
173 3fc6c082 bellard
    gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
174 3fc6c082 bellard
}
175 3fc6c082 bellard
176 3fc6c082 bellard
static void spr_read_ibat_h (void *opaque, int sprn)
177 3fc6c082 bellard
{
178 3fc6c082 bellard
    gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT4U) / 2);
179 3fc6c082 bellard
}
180 3fc6c082 bellard
181 3fc6c082 bellard
static void spr_write_ibatu (void *opaque, int sprn)
182 3fc6c082 bellard
{
183 3fc6c082 bellard
    DisasContext *ctx = opaque;
184 3fc6c082 bellard
185 3fc6c082 bellard
    gen_op_store_ibatu((sprn - SPR_IBAT0U) / 2);
186 3fc6c082 bellard
    RET_STOP(ctx);
187 3fc6c082 bellard
}
188 3fc6c082 bellard
189 3fc6c082 bellard
static void spr_write_ibatu_h (void *opaque, int sprn)
190 3fc6c082 bellard
{
191 3fc6c082 bellard
    DisasContext *ctx = opaque;
192 3fc6c082 bellard
193 3fc6c082 bellard
    gen_op_store_ibatu((sprn - SPR_IBAT4U) / 2);
194 3fc6c082 bellard
    RET_STOP(ctx);
195 3fc6c082 bellard
}
196 3fc6c082 bellard
197 3fc6c082 bellard
static void spr_write_ibatl (void *opaque, int sprn)
198 3fc6c082 bellard
{
199 3fc6c082 bellard
    DisasContext *ctx = opaque;
200 3fc6c082 bellard
201 3fc6c082 bellard
    gen_op_store_ibatl((sprn - SPR_IBAT0L) / 2);
202 3fc6c082 bellard
    RET_STOP(ctx);
203 3fc6c082 bellard
}
204 3fc6c082 bellard
205 3fc6c082 bellard
static void spr_write_ibatl_h (void *opaque, int sprn)
206 3fc6c082 bellard
{
207 3fc6c082 bellard
    DisasContext *ctx = opaque;
208 3fc6c082 bellard
209 3fc6c082 bellard
    gen_op_store_ibatl((sprn - SPR_IBAT4L) / 2);
210 3fc6c082 bellard
    RET_STOP(ctx);
211 3fc6c082 bellard
}
212 3fc6c082 bellard
213 3fc6c082 bellard
/* DBAT0U...DBAT7U */
214 3fc6c082 bellard
/* DBAT0L...DBAT7L */
215 3fc6c082 bellard
static void spr_read_dbat (void *opaque, int sprn)
216 3fc6c082 bellard
{
217 3fc6c082 bellard
    gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT0U) / 2);
218 3fc6c082 bellard
}
219 3fc6c082 bellard
220 3fc6c082 bellard
static void spr_read_dbat_h (void *opaque, int sprn)
221 3fc6c082 bellard
{
222 3fc6c082 bellard
    gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT4U) / 2);
223 3fc6c082 bellard
}
224 3fc6c082 bellard
225 3fc6c082 bellard
static void spr_write_dbatu (void *opaque, int sprn)
226 3fc6c082 bellard
{
227 3fc6c082 bellard
    DisasContext *ctx = opaque;
228 3fc6c082 bellard
229 3fc6c082 bellard
    gen_op_store_dbatu((sprn - SPR_DBAT0U) / 2);
230 3fc6c082 bellard
    RET_STOP(ctx);
231 3fc6c082 bellard
}
232 3fc6c082 bellard
233 3fc6c082 bellard
static void spr_write_dbatu_h (void *opaque, int sprn)
234 3fc6c082 bellard
{
235 3fc6c082 bellard
    DisasContext *ctx = opaque;
236 3fc6c082 bellard
237 3fc6c082 bellard
    gen_op_store_dbatu((sprn - SPR_DBAT4U) / 2);
238 3fc6c082 bellard
    RET_STOP(ctx);
239 3fc6c082 bellard
}
240 3fc6c082 bellard
241 3fc6c082 bellard
static void spr_write_dbatl (void *opaque, int sprn)
242 3fc6c082 bellard
{
243 3fc6c082 bellard
    DisasContext *ctx = opaque;
244 3fc6c082 bellard
245 3fc6c082 bellard
    gen_op_store_dbatl((sprn - SPR_DBAT0L) / 2);
246 3fc6c082 bellard
    RET_STOP(ctx);
247 3fc6c082 bellard
}
248 3fc6c082 bellard
249 3fc6c082 bellard
static void spr_write_dbatl_h (void *opaque, int sprn)
250 3fc6c082 bellard
{
251 3fc6c082 bellard
    DisasContext *ctx = opaque;
252 3fc6c082 bellard
253 3fc6c082 bellard
    gen_op_store_dbatl((sprn - SPR_DBAT4L) / 2);
254 3fc6c082 bellard
    RET_STOP(ctx);
255 3fc6c082 bellard
}
256 3fc6c082 bellard
257 3fc6c082 bellard
/* SDR1 */
258 3fc6c082 bellard
static void spr_read_sdr1 (void *opaque, int sprn)
259 3fc6c082 bellard
{
260 3fc6c082 bellard
    gen_op_load_sdr1();
261 3fc6c082 bellard
}
262 3fc6c082 bellard
263 3fc6c082 bellard
static void spr_write_sdr1 (void *opaque, int sprn)
264 3fc6c082 bellard
{
265 3fc6c082 bellard
    DisasContext *ctx = opaque;
266 3fc6c082 bellard
267 3fc6c082 bellard
    gen_op_store_sdr1();
268 3fc6c082 bellard
    RET_STOP(ctx);
269 3fc6c082 bellard
}
270 3fc6c082 bellard
271 76a66253 j_mayer
/* 64 bits PowerPC specific SPRs */
272 76a66253 j_mayer
/* ASR */
273 5b284968 ths
/* Currently unused */
274 5b284968 ths
#if 0 && defined(TARGET_PPC64)
275 76a66253 j_mayer
static void spr_read_asr (void *opaque, int sprn)
276 76a66253 j_mayer
{
277 76a66253 j_mayer
    gen_op_load_asr();
278 76a66253 j_mayer
}
279 76a66253 j_mayer

280 76a66253 j_mayer
static void spr_write_asr (void *opaque, int sprn)
281 76a66253 j_mayer
{
282 76a66253 j_mayer
    DisasContext *ctx = opaque;
283 76a66253 j_mayer

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