Statistics
| Branch: | Revision:

root / target-ppc / cpu.h @ 97eb5b14

History | View | Annotate | Download (14.4 kB)

1 79aceca5 bellard
/*
2 79aceca5 bellard
 *  PPC emulation cpu definitions for qemu.
3 79aceca5 bellard
 * 
4 79aceca5 bellard
 *  Copyright (c) 2003 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 79aceca5 bellard
#include <endian.h>
24 79aceca5 bellard
#include <asm/byteorder.h>
25 79aceca5 bellard
26 3cf1e035 bellard
#define TARGET_LONG_BITS 32
27 3cf1e035 bellard
28 79aceca5 bellard
#include "cpu-defs.h"
29 79aceca5 bellard
30 9a64fbe4 bellard
//#define USE_OPEN_FIRMWARE
31 9a64fbe4 bellard
32 79aceca5 bellard
/***                          Sign extend constants                        ***/
33 79aceca5 bellard
/* 8 to 32 bits */
34 79aceca5 bellard
static inline int32_t s_ext8 (uint8_t value)
35 79aceca5 bellard
{
36 79aceca5 bellard
    int8_t *tmp = &value;
37 79aceca5 bellard
38 79aceca5 bellard
    return *tmp;
39 79aceca5 bellard
}
40 79aceca5 bellard
41 79aceca5 bellard
/* 16 to 32 bits */
42 79aceca5 bellard
static inline int32_t s_ext16 (uint16_t value)
43 79aceca5 bellard
{
44 79aceca5 bellard
    int16_t *tmp = &value;
45 79aceca5 bellard
46 79aceca5 bellard
    return *tmp;
47 79aceca5 bellard
}
48 79aceca5 bellard
49 79aceca5 bellard
/* 24 to 32 bits */
50 79aceca5 bellard
static inline int32_t s_ext24 (uint32_t value)
51 79aceca5 bellard
{
52 79aceca5 bellard
    uint16_t utmp = (value >> 8) & 0xFFFF;
53 79aceca5 bellard
    int16_t *tmp = &utmp;
54 79aceca5 bellard
55 79aceca5 bellard
    return (*tmp << 8) | (value & 0xFF);
56 79aceca5 bellard
}
57 79aceca5 bellard
58 79aceca5 bellard
#include "config.h"
59 79aceca5 bellard
#include <setjmp.h>
60 79aceca5 bellard
61 9a64fbe4 bellard
/* Instruction types */
62 9a64fbe4 bellard
enum {
63 9a64fbe4 bellard
    PPC_NONE     = 0x0000,
64 9a64fbe4 bellard
    PPC_INTEGER  = 0x0001, /* CPU has integer operations instructions        */
65 9a64fbe4 bellard
    PPC_FLOAT    = 0x0002, /* CPU has floating point operations instructions */
66 9a64fbe4 bellard
    PPC_FLOW     = 0x0004, /* CPU has flow control instructions              */
67 9a64fbe4 bellard
    PPC_MEM      = 0x0008, /* CPU has virtual memory instructions            */
68 9a64fbe4 bellard
    PPC_RES      = 0x0010, /* CPU has ld/st with reservation instructions    */
69 9a64fbe4 bellard
    PPC_CACHE    = 0x0020, /* CPU has cache control instructions             */
70 9a64fbe4 bellard
    PPC_MISC     = 0x0040, /* CPU has spr/msr access instructions            */
71 9a64fbe4 bellard
    PPC_EXTERN   = 0x0080, /* CPU has external control instructions          */
72 9a64fbe4 bellard
    PPC_SEGMENT  = 0x0100, /* CPU has memory segment instructions            */
73 9a64fbe4 bellard
    PPC_CACHE_OPT= 0x0200,
74 9a64fbe4 bellard
    PPC_FLOAT_OPT= 0x0400,
75 9a64fbe4 bellard
    PPC_MEM_OPT  = 0x0800,
76 9a64fbe4 bellard
};
77 79aceca5 bellard
78 9a64fbe4 bellard
#define PPC_COMMON  (PPC_INTEGER | PPC_FLOAT | PPC_FLOW | PPC_MEM |           \
79 9a64fbe4 bellard
                     PPC_RES | PPC_CACHE | PPC_MISC | PPC_SEGMENT)
80 9a64fbe4 bellard
/* PPC 740/745/750/755 (aka G3) has external access instructions */
81 9a64fbe4 bellard
#define PPC_750 (PPC_INTEGER | PPC_FLOAT | PPC_FLOW | PPC_MEM |               \
82 9a64fbe4 bellard
                 PPC_RES | PPC_CACHE | PPC_MISC | PPC_EXTERN | PPC_SEGMENT)
83 79aceca5 bellard
84 79aceca5 bellard
/* Supervisor mode registers */
85 79aceca5 bellard
/* Machine state register */
86 79aceca5 bellard
#define MSR_POW 18
87 79aceca5 bellard
#define MSR_ILE 16
88 79aceca5 bellard
#define MSR_EE  15
89 79aceca5 bellard
#define MSR_PR  14
90 79aceca5 bellard
#define MSR_FP  13
91 79aceca5 bellard
#define MSR_ME  12
92 79aceca5 bellard
#define MSR_FE0 11
93 79aceca5 bellard
#define MSR_SE  10
94 79aceca5 bellard
#define MSR_BE  9
95 79aceca5 bellard
#define MSR_FE1 8
96 79aceca5 bellard
#define MSR_IP 6
97 79aceca5 bellard
#define MSR_IR 5
98 79aceca5 bellard
#define MSR_DR 4
99 79aceca5 bellard
#define MSR_RI 1
100 79aceca5 bellard
#define MSR_LE 0
101 79aceca5 bellard
#define msr_pow env->msr[MSR_POW]
102 79aceca5 bellard
#define msr_ile env->msr[MSR_ILE]
103 79aceca5 bellard
#define msr_ee  env->msr[MSR_EE]
104 79aceca5 bellard
#define msr_pr  env->msr[MSR_PR]
105 79aceca5 bellard
#define msr_fp  env->msr[MSR_FP]
106 79aceca5 bellard
#define msr_me  env->msr[MSR_ME]
107 79aceca5 bellard
#define msr_fe0 env->msr[MSR_FE0]
108 79aceca5 bellard
#define msr_se  env->msr[MSR_SE]
109 79aceca5 bellard
#define msr_be  env->msr[MSR_BE]
110 79aceca5 bellard
#define msr_fe1 env->msr[MSR_FE1]
111 79aceca5 bellard
#define msr_ip  env->msr[MSR_IP]
112 79aceca5 bellard
#define msr_ir  env->msr[MSR_IR]
113 79aceca5 bellard
#define msr_dr  env->msr[MSR_DR]
114 79aceca5 bellard
#define msr_ri  env->msr[MSR_RI]
115 79aceca5 bellard
#define msr_le  env->msr[MSR_LE]
116 79aceca5 bellard
117 79aceca5 bellard
/* Segment registers */
118 79aceca5 bellard
typedef struct CPUPPCState {
119 79aceca5 bellard
    /* general purpose registers */
120 79aceca5 bellard
    uint32_t gpr[32];
121 79aceca5 bellard
    /* floating point registers */
122 fb0eaffc bellard
    double fpr[32];
123 79aceca5 bellard
    /* segment registers */
124 9a64fbe4 bellard
    uint32_t sdr1;
125 9a64fbe4 bellard
    uint32_t sr[16];
126 79aceca5 bellard
    /* XER */
127 9a64fbe4 bellard
    uint8_t xer[4];
128 79aceca5 bellard
    /* Reservation address */
129 79aceca5 bellard
    uint32_t reserve;
130 79aceca5 bellard
    /* machine state register */
131 79aceca5 bellard
    uint8_t msr[32];
132 79aceca5 bellard
    /* condition register */
133 79aceca5 bellard
    uint8_t crf[8];
134 79aceca5 bellard
    /* floating point status and control register */
135 9a64fbe4 bellard
    uint8_t fpscr[8];
136 79aceca5 bellard
    uint32_t nip;
137 9a64fbe4 bellard
    /* special purpose registers */
138 9a64fbe4 bellard
    uint32_t lr;
139 9a64fbe4 bellard
    uint32_t ctr;
140 9a64fbe4 bellard
    /* Time base */
141 9a64fbe4 bellard
    uint32_t tb[2];
142 9a64fbe4 bellard
    /* decrementer */
143 9a64fbe4 bellard
    uint32_t decr;
144 9a64fbe4 bellard
    /* BATs */
145 9a64fbe4 bellard
    uint32_t DBAT[2][8];
146 9a64fbe4 bellard
    uint32_t IBAT[2][8];
147 9a64fbe4 bellard
    /* all others */
148 9a64fbe4 bellard
    uint32_t spr[1024];
149 79aceca5 bellard
    /* qemu dedicated */
150 fb0eaffc bellard
     /* temporary float registers */
151 fb0eaffc bellard
    double ft0;
152 fb0eaffc bellard
    double ft1;
153 fb0eaffc bellard
    double ft2;
154 79aceca5 bellard
    int interrupt_request;
155 79aceca5 bellard
    jmp_buf jmp_env;
156 79aceca5 bellard
    int exception_index;
157 79aceca5 bellard
    int error_code;
158 ac9eb073 bellard
    int access_type; /* when a memory exception occurs, the access
159 ac9eb073 bellard
                        type is stored here */
160 9a64fbe4 bellard
    uint32_t exceptions; /* exception queue */
161 9a64fbe4 bellard
    uint32_t errors[16];
162 79aceca5 bellard
    int user_mode_only; /* user mode only simulation */
163 79aceca5 bellard
    struct TranslationBlock *current_tb; /* currently executing TB */
164 9a64fbe4 bellard
    /* soft mmu support */
165 9a64fbe4 bellard
    /* 0 = kernel, 1 = user */
166 9a64fbe4 bellard
    CPUTLBEntry tlb_read[2][CPU_TLB_SIZE];
167 9a64fbe4 bellard
    CPUTLBEntry tlb_write[2][CPU_TLB_SIZE];
168 79aceca5 bellard
    /* user data */
169 79aceca5 bellard
    void *opaque;
170 79aceca5 bellard
} CPUPPCState;
171 79aceca5 bellard
172 79aceca5 bellard
CPUPPCState *cpu_ppc_init(void);
173 79aceca5 bellard
int cpu_ppc_exec(CPUPPCState *s);
174 79aceca5 bellard
void cpu_ppc_close(CPUPPCState *s);
175 79aceca5 bellard
/* you can call this signal handler from your SIGBUS and SIGSEGV
176 79aceca5 bellard
   signal handlers to inform the virtual CPU of exceptions. non zero
177 79aceca5 bellard
   is returned if the signal was handled by the virtual CPU.  */
178 79aceca5 bellard
struct siginfo;
179 79aceca5 bellard
int cpu_ppc_signal_handler(int host_signum, struct siginfo *info, 
180 79aceca5 bellard
                           void *puc);
181 79aceca5 bellard
182 79aceca5 bellard
void cpu_ppc_dump_state(CPUPPCState *env, FILE *f, int flags);
183 9a64fbe4 bellard
void cpu_loop_exit(void);
184 9a64fbe4 bellard
void dump_stack (CPUPPCState *env);
185 9a64fbe4 bellard
uint32_t _load_xer (void);
186 9a64fbe4 bellard
void _store_xer (uint32_t value);
187 9a64fbe4 bellard
uint32_t _load_msr (void);
188 9a64fbe4 bellard
void _store_msr (uint32_t value);
189 9a64fbe4 bellard
void do_interrupt (CPUPPCState *env);
190 79aceca5 bellard
191 79aceca5 bellard
#define TARGET_PAGE_BITS 12
192 79aceca5 bellard
#include "cpu-all.h"
193 79aceca5 bellard
194 79aceca5 bellard
#define ugpr(n) (env->gpr[n])
195 9a64fbe4 bellard
#define fprd(n) (env->fpr[n])
196 9a64fbe4 bellard
#define fprs(n) ((float)env->fpr[n])
197 9a64fbe4 bellard
#define fpru(n) ((uint32_t)env->fpr[n])
198 9a64fbe4 bellard
#define fpri(n) ((int32_t)env->fpr[n])
199 79aceca5 bellard
200 79aceca5 bellard
#define SPR_ENCODE(sprn)                               \
201 79aceca5 bellard
(((sprn) >> 5) | (((sprn) & 0x1F) << 5))
202 79aceca5 bellard
203 79aceca5 bellard
/* User mode SPR */
204 79aceca5 bellard
#define spr(n) env->spr[n]
205 79aceca5 bellard
#define XER_SO 31
206 79aceca5 bellard
#define XER_OV 30
207 79aceca5 bellard
#define XER_CA 29
208 79aceca5 bellard
#define XER_BC 0
209 9a64fbe4 bellard
#define xer_so env->xer[3]
210 9a64fbe4 bellard
#define xer_ov env->xer[2]
211 9a64fbe4 bellard
#define xer_ca env->xer[1]
212 9a64fbe4 bellard
#define xer_bc env->xer[0]
213 79aceca5 bellard
214 9a64fbe4 bellard
#define XER    SPR_ENCODE(1)
215 9a64fbe4 bellard
#define LR     SPR_ENCODE(8)
216 9a64fbe4 bellard
#define CTR    SPR_ENCODE(9)
217 79aceca5 bellard
/* VEA mode SPR */
218 9a64fbe4 bellard
#define V_TBL  SPR_ENCODE(268)
219 9a64fbe4 bellard
#define V_TBU  SPR_ENCODE(269)
220 79aceca5 bellard
/* supervisor mode SPR */
221 9a64fbe4 bellard
#define DSISR  SPR_ENCODE(18)
222 9a64fbe4 bellard
#define DAR    SPR_ENCODE(19)
223 9a64fbe4 bellard
#define DECR   SPR_ENCODE(22)
224 9a64fbe4 bellard
#define SDR1   SPR_ENCODE(25)
225 9a64fbe4 bellard
#define SRR0   SPR_ENCODE(26)
226 9a64fbe4 bellard
#define SRR1   SPR_ENCODE(27)
227 9a64fbe4 bellard
#define SPRG0  SPR_ENCODE(272)
228 9a64fbe4 bellard
#define SPRG1  SPR_ENCODE(273)
229 9a64fbe4 bellard
#define SPRG2  SPR_ENCODE(274)
230 9a64fbe4 bellard
#define SPRG3  SPR_ENCODE(275)
231 9a64fbe4 bellard
#define SPRG4  SPR_ENCODE(276)
232 9a64fbe4 bellard
#define SPRG5  SPR_ENCODE(277)
233 9a64fbe4 bellard
#define SPRG6  SPR_ENCODE(278)
234 9a64fbe4 bellard
#define SPRG7  SPR_ENCODE(279)
235 9a64fbe4 bellard
#define ASR    SPR_ENCODE(280)
236 9a64fbe4 bellard
#define EAR    SPR_ENCODE(282)
237 9a64fbe4 bellard
#define O_TBL  SPR_ENCODE(284)
238 9a64fbe4 bellard
#define O_TBU  SPR_ENCODE(285)
239 9a64fbe4 bellard
#define PVR    SPR_ENCODE(287)
240 9a64fbe4 bellard
#define IBAT0U SPR_ENCODE(528)
241 9a64fbe4 bellard
#define IBAT0L SPR_ENCODE(529)
242 9a64fbe4 bellard
#define IBAT1U SPR_ENCODE(530)
243 9a64fbe4 bellard
#define IBAT1L SPR_ENCODE(531)
244 9a64fbe4 bellard
#define IBAT2U SPR_ENCODE(532)
245 9a64fbe4 bellard
#define IBAT2L SPR_ENCODE(533)
246 9a64fbe4 bellard
#define IBAT3U SPR_ENCODE(534)
247 9a64fbe4 bellard
#define IBAT3L SPR_ENCODE(535)
248 9a64fbe4 bellard
#define DBAT0U SPR_ENCODE(536)
249 9a64fbe4 bellard
#define DBAT0L SPR_ENCODE(537)
250 9a64fbe4 bellard
#define DBAT1U SPR_ENCODE(538)
251 9a64fbe4 bellard
#define DBAT1L SPR_ENCODE(539)
252 9a64fbe4 bellard
#define DBAT2U SPR_ENCODE(540)
253 9a64fbe4 bellard
#define DBAT2L SPR_ENCODE(541)
254 9a64fbe4 bellard
#define DBAT3U SPR_ENCODE(542)
255 9a64fbe4 bellard
#define DBAT3L SPR_ENCODE(543)
256 9a64fbe4 bellard
#define IBAT4U SPR_ENCODE(560)
257 9a64fbe4 bellard
#define IBAT4L SPR_ENCODE(561)
258 9a64fbe4 bellard
#define IBAT5U SPR_ENCODE(562)
259 9a64fbe4 bellard
#define IBAT5L SPR_ENCODE(563)
260 9a64fbe4 bellard
#define IBAT6U SPR_ENCODE(564)
261 9a64fbe4 bellard
#define IBAT6L SPR_ENCODE(565)
262 9a64fbe4 bellard
#define IBAT7U SPR_ENCODE(566)
263 9a64fbe4 bellard
#define IBAT7L SPR_ENCODE(567)
264 9a64fbe4 bellard
#define DBAT4U SPR_ENCODE(568)
265 9a64fbe4 bellard
#define DBAT4L SPR_ENCODE(569)
266 9a64fbe4 bellard
#define DBAT5U SPR_ENCODE(570)
267 9a64fbe4 bellard
#define DBAT5L SPR_ENCODE(571)
268 9a64fbe4 bellard
#define DBAT6U SPR_ENCODE(572)
269 9a64fbe4 bellard
#define DBAT6L SPR_ENCODE(573)
270 9a64fbe4 bellard
#define DBAT7U SPR_ENCODE(574)
271 9a64fbe4 bellard
#define DBAT7L SPR_ENCODE(575)
272 9a64fbe4 bellard
#define DABR   SPR_ENCODE(1013)
273 79aceca5 bellard
#define DABR_MASK 0xFFFFFFF8
274 9a64fbe4 bellard
#define FPECR  SPR_ENCODE(1022)
275 9a64fbe4 bellard
#define PIR    SPR_ENCODE(1023)
276 79aceca5 bellard
277 79aceca5 bellard
#define TARGET_PAGE_BITS 12
278 79aceca5 bellard
#include "cpu-all.h"
279 79aceca5 bellard
280 79aceca5 bellard
CPUPPCState *cpu_ppc_init(void);
281 79aceca5 bellard
int cpu_ppc_exec(CPUPPCState *s);
282 79aceca5 bellard
void cpu_ppc_close(CPUPPCState *s);
283 79aceca5 bellard
void cpu_ppc_dump_state(CPUPPCState *env, FILE *f, int flags);
284 9a64fbe4 bellard
void PPC_init_hw (CPUPPCState *env, uint32_t mem_size,
285 9a64fbe4 bellard
                  uint32_t kernel_addr, uint32_t kernel_size,
286 9a64fbe4 bellard
                  uint32_t stack_addr, int boot_device);
287 79aceca5 bellard
288 9a64fbe4 bellard
/* Memory access type :
289 9a64fbe4 bellard
 * may be needed for precise access rights control and precise exceptions.
290 9a64fbe4 bellard
 */
291 79aceca5 bellard
enum {
292 9a64fbe4 bellard
    /* 1 bit to define user level / supervisor access */
293 9a64fbe4 bellard
    ACCESS_USER  = 0x00,
294 9a64fbe4 bellard
    ACCESS_SUPER = 0x01,
295 9a64fbe4 bellard
    /* Type of instruction that generated the access */
296 9a64fbe4 bellard
    ACCESS_CODE  = 0x10, /* Code fetch access                */
297 9a64fbe4 bellard
    ACCESS_INT   = 0x20, /* Integer load/store access        */
298 9a64fbe4 bellard
    ACCESS_FLOAT = 0x30, /* floating point load/store access */
299 9a64fbe4 bellard
    ACCESS_RES   = 0x40, /* load/store with reservation      */
300 9a64fbe4 bellard
    ACCESS_EXT   = 0x50, /* external access                  */
301 9a64fbe4 bellard
    ACCESS_CACHE = 0x60, /* Cache manipulation               */
302 9a64fbe4 bellard
};
303 9a64fbe4 bellard
304 9a64fbe4 bellard
/*****************************************************************************/
305 9a64fbe4 bellard
/* Exceptions */
306 9a64fbe4 bellard
enum {
307 9a64fbe4 bellard
    EXCP_NONE          = -1,
308 79aceca5 bellard
    /* PPC hardware exceptions : exception vector / 0x100 */
309 79aceca5 bellard
    EXCP_RESET         = 0x01, /* System reset                     */
310 79aceca5 bellard
    EXCP_MACHINE_CHECK = 0x02, /* Machine check exception          */
311 79aceca5 bellard
    EXCP_DSI           = 0x03, /* Impossible memory access         */
312 79aceca5 bellard
    EXCP_ISI           = 0x04, /* Impossible instruction fetch     */
313 79aceca5 bellard
    EXCP_EXTERNAL      = 0x05, /* External interruption            */
314 79aceca5 bellard
    EXCP_ALIGN         = 0x06, /* Alignment exception              */
315 79aceca5 bellard
    EXCP_PROGRAM       = 0x07, /* Program exception                */
316 79aceca5 bellard
    EXCP_NO_FP         = 0x08, /* No floating point                */
317 79aceca5 bellard
    EXCP_DECR          = 0x09, /* Decrementer exception            */
318 79aceca5 bellard
    EXCP_RESA          = 0x0A, /* Implementation specific          */
319 79aceca5 bellard
    EXCP_RESB          = 0x0B, /* Implementation specific          */
320 79aceca5 bellard
    EXCP_SYSCALL       = 0x0C, /* System call                      */
321 79aceca5 bellard
    EXCP_TRACE         = 0x0D, /* Trace exception (optional)       */
322 79aceca5 bellard
    EXCP_FP_ASSIST     = 0x0E, /* Floating-point assist (optional) */
323 9a64fbe4 bellard
    /* MPC740/745/750 & IBM 750 */
324 9a64fbe4 bellard
    EXCP_PERF          = 0x0F,  /* Performance monitor              */
325 9a64fbe4 bellard
    EXCP_IABR          = 0x13,  /* Instruction address breakpoint   */
326 9a64fbe4 bellard
    EXCP_SMI           = 0x14,  /* System management interrupt      */
327 9a64fbe4 bellard
    EXCP_THRM          = 0x15,  /* Thermal management interrupt     */
328 9a64fbe4 bellard
    /* MPC755 */
329 9a64fbe4 bellard
    EXCP_TLBMISS       = 0x10,  /* Instruction TLB miss             */
330 9a64fbe4 bellard
    EXCP_TLBMISS_DL    = 0x11,  /* Data TLB miss for load           */
331 9a64fbe4 bellard
    EXCP_TLBMISS_DS    = 0x12,  /* Data TLB miss for store          */
332 9a64fbe4 bellard
    EXCP_PPC_MAX       = 0x16,
333 9a64fbe4 bellard
    /* Qemu exception */
334 9a64fbe4 bellard
    EXCP_OFCALL        = 0x20,  /* Call open-firmware emulator      */
335 9a64fbe4 bellard
    EXCP_RTASCALL      = 0x21,  /* Call RTAS emulator               */
336 9a64fbe4 bellard
    /* Special cases where we want to stop translation */
337 9a64fbe4 bellard
    EXCP_MTMSR         = 0x104, /* mtmsr instruction:               */
338 9a64fbe4 bellard
                                /* may change privilege level       */
339 9a64fbe4 bellard
    EXCP_BRANCH        = 0x108, /* branch instruction               */
340 9a64fbe4 bellard
    EXCP_RFI           = 0x10C, /* return from interrupt            */
341 9a64fbe4 bellard
    EXCP_SYSCALL_USER  = 0x110, /* System call in user mode only    */
342 9a64fbe4 bellard
};
343 9a64fbe4 bellard
/* Error codes */
344 9a64fbe4 bellard
enum {
345 9a64fbe4 bellard
    /* Exception subtypes for EXCP_DSI                              */
346 9a64fbe4 bellard
    EXCP_DSI_TRANSLATE = 0x01,  /* Data address can't be translated */
347 9a64fbe4 bellard
    EXCP_DSI_NOTSUP    = 0x02,  /* Access type not supported        */
348 9a64fbe4 bellard
    EXCP_DSI_PROT      = 0x03,  /* Memory protection violation      */
349 9a64fbe4 bellard
    EXCP_DSI_EXTERNAL  = 0x04,  /* External access disabled         */
350 9a64fbe4 bellard
    EXCP_DSI_DABR      = 0x05,  /* Data address breakpoint          */
351 9a64fbe4 bellard
    /* flags for EXCP_DSI */
352 9a64fbe4 bellard
    EXCP_DSI_DIRECT    = 0x10,
353 9a64fbe4 bellard
    EXCP_DSI_STORE     = 0x20,
354 9a64fbe4 bellard
    EXCP_ECXW          = 0x40,
355 9a64fbe4 bellard
    /* Exception subtypes for EXCP_ISI                              */
356 9a64fbe4 bellard
    EXCP_ISI_TRANSLATE = 0x01,  /* Code address can't be translated */
357 9a64fbe4 bellard
    EXCP_ISI_NOEXEC    = 0x02,  /* Try to fetch from a data segment */
358 9a64fbe4 bellard
    EXCP_ISI_GUARD     = 0x03,  /* Fetch from guarded memory        */
359 9a64fbe4 bellard
    EXCP_ISI_PROT      = 0x04,  /* Memory protection violation      */
360 9a64fbe4 bellard
    /* Exception subtypes for EXCP_ALIGN                            */
361 9a64fbe4 bellard
    EXCP_ALIGN_FP      = 0x01,  /* FP alignment exception           */
362 9a64fbe4 bellard
    EXCP_ALIGN_LST     = 0x02,  /* Unaligned mult/extern load/store */
363 9a64fbe4 bellard
    EXCP_ALIGN_LE      = 0x03,  /* Multiple little-endian access    */
364 9a64fbe4 bellard
    EXCP_ALIGN_PROT    = 0x04,  /* Access cross protection boundary */
365 9a64fbe4 bellard
    EXCP_ALIGN_BAT     = 0x05,  /* Access cross a BAT/seg boundary  */
366 9a64fbe4 bellard
    EXCP_ALIGN_CACHE   = 0x06,  /* Impossible dcbz access           */
367 9a64fbe4 bellard
    /* Exception subtypes for EXCP_PROGRAM                          */
368 79aceca5 bellard
    /* FP exceptions */
369 9a64fbe4 bellard
    EXCP_FP            = 0x10,
370 9a64fbe4 bellard
    EXCP_FP_OX         = 0x01,  /* FP overflow                      */
371 9a64fbe4 bellard
    EXCP_FP_UX         = 0x02,  /* FP underflow                     */
372 9a64fbe4 bellard
    EXCP_FP_ZX         = 0x03,  /* FP divide by zero                */
373 9a64fbe4 bellard
    EXCP_FP_XX         = 0x04,  /* FP inexact                       */
374 9a64fbe4 bellard
    EXCP_FP_VXNAN      = 0x05,  /* FP invalid SNaN op               */
375 9a64fbe4 bellard
    EXCP_FP_VXISI      = 0x06,  /* FP invalid infinite substraction */
376 9a64fbe4 bellard
    EXCP_FP_VXIDI      = 0x07,  /* FP invalid infinite divide       */
377 9a64fbe4 bellard
    EXCP_FP_VXZDZ      = 0x08,  /* FP invalid zero divide           */
378 9a64fbe4 bellard
    EXCP_FP_VXIMZ      = 0x09,  /* FP invalid infinite * zero       */
379 9a64fbe4 bellard
    EXCP_FP_VXVC       = 0x0A,  /* FP invalid compare               */
380 9a64fbe4 bellard
    EXCP_FP_VXSOFT     = 0x0B,  /* FP invalid operation             */
381 9a64fbe4 bellard
    EXCP_FP_VXSQRT     = 0x0C,  /* FP invalid square root           */
382 9a64fbe4 bellard
    EXCP_FP_VXCVI      = 0x0D,  /* FP invalid integer conversion    */
383 79aceca5 bellard
    /* Invalid instruction */
384 9a64fbe4 bellard
    EXCP_INVAL         = 0x20,
385 9a64fbe4 bellard
    EXCP_INVAL_INVAL   = 0x01,  /* Invalid instruction              */
386 9a64fbe4 bellard
    EXCP_INVAL_LSWX    = 0x02,  /* Invalid lswx instruction         */
387 9a64fbe4 bellard
    EXCP_INVAL_SPR     = 0x03,  /* Invalid SPR access               */
388 9a64fbe4 bellard
    EXCP_INVAL_FP      = 0x04,  /* Unimplemented mandatory fp instr */
389 79aceca5 bellard
    /* Privileged instruction */
390 9a64fbe4 bellard
    EXCP_PRIV          = 0x30,
391 9a64fbe4 bellard
    EXCP_PRIV_OPC      = 0x01,
392 9a64fbe4 bellard
    EXCP_PRIV_REG      = 0x02,
393 79aceca5 bellard
    /* Trap */
394 9a64fbe4 bellard
    EXCP_TRAP          = 0x40,
395 79aceca5 bellard
};
396 79aceca5 bellard
397 9a64fbe4 bellard
/*****************************************************************************/
398 9a64fbe4 bellard
399 79aceca5 bellard
#endif /* !defined (__CPU_PPC_H__) */