Statistics
| Branch: | Revision:

root / target-ppc / translate_init.c @ 86cc1ce0

History | View | Annotate | Download (126.7 kB)

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