Statistics
| Branch: | Revision:

root / target-ppc / cpu.h @ a04e134a

History | View | Annotate | Download (43.1 kB)

1 79aceca5 bellard
/*
2 3fc6c082 bellard
 *  PowerPC emulation cpu definitions for qemu.
3 5fafdf24 ths
 *
4 76a66253 j_mayer
 *  Copyright (c) 2003-2007 Jocelyn Mayer
5 79aceca5 bellard
 *
6 79aceca5 bellard
 * This library is free software; you can redistribute it and/or
7 79aceca5 bellard
 * modify it under the terms of the GNU Lesser General Public
8 79aceca5 bellard
 * License as published by the Free Software Foundation; either
9 79aceca5 bellard
 * version 2 of the License, or (at your option) any later version.
10 79aceca5 bellard
 *
11 79aceca5 bellard
 * This library is distributed in the hope that it will be useful,
12 79aceca5 bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 79aceca5 bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 79aceca5 bellard
 * Lesser General Public License for more details.
15 79aceca5 bellard
 *
16 79aceca5 bellard
 * You should have received a copy of the GNU Lesser General Public
17 79aceca5 bellard
 * License along with this library; if not, write to the Free Software
18 79aceca5 bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 79aceca5 bellard
 */
20 79aceca5 bellard
#if !defined (__CPU_PPC_H__)
21 79aceca5 bellard
#define __CPU_PPC_H__
22 79aceca5 bellard
23 3fc6c082 bellard
#include "config.h"
24 de270b3c j_mayer
#include <inttypes.h>
25 3fc6c082 bellard
26 76a66253 j_mayer
#if defined (TARGET_PPC64)
27 76a66253 j_mayer
typedef uint64_t ppc_gpr_t;
28 0487d6a8 j_mayer
#define TARGET_GPR_BITS  64
29 d9d7210c j_mayer
#define TARGET_LONG_BITS 64
30 76a66253 j_mayer
#define REGX "%016" PRIx64
31 35cdaad6 j_mayer
#define TARGET_PAGE_BITS 12
32 35cdaad6 j_mayer
#elif defined(TARGET_PPCEMB)
33 8b67546f j_mayer
/* BookE have 36 bits physical address space */
34 e96efcfc j_mayer
#define TARGET_PHYS_ADDR_BITS 64
35 76a66253 j_mayer
/* GPR are 64 bits: used by vector extension */
36 76a66253 j_mayer
typedef uint64_t ppc_gpr_t;
37 0487d6a8 j_mayer
#define TARGET_GPR_BITS  64
38 d9d7210c j_mayer
#define TARGET_LONG_BITS 32
39 1b9eb036 j_mayer
#define REGX "%016" PRIx64
40 d9d7210c j_mayer
#if defined(CONFIG_USER_ONLY)
41 d9d7210c j_mayer
/* It looks like a lot of Linux programs assume page size
42 d9d7210c j_mayer
 * is 4kB long. This is evil, but we have to deal with it...
43 d9d7210c j_mayer
 */
44 d9d7210c j_mayer
#define TARGET_PAGE_BITS 12
45 d9d7210c j_mayer
#else
46 35cdaad6 j_mayer
/* Pages can be 1 kB small */
47 35cdaad6 j_mayer
#define TARGET_PAGE_BITS 10
48 d9d7210c j_mayer
#endif
49 d9d7210c j_mayer
#else
50 d9d7210c j_mayer
#if (HOST_LONG_BITS >= 64)
51 d9d7210c j_mayer
/* When using 64 bits temporary registers,
52 d9d7210c j_mayer
 * we can use 64 bits GPR with no extra cost
53 d9d7210c j_mayer
 * It's even an optimization as it will prevent
54 d9d7210c j_mayer
 * the compiler to do unuseful masking in the micro-ops.
55 d9d7210c j_mayer
 */
56 d9d7210c j_mayer
typedef uint64_t ppc_gpr_t;
57 d9d7210c j_mayer
#define TARGET_GPR_BITS  64
58 71c8b8fd j_mayer
#define REGX "%08" PRIx64
59 76a66253 j_mayer
#else
60 76a66253 j_mayer
typedef uint32_t ppc_gpr_t;
61 0487d6a8 j_mayer
#define TARGET_GPR_BITS  32
62 71c8b8fd j_mayer
#define REGX "%08" PRIx32
63 d9d7210c j_mayer
#endif
64 d9d7210c j_mayer
#define TARGET_LONG_BITS 32
65 35cdaad6 j_mayer
#define TARGET_PAGE_BITS 12
66 76a66253 j_mayer
#endif
67 3cf1e035 bellard
68 79aceca5 bellard
#include "cpu-defs.h"
69 79aceca5 bellard
70 e96efcfc j_mayer
#define ADDRX TARGET_FMT_lx
71 e96efcfc j_mayer
#define PADDRX TARGET_FMT_plx
72 e96efcfc j_mayer
73 79aceca5 bellard
#include <setjmp.h>
74 79aceca5 bellard
75 4ecc3190 bellard
#include "softfloat.h"
76 4ecc3190 bellard
77 1fddef4b bellard
#define TARGET_HAS_ICE 1
78 1fddef4b bellard
79 76a66253 j_mayer
#if defined (TARGET_PPC64)
80 76a66253 j_mayer
#define ELF_MACHINE     EM_PPC64
81 76a66253 j_mayer
#else
82 76a66253 j_mayer
#define ELF_MACHINE     EM_PPC
83 76a66253 j_mayer
#endif
84 9042c0e2 ths
85 fdabc366 bellard
/* XXX: this should be tunable: PowerPC 601 & 64 bits PowerPC
86 fdabc366 bellard
 *                              have different cache line sizes
87 fdabc366 bellard
 */
88 fdabc366 bellard
#define ICACHE_LINE_SIZE 32
89 fdabc366 bellard
#define DCACHE_LINE_SIZE 32
90 fdabc366 bellard
91 3fc6c082 bellard
/*****************************************************************************/
92 a750fc0b j_mayer
/* MMU model                                                                 */
93 3fc6c082 bellard
enum {
94 a750fc0b j_mayer
    POWERPC_MMU_UNKNOWN    = 0,
95 a750fc0b j_mayer
    /* Standard 32 bits PowerPC MMU                            */
96 a750fc0b j_mayer
    POWERPC_MMU_32B,
97 a750fc0b j_mayer
    /* Standard 64 bits PowerPC MMU                            */
98 a750fc0b j_mayer
    POWERPC_MMU_64B,
99 a750fc0b j_mayer
    /* PowerPC 601 MMU                                         */
100 a750fc0b j_mayer
    POWERPC_MMU_601,
101 a750fc0b j_mayer
    /* PowerPC 6xx MMU with software TLB                       */
102 a750fc0b j_mayer
    POWERPC_MMU_SOFT_6xx,
103 a750fc0b j_mayer
    /* PowerPC 74xx MMU with software TLB                      */
104 a750fc0b j_mayer
    POWERPC_MMU_SOFT_74xx,
105 a750fc0b j_mayer
    /* PowerPC 4xx MMU with software TLB                       */
106 a750fc0b j_mayer
    POWERPC_MMU_SOFT_4xx,
107 a750fc0b j_mayer
    /* PowerPC 4xx MMU with software TLB and zones protections */
108 a750fc0b j_mayer
    POWERPC_MMU_SOFT_4xx_Z,
109 a750fc0b j_mayer
    /* PowerPC 4xx MMU in real mode only                       */
110 a750fc0b j_mayer
    POWERPC_MMU_REAL_4xx,
111 a750fc0b j_mayer
    /* BookE MMU model                                         */
112 a750fc0b j_mayer
    POWERPC_MMU_BOOKE,
113 a750fc0b j_mayer
    /* BookE FSL MMU model                                     */
114 a750fc0b j_mayer
    POWERPC_MMU_BOOKE_FSL,
115 a750fc0b j_mayer
    /* 64 bits "bridge" PowerPC MMU                            */
116 a750fc0b j_mayer
    POWERPC_MMU_64BRIDGE,
117 3fc6c082 bellard
};
118 3fc6c082 bellard
119 3fc6c082 bellard
/*****************************************************************************/
120 a750fc0b j_mayer
/* Exception model                                                           */
121 3fc6c082 bellard
enum {
122 a750fc0b j_mayer
    POWERPC_EXCP_UNKNOWN   = 0,
123 3fc6c082 bellard
    /* Standard PowerPC exception model */
124 a750fc0b j_mayer
    POWERPC_EXCP_STD,
125 2662a059 j_mayer
    /* PowerPC 40x exception model      */
126 a750fc0b j_mayer
    POWERPC_EXCP_40x,
127 2662a059 j_mayer
    /* PowerPC 601 exception model      */
128 a750fc0b j_mayer
    POWERPC_EXCP_601,
129 2662a059 j_mayer
    /* PowerPC 602 exception model      */
130 a750fc0b j_mayer
    POWERPC_EXCP_602,
131 2662a059 j_mayer
    /* PowerPC 603 exception model      */
132 a750fc0b j_mayer
    POWERPC_EXCP_603,
133 a750fc0b j_mayer
    /* PowerPC 603e exception model     */
134 a750fc0b j_mayer
    POWERPC_EXCP_603E,
135 a750fc0b j_mayer
    /* PowerPC G2 exception model       */
136 a750fc0b j_mayer
    POWERPC_EXCP_G2,
137 2662a059 j_mayer
    /* PowerPC 604 exception model      */
138 a750fc0b j_mayer
    POWERPC_EXCP_604,
139 2662a059 j_mayer
    /* PowerPC 7x0 exception model      */
140 a750fc0b j_mayer
    POWERPC_EXCP_7x0,
141 2662a059 j_mayer
    /* PowerPC 7x5 exception model      */
142 a750fc0b j_mayer
    POWERPC_EXCP_7x5,
143 2662a059 j_mayer
    /* PowerPC 74xx exception model     */
144 a750fc0b j_mayer
    POWERPC_EXCP_74xx,
145 2662a059 j_mayer
    /* PowerPC 970 exception model      */
146 a750fc0b j_mayer
    POWERPC_EXCP_970,
147 2662a059 j_mayer
    /* BookE exception model            */
148 a750fc0b j_mayer
    POWERPC_EXCP_BOOKE,
149 a750fc0b j_mayer
};
150 a750fc0b j_mayer
151 a750fc0b j_mayer
/*****************************************************************************/
152 a750fc0b j_mayer
/* Input pins model                                                          */
153 a750fc0b j_mayer
enum {
154 a750fc0b j_mayer
    PPC_FLAGS_INPUT_UNKNOWN = 0,
155 2662a059 j_mayer
    /* PowerPC 6xx bus                  */
156 a750fc0b j_mayer
    PPC_FLAGS_INPUT_6xx,
157 2662a059 j_mayer
    /* BookE bus                        */
158 a750fc0b j_mayer
    PPC_FLAGS_INPUT_BookE,
159 a750fc0b j_mayer
    /* PowerPC 405 bus                  */
160 a750fc0b j_mayer
    PPC_FLAGS_INPUT_405,
161 2662a059 j_mayer
    /* PowerPC 970 bus                  */
162 a750fc0b j_mayer
    PPC_FLAGS_INPUT_970,
163 a750fc0b j_mayer
    /* PowerPC 401 bus                  */
164 a750fc0b j_mayer
    PPC_FLAGS_INPUT_401,
165 3fc6c082 bellard
};
166 3fc6c082 bellard
167 a750fc0b j_mayer
#define PPC_INPUT(env) (env->bus_model)
168 3fc6c082 bellard
169 3fc6c082 bellard
typedef struct ppc_def_t ppc_def_t;
170 a750fc0b j_mayer
typedef struct opc_handler_t opc_handler_t;
171 79aceca5 bellard
172 3fc6c082 bellard
/*****************************************************************************/
173 3fc6c082 bellard
/* Types used to describe some PowerPC registers */
174 3fc6c082 bellard
typedef struct CPUPPCState CPUPPCState;
175 9fddaa0c bellard
typedef struct ppc_tb_t ppc_tb_t;
176 3fc6c082 bellard
typedef struct ppc_spr_t ppc_spr_t;
177 3fc6c082 bellard
typedef struct ppc_dcr_t ppc_dcr_t;
178 3fc6c082 bellard
typedef struct ppc_avr_t ppc_avr_t;
179 1d0a48fb j_mayer
typedef union ppc_tlb_t ppc_tlb_t;
180 76a66253 j_mayer
181 3fc6c082 bellard
/* SPR access micro-ops generations callbacks */
182 3fc6c082 bellard
struct ppc_spr_t {
183 3fc6c082 bellard
    void (*uea_read)(void *opaque, int spr_num);
184 3fc6c082 bellard
    void (*uea_write)(void *opaque, int spr_num);
185 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
186 3fc6c082 bellard
    void (*oea_read)(void *opaque, int spr_num);
187 3fc6c082 bellard
    void (*oea_write)(void *opaque, int spr_num);
188 76a66253 j_mayer
#endif
189 3fc6c082 bellard
    const unsigned char *name;
190 3fc6c082 bellard
};
191 3fc6c082 bellard
192 3fc6c082 bellard
/* Altivec registers (128 bits) */
193 3fc6c082 bellard
struct ppc_avr_t {
194 3fc6c082 bellard
    uint32_t u[4];
195 3fc6c082 bellard
};
196 9fddaa0c bellard
197 3fc6c082 bellard
/* Software TLB cache */
198 1d0a48fb j_mayer
typedef struct ppc6xx_tlb_t ppc6xx_tlb_t;
199 1d0a48fb j_mayer
struct ppc6xx_tlb_t {
200 76a66253 j_mayer
    target_ulong pte0;
201 76a66253 j_mayer
    target_ulong pte1;
202 76a66253 j_mayer
    target_ulong EPN;
203 1d0a48fb j_mayer
};
204 1d0a48fb j_mayer
205 1d0a48fb j_mayer
typedef struct ppcemb_tlb_t ppcemb_tlb_t;
206 1d0a48fb j_mayer
struct ppcemb_tlb_t {
207 c55e9aef j_mayer
    target_phys_addr_t RPN;
208 1d0a48fb j_mayer
    target_ulong EPN;
209 76a66253 j_mayer
    target_ulong PID;
210 c55e9aef j_mayer
    target_ulong size;
211 c55e9aef j_mayer
    uint32_t prot;
212 c55e9aef j_mayer
    uint32_t attr; /* Storage attributes */
213 1d0a48fb j_mayer
};
214 1d0a48fb j_mayer
215 1d0a48fb j_mayer
union ppc_tlb_t {
216 1d0a48fb j_mayer
    ppc6xx_tlb_t tlb6;
217 1d0a48fb j_mayer
    ppcemb_tlb_t tlbe;
218 3fc6c082 bellard
};
219 3fc6c082 bellard
220 3fc6c082 bellard
/*****************************************************************************/
221 3fc6c082 bellard
/* Machine state register bits definition                                    */
222 76a66253 j_mayer
#define MSR_SF   63 /* Sixty-four-bit mode                            hflags */
223 3fc6c082 bellard
#define MSR_ISF  61 /* Sixty-four-bit interrupt mode on 630                  */
224 76a66253 j_mayer
#define MSR_HV   60 /* hypervisor state                               hflags */
225 363be49c j_mayer
#define MSR_CM   31 /* Computation mode for BookE                     hflags */
226 363be49c j_mayer
#define MSR_ICM  30 /* Interrupt computation mode for BookE                  */
227 363be49c j_mayer
#define MSR_UCLE 26 /* User-mode cache lock enable for BookE                 */
228 76a66253 j_mayer
#define MSR_VR   25 /* altivec available                              hflags */
229 363be49c j_mayer
#define MSR_SPE  25 /* SPE enable for BookE                           hflags */
230 76a66253 j_mayer
#define MSR_AP   23 /* Access privilege state on 602                  hflags */
231 76a66253 j_mayer
#define MSR_SA   22 /* Supervisor access mode on 602                  hflags */
232 3fc6c082 bellard
#define MSR_KEY  19 /* key bit on 603e                                       */
233 3fc6c082 bellard
#define MSR_POW  18 /* Power management                                      */
234 3fc6c082 bellard
#define MSR_WE   18 /* Wait state enable on embedded PowerPC                 */
235 3fc6c082 bellard
#define MSR_TGPR 17 /* TGPR usage on 602/603                                 */
236 76a66253 j_mayer
#define MSR_TLB  17 /* TLB update on ?                                       */
237 3fc6c082 bellard
#define MSR_CE   17 /* Critical interrupt enable on embedded PowerPC         */
238 3fc6c082 bellard
#define MSR_ILE  16 /* Interrupt little-endian mode                          */
239 3fc6c082 bellard
#define MSR_EE   15 /* External interrupt enable                             */
240 76a66253 j_mayer
#define MSR_PR   14 /* Problem state                                  hflags */
241 76a66253 j_mayer
#define MSR_FP   13 /* Floating point available                       hflags */
242 3fc6c082 bellard
#define MSR_ME   12 /* Machine check interrupt enable                        */
243 76a66253 j_mayer
#define MSR_FE0  11 /* Floating point exception mode 0                hflags */
244 76a66253 j_mayer
#define MSR_SE   10 /* Single-step trace enable                       hflags */
245 3fc6c082 bellard
#define MSR_DWE  10 /* Debug wait enable on 405                              */
246 76a66253 j_mayer
#define MSR_UBLE 10 /* User BTB lock enable on e500                          */
247 76a66253 j_mayer
#define MSR_BE   9  /* Branch trace enable                            hflags */
248 3fc6c082 bellard
#define MSR_DE   9  /* Debug interrupts enable on embedded PowerPC           */
249 76a66253 j_mayer
#define MSR_FE1  8  /* Floating point exception mode 1                hflags */
250 3fc6c082 bellard
#define MSR_AL   7  /* AL bit on POWER                                       */
251 3fc6c082 bellard
#define MSR_IP   6  /* Interrupt prefix                                      */
252 3fc6c082 bellard
#define MSR_IR   5  /* Instruction relocate                                  */
253 3fc6c082 bellard
#define MSR_IS   5  /* Instruction address space on embedded PowerPC         */
254 3fc6c082 bellard
#define MSR_DR   4  /* Data relocate                                         */
255 3fc6c082 bellard
#define MSR_DS   4  /* Data address space on embedded PowerPC                */
256 3fc6c082 bellard
#define MSR_PE   3  /* Protection enable on 403                              */
257 3fc6c082 bellard
#define MSR_EP   3  /* Exception prefix on 601                               */
258 3fc6c082 bellard
#define MSR_PX   2  /* Protection exclusive on 403                           */
259 3fc6c082 bellard
#define MSR_PMM  2  /* Performance monitor mark on POWER                     */
260 3fc6c082 bellard
#define MSR_RI   1  /* Recoverable interrupt                                 */
261 76a66253 j_mayer
#define MSR_LE   0  /* Little-endian mode                             hflags */
262 3fc6c082 bellard
#define msr_sf   env->msr[MSR_SF]
263 3fc6c082 bellard
#define msr_isf  env->msr[MSR_ISF]
264 3fc6c082 bellard
#define msr_hv   env->msr[MSR_HV]
265 363be49c j_mayer
#define msr_cm   env->msr[MSR_CM]
266 363be49c j_mayer
#define msr_icm  env->msr[MSR_ICM]
267 76a66253 j_mayer
#define msr_ucle env->msr[MSR_UCLE]
268 3fc6c082 bellard
#define msr_vr   env->msr[MSR_VR]
269 76a66253 j_mayer
#define msr_spe  env->msr[MSR_SPE]
270 3fc6c082 bellard
#define msr_ap   env->msr[MSR_AP]
271 3fc6c082 bellard
#define msr_sa   env->msr[MSR_SA]
272 3fc6c082 bellard
#define msr_key  env->msr[MSR_KEY]
273 76a66253 j_mayer
#define msr_pow  env->msr[MSR_POW]
274 3fc6c082 bellard
#define msr_we   env->msr[MSR_WE]
275 3fc6c082 bellard
#define msr_tgpr env->msr[MSR_TGPR]
276 3fc6c082 bellard
#define msr_tlb  env->msr[MSR_TLB]
277 3fc6c082 bellard
#define msr_ce   env->msr[MSR_CE]
278 76a66253 j_mayer
#define msr_ile  env->msr[MSR_ILE]
279 76a66253 j_mayer
#define msr_ee   env->msr[MSR_EE]
280 76a66253 j_mayer
#define msr_pr   env->msr[MSR_PR]
281 76a66253 j_mayer
#define msr_fp   env->msr[MSR_FP]
282 76a66253 j_mayer
#define msr_me   env->msr[MSR_ME]
283 76a66253 j_mayer
#define msr_fe0  env->msr[MSR_FE0]
284 76a66253 j_mayer
#define msr_se   env->msr[MSR_SE]
285 3fc6c082 bellard
#define msr_dwe  env->msr[MSR_DWE]
286 76a66253 j_mayer
#define msr_uble env->msr[MSR_UBLE]
287 76a66253 j_mayer
#define msr_be   env->msr[MSR_BE]
288 3fc6c082 bellard
#define msr_de   env->msr[MSR_DE]
289 76a66253 j_mayer
#define msr_fe1  env->msr[MSR_FE1]
290 3fc6c082 bellard
#define msr_al   env->msr[MSR_AL]
291 76a66253 j_mayer
#define msr_ip   env->msr[MSR_IP]
292 76a66253 j_mayer
#define msr_ir   env->msr[MSR_IR]
293 3fc6c082 bellard
#define msr_is   env->msr[MSR_IS]
294 76a66253 j_mayer
#define msr_dr   env->msr[MSR_DR]
295 3fc6c082 bellard
#define msr_ds   env->msr[MSR_DS]
296 3fc6c082 bellard
#define msr_pe   env->msr[MSR_PE]
297 3fc6c082 bellard
#define msr_ep   env->msr[MSR_EP]
298 3fc6c082 bellard
#define msr_px   env->msr[MSR_PX]
299 3fc6c082 bellard
#define msr_pmm  env->msr[MSR_PMM]
300 76a66253 j_mayer
#define msr_ri   env->msr[MSR_RI]
301 76a66253 j_mayer
#define msr_le   env->msr[MSR_LE]
302 79aceca5 bellard
303 3fc6c082 bellard
/*****************************************************************************/
304 3fc6c082 bellard
/* The whole PowerPC CPU context */
305 3fc6c082 bellard
struct CPUPPCState {
306 3fc6c082 bellard
    /* First are the most commonly used resources
307 3fc6c082 bellard
     * during translated code execution
308 3fc6c082 bellard
     */
309 0487d6a8 j_mayer
#if TARGET_GPR_BITS > HOST_LONG_BITS
310 3fc6c082 bellard
    /* temporary fixed-point registers
311 3fc6c082 bellard
     * used to emulate 64 bits target on 32 bits hosts
312 5fafdf24 ths
     */
313 3c4c9f9f ths
    ppc_gpr_t t0, t1, t2;
314 3fc6c082 bellard
#endif
315 d9bce9d9 j_mayer
    ppc_avr_t t0_avr, t1_avr, t2_avr;
316 d9bce9d9 j_mayer
317 79aceca5 bellard
    /* general purpose registers */
318 76a66253 j_mayer
    ppc_gpr_t gpr[32];
319 3fc6c082 bellard
    /* LR */
320 3fc6c082 bellard
    target_ulong lr;
321 3fc6c082 bellard
    /* CTR */
322 3fc6c082 bellard
    target_ulong ctr;
323 3fc6c082 bellard
    /* condition register */
324 3fc6c082 bellard
    uint8_t crf[8];
325 79aceca5 bellard
    /* XER */
326 3fc6c082 bellard
    /* XXX: We use only 5 fields, but we want to keep the structure aligned */
327 3fc6c082 bellard
    uint8_t xer[8];
328 79aceca5 bellard
    /* Reservation address */
329 3fc6c082 bellard
    target_ulong reserve;
330 3fc6c082 bellard
331 3fc6c082 bellard
    /* Those ones are used in supervisor mode only */
332 79aceca5 bellard
    /* machine state register */
333 3fc6c082 bellard
    uint8_t msr[64];
334 3fc6c082 bellard
    /* temporary general purpose registers */
335 76a66253 j_mayer
    ppc_gpr_t tgpr[4]; /* Used to speed-up TLB assist handlers */
336 3fc6c082 bellard
337 3fc6c082 bellard
    /* Floating point execution context */
338 76a66253 j_mayer
    /* temporary float registers */
339 4ecc3190 bellard
    float64 ft0;
340 4ecc3190 bellard
    float64 ft1;
341 4ecc3190 bellard
    float64 ft2;
342 4ecc3190 bellard
    float_status fp_status;
343 3fc6c082 bellard
    /* floating point registers */
344 3fc6c082 bellard
    float64 fpr[32];
345 3fc6c082 bellard
    /* floating point status and control register */
346 3fc6c082 bellard
    uint8_t fpscr[8];
347 4ecc3190 bellard
348 a316d335 bellard
    CPU_COMMON
349 a316d335 bellard
350 50443c98 bellard
    int halted; /* TRUE if the CPU is in suspend state */
351 50443c98 bellard
352 ac9eb073 bellard
    int access_type; /* when a memory exception occurs, the access
353 ac9eb073 bellard
                        type is stored here */
354 a541f297 bellard
355 3fc6c082 bellard
    /* MMU context */
356 3fc6c082 bellard
    /* Address space register */
357 3fc6c082 bellard
    target_ulong asr;
358 3fc6c082 bellard
    /* segment registers */
359 3fc6c082 bellard
    target_ulong sdr1;
360 3fc6c082 bellard
    target_ulong sr[16];
361 3fc6c082 bellard
    /* BATs */
362 3fc6c082 bellard
    int nb_BATs;
363 3fc6c082 bellard
    target_ulong DBAT[2][8];
364 3fc6c082 bellard
    target_ulong IBAT[2][8];
365 9fddaa0c bellard
366 3fc6c082 bellard
    /* Other registers */
367 3fc6c082 bellard
    /* Special purpose registers */
368 3fc6c082 bellard
    target_ulong spr[1024];
369 3fc6c082 bellard
    /* Altivec registers */
370 3fc6c082 bellard
    ppc_avr_t avr[32];
371 3fc6c082 bellard
    uint32_t vscr;
372 d9bce9d9 j_mayer
    /* SPE registers */
373 d9bce9d9 j_mayer
    ppc_gpr_t spe_acc;
374 0487d6a8 j_mayer
    float_status spe_status;
375 d9bce9d9 j_mayer
    uint32_t spe_fscr;
376 3fc6c082 bellard
377 3fc6c082 bellard
    /* Internal devices resources */
378 9fddaa0c bellard
    /* Time base and decrementer */
379 9fddaa0c bellard
    ppc_tb_t *tb_env;
380 3fc6c082 bellard
    /* Device control registers */
381 3fc6c082 bellard
    ppc_dcr_t *dcr_env;
382 3fc6c082 bellard
383 3fc6c082 bellard
    /* PowerPC TLB registers (for 4xx and 60x software driven TLBs) */
384 76a66253 j_mayer
    int nb_tlb;      /* Total number of TLB                                  */
385 76a66253 j_mayer
    int tlb_per_way; /* Speed-up helper: used to avoid divisions at run time */
386 76a66253 j_mayer
    int nb_ways;     /* Number of ways in the TLB set                        */
387 76a66253 j_mayer
    int last_way;    /* Last used way used to allocate TLB in a LRU way      */
388 76a66253 j_mayer
    int id_tlbs;     /* If 1, MMU has separated TLBs for instructions & data */
389 363be49c j_mayer
    int nb_pids;     /* Number of available PID registers                    */
390 76a66253 j_mayer
    ppc_tlb_t *tlb;  /* TLB is optional. Allocate them only if needed        */
391 3fc6c082 bellard
    /* 403 dedicated access protection registers */
392 3fc6c082 bellard
    target_ulong pb[4];
393 3fc6c082 bellard
394 3fc6c082 bellard
    /* Those resources are used during exception processing */
395 3fc6c082 bellard
    /* CPU model definition */
396 a750fc0b j_mayer
    target_ulong msr_mask;
397 a750fc0b j_mayer
    uint8_t mmu_model;
398 a750fc0b j_mayer
    uint8_t excp_model;
399 a750fc0b j_mayer
    uint8_t bus_model;
400 a750fc0b j_mayer
    uint8_t pad;
401 3fc6c082 bellard
    uint32_t flags;
402 3fc6c082 bellard
403 3fc6c082 bellard
    int exception_index;
404 3fc6c082 bellard
    int error_code;
405 3fc6c082 bellard
    int interrupt_request;
406 47103572 j_mayer
    uint32_t pending_interrupts;
407 e9df014c j_mayer
#if !defined(CONFIG_USER_ONLY)
408 e9df014c j_mayer
    /* This is the IRQ controller, which is implementation dependant
409 e9df014c j_mayer
     * and only relevant when emulating a complete machine.
410 e9df014c j_mayer
     */
411 e9df014c j_mayer
    uint32_t irq_input_state;
412 e9df014c j_mayer
    void **irq_inputs;
413 e9df014c j_mayer
#endif
414 3fc6c082 bellard
415 3fc6c082 bellard
    /* Those resources are used only during code translation */
416 3fc6c082 bellard
    /* Next instruction pointer */
417 3fc6c082 bellard
    target_ulong nip;
418 3fc6c082 bellard
    /* SPR translation callbacks */
419 3fc6c082 bellard
    ppc_spr_t spr_cb[1024];
420 3fc6c082 bellard
    /* opcode handlers */
421 3fc6c082 bellard
    opc_handler_t *opcodes[0x40];
422 3fc6c082 bellard
423 3fc6c082 bellard
    /* Those resources are used only in Qemu core */
424 3fc6c082 bellard
    jmp_buf jmp_env;
425 3fc6c082 bellard
    int user_mode_only; /* user mode only simulation */
426 4296f459 j_mayer
    target_ulong hflags; /* hflags is a MSR & HFLAGS_MASK */
427 3fc6c082 bellard
428 9fddaa0c bellard
    /* Power management */
429 9fddaa0c bellard
    int power_mode;
430 a541f297 bellard
431 6d506e6d bellard
    /* temporary hack to handle OSI calls (only used if non NULL) */
432 6d506e6d bellard
    int (*osi_call)(struct CPUPPCState *env);
433 3fc6c082 bellard
};
434 79aceca5 bellard
435 76a66253 j_mayer
/* Context used internally during MMU translations */
436 76a66253 j_mayer
typedef struct mmu_ctx_t mmu_ctx_t;
437 76a66253 j_mayer
struct mmu_ctx_t {
438 76a66253 j_mayer
    target_phys_addr_t raddr;      /* Real address              */
439 76a66253 j_mayer
    int prot;                      /* Protection bits           */
440 76a66253 j_mayer
    target_phys_addr_t pg_addr[2]; /* PTE tables base addresses */
441 76a66253 j_mayer
    target_ulong ptem;             /* Virtual segment ID | API  */
442 76a66253 j_mayer
    int key;                       /* Access key                */
443 76a66253 j_mayer
};
444 76a66253 j_mayer
445 3fc6c082 bellard
/*****************************************************************************/
446 36081602 j_mayer
CPUPPCState *cpu_ppc_init (void);
447 36081602 j_mayer
int cpu_ppc_exec (CPUPPCState *s);
448 36081602 j_mayer
void cpu_ppc_close (CPUPPCState *s);
449 79aceca5 bellard
/* you can call this signal handler from your SIGBUS and SIGSEGV
450 79aceca5 bellard
   signal handlers to inform the virtual CPU of exceptions. non zero
451 79aceca5 bellard
   is returned if the signal was handled by the virtual CPU.  */
452 36081602 j_mayer
int cpu_ppc_signal_handler (int host_signum, void *pinfo,
453 36081602 j_mayer
                            void *puc);
454 79aceca5 bellard
455 a541f297 bellard
void do_interrupt (CPUPPCState *env);
456 e9df014c j_mayer
void ppc_hw_interrupt (CPUPPCState *env);
457 36081602 j_mayer
void cpu_loop_exit (void);
458 a541f297 bellard
459 9a64fbe4 bellard
void dump_stack (CPUPPCState *env);
460 a541f297 bellard
461 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
462 3fc6c082 bellard
target_ulong do_load_ibatu (CPUPPCState *env, int nr);
463 3fc6c082 bellard
target_ulong do_load_ibatl (CPUPPCState *env, int nr);
464 3fc6c082 bellard
void do_store_ibatu (CPUPPCState *env, int nr, target_ulong value);
465 3fc6c082 bellard
void do_store_ibatl (CPUPPCState *env, int nr, target_ulong value);
466 3fc6c082 bellard
target_ulong do_load_dbatu (CPUPPCState *env, int nr);
467 3fc6c082 bellard
target_ulong do_load_dbatl (CPUPPCState *env, int nr);
468 3fc6c082 bellard
void do_store_dbatu (CPUPPCState *env, int nr, target_ulong value);
469 3fc6c082 bellard
void do_store_dbatl (CPUPPCState *env, int nr, target_ulong value);
470 3fc6c082 bellard
target_ulong do_load_sdr1 (CPUPPCState *env);
471 3fc6c082 bellard
void do_store_sdr1 (CPUPPCState *env, target_ulong value);
472 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
473 d9bce9d9 j_mayer
target_ulong ppc_load_asr (CPUPPCState *env);
474 d9bce9d9 j_mayer
void ppc_store_asr (CPUPPCState *env, target_ulong value);
475 d9bce9d9 j_mayer
#endif
476 3fc6c082 bellard
target_ulong do_load_sr (CPUPPCState *env, int srnum);
477 3fc6c082 bellard
void do_store_sr (CPUPPCState *env, int srnum, target_ulong value);
478 76a66253 j_mayer
#endif
479 76a66253 j_mayer
uint32_t ppc_load_xer (CPUPPCState *env);
480 76a66253 j_mayer
void ppc_store_xer (CPUPPCState *env, uint32_t value);
481 3fc6c082 bellard
target_ulong do_load_msr (CPUPPCState *env);
482 3fc6c082 bellard
void do_store_msr (CPUPPCState *env, target_ulong value);
483 426613db j_mayer
void ppc_store_msr_32 (CPUPPCState *env, uint32_t value);
484 3fc6c082 bellard
485 3fc6c082 bellard
void do_compute_hflags (CPUPPCState *env);
486 0a032cbe j_mayer
void cpu_ppc_reset (void *opaque);
487 0a032cbe j_mayer
CPUPPCState *cpu_ppc_init (void);
488 0a032cbe j_mayer
void cpu_ppc_close(CPUPPCState *env);
489 a541f297 bellard
490 3fc6c082 bellard
int ppc_find_by_name (const unsigned char *name, ppc_def_t **def);
491 3fc6c082 bellard
int ppc_find_by_pvr (uint32_t apvr, ppc_def_t **def);
492 3fc6c082 bellard
void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
493 3fc6c082 bellard
int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def);
494 85c4adf6 bellard
495 9fddaa0c bellard
/* Time-base and decrementer management */
496 9fddaa0c bellard
#ifndef NO_CPU_IO_DEFS
497 9fddaa0c bellard
uint32_t cpu_ppc_load_tbl (CPUPPCState *env);
498 9fddaa0c bellard
uint32_t cpu_ppc_load_tbu (CPUPPCState *env);
499 9fddaa0c bellard
void cpu_ppc_store_tbu (CPUPPCState *env, uint32_t value);
500 9fddaa0c bellard
void cpu_ppc_store_tbl (CPUPPCState *env, uint32_t value);
501 9fddaa0c bellard
uint32_t cpu_ppc_load_decr (CPUPPCState *env);
502 9fddaa0c bellard
void cpu_ppc_store_decr (CPUPPCState *env, uint32_t value);
503 d9bce9d9 j_mayer
uint32_t cpu_ppc601_load_rtcl (CPUPPCState *env);
504 d9bce9d9 j_mayer
uint32_t cpu_ppc601_load_rtcu (CPUPPCState *env);
505 d9bce9d9 j_mayer
#if !defined(CONFIG_USER_ONLY)
506 d9bce9d9 j_mayer
void cpu_ppc601_store_rtcl (CPUPPCState *env, uint32_t value);
507 d9bce9d9 j_mayer
void cpu_ppc601_store_rtcu (CPUPPCState *env, uint32_t value);
508 d9bce9d9 j_mayer
target_ulong load_40x_pit (CPUPPCState *env);
509 d9bce9d9 j_mayer
void store_40x_pit (CPUPPCState *env, target_ulong val);
510 8ecc7913 j_mayer
void store_40x_dbcr0 (CPUPPCState *env, uint32_t val);
511 c294fc58 j_mayer
void store_40x_sler (CPUPPCState *env, uint32_t val);
512 d9bce9d9 j_mayer
void store_booke_tcr (CPUPPCState *env, target_ulong val);
513 d9bce9d9 j_mayer
void store_booke_tsr (CPUPPCState *env, target_ulong val);
514 0a032cbe j_mayer
void ppc_tlb_invalidate_all (CPUPPCState *env);
515 36081602 j_mayer
int ppcemb_tlb_search (CPUPPCState *env, target_ulong address, uint32_t pid);
516 d9bce9d9 j_mayer
#endif
517 9fddaa0c bellard
#endif
518 79aceca5 bellard
519 2e719ba3 j_mayer
/* Device control registers */
520 2e719ba3 j_mayer
int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, target_ulong *valp);
521 2e719ba3 j_mayer
int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val);
522 2e719ba3 j_mayer
523 9467d44c ths
#define CPUState CPUPPCState
524 9467d44c ths
#define cpu_init cpu_ppc_init
525 9467d44c ths
#define cpu_exec cpu_ppc_exec
526 9467d44c ths
#define cpu_gen_code cpu_ppc_gen_code
527 9467d44c ths
#define cpu_signal_handler cpu_ppc_signal_handler
528 9467d44c ths
529 79aceca5 bellard
#include "cpu-all.h"
530 79aceca5 bellard
531 3fc6c082 bellard
/*****************************************************************************/
532 3fc6c082 bellard
/* Registers definitions */
533 79aceca5 bellard
#define XER_SO 31
534 79aceca5 bellard
#define XER_OV 30
535 79aceca5 bellard
#define XER_CA 29
536 3fc6c082 bellard
#define XER_CMP 8
537 36081602 j_mayer
#define XER_BC  0
538 3fc6c082 bellard
#define xer_so  env->xer[4]
539 3fc6c082 bellard
#define xer_ov  env->xer[6]
540 3fc6c082 bellard
#define xer_ca  env->xer[2]
541 3fc6c082 bellard
#define xer_cmp env->xer[1]
542 36081602 j_mayer
#define xer_bc  env->xer[0]
543 79aceca5 bellard
544 3fc6c082 bellard
/* SPR definitions */
545 76a66253 j_mayer
#define SPR_MQ           (0x000)
546 76a66253 j_mayer
#define SPR_XER          (0x001)
547 76a66253 j_mayer
#define SPR_601_VRTCU    (0x004)
548 76a66253 j_mayer
#define SPR_601_VRTCL    (0x005)
549 76a66253 j_mayer
#define SPR_601_UDECR    (0x006)
550 76a66253 j_mayer
#define SPR_LR           (0x008)
551 76a66253 j_mayer
#define SPR_CTR          (0x009)
552 76a66253 j_mayer
#define SPR_DSISR        (0x012)
553 a750fc0b j_mayer
#define SPR_DAR          (0x013) /* DAE for PowerPC 601 */
554 76a66253 j_mayer
#define SPR_601_RTCU     (0x014)
555 76a66253 j_mayer
#define SPR_601_RTCL     (0x015)
556 76a66253 j_mayer
#define SPR_DECR         (0x016)
557 76a66253 j_mayer
#define SPR_SDR1         (0x019)
558 76a66253 j_mayer
#define SPR_SRR0         (0x01A)
559 76a66253 j_mayer
#define SPR_SRR1         (0x01B)
560 2662a059 j_mayer
#define SPR_AMR          (0x01D)
561 76a66253 j_mayer
#define SPR_BOOKE_PID    (0x030)
562 76a66253 j_mayer
#define SPR_BOOKE_DECAR  (0x036)
563 363be49c j_mayer
#define SPR_BOOKE_CSRR0  (0x03A)
564 363be49c j_mayer
#define SPR_BOOKE_CSRR1  (0x03B)
565 76a66253 j_mayer
#define SPR_BOOKE_DEAR   (0x03D)
566 76a66253 j_mayer
#define SPR_BOOKE_ESR    (0x03E)
567 363be49c j_mayer
#define SPR_BOOKE_IVPR   (0x03F)
568 76a66253 j_mayer
#define SPR_8xx_EIE      (0x050)
569 76a66253 j_mayer
#define SPR_8xx_EID      (0x051)
570 76a66253 j_mayer
#define SPR_8xx_NRE      (0x052)
571 2662a059 j_mayer
#define SPR_CTRL         (0x088)
572 76a66253 j_mayer
#define SPR_58x_CMPA     (0x090)
573 76a66253 j_mayer
#define SPR_58x_CMPB     (0x091)
574 76a66253 j_mayer
#define SPR_58x_CMPC     (0x092)
575 76a66253 j_mayer
#define SPR_58x_CMPD     (0x093)
576 76a66253 j_mayer
#define SPR_58x_ICR      (0x094)
577 76a66253 j_mayer
#define SPR_58x_DER      (0x094)
578 76a66253 j_mayer
#define SPR_58x_COUNTA   (0x096)
579 76a66253 j_mayer
#define SPR_58x_COUNTB   (0x097)
580 2662a059 j_mayer
#define SPR_UCTRL        (0x098)
581 76a66253 j_mayer
#define SPR_58x_CMPE     (0x098)
582 76a66253 j_mayer
#define SPR_58x_CMPF     (0x099)
583 76a66253 j_mayer
#define SPR_58x_CMPG     (0x09A)
584 76a66253 j_mayer
#define SPR_58x_CMPH     (0x09B)
585 76a66253 j_mayer
#define SPR_58x_LCTRL1   (0x09C)
586 76a66253 j_mayer
#define SPR_58x_LCTRL2   (0x09D)
587 76a66253 j_mayer
#define SPR_58x_ICTRL    (0x09E)
588 76a66253 j_mayer
#define SPR_58x_BAR      (0x09F)
589 76a66253 j_mayer
#define SPR_VRSAVE       (0x100)
590 76a66253 j_mayer
#define SPR_USPRG0       (0x100)
591 363be49c j_mayer
#define SPR_USPRG1       (0x101)
592 363be49c j_mayer
#define SPR_USPRG2       (0x102)
593 363be49c j_mayer
#define SPR_USPRG3       (0x103)
594 76a66253 j_mayer
#define SPR_USPRG4       (0x104)
595 76a66253 j_mayer
#define SPR_USPRG5       (0x105)
596 76a66253 j_mayer
#define SPR_USPRG6       (0x106)
597 76a66253 j_mayer
#define SPR_USPRG7       (0x107)
598 76a66253 j_mayer
#define SPR_VTBL         (0x10C)
599 76a66253 j_mayer
#define SPR_VTBU         (0x10D)
600 76a66253 j_mayer
#define SPR_SPRG0        (0x110)
601 76a66253 j_mayer
#define SPR_SPRG1        (0x111)
602 76a66253 j_mayer
#define SPR_SPRG2        (0x112)
603 76a66253 j_mayer
#define SPR_SPRG3        (0x113)
604 76a66253 j_mayer
#define SPR_SPRG4        (0x114)
605 76a66253 j_mayer
#define SPR_SCOMC        (0x114)
606 76a66253 j_mayer
#define SPR_SPRG5        (0x115)
607 76a66253 j_mayer
#define SPR_SCOMD        (0x115)
608 76a66253 j_mayer
#define SPR_SPRG6        (0x116)
609 76a66253 j_mayer
#define SPR_SPRG7        (0x117)
610 76a66253 j_mayer
#define SPR_ASR          (0x118)
611 76a66253 j_mayer
#define SPR_EAR          (0x11A)
612 76a66253 j_mayer
#define SPR_TBL          (0x11C)
613 76a66253 j_mayer
#define SPR_TBU          (0x11D)
614 2662a059 j_mayer
#define SPR_TBU40        (0x11E)
615 76a66253 j_mayer
#define SPR_SVR          (0x11E)
616 76a66253 j_mayer
#define SPR_BOOKE_PIR    (0x11E)
617 76a66253 j_mayer
#define SPR_PVR          (0x11F)
618 76a66253 j_mayer
#define SPR_HSPRG0       (0x130)
619 76a66253 j_mayer
#define SPR_BOOKE_DBSR   (0x130)
620 76a66253 j_mayer
#define SPR_HSPRG1       (0x131)
621 2662a059 j_mayer
#define SPR_HDSISR       (0x132)
622 2662a059 j_mayer
#define SPR_HDAR         (0x133)
623 76a66253 j_mayer
#define SPR_BOOKE_DBCR0  (0x134)
624 76a66253 j_mayer
#define SPR_IBCR         (0x135)
625 2662a059 j_mayer
#define SPR_PURR         (0x135)
626 76a66253 j_mayer
#define SPR_BOOKE_DBCR1  (0x135)
627 76a66253 j_mayer
#define SPR_DBCR         (0x136)
628 76a66253 j_mayer
#define SPR_HDEC         (0x136)
629 76a66253 j_mayer
#define SPR_BOOKE_DBCR2  (0x136)
630 76a66253 j_mayer
#define SPR_HIOR         (0x137)
631 76a66253 j_mayer
#define SPR_MBAR         (0x137)
632 76a66253 j_mayer
#define SPR_RMOR         (0x138)
633 76a66253 j_mayer
#define SPR_BOOKE_IAC1   (0x138)
634 76a66253 j_mayer
#define SPR_HRMOR        (0x139)
635 76a66253 j_mayer
#define SPR_BOOKE_IAC2   (0x139)
636 76a66253 j_mayer
#define SPR_HSSR0        (0x13A)
637 76a66253 j_mayer
#define SPR_BOOKE_IAC3   (0x13A)
638 76a66253 j_mayer
#define SPR_HSSR1        (0x13B)
639 76a66253 j_mayer
#define SPR_BOOKE_IAC4   (0x13B)
640 76a66253 j_mayer
#define SPR_LPCR         (0x13C)
641 76a66253 j_mayer
#define SPR_BOOKE_DAC1   (0x13C)
642 76a66253 j_mayer
#define SPR_LPIDR        (0x13D)
643 76a66253 j_mayer
#define SPR_DABR2        (0x13D)
644 76a66253 j_mayer
#define SPR_BOOKE_DAC2   (0x13D)
645 76a66253 j_mayer
#define SPR_BOOKE_DVC1   (0x13E)
646 76a66253 j_mayer
#define SPR_BOOKE_DVC2   (0x13F)
647 76a66253 j_mayer
#define SPR_BOOKE_TSR    (0x150)
648 76a66253 j_mayer
#define SPR_BOOKE_TCR    (0x154)
649 76a66253 j_mayer
#define SPR_BOOKE_IVOR0  (0x190)
650 76a66253 j_mayer
#define SPR_BOOKE_IVOR1  (0x191)
651 76a66253 j_mayer
#define SPR_BOOKE_IVOR2  (0x192)
652 76a66253 j_mayer
#define SPR_BOOKE_IVOR3  (0x193)
653 76a66253 j_mayer
#define SPR_BOOKE_IVOR4  (0x194)
654 76a66253 j_mayer
#define SPR_BOOKE_IVOR5  (0x195)
655 76a66253 j_mayer
#define SPR_BOOKE_IVOR6  (0x196)
656 76a66253 j_mayer
#define SPR_BOOKE_IVOR7  (0x197)
657 76a66253 j_mayer
#define SPR_BOOKE_IVOR8  (0x198)
658 76a66253 j_mayer
#define SPR_BOOKE_IVOR9  (0x199)
659 76a66253 j_mayer
#define SPR_BOOKE_IVOR10 (0x19A)
660 76a66253 j_mayer
#define SPR_BOOKE_IVOR11 (0x19B)
661 76a66253 j_mayer
#define SPR_BOOKE_IVOR12 (0x19C)
662 76a66253 j_mayer
#define SPR_BOOKE_IVOR13 (0x19D)
663 76a66253 j_mayer
#define SPR_BOOKE_IVOR14 (0x19E)
664 76a66253 j_mayer
#define SPR_BOOKE_IVOR15 (0x19F)
665 2662a059 j_mayer
#define SPR_BOOKE_SPEFSCR (0x200)
666 76a66253 j_mayer
#define SPR_E500_BBEAR   (0x201)
667 76a66253 j_mayer
#define SPR_E500_BBTAR   (0x202)
668 76a66253 j_mayer
#define SPR_BOOKE_ATBL   (0x20E)
669 76a66253 j_mayer
#define SPR_BOOKE_ATBU   (0x20F)
670 76a66253 j_mayer
#define SPR_IBAT0U       (0x210)
671 363be49c j_mayer
#define SPR_BOOKE_IVOR32 (0x210)
672 76a66253 j_mayer
#define SPR_IBAT0L       (0x211)
673 363be49c j_mayer
#define SPR_BOOKE_IVOR33 (0x211)
674 76a66253 j_mayer
#define SPR_IBAT1U       (0x212)
675 363be49c j_mayer
#define SPR_BOOKE_IVOR34 (0x212)
676 76a66253 j_mayer
#define SPR_IBAT1L       (0x213)
677 363be49c j_mayer
#define SPR_BOOKE_IVOR35 (0x213)
678 76a66253 j_mayer
#define SPR_IBAT2U       (0x214)
679 363be49c j_mayer
#define SPR_BOOKE_IVOR36 (0x214)
680 76a66253 j_mayer
#define SPR_IBAT2L       (0x215)
681 76a66253 j_mayer
#define SPR_E500_L1CFG0  (0x215)
682 363be49c j_mayer
#define SPR_BOOKE_IVOR37 (0x215)
683 76a66253 j_mayer
#define SPR_IBAT3U       (0x216)
684 76a66253 j_mayer
#define SPR_E500_L1CFG1  (0x216)
685 76a66253 j_mayer
#define SPR_IBAT3L       (0x217)
686 76a66253 j_mayer
#define SPR_DBAT0U       (0x218)
687 76a66253 j_mayer
#define SPR_DBAT0L       (0x219)
688 76a66253 j_mayer
#define SPR_DBAT1U       (0x21A)
689 76a66253 j_mayer
#define SPR_DBAT1L       (0x21B)
690 76a66253 j_mayer
#define SPR_DBAT2U       (0x21C)
691 76a66253 j_mayer
#define SPR_DBAT2L       (0x21D)
692 76a66253 j_mayer
#define SPR_DBAT3U       (0x21E)
693 76a66253 j_mayer
#define SPR_DBAT3L       (0x21F)
694 76a66253 j_mayer
#define SPR_IBAT4U       (0x230)
695 76a66253 j_mayer
#define SPR_IBAT4L       (0x231)
696 76a66253 j_mayer
#define SPR_IBAT5U       (0x232)
697 76a66253 j_mayer
#define SPR_IBAT5L       (0x233)
698 76a66253 j_mayer
#define SPR_IBAT6U       (0x234)
699 76a66253 j_mayer
#define SPR_IBAT6L       (0x235)
700 76a66253 j_mayer
#define SPR_IBAT7U       (0x236)
701 76a66253 j_mayer
#define SPR_IBAT7L       (0x237)
702 76a66253 j_mayer
#define SPR_DBAT4U       (0x238)
703 76a66253 j_mayer
#define SPR_DBAT4L       (0x239)
704 76a66253 j_mayer
#define SPR_DBAT5U       (0x23A)
705 363be49c j_mayer
#define SPR_BOOKE_MCSRR0 (0x23A)
706 76a66253 j_mayer
#define SPR_DBAT5L       (0x23B)
707 363be49c j_mayer
#define SPR_BOOKE_MCSRR1 (0x23B)
708 76a66253 j_mayer
#define SPR_DBAT6U       (0x23C)
709 363be49c j_mayer
#define SPR_BOOKE_MCSR   (0x23C)
710 76a66253 j_mayer
#define SPR_DBAT6L       (0x23D)
711 76a66253 j_mayer
#define SPR_E500_MCAR    (0x23D)
712 76a66253 j_mayer
#define SPR_DBAT7U       (0x23E)
713 363be49c j_mayer
#define SPR_BOOKE_DSRR0  (0x23E)
714 76a66253 j_mayer
#define SPR_DBAT7L       (0x23F)
715 363be49c j_mayer
#define SPR_BOOKE_DSRR1  (0x23F)
716 363be49c j_mayer
#define SPR_BOOKE_SPRG8  (0x25C)
717 363be49c j_mayer
#define SPR_BOOKE_SPRG9  (0x25D)
718 363be49c j_mayer
#define SPR_BOOKE_MAS0   (0x270)
719 363be49c j_mayer
#define SPR_BOOKE_MAS1   (0x271)
720 363be49c j_mayer
#define SPR_BOOKE_MAS2   (0x272)
721 363be49c j_mayer
#define SPR_BOOKE_MAS3   (0x273)
722 363be49c j_mayer
#define SPR_BOOKE_MAS4   (0x274)
723 363be49c j_mayer
#define SPR_BOOKE_MAS6   (0x276)
724 363be49c j_mayer
#define SPR_BOOKE_PID1   (0x279)
725 363be49c j_mayer
#define SPR_BOOKE_PID2   (0x27A)
726 363be49c j_mayer
#define SPR_BOOKE_TLB0CFG (0x2B0)
727 363be49c j_mayer
#define SPR_BOOKE_TLB1CFG (0x2B1)
728 363be49c j_mayer
#define SPR_BOOKE_TLB2CFG (0x2B2)
729 363be49c j_mayer
#define SPR_BOOKE_TLB3CFG (0x2B3)
730 363be49c j_mayer
#define SPR_BOOKE_EPR    (0x2BE)
731 2662a059 j_mayer
#define SPR_PERF0        (0x300)
732 2662a059 j_mayer
#define SPR_PERF1        (0x301)
733 2662a059 j_mayer
#define SPR_PERF2        (0x302)
734 2662a059 j_mayer
#define SPR_PERF3        (0x303)
735 2662a059 j_mayer
#define SPR_PERF4        (0x304)
736 2662a059 j_mayer
#define SPR_PERF5        (0x305)
737 2662a059 j_mayer
#define SPR_PERF6        (0x306)
738 2662a059 j_mayer
#define SPR_PERF7        (0x307)
739 2662a059 j_mayer
#define SPR_PERF8        (0x308)
740 2662a059 j_mayer
#define SPR_PERF9        (0x309)
741 2662a059 j_mayer
#define SPR_PERFA        (0x30A)
742 2662a059 j_mayer
#define SPR_PERFB        (0x30B)
743 2662a059 j_mayer
#define SPR_PERFC        (0x30C)
744 2662a059 j_mayer
#define SPR_PERFD        (0x30D)
745 2662a059 j_mayer
#define SPR_PERFE        (0x30E)
746 2662a059 j_mayer
#define SPR_PERFF        (0x30F)
747 2662a059 j_mayer
#define SPR_UPERF0       (0x310)
748 2662a059 j_mayer
#define SPR_UPERF1       (0x311)
749 2662a059 j_mayer
#define SPR_UPERF2       (0x312)
750 2662a059 j_mayer
#define SPR_UPERF3       (0x313)
751 2662a059 j_mayer
#define SPR_UPERF4       (0x314)
752 2662a059 j_mayer
#define SPR_UPERF5       (0x315)
753 2662a059 j_mayer
#define SPR_UPERF6       (0x316)
754 2662a059 j_mayer
#define SPR_UPERF7       (0x317)
755 2662a059 j_mayer
#define SPR_UPERF8       (0x318)
756 2662a059 j_mayer
#define SPR_UPERF9       (0x319)
757 2662a059 j_mayer
#define SPR_UPERFA       (0x31A)
758 2662a059 j_mayer
#define SPR_UPERFB       (0x31B)
759 2662a059 j_mayer
#define SPR_UPERFC       (0x31C)
760 2662a059 j_mayer
#define SPR_UPERFD       (0x31D)
761 2662a059 j_mayer
#define SPR_UPERFE       (0x31E)
762 2662a059 j_mayer
#define SPR_UPERFF       (0x31F)
763 76a66253 j_mayer
#define SPR_440_INV0     (0x370)
764 76a66253 j_mayer
#define SPR_440_INV1     (0x371)
765 76a66253 j_mayer
#define SPR_440_INV2     (0x372)
766 76a66253 j_mayer
#define SPR_440_INV3     (0x373)
767 2662a059 j_mayer
#define SPR_440_ITV0     (0x374)
768 2662a059 j_mayer
#define SPR_440_ITV1     (0x375)
769 2662a059 j_mayer
#define SPR_440_ITV2     (0x376)
770 2662a059 j_mayer
#define SPR_440_ITV3     (0x377)
771 a750fc0b j_mayer
#define SPR_440_CCR1     (0x378)
772 a750fc0b j_mayer
#define SPR_DCRIPR       (0x37B)
773 2662a059 j_mayer
#define SPR_PPR          (0x380)
774 76a66253 j_mayer
#define SPR_440_DNV0     (0x390)
775 76a66253 j_mayer
#define SPR_440_DNV1     (0x391)
776 76a66253 j_mayer
#define SPR_440_DNV2     (0x392)
777 76a66253 j_mayer
#define SPR_440_DNV3     (0x393)
778 2662a059 j_mayer
#define SPR_440_DTV0     (0x394)
779 2662a059 j_mayer
#define SPR_440_DTV1     (0x395)
780 2662a059 j_mayer
#define SPR_440_DTV2     (0x396)
781 2662a059 j_mayer
#define SPR_440_DTV3     (0x397)
782 76a66253 j_mayer
#define SPR_440_DVLIM    (0x398)
783 76a66253 j_mayer
#define SPR_440_IVLIM    (0x399)
784 76a66253 j_mayer
#define SPR_440_RSTCFG   (0x39B)
785 2662a059 j_mayer
#define SPR_BOOKE_DCDBTRL (0x39C)
786 2662a059 j_mayer
#define SPR_BOOKE_DCDBTRH (0x39D)
787 2662a059 j_mayer
#define SPR_BOOKE_ICDBTRL (0x39E)
788 2662a059 j_mayer
#define SPR_BOOKE_ICDBTRH (0x39F)
789 a750fc0b j_mayer
#define SPR_UMMCR2       (0x3A0)
790 a750fc0b j_mayer
#define SPR_UPMC5        (0x3A1)
791 a750fc0b j_mayer
#define SPR_UPMC6        (0x3A2)
792 a750fc0b j_mayer
#define SPR_UBAMR        (0x3A7)
793 76a66253 j_mayer
#define SPR_UMMCR0       (0x3A8)
794 76a66253 j_mayer
#define SPR_UPMC1        (0x3A9)
795 76a66253 j_mayer
#define SPR_UPMC2        (0x3AA)
796 a750fc0b j_mayer
#define SPR_USIAR        (0x3AB)
797 76a66253 j_mayer
#define SPR_UMMCR1       (0x3AC)
798 76a66253 j_mayer
#define SPR_UPMC3        (0x3AD)
799 76a66253 j_mayer
#define SPR_UPMC4        (0x3AE)
800 76a66253 j_mayer
#define SPR_USDA         (0x3AF)
801 76a66253 j_mayer
#define SPR_40x_ZPR      (0x3B0)
802 363be49c j_mayer
#define SPR_BOOKE_MAS7   (0x3B0)
803 a750fc0b j_mayer
#define SPR_620_PMR0     (0x3B0)
804 a750fc0b j_mayer
#define SPR_MMCR2        (0x3B0)
805 a750fc0b j_mayer
#define SPR_PMC5         (0x3B1)
806 76a66253 j_mayer
#define SPR_40x_PID      (0x3B1)
807 a750fc0b j_mayer
#define SPR_620_PMR1     (0x3B1)
808 a750fc0b j_mayer
#define SPR_PMC6         (0x3B2)
809 76a66253 j_mayer
#define SPR_440_MMUCR    (0x3B2)
810 a750fc0b j_mayer
#define SPR_620_PMR2     (0x3B2)
811 76a66253 j_mayer
#define SPR_4xx_CCR0     (0x3B3)
812 363be49c j_mayer
#define SPR_BOOKE_EPLC   (0x3B3)
813 a750fc0b j_mayer
#define SPR_620_PMR3     (0x3B3)
814 76a66253 j_mayer
#define SPR_405_IAC3     (0x3B4)
815 363be49c j_mayer
#define SPR_BOOKE_EPSC   (0x3B4)
816 a750fc0b j_mayer
#define SPR_620_PMR4     (0x3B4)
817 76a66253 j_mayer
#define SPR_405_IAC4     (0x3B5)
818 a750fc0b j_mayer
#define SPR_620_PMR5     (0x3B5)
819 76a66253 j_mayer
#define SPR_405_DVC1     (0x3B6)
820 a750fc0b j_mayer
#define SPR_620_PMR6     (0x3B6)
821 76a66253 j_mayer
#define SPR_405_DVC2     (0x3B7)
822 a750fc0b j_mayer
#define SPR_620_PMR7     (0x3B7)
823 a750fc0b j_mayer
#define SPR_BAMR         (0x3B7)
824 76a66253 j_mayer
#define SPR_MMCR0        (0x3B8)
825 a750fc0b j_mayer
#define SPR_620_PMR8     (0x3B8)
826 76a66253 j_mayer
#define SPR_PMC1         (0x3B9)
827 76a66253 j_mayer
#define SPR_40x_SGR      (0x3B9)
828 a750fc0b j_mayer
#define SPR_620_PMR9     (0x3B9)
829 76a66253 j_mayer
#define SPR_PMC2         (0x3BA)
830 76a66253 j_mayer
#define SPR_40x_DCWR     (0x3BA)
831 a750fc0b j_mayer
#define SPR_620_PMRA     (0x3BA)
832 a750fc0b j_mayer
#define SPR_SIAR         (0x3BB)
833 76a66253 j_mayer
#define SPR_405_SLER     (0x3BB)
834 a750fc0b j_mayer
#define SPR_620_PMRB     (0x3BB)
835 76a66253 j_mayer
#define SPR_MMCR1        (0x3BC)
836 76a66253 j_mayer
#define SPR_405_SU0R     (0x3BC)
837 a750fc0b j_mayer
#define SPR_620_PMRC     (0x3BC)
838 a750fc0b j_mayer
#define SPR_401_SKR      (0x3BC)
839 76a66253 j_mayer
#define SPR_PMC3         (0x3BD)
840 76a66253 j_mayer
#define SPR_405_DBCR1    (0x3BD)
841 a750fc0b j_mayer
#define SPR_620_PMRD     (0x3BD)
842 76a66253 j_mayer
#define SPR_PMC4         (0x3BE)
843 a750fc0b j_mayer
#define SPR_620_PMRE     (0x3BE)
844 76a66253 j_mayer
#define SPR_SDA          (0x3BF)
845 a750fc0b j_mayer
#define SPR_620_PMRF     (0x3BF)
846 76a66253 j_mayer
#define SPR_403_VTBL     (0x3CC)
847 76a66253 j_mayer
#define SPR_403_VTBU     (0x3CD)
848 76a66253 j_mayer
#define SPR_DMISS        (0x3D0)
849 76a66253 j_mayer
#define SPR_DCMP         (0x3D1)
850 76a66253 j_mayer
#define SPR_HASH1        (0x3D2)
851 76a66253 j_mayer
#define SPR_HASH2        (0x3D3)
852 2662a059 j_mayer
#define SPR_BOOKE_ICDBDR (0x3D3)
853 a750fc0b j_mayer
#define SPR_TLBMISS      (0x3D4)
854 76a66253 j_mayer
#define SPR_IMISS        (0x3D4)
855 76a66253 j_mayer
#define SPR_40x_ESR      (0x3D4)
856 a750fc0b j_mayer
#define SPR_PTEHI        (0x3D5)
857 76a66253 j_mayer
#define SPR_ICMP         (0x3D5)
858 76a66253 j_mayer
#define SPR_40x_DEAR     (0x3D5)
859 a750fc0b j_mayer
#define SPR_PTELO        (0x3D6)
860 76a66253 j_mayer
#define SPR_RPA          (0x3D6)
861 76a66253 j_mayer
#define SPR_40x_EVPR     (0x3D6)
862 a750fc0b j_mayer
#define SPR_L3PM         (0x3D7)
863 76a66253 j_mayer
#define SPR_403_CDBCR    (0x3D7)
864 a750fc0b j_mayer
#define SPR_L3OHCR       (0x3D8)
865 76a66253 j_mayer
#define SPR_TCR          (0x3D8)
866 76a66253 j_mayer
#define SPR_40x_TSR      (0x3D8)
867 76a66253 j_mayer
#define SPR_IBR          (0x3DA)
868 76a66253 j_mayer
#define SPR_40x_TCR      (0x3DA)
869 a750fc0b j_mayer
#define SPR_ESASRR       (0x3DB)
870 76a66253 j_mayer
#define SPR_40x_PIT      (0x3DB)
871 76a66253 j_mayer
#define SPR_403_TBL      (0x3DC)
872 76a66253 j_mayer
#define SPR_403_TBU      (0x3DD)
873 76a66253 j_mayer
#define SPR_SEBR         (0x3DE)
874 76a66253 j_mayer
#define SPR_40x_SRR2     (0x3DE)
875 76a66253 j_mayer
#define SPR_SER          (0x3DF)
876 76a66253 j_mayer
#define SPR_40x_SRR3     (0x3DF)
877 a750fc0b j_mayer
#define SPR_L3ITCR0      (0x3E8)
878 a750fc0b j_mayer
#define SPR_L3ITCR1      (0x3E9)
879 a750fc0b j_mayer
#define SPR_L3ITCR2      (0x3EA)
880 a750fc0b j_mayer
#define SPR_L3ITCR3      (0x3EB)
881 76a66253 j_mayer
#define SPR_HID0         (0x3F0)
882 76a66253 j_mayer
#define SPR_40x_DBSR     (0x3F0)
883 76a66253 j_mayer
#define SPR_HID1         (0x3F1)
884 76a66253 j_mayer
#define SPR_IABR         (0x3F2)
885 76a66253 j_mayer
#define SPR_40x_DBCR0    (0x3F2)
886 76a66253 j_mayer
#define SPR_601_HID2     (0x3F2)
887 76a66253 j_mayer
#define SPR_E500_L1CSR0  (0x3F2)
888 a750fc0b j_mayer
#define SPR_ICTRL        (0x3F3)
889 76a66253 j_mayer
#define SPR_HID2         (0x3F3)
890 76a66253 j_mayer
#define SPR_E500_L1CSR1  (0x3F3)
891 76a66253 j_mayer
#define SPR_440_DBDR     (0x3F3)
892 a750fc0b j_mayer
#define SPR_LDSTDB       (0x3F4)
893 76a66253 j_mayer
#define SPR_40x_IAC1     (0x3F4)
894 363be49c j_mayer
#define SPR_BOOKE_MMUCSR0 (0x3F4)
895 76a66253 j_mayer
#define SPR_DABR         (0x3F5)
896 3fc6c082 bellard
#define DABR_MASK (~(target_ulong)0x7)
897 76a66253 j_mayer
#define SPR_E500_BUCSR   (0x3F5)
898 76a66253 j_mayer
#define SPR_40x_IAC2     (0x3F5)
899 76a66253 j_mayer
#define SPR_601_HID5     (0x3F5)
900 76a66253 j_mayer
#define SPR_40x_DAC1     (0x3F6)
901 a750fc0b j_mayer
#define SPR_MSSCR0       (0x3F6)
902 a750fc0b j_mayer
#define SPR_MSSSR0       (0x3F7)
903 2662a059 j_mayer
#define SPR_DABRX        (0x3F7)
904 76a66253 j_mayer
#define SPR_40x_DAC2     (0x3F7)
905 363be49c j_mayer
#define SPR_BOOKE_MMUCFG (0x3F7)
906 a750fc0b j_mayer
#define SPR_LDSTCR       (0x3F8)
907 a750fc0b j_mayer
#define SPR_L2PMCR       (0x3F8)
908 76a66253 j_mayer
#define SPR_750_HID2     (0x3F8)
909 a750fc0b j_mayer
#define SPR_620_HID8     (0x3F8)
910 76a66253 j_mayer
#define SPR_L2CR         (0x3F9)
911 a750fc0b j_mayer
#define SPR_620_HID9     (0x3F9)
912 a750fc0b j_mayer
#define SPR_L3CR         (0x3FA)
913 76a66253 j_mayer
#define SPR_IABR2        (0x3FA)
914 76a66253 j_mayer
#define SPR_40x_DCCR     (0x3FA)
915 76a66253 j_mayer
#define SPR_ICTC         (0x3FB)
916 76a66253 j_mayer
#define SPR_40x_ICCR     (0x3FB)
917 76a66253 j_mayer
#define SPR_THRM1        (0x3FC)
918 76a66253 j_mayer
#define SPR_403_PBL1     (0x3FC)
919 76a66253 j_mayer
#define SPR_SP           (0x3FD)
920 76a66253 j_mayer
#define SPR_THRM2        (0x3FD)
921 76a66253 j_mayer
#define SPR_403_PBU1     (0x3FD)
922 a750fc0b j_mayer
#define SPR_604_HID13    (0x3FD)
923 76a66253 j_mayer
#define SPR_LT           (0x3FE)
924 76a66253 j_mayer
#define SPR_THRM3        (0x3FE)
925 76a66253 j_mayer
#define SPR_FPECR        (0x3FE)
926 76a66253 j_mayer
#define SPR_403_PBL2     (0x3FE)
927 76a66253 j_mayer
#define SPR_PIR          (0x3FF)
928 76a66253 j_mayer
#define SPR_403_PBU2     (0x3FF)
929 76a66253 j_mayer
#define SPR_601_HID15    (0x3FF)
930 a750fc0b j_mayer
#define SPR_604_HID15    (0x3FF)
931 76a66253 j_mayer
#define SPR_E500_SVR     (0x3FF)
932 79aceca5 bellard
933 76a66253 j_mayer
/*****************************************************************************/
934 9a64fbe4 bellard
/* Memory access type :
935 9a64fbe4 bellard
 * may be needed for precise access rights control and precise exceptions.
936 9a64fbe4 bellard
 */
937 79aceca5 bellard
enum {
938 9a64fbe4 bellard
    /* 1 bit to define user level / supervisor access */
939 9a64fbe4 bellard
    ACCESS_USER  = 0x00,
940 9a64fbe4 bellard
    ACCESS_SUPER = 0x01,
941 9a64fbe4 bellard
    /* Type of instruction that generated the access */
942 9a64fbe4 bellard
    ACCESS_CODE  = 0x10, /* Code fetch access                */
943 9a64fbe4 bellard
    ACCESS_INT   = 0x20, /* Integer load/store access        */
944 9a64fbe4 bellard
    ACCESS_FLOAT = 0x30, /* floating point load/store access */
945 9a64fbe4 bellard
    ACCESS_RES   = 0x40, /* load/store with reservation      */
946 9a64fbe4 bellard
    ACCESS_EXT   = 0x50, /* external access                  */
947 9a64fbe4 bellard
    ACCESS_CACHE = 0x60, /* Cache manipulation               */
948 9a64fbe4 bellard
};
949 9a64fbe4 bellard
950 9a64fbe4 bellard
/*****************************************************************************/
951 9a64fbe4 bellard
/* Exceptions */
952 2be0071f bellard
#define EXCP_NONE          -1
953 2be0071f bellard
/* PowerPC hardware exceptions : exception vectors defined in PowerPC book 3 */
954 2be0071f bellard
#define EXCP_RESET         0x0100 /* System reset                            */
955 2be0071f bellard
#define EXCP_MACHINE_CHECK 0x0200 /* Machine check exception                 */
956 2be0071f bellard
#define EXCP_DSI           0x0300 /* Data storage exception                  */
957 2be0071f bellard
#define EXCP_DSEG          0x0380 /* Data segment exception                  */
958 2be0071f bellard
#define EXCP_ISI           0x0400 /* Instruction storage exception           */
959 2be0071f bellard
#define EXCP_ISEG          0x0480 /* Instruction segment exception           */
960 2be0071f bellard
#define EXCP_EXTERNAL      0x0500 /* External interruption                   */
961 2be0071f bellard
#define EXCP_ALIGN         0x0600 /* Alignment exception                     */
962 2be0071f bellard
#define EXCP_PROGRAM       0x0700 /* Program exception                       */
963 2be0071f bellard
#define EXCP_NO_FP         0x0800 /* Floating point unavailable exception    */
964 2be0071f bellard
#define EXCP_DECR          0x0900 /* Decrementer exception                   */
965 2be0071f bellard
#define EXCP_HDECR         0x0980 /* Hypervisor decrementer exception        */
966 2be0071f bellard
#define EXCP_SYSCALL       0x0C00 /* System call                             */
967 2be0071f bellard
#define EXCP_TRACE         0x0D00 /* Trace exception                         */
968 2be0071f bellard
#define EXCP_PERF          0x0F00 /* Performance monitor exception           */
969 2be0071f bellard
/* Exceptions defined in PowerPC 32 bits programming environment manual      */
970 2be0071f bellard
#define EXCP_FP_ASSIST     0x0E00 /* Floating-point assist                   */
971 2be0071f bellard
/* Implementation specific exceptions                                        */
972 2be0071f bellard
/* 40x exceptions                                                            */
973 2be0071f bellard
#define EXCP_40x_PIT       0x1000 /* Programmable interval timer interrupt   */
974 2be0071f bellard
#define EXCP_40x_FIT       0x1010 /* Fixed interval timer interrupt          */
975 2be0071f bellard
#define EXCP_40x_WATCHDOG  0x1020 /* Watchdog timer exception                */
976 2be0071f bellard
#define EXCP_40x_DTLBMISS  0x1100 /* Data TLB miss exception                 */
977 2be0071f bellard
#define EXCP_40x_ITLBMISS  0x1200 /* Instruction TLB miss exception          */
978 2be0071f bellard
#define EXCP_40x_DEBUG     0x2000 /* Debug exception                         */
979 2be0071f bellard
/* 405 specific exceptions                                                   */
980 2be0071f bellard
#define EXCP_405_APU       0x0F20 /* APU unavailable exception               */
981 a750fc0b j_mayer
/* 440 specific exceptions                                                   */
982 a750fc0b j_mayer
#define EXCP_440_CRIT      0x0100 /* Critical interrupt                      */
983 a750fc0b j_mayer
#define EXCP_440_SPEU      0x1600 /* SPE unavailable exception               */
984 a750fc0b j_mayer
#define EXCP_440_SPED      0x1700 /* SPE floating-point data exception       */
985 a750fc0b j_mayer
#define EXCP_440_SPER      0x1800 /* SPE floating-point round exception      */
986 2be0071f bellard
/* TLB assist exceptions (602/603)                                           */
987 2be0071f bellard
#define EXCP_I_TLBMISS     0x1000 /* Instruction TLB miss                    */
988 2be0071f bellard
#define EXCP_DL_TLBMISS    0x1100 /* Data load TLB miss                      */
989 2be0071f bellard
#define EXCP_DS_TLBMISS    0x1200 /* Data store TLB miss                     */
990 2be0071f bellard
/* Breakpoint exceptions (602/603/604/620/740/745/750/755...)                */
991 2be0071f bellard
#define EXCP_IABR          0x1300 /* Instruction address breakpoint          */
992 2be0071f bellard
#define EXCP_SMI           0x1400 /* System management interrupt             */
993 2be0071f bellard
/* Altivec related exceptions                                                */
994 2be0071f bellard
#define EXCP_VPU           0x0F20 /* VPU unavailable exception               */
995 2be0071f bellard
/* 601 specific exceptions                                                   */
996 a750fc0b j_mayer
#define EXCP_601_IO        0x0A00 /* IO error exception                      */
997 2be0071f bellard
#define EXCP_601_RUNM      0x2000 /* Run mode exception                      */
998 2be0071f bellard
/* 602 specific exceptions                                                   */
999 2be0071f bellard
#define EXCP_602_WATCHDOG  0x1500 /* Watchdog exception                      */
1000 2be0071f bellard
#define EXCP_602_EMUL      0x1600 /* Emulation trap exception                */
1001 2be0071f bellard
/* G2 specific exceptions                                                    */
1002 2be0071f bellard
#define EXCP_G2_CRIT       0x0A00 /* Critical interrupt                      */
1003 2be0071f bellard
/* MPC740/745/750 & IBM 750 specific exceptions                              */
1004 2be0071f bellard
#define EXCP_THRM          0x1700 /* Thermal management interrupt            */
1005 2be0071f bellard
/* 74xx specific exceptions                                                  */
1006 2be0071f bellard
#define EXCP_74xx_VPUA     0x1600 /* VPU assist exception                    */
1007 2be0071f bellard
/* 970FX specific exceptions                                                 */
1008 2be0071f bellard
#define EXCP_970_SOFTP     0x1500 /* Soft patch exception                    */
1009 2be0071f bellard
#define EXCP_970_MAINT     0x1600 /* Maintenance exception                   */
1010 2be0071f bellard
#define EXCP_970_THRM      0x1800 /* Thermal exception                       */
1011 2be0071f bellard
#define EXCP_970_VPUA      0x1700 /* VPU assist exception                    */
1012 0487d6a8 j_mayer
/* SPE related exceptions                                                    */
1013 0487d6a8 j_mayer
#define EXCP_NO_SPE        0x0F20 /* SPE unavailable exception               */
1014 2be0071f bellard
/* End of exception vectors area                                             */
1015 2be0071f bellard
#define EXCP_PPC_MAX       0x4000
1016 2be0071f bellard
/* Qemu exceptions: special cases we want to stop translation                */
1017 2be0071f bellard
#define EXCP_MTMSR         0x11000 /* mtmsr instruction:                     */
1018 76a66253 j_mayer
                                   /* may change privilege level             */
1019 2be0071f bellard
#define EXCP_BRANCH        0x11001 /* branch instruction                     */
1020 2be0071f bellard
#define EXCP_SYSCALL_USER  0x12000 /* System call in user mode only          */
1021 2be0071f bellard
1022 9a64fbe4 bellard
/* Error codes */
1023 9a64fbe4 bellard
enum {
1024 9a64fbe4 bellard
    /* Exception subtypes for EXCP_ALIGN                            */
1025 9a64fbe4 bellard
    EXCP_ALIGN_FP      = 0x01,  /* FP alignment exception           */
1026 9a64fbe4 bellard
    EXCP_ALIGN_LST     = 0x02,  /* Unaligned mult/extern load/store */
1027 9a64fbe4 bellard
    EXCP_ALIGN_LE      = 0x03,  /* Multiple little-endian access    */
1028 9a64fbe4 bellard
    EXCP_ALIGN_PROT    = 0x04,  /* Access cross protection boundary */
1029 9a64fbe4 bellard
    EXCP_ALIGN_BAT     = 0x05,  /* Access cross a BAT/seg boundary  */
1030 9a64fbe4 bellard
    EXCP_ALIGN_CACHE   = 0x06,  /* Impossible dcbz access           */
1031 9a64fbe4 bellard
    /* Exception subtypes for EXCP_PROGRAM                          */
1032 79aceca5 bellard
    /* FP exceptions */
1033 9a64fbe4 bellard
    EXCP_FP            = 0x10,
1034 9a64fbe4 bellard
    EXCP_FP_OX         = 0x01,  /* FP overflow                      */
1035 9a64fbe4 bellard
    EXCP_FP_UX         = 0x02,  /* FP underflow                     */
1036 9a64fbe4 bellard
    EXCP_FP_ZX         = 0x03,  /* FP divide by zero                */
1037 9a64fbe4 bellard
    EXCP_FP_XX         = 0x04,  /* FP inexact                       */
1038 9a64fbe4 bellard
    EXCP_FP_VXNAN      = 0x05,  /* FP invalid SNaN op               */
1039 0cfec834 ths
    EXCP_FP_VXISI      = 0x06,  /* FP invalid infinite subtraction */
1040 9a64fbe4 bellard
    EXCP_FP_VXIDI      = 0x07,  /* FP invalid infinite divide       */
1041 9a64fbe4 bellard
    EXCP_FP_VXZDZ      = 0x08,  /* FP invalid zero divide           */
1042 9a64fbe4 bellard
    EXCP_FP_VXIMZ      = 0x09,  /* FP invalid infinite * zero       */
1043 9a64fbe4 bellard
    EXCP_FP_VXVC       = 0x0A,  /* FP invalid compare               */
1044 9a64fbe4 bellard
    EXCP_FP_VXSOFT     = 0x0B,  /* FP invalid operation             */
1045 9a64fbe4 bellard
    EXCP_FP_VXSQRT     = 0x0C,  /* FP invalid square root           */
1046 9a64fbe4 bellard
    EXCP_FP_VXCVI      = 0x0D,  /* FP invalid integer conversion    */
1047 79aceca5 bellard
    /* Invalid instruction */
1048 9a64fbe4 bellard
    EXCP_INVAL         = 0x20,
1049 9a64fbe4 bellard
    EXCP_INVAL_INVAL   = 0x01,  /* Invalid instruction              */
1050 9a64fbe4 bellard
    EXCP_INVAL_LSWX    = 0x02,  /* Invalid lswx instruction         */
1051 9a64fbe4 bellard
    EXCP_INVAL_SPR     = 0x03,  /* Invalid SPR access               */
1052 9a64fbe4 bellard
    EXCP_INVAL_FP      = 0x04,  /* Unimplemented mandatory fp instr */
1053 79aceca5 bellard
    /* Privileged instruction */
1054 9a64fbe4 bellard
    EXCP_PRIV          = 0x30,
1055 8b67546f j_mayer
    EXCP_PRIV_OPC      = 0x01,  /* Privileged operation exception   */
1056 8b67546f j_mayer
    EXCP_PRIV_REG      = 0x02,  /* Privileged register exception    */
1057 79aceca5 bellard
    /* Trap */
1058 9a64fbe4 bellard
    EXCP_TRAP          = 0x40,
1059 79aceca5 bellard
};
1060 79aceca5 bellard
1061 47103572 j_mayer
/* Hardware interruption sources:
1062 47103572 j_mayer
 * all those exception can be raised simulteaneously
1063 47103572 j_mayer
 */
1064 e9df014c j_mayer
/* Input pins definitions */
1065 e9df014c j_mayer
enum {
1066 e9df014c j_mayer
    /* 6xx bus input pins */
1067 24be5ae3 j_mayer
    PPC6xx_INPUT_HRESET     = 0,
1068 24be5ae3 j_mayer
    PPC6xx_INPUT_SRESET     = 1,
1069 24be5ae3 j_mayer
    PPC6xx_INPUT_CKSTP_IN   = 2,
1070 24be5ae3 j_mayer
    PPC6xx_INPUT_MCP        = 3,
1071 24be5ae3 j_mayer
    PPC6xx_INPUT_SMI        = 4,
1072 24be5ae3 j_mayer
    PPC6xx_INPUT_INT        = 5,
1073 24be5ae3 j_mayer
};
1074 24be5ae3 j_mayer
1075 24be5ae3 j_mayer
enum {
1076 e9df014c j_mayer
    /* Embedded PowerPC input pins */
1077 24be5ae3 j_mayer
    PPCBookE_INPUT_HRESET     = 0,
1078 24be5ae3 j_mayer
    PPCBookE_INPUT_SRESET     = 1,
1079 24be5ae3 j_mayer
    PPCBookE_INPUT_CKSTP_IN   = 2,
1080 24be5ae3 j_mayer
    PPCBookE_INPUT_MCP        = 3,
1081 24be5ae3 j_mayer
    PPCBookE_INPUT_SMI        = 4,
1082 24be5ae3 j_mayer
    PPCBookE_INPUT_INT        = 5,
1083 24be5ae3 j_mayer
    PPCBookE_INPUT_CINT       = 6,
1084 24be5ae3 j_mayer
};
1085 24be5ae3 j_mayer
1086 24be5ae3 j_mayer
enum {
1087 a750fc0b j_mayer
    /* PowerPC 401/403 input pins */
1088 a750fc0b j_mayer
    PPC401_INPUT_RESET      = 0,
1089 a750fc0b j_mayer
    PPC401_INPUT_CINT       = 1,
1090 a750fc0b j_mayer
    PPC401_INPUT_INT        = 2,
1091 a750fc0b j_mayer
    PPC401_INPUT_BERR       = 3,
1092 a750fc0b j_mayer
    PPC401_INPUT_HALT       = 4,
1093 a750fc0b j_mayer
};
1094 a750fc0b j_mayer
1095 a750fc0b j_mayer
enum {
1096 24be5ae3 j_mayer
    /* PowerPC 405 input pins */
1097 24be5ae3 j_mayer
    PPC405_INPUT_RESET_CORE = 0,
1098 24be5ae3 j_mayer
    PPC405_INPUT_RESET_CHIP = 1,
1099 24be5ae3 j_mayer
    PPC405_INPUT_RESET_SYS  = 2,
1100 24be5ae3 j_mayer
    PPC405_INPUT_CINT       = 3,
1101 24be5ae3 j_mayer
    PPC405_INPUT_INT        = 4,
1102 24be5ae3 j_mayer
    PPC405_INPUT_HALT       = 5,
1103 24be5ae3 j_mayer
    PPC405_INPUT_DEBUG      = 6,
1104 e9df014c j_mayer
};
1105 e9df014c j_mayer
1106 d0dfae6e j_mayer
enum {
1107 a750fc0b j_mayer
    /* PowerPC 620 (and probably others) input pins */
1108 a750fc0b j_mayer
    PPC620_INPUT_HRESET     = 0,
1109 a750fc0b j_mayer
    PPC620_INPUT_SRESET     = 1,
1110 a750fc0b j_mayer
    PPC620_INPUT_CKSTP      = 2,
1111 a750fc0b j_mayer
    PPC620_INPUT_TBEN       = 3,
1112 a750fc0b j_mayer
    PPC620_INPUT_WAKEUP     = 4,
1113 a750fc0b j_mayer
    PPC620_INPUT_MCP        = 5,
1114 a750fc0b j_mayer
    PPC620_INPUT_SMI        = 6,
1115 a750fc0b j_mayer
    PPC620_INPUT_INT        = 7,
1116 a750fc0b j_mayer
};
1117 a750fc0b j_mayer
1118 a750fc0b j_mayer
enum {
1119 d0dfae6e j_mayer
    /* PowerPC 970 input pins */
1120 d0dfae6e j_mayer
    PPC970_INPUT_HRESET     = 0,
1121 d0dfae6e j_mayer
    PPC970_INPUT_SRESET     = 1,
1122 d0dfae6e j_mayer
    PPC970_INPUT_CKSTP      = 2,
1123 d0dfae6e j_mayer
    PPC970_INPUT_TBEN       = 3,
1124 d0dfae6e j_mayer
    PPC970_INPUT_MCP        = 4,
1125 d0dfae6e j_mayer
    PPC970_INPUT_INT        = 5,
1126 d0dfae6e j_mayer
    PPC970_INPUT_THINT      = 6,
1127 d0dfae6e j_mayer
};
1128 d0dfae6e j_mayer
1129 e9df014c j_mayer
/* Hardware exceptions definitions */
1130 47103572 j_mayer
enum {
1131 e9df014c j_mayer
    /* External hardware exception sources */
1132 e9df014c j_mayer
    PPC_INTERRUPT_RESET  = 0,  /* Reset exception                      */
1133 e9df014c j_mayer
    PPC_INTERRUPT_MCK    = 1,  /* Machine check exception              */
1134 e9df014c j_mayer
    PPC_INTERRUPT_EXT    = 2,  /* External interrupt                   */
1135 e9df014c j_mayer
    PPC_INTERRUPT_SMI    = 3,  /* System management interrupt          */
1136 e9df014c j_mayer
    PPC_INTERRUPT_CEXT   = 4,  /* Critical external interrupt          */
1137 e9df014c j_mayer
    PPC_INTERRUPT_DEBUG  = 5,  /* External debug exception             */
1138 d0dfae6e j_mayer
    PPC_INTERRUPT_THERM  = 6,  /* Thermal exception                    */
1139 e9df014c j_mayer
    /* Internal hardware exception sources */
1140 d0dfae6e j_mayer
    PPC_INTERRUPT_DECR   = 7,  /* Decrementer exception                */
1141 d0dfae6e j_mayer
    PPC_INTERRUPT_HDECR  = 8,  /* Hypervisor decrementer exception     */
1142 d0dfae6e j_mayer
    PPC_INTERRUPT_PIT    = 9,  /* Programmable inteval timer interrupt */
1143 d0dfae6e j_mayer
    PPC_INTERRUPT_FIT    = 10, /* Fixed interval timer interrupt       */
1144 d0dfae6e j_mayer
    PPC_INTERRUPT_WDT    = 11, /* Watchdog timer interrupt             */
1145 47103572 j_mayer
};
1146 47103572 j_mayer
1147 9a64fbe4 bellard
/*****************************************************************************/
1148 9a64fbe4 bellard
1149 a04e134a ths
static inline target_ulong get_sp_from_cpustate(CPUPPCState *state)
1150 a04e134a ths
{
1151 a04e134a ths
    return state->gpr[1];
1152 a04e134a ths
}
1153 a04e134a ths
1154 79aceca5 bellard
#endif /* !defined (__CPU_PPC_H__) */