Statistics
| Branch: | Revision:

root / target-ppc / cpu.h @ 38a64f9d

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