Statistics
| Branch: | Revision:

root / target-ppc / cpu.h @ f9fdea6b

History | View | Annotate | Download (46.3 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 3fc6c082 bellard
/*****************************************************************************/
86 a750fc0b j_mayer
/* MMU model                                                                 */
87 3fc6c082 bellard
enum {
88 a750fc0b j_mayer
    POWERPC_MMU_UNKNOWN    = 0,
89 a750fc0b j_mayer
    /* Standard 32 bits PowerPC MMU                            */
90 a750fc0b j_mayer
    POWERPC_MMU_32B,
91 a750fc0b j_mayer
    /* PowerPC 6xx MMU with software TLB                       */
92 a750fc0b j_mayer
    POWERPC_MMU_SOFT_6xx,
93 a750fc0b j_mayer
    /* PowerPC 74xx MMU with software TLB                      */
94 a750fc0b j_mayer
    POWERPC_MMU_SOFT_74xx,
95 a750fc0b j_mayer
    /* PowerPC 4xx MMU with software TLB                       */
96 a750fc0b j_mayer
    POWERPC_MMU_SOFT_4xx,
97 a750fc0b j_mayer
    /* PowerPC 4xx MMU with software TLB and zones protections */
98 a750fc0b j_mayer
    POWERPC_MMU_SOFT_4xx_Z,
99 a750fc0b j_mayer
    /* PowerPC 4xx MMU in real mode only                       */
100 a750fc0b j_mayer
    POWERPC_MMU_REAL_4xx,
101 a750fc0b j_mayer
    /* BookE MMU model                                         */
102 a750fc0b j_mayer
    POWERPC_MMU_BOOKE,
103 a750fc0b j_mayer
    /* BookE FSL MMU model                                     */
104 a750fc0b j_mayer
    POWERPC_MMU_BOOKE_FSL,
105 00af685f j_mayer
#if defined(TARGET_PPC64)
106 12de9a39 j_mayer
    /* 64 bits PowerPC MMU                                     */
107 00af685f j_mayer
    POWERPC_MMU_64B,
108 00af685f j_mayer
#endif /* defined(TARGET_PPC64) */
109 3fc6c082 bellard
};
110 3fc6c082 bellard
111 3fc6c082 bellard
/*****************************************************************************/
112 a750fc0b j_mayer
/* Exception model                                                           */
113 3fc6c082 bellard
enum {
114 a750fc0b j_mayer
    POWERPC_EXCP_UNKNOWN   = 0,
115 3fc6c082 bellard
    /* Standard PowerPC exception model */
116 a750fc0b j_mayer
    POWERPC_EXCP_STD,
117 2662a059 j_mayer
    /* PowerPC 40x exception model      */
118 a750fc0b j_mayer
    POWERPC_EXCP_40x,
119 2662a059 j_mayer
    /* PowerPC 601 exception model      */
120 a750fc0b j_mayer
    POWERPC_EXCP_601,
121 2662a059 j_mayer
    /* PowerPC 602 exception model      */
122 a750fc0b j_mayer
    POWERPC_EXCP_602,
123 2662a059 j_mayer
    /* PowerPC 603 exception model      */
124 a750fc0b j_mayer
    POWERPC_EXCP_603,
125 a750fc0b j_mayer
    /* PowerPC 603e exception model     */
126 a750fc0b j_mayer
    POWERPC_EXCP_603E,
127 a750fc0b j_mayer
    /* PowerPC G2 exception model       */
128 a750fc0b j_mayer
    POWERPC_EXCP_G2,
129 2662a059 j_mayer
    /* PowerPC 604 exception model      */
130 a750fc0b j_mayer
    POWERPC_EXCP_604,
131 2662a059 j_mayer
    /* PowerPC 7x0 exception model      */
132 a750fc0b j_mayer
    POWERPC_EXCP_7x0,
133 2662a059 j_mayer
    /* PowerPC 7x5 exception model      */
134 a750fc0b j_mayer
    POWERPC_EXCP_7x5,
135 2662a059 j_mayer
    /* PowerPC 74xx exception model     */
136 a750fc0b j_mayer
    POWERPC_EXCP_74xx,
137 2662a059 j_mayer
    /* BookE exception model            */
138 a750fc0b j_mayer
    POWERPC_EXCP_BOOKE,
139 00af685f j_mayer
#if defined(TARGET_PPC64)
140 00af685f j_mayer
    /* PowerPC 970 exception model      */
141 00af685f j_mayer
    POWERPC_EXCP_970,
142 00af685f j_mayer
#endif /* defined(TARGET_PPC64) */
143 a750fc0b j_mayer
};
144 a750fc0b j_mayer
145 a750fc0b j_mayer
/*****************************************************************************/
146 e1833e1f j_mayer
/* Exception vectors definitions                                             */
147 e1833e1f j_mayer
enum {
148 e1833e1f j_mayer
    POWERPC_EXCP_NONE    = -1,
149 e1833e1f j_mayer
    /* The 64 first entries are used by the PowerPC embedded specification   */
150 e1833e1f j_mayer
    POWERPC_EXCP_CRITICAL = 0,  /* Critical input                            */
151 e1833e1f j_mayer
    POWERPC_EXCP_MCHECK   = 1,  /* Machine check exception                   */
152 e1833e1f j_mayer
    POWERPC_EXCP_DSI      = 2,  /* Data storage exception                    */
153 e1833e1f j_mayer
    POWERPC_EXCP_ISI      = 3,  /* Instruction storage exception             */
154 e1833e1f j_mayer
    POWERPC_EXCP_EXTERNAL = 4,  /* External input                            */
155 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN    = 5,  /* Alignment exception                       */
156 e1833e1f j_mayer
    POWERPC_EXCP_PROGRAM  = 6,  /* Program exception                         */
157 e1833e1f j_mayer
    POWERPC_EXCP_FPU      = 7,  /* Floating-point unavailable exception      */
158 e1833e1f j_mayer
    POWERPC_EXCP_SYSCALL  = 8,  /* System call exception                     */
159 e1833e1f j_mayer
    POWERPC_EXCP_APU      = 9,  /* Auxiliary processor unavailable           */
160 e1833e1f j_mayer
    POWERPC_EXCP_DECR     = 10, /* Decrementer exception                     */
161 e1833e1f j_mayer
    POWERPC_EXCP_FIT      = 11, /* Fixed-interval timer interrupt            */
162 e1833e1f j_mayer
    POWERPC_EXCP_WDT      = 12, /* Watchdog timer interrupt                  */
163 e1833e1f j_mayer
    POWERPC_EXCP_DTLB     = 13, /* Data TLB error                            */
164 e1833e1f j_mayer
    POWERPC_EXCP_ITLB     = 14, /* Instruction TLB error                     */
165 e1833e1f j_mayer
    POWERPC_EXCP_DEBUG    = 15, /* Debug interrupt                           */
166 e1833e1f j_mayer
    /* Vectors 16 to 31 are reserved                                         */
167 e1833e1f j_mayer
#if defined(TARGET_PPCEMB)
168 e1833e1f j_mayer
    POWERPC_EXCP_SPEU     = 32, /* SPE/embedded floating-point unavailable   */
169 e1833e1f j_mayer
    POWERPC_EXCP_EFPDI    = 33, /* Embedded floating-point data interrupt    */
170 e1833e1f j_mayer
    POWERPC_EXCP_EFPRI    = 34, /* Embedded floating-point round interrupt   */
171 e1833e1f j_mayer
    POWERPC_EXCP_EPERFM   = 35, /* Embedded performance monitor interrupt    */
172 e1833e1f j_mayer
    POWERPC_EXCP_DOORI    = 36, /* Embedded doorbell interrupt               */
173 e1833e1f j_mayer
    POWERPC_EXCP_DOORCI   = 37, /* Embedded doorbell critical interrupt      */
174 e1833e1f j_mayer
#endif /* defined(TARGET_PPCEMB) */
175 e1833e1f j_mayer
    /* Vectors 38 to 63 are reserved                                         */
176 e1833e1f j_mayer
    /* Exceptions defined in the PowerPC server specification                */
177 e1833e1f j_mayer
    POWERPC_EXCP_RESET    = 64, /* System reset exception                    */
178 e1833e1f j_mayer
#if defined(TARGET_PPC64) /* PowerPC 64 */
179 e1833e1f j_mayer
    POWERPC_EXCP_DSEG     = 65, /* Data segment exception                    */
180 e1833e1f j_mayer
    POWERPC_EXCP_ISEG     = 66, /* Instruction segment exception             */
181 e1833e1f j_mayer
#endif /* defined(TARGET_PPC64) */
182 e1833e1f j_mayer
#if defined(TARGET_PPC64H) /* PowerPC 64 with hypervisor mode support */
183 e1833e1f j_mayer
    POWERPC_EXCP_HDECR    = 67, /* Hypervisor decrementer exception          */
184 e1833e1f j_mayer
#endif /* defined(TARGET_PPC64H) */
185 e1833e1f j_mayer
    POWERPC_EXCP_TRACE    = 68, /* Trace exception                           */
186 e1833e1f j_mayer
#if defined(TARGET_PPC64H) /* PowerPC 64 with hypervisor mode support */
187 e1833e1f j_mayer
    POWERPC_EXCP_HDSI     = 69, /* Hypervisor data storage exception         */
188 e1833e1f j_mayer
    POWERPC_EXCP_HISI     = 70, /* Hypervisor instruction storage exception  */
189 e1833e1f j_mayer
    POWERPC_EXCP_HDSEG    = 71, /* Hypervisor data segment exception         */
190 e1833e1f j_mayer
    POWERPC_EXCP_HISEG    = 72, /* Hypervisor instruction segment exception  */
191 e1833e1f j_mayer
#endif /* defined(TARGET_PPC64H) */
192 e1833e1f j_mayer
    POWERPC_EXCP_VPU      = 73, /* Vector unavailable exception              */
193 e1833e1f j_mayer
    /* 40x specific exceptions                                               */
194 e1833e1f j_mayer
    POWERPC_EXCP_PIT      = 74, /* Programmable interval timer interrupt     */
195 e1833e1f j_mayer
    /* 601 specific exceptions                                               */
196 e1833e1f j_mayer
    POWERPC_EXCP_IO       = 75, /* IO error exception                        */
197 e1833e1f j_mayer
    POWERPC_EXCP_RUNM     = 76, /* Run mode exception                        */
198 e1833e1f j_mayer
    /* 602 specific exceptions                                               */
199 e1833e1f j_mayer
    POWERPC_EXCP_EMUL     = 77, /* Emulation trap exception                  */
200 e1833e1f j_mayer
    /* 602/603 specific exceptions                                           */
201 e1833e1f j_mayer
    POWERPC_EXCP_IFTLB    = 78, /* Instruction fetch TLB error               */
202 e1833e1f j_mayer
    POWERPC_EXCP_DLTLB    = 79, /* Data load TLB miss                        */
203 e1833e1f j_mayer
    POWERPC_EXCP_DSTLB    = 80, /* Data store TLB miss                       */
204 e1833e1f j_mayer
    /* Exceptions available on most PowerPC                                  */
205 e1833e1f j_mayer
    POWERPC_EXCP_FPA      = 81, /* Floating-point assist exception           */
206 e1833e1f j_mayer
    POWERPC_EXCP_IABR     = 82, /* Instruction address breakpoint            */
207 e1833e1f j_mayer
    POWERPC_EXCP_SMI      = 83, /* System management interrupt               */
208 e1833e1f j_mayer
    POWERPC_EXCP_PERFM    = 84, /* Embedded performance monitor interrupt    */
209 e1833e1f j_mayer
    /* 7xx/74xx specific exceptions                                          */
210 e1833e1f j_mayer
    POWERPC_EXCP_THERM    = 85, /* Thermal interrupt                         */
211 e1833e1f j_mayer
    /* 74xx specific exceptions                                              */
212 e1833e1f j_mayer
    POWERPC_EXCP_VPUA     = 86, /* Vector assist exception                   */
213 e1833e1f j_mayer
    /* 970FX specific exceptions                                             */
214 e1833e1f j_mayer
    POWERPC_EXCP_SOFTP    = 87, /* Soft patch exception                      */
215 e1833e1f j_mayer
    POWERPC_EXCP_MAINT    = 88, /* Maintenance exception                     */
216 e1833e1f j_mayer
    /* EOL                                                                   */
217 e1833e1f j_mayer
    POWERPC_EXCP_NB       = 96,
218 e1833e1f j_mayer
    /* Qemu exceptions: used internally during code translation              */
219 e1833e1f j_mayer
    POWERPC_EXCP_STOP         = 0x200, /* stop translation                   */
220 e1833e1f j_mayer
    POWERPC_EXCP_BRANCH       = 0x201, /* branch instruction                 */
221 e1833e1f j_mayer
    /* Qemu exceptions: special cases we want to stop translation            */
222 e1833e1f j_mayer
    POWERPC_EXCP_SYNC         = 0x202, /* context synchronizing instruction  */
223 e1833e1f j_mayer
    POWERPC_EXCP_SYSCALL_USER = 0x203, /* System call in user mode only      */
224 e1833e1f j_mayer
};
225 e1833e1f j_mayer
226 e1833e1f j_mayer
/* Exceptions error codes                                                    */
227 e1833e1f j_mayer
enum {
228 e1833e1f j_mayer
    /* Exception subtypes for POWERPC_EXCP_ALIGN                             */
229 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_FP      = 0x01,  /* FP alignment exception            */
230 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_LST     = 0x02,  /* Unaligned mult/extern load/store  */
231 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_LE      = 0x03,  /* Multiple little-endian access     */
232 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_PROT    = 0x04,  /* Access cross protection boundary  */
233 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_BAT     = 0x05,  /* Access cross a BAT/seg boundary   */
234 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_CACHE   = 0x06,  /* Impossible dcbz access            */
235 e1833e1f j_mayer
    /* Exception subtypes for POWERPC_EXCP_PROGRAM                           */
236 e1833e1f j_mayer
    /* FP exceptions                                                         */
237 e1833e1f j_mayer
    POWERPC_EXCP_FP            = 0x10,
238 e1833e1f j_mayer
    POWERPC_EXCP_FP_OX         = 0x01,  /* FP overflow                       */
239 e1833e1f j_mayer
    POWERPC_EXCP_FP_UX         = 0x02,  /* FP underflow                      */
240 e1833e1f j_mayer
    POWERPC_EXCP_FP_ZX         = 0x03,  /* FP divide by zero                 */
241 e1833e1f j_mayer
    POWERPC_EXCP_FP_XX         = 0x04,  /* FP inexact                        */
242 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXNAN      = 0x05,  /* FP invalid SNaN op                */
243 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXISI      = 0x06,  /* FP invalid infinite subtraction   */
244 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXIDI      = 0x07,  /* FP invalid infinite divide        */
245 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXZDZ      = 0x08,  /* FP invalid zero divide            */
246 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXIMZ      = 0x09,  /* FP invalid infinite * zero        */
247 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXVC       = 0x0A,  /* FP invalid compare                */
248 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXSOFT     = 0x0B,  /* FP invalid operation              */
249 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXSQRT     = 0x0C,  /* FP invalid square root            */
250 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXCVI      = 0x0D,  /* FP invalid integer conversion     */
251 e1833e1f j_mayer
    /* Invalid instruction                                                   */
252 e1833e1f j_mayer
    POWERPC_EXCP_INVAL         = 0x20,
253 e1833e1f j_mayer
    POWERPC_EXCP_INVAL_INVAL   = 0x01,  /* Invalid instruction               */
254 e1833e1f j_mayer
    POWERPC_EXCP_INVAL_LSWX    = 0x02,  /* Invalid lswx instruction          */
255 e1833e1f j_mayer
    POWERPC_EXCP_INVAL_SPR     = 0x03,  /* Invalid SPR access                */
256 e1833e1f j_mayer
    POWERPC_EXCP_INVAL_FP      = 0x04,  /* Unimplemented mandatory fp instr  */
257 e1833e1f j_mayer
    /* Privileged instruction                                                */
258 e1833e1f j_mayer
    POWERPC_EXCP_PRIV          = 0x30,
259 e1833e1f j_mayer
    POWERPC_EXCP_PRIV_OPC      = 0x01,  /* Privileged operation exception    */
260 e1833e1f j_mayer
    POWERPC_EXCP_PRIV_REG      = 0x02,  /* Privileged register exception     */
261 e1833e1f j_mayer
    /* Trap                                                                  */
262 e1833e1f j_mayer
    POWERPC_EXCP_TRAP          = 0x40,
263 e1833e1f j_mayer
};
264 e1833e1f j_mayer
265 e1833e1f j_mayer
/*****************************************************************************/
266 a750fc0b j_mayer
/* Input pins model                                                          */
267 a750fc0b j_mayer
enum {
268 a750fc0b j_mayer
    PPC_FLAGS_INPUT_UNKNOWN = 0,
269 2662a059 j_mayer
    /* PowerPC 6xx bus                  */
270 a750fc0b j_mayer
    PPC_FLAGS_INPUT_6xx,
271 2662a059 j_mayer
    /* BookE bus                        */
272 a750fc0b j_mayer
    PPC_FLAGS_INPUT_BookE,
273 a750fc0b j_mayer
    /* PowerPC 405 bus                  */
274 a750fc0b j_mayer
    PPC_FLAGS_INPUT_405,
275 2662a059 j_mayer
    /* PowerPC 970 bus                  */
276 a750fc0b j_mayer
    PPC_FLAGS_INPUT_970,
277 a750fc0b j_mayer
    /* PowerPC 401 bus                  */
278 a750fc0b j_mayer
    PPC_FLAGS_INPUT_401,
279 3fc6c082 bellard
};
280 3fc6c082 bellard
281 a750fc0b j_mayer
#define PPC_INPUT(env) (env->bus_model)
282 3fc6c082 bellard
283 be147d08 j_mayer
/*****************************************************************************/
284 3fc6c082 bellard
typedef struct ppc_def_t ppc_def_t;
285 a750fc0b j_mayer
typedef struct opc_handler_t opc_handler_t;
286 79aceca5 bellard
287 3fc6c082 bellard
/*****************************************************************************/
288 3fc6c082 bellard
/* Types used to describe some PowerPC registers */
289 3fc6c082 bellard
typedef struct CPUPPCState CPUPPCState;
290 9fddaa0c bellard
typedef struct ppc_tb_t ppc_tb_t;
291 3fc6c082 bellard
typedef struct ppc_spr_t ppc_spr_t;
292 3fc6c082 bellard
typedef struct ppc_dcr_t ppc_dcr_t;
293 a9d9eb8f j_mayer
typedef union ppc_avr_t ppc_avr_t;
294 1d0a48fb j_mayer
typedef union ppc_tlb_t ppc_tlb_t;
295 76a66253 j_mayer
296 3fc6c082 bellard
/* SPR access micro-ops generations callbacks */
297 3fc6c082 bellard
struct ppc_spr_t {
298 3fc6c082 bellard
    void (*uea_read)(void *opaque, int spr_num);
299 3fc6c082 bellard
    void (*uea_write)(void *opaque, int spr_num);
300 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
301 3fc6c082 bellard
    void (*oea_read)(void *opaque, int spr_num);
302 3fc6c082 bellard
    void (*oea_write)(void *opaque, int spr_num);
303 be147d08 j_mayer
#if defined(TARGET_PPC64H)
304 be147d08 j_mayer
    void (*hea_read)(void *opaque, int spr_num);
305 be147d08 j_mayer
    void (*hea_write)(void *opaque, int spr_num);
306 be147d08 j_mayer
#endif
307 76a66253 j_mayer
#endif
308 3fc6c082 bellard
    const unsigned char *name;
309 3fc6c082 bellard
};
310 3fc6c082 bellard
311 3fc6c082 bellard
/* Altivec registers (128 bits) */
312 a9d9eb8f j_mayer
union ppc_avr_t {
313 a9d9eb8f j_mayer
    uint8_t u8[16];
314 a9d9eb8f j_mayer
    uint16_t u16[8];
315 a9d9eb8f j_mayer
    uint32_t u32[4];
316 a9d9eb8f j_mayer
    uint64_t u64[2];
317 3fc6c082 bellard
};
318 9fddaa0c bellard
319 3fc6c082 bellard
/* Software TLB cache */
320 1d0a48fb j_mayer
typedef struct ppc6xx_tlb_t ppc6xx_tlb_t;
321 1d0a48fb j_mayer
struct ppc6xx_tlb_t {
322 76a66253 j_mayer
    target_ulong pte0;
323 76a66253 j_mayer
    target_ulong pte1;
324 76a66253 j_mayer
    target_ulong EPN;
325 1d0a48fb j_mayer
};
326 1d0a48fb j_mayer
327 1d0a48fb j_mayer
typedef struct ppcemb_tlb_t ppcemb_tlb_t;
328 1d0a48fb j_mayer
struct ppcemb_tlb_t {
329 c55e9aef j_mayer
    target_phys_addr_t RPN;
330 1d0a48fb j_mayer
    target_ulong EPN;
331 76a66253 j_mayer
    target_ulong PID;
332 c55e9aef j_mayer
    target_ulong size;
333 c55e9aef j_mayer
    uint32_t prot;
334 c55e9aef j_mayer
    uint32_t attr; /* Storage attributes */
335 1d0a48fb j_mayer
};
336 1d0a48fb j_mayer
337 1d0a48fb j_mayer
union ppc_tlb_t {
338 1d0a48fb j_mayer
    ppc6xx_tlb_t tlb6;
339 1d0a48fb j_mayer
    ppcemb_tlb_t tlbe;
340 3fc6c082 bellard
};
341 3fc6c082 bellard
342 3fc6c082 bellard
/*****************************************************************************/
343 3fc6c082 bellard
/* Machine state register bits definition                                    */
344 76a66253 j_mayer
#define MSR_SF   63 /* Sixty-four-bit mode                            hflags */
345 3fc6c082 bellard
#define MSR_ISF  61 /* Sixty-four-bit interrupt mode on 630                  */
346 76a66253 j_mayer
#define MSR_HV   60 /* hypervisor state                               hflags */
347 363be49c j_mayer
#define MSR_CM   31 /* Computation mode for BookE                     hflags */
348 363be49c j_mayer
#define MSR_ICM  30 /* Interrupt computation mode for BookE                  */
349 363be49c j_mayer
#define MSR_UCLE 26 /* User-mode cache lock enable for BookE                 */
350 d26bfc9a j_mayer
#define MSR_VR   25 /* altivec available                            x hflags */
351 d26bfc9a j_mayer
#define MSR_SPE  25 /* SPE enable for BookE                         x hflags */
352 76a66253 j_mayer
#define MSR_AP   23 /* Access privilege state on 602                  hflags */
353 76a66253 j_mayer
#define MSR_SA   22 /* Supervisor access mode on 602                  hflags */
354 3fc6c082 bellard
#define MSR_KEY  19 /* key bit on 603e                                       */
355 25ba3a68 j_mayer
#define MSR_POW  18 /* Power management                                      */
356 d26bfc9a j_mayer
#define MSR_TGPR 17 /* TGPR usage on 602/603                        x        */
357 d26bfc9a j_mayer
#define MSR_CE   17 /* Critical interrupt enable on embedded PowerPC x       */
358 3fc6c082 bellard
#define MSR_ILE  16 /* Interrupt little-endian mode                          */
359 3fc6c082 bellard
#define MSR_EE   15 /* External interrupt enable                             */
360 76a66253 j_mayer
#define MSR_PR   14 /* Problem state                                  hflags */
361 76a66253 j_mayer
#define MSR_FP   13 /* Floating point available                       hflags */
362 3fc6c082 bellard
#define MSR_ME   12 /* Machine check interrupt enable                        */
363 76a66253 j_mayer
#define MSR_FE0  11 /* Floating point exception mode 0                hflags */
364 d26bfc9a j_mayer
#define MSR_SE   10 /* Single-step trace enable                     x hflags */
365 d26bfc9a j_mayer
#define MSR_DWE  10 /* Debug wait enable on 405                     x        */
366 d26bfc9a j_mayer
#define MSR_UBLE 10 /* User BTB lock enable on e500                 x        */
367 d26bfc9a j_mayer
#define MSR_BE   9  /* Branch trace enable                          x hflags */
368 d26bfc9a j_mayer
#define MSR_DE   9  /* Debug interrupts enable on embedded PowerPC  x        */
369 76a66253 j_mayer
#define MSR_FE1  8  /* Floating point exception mode 1                hflags */
370 3fc6c082 bellard
#define MSR_AL   7  /* AL bit on POWER                                       */
371 0411a972 j_mayer
#define MSR_EP   6  /* Exception prefix on 601                               */
372 3fc6c082 bellard
#define MSR_IR   5  /* Instruction relocate                                  */
373 3fc6c082 bellard
#define MSR_DR   4  /* Data relocate                                         */
374 25ba3a68 j_mayer
#define MSR_PE   3  /* Protection enable on 403                              */
375 d26bfc9a j_mayer
#define MSR_PX   2  /* Protection exclusive on 403                  x        */
376 d26bfc9a j_mayer
#define MSR_PMM  2  /* Performance monitor mark on POWER            x        */
377 d26bfc9a j_mayer
#define MSR_RI   1  /* Recoverable interrupt                        1        */
378 d26bfc9a j_mayer
#define MSR_LE   0  /* Little-endian mode                           1 hflags */
379 0411a972 j_mayer
380 0411a972 j_mayer
#define msr_sf   ((env->msr >> MSR_SF)   & 1)
381 0411a972 j_mayer
#define msr_isf  ((env->msr >> MSR_ISF)  & 1)
382 0411a972 j_mayer
#define msr_hv   ((env->msr >> MSR_HV)   & 1)
383 0411a972 j_mayer
#define msr_cm   ((env->msr >> MSR_CM)   & 1)
384 0411a972 j_mayer
#define msr_icm  ((env->msr >> MSR_ICM)  & 1)
385 0411a972 j_mayer
#define msr_ucle ((env->msr >> MSR_UCLE) & 1)
386 0411a972 j_mayer
#define msr_vr   ((env->msr >> MSR_VR)   & 1)
387 0411a972 j_mayer
#define msr_spe  ((env->msr >> MSR_SE)   & 1)
388 0411a972 j_mayer
#define msr_ap   ((env->msr >> MSR_AP)   & 1)
389 0411a972 j_mayer
#define msr_sa   ((env->msr >> MSR_SA)   & 1)
390 0411a972 j_mayer
#define msr_key  ((env->msr >> MSR_KEY)  & 1)
391 0411a972 j_mayer
#define msr_pow  ((env->msr >> MSR_POW)  & 1)
392 0411a972 j_mayer
#define msr_tgpr ((env->msr >> MSR_TGPR) & 1)
393 0411a972 j_mayer
#define msr_ce   ((env->msr >> MSR_CE)   & 1)
394 0411a972 j_mayer
#define msr_ile  ((env->msr >> MSR_ILE)  & 1)
395 0411a972 j_mayer
#define msr_ee   ((env->msr >> MSR_EE)   & 1)
396 0411a972 j_mayer
#define msr_pr   ((env->msr >> MSR_PR)   & 1)
397 0411a972 j_mayer
#define msr_fp   ((env->msr >> MSR_FP)   & 1)
398 0411a972 j_mayer
#define msr_me   ((env->msr >> MSR_ME)   & 1)
399 0411a972 j_mayer
#define msr_fe0  ((env->msr >> MSR_FE0)  & 1)
400 0411a972 j_mayer
#define msr_se   ((env->msr >> MSR_SE)   & 1)
401 0411a972 j_mayer
#define msr_dwe  ((env->msr >> MSR_DWE)  & 1)
402 0411a972 j_mayer
#define msr_uble ((env->msr >> MSR_UBLE) & 1)
403 0411a972 j_mayer
#define msr_be   ((env->msr >> MSR_BE)   & 1)
404 0411a972 j_mayer
#define msr_de   ((env->msr >> MSR_DE)   & 1)
405 0411a972 j_mayer
#define msr_fe1  ((env->msr >> MSR_FE1)  & 1)
406 0411a972 j_mayer
#define msr_al   ((env->msr >> MSR_AL)   & 1)
407 0411a972 j_mayer
#define msr_ep   ((env->msr >> MSR_EP)   & 1)
408 0411a972 j_mayer
#define msr_ir   ((env->msr >> MSR_IR)   & 1)
409 0411a972 j_mayer
#define msr_dr   ((env->msr >> MSR_DR)   & 1)
410 0411a972 j_mayer
#define msr_pe   ((env->msr >> MSR_PE)   & 1)
411 0411a972 j_mayer
#define msr_px   ((env->msr >> MSR_PX)   & 1)
412 0411a972 j_mayer
#define msr_pmm  ((env->msr >> MSR_PMM)  & 1)
413 0411a972 j_mayer
#define msr_ri   ((env->msr >> MSR_RI)   & 1)
414 0411a972 j_mayer
#define msr_le   ((env->msr >> MSR_LE)   & 1)
415 79aceca5 bellard
416 d26bfc9a j_mayer
enum {
417 d26bfc9a j_mayer
    POWERPC_FLAG_NONE = 0x00000000,
418 d26bfc9a j_mayer
    /* Flag for MSR bit 25 signification (VRE/SPE)                           */
419 d26bfc9a j_mayer
    POWERPC_FLAG_SPE  = 0x00000001,
420 d26bfc9a j_mayer
    POWERPC_FLAG_VRE  = 0x00000002,
421 d26bfc9a j_mayer
    /* Flag for MSR bit 17 signification (TGPR/CE)                           */
422 25ba3a68 j_mayer
    POWERPC_FLAG_TGPR = 0x00000004,
423 25ba3a68 j_mayer
    POWERPC_FLAG_CE   = 0x00000008,
424 d26bfc9a j_mayer
    /* Flag for MSR bit 10 signification (SE/DWE/UBLE)                       */
425 25ba3a68 j_mayer
    POWERPC_FLAG_SE   = 0x00000010,
426 25ba3a68 j_mayer
    POWERPC_FLAG_DWE  = 0x00000020,
427 25ba3a68 j_mayer
    POWERPC_FLAG_UBLE = 0x00000040,
428 d26bfc9a j_mayer
    /* Flag for MSR bit 9 signification (BE/DE)                              */
429 25ba3a68 j_mayer
    POWERPC_FLAG_BE   = 0x00000080,
430 25ba3a68 j_mayer
    POWERPC_FLAG_DE   = 0x00000100,
431 d26bfc9a j_mayer
    /* Flag for MSR but 2 signification (PX/PMM)                             */
432 25ba3a68 j_mayer
    POWERPC_FLAG_PX   = 0x00000200,
433 25ba3a68 j_mayer
    POWERPC_FLAG_PMM  = 0x00000400,
434 d26bfc9a j_mayer
};
435 d26bfc9a j_mayer
436 6ebbf390 j_mayer
#if defined(TARGET_PPC64H)
437 6ebbf390 j_mayer
#define NB_MMU_MODES 3
438 6ebbf390 j_mayer
#else
439 6ebbf390 j_mayer
#define NB_MMU_MODES 2
440 6ebbf390 j_mayer
#endif
441 6ebbf390 j_mayer
442 3fc6c082 bellard
/*****************************************************************************/
443 3fc6c082 bellard
/* The whole PowerPC CPU context */
444 3fc6c082 bellard
struct CPUPPCState {
445 3fc6c082 bellard
    /* First are the most commonly used resources
446 3fc6c082 bellard
     * during translated code execution
447 3fc6c082 bellard
     */
448 0487d6a8 j_mayer
#if TARGET_GPR_BITS > HOST_LONG_BITS
449 3fc6c082 bellard
    /* temporary fixed-point registers
450 3fc6c082 bellard
     * used to emulate 64 bits target on 32 bits hosts
451 5fafdf24 ths
     */
452 3c4c9f9f ths
    ppc_gpr_t t0, t1, t2;
453 3fc6c082 bellard
#endif
454 a9d9eb8f j_mayer
    ppc_avr_t avr0, avr1, avr2;
455 d9bce9d9 j_mayer
456 79aceca5 bellard
    /* general purpose registers */
457 76a66253 j_mayer
    ppc_gpr_t gpr[32];
458 3fc6c082 bellard
    /* LR */
459 3fc6c082 bellard
    target_ulong lr;
460 3fc6c082 bellard
    /* CTR */
461 3fc6c082 bellard
    target_ulong ctr;
462 3fc6c082 bellard
    /* condition register */
463 3fc6c082 bellard
    uint8_t crf[8];
464 79aceca5 bellard
    /* XER */
465 3fc6c082 bellard
    /* XXX: We use only 5 fields, but we want to keep the structure aligned */
466 3fc6c082 bellard
    uint8_t xer[8];
467 79aceca5 bellard
    /* Reservation address */
468 3fc6c082 bellard
    target_ulong reserve;
469 3fc6c082 bellard
470 3fc6c082 bellard
    /* Those ones are used in supervisor mode only */
471 79aceca5 bellard
    /* machine state register */
472 0411a972 j_mayer
    target_ulong msr;
473 3fc6c082 bellard
    /* temporary general purpose registers */
474 76a66253 j_mayer
    ppc_gpr_t tgpr[4]; /* Used to speed-up TLB assist handlers */
475 3fc6c082 bellard
476 3fc6c082 bellard
    /* Floating point execution context */
477 76a66253 j_mayer
    /* temporary float registers */
478 4ecc3190 bellard
    float64 ft0;
479 4ecc3190 bellard
    float64 ft1;
480 4ecc3190 bellard
    float64 ft2;
481 4ecc3190 bellard
    float_status fp_status;
482 3fc6c082 bellard
    /* floating point registers */
483 3fc6c082 bellard
    float64 fpr[32];
484 3fc6c082 bellard
    /* floating point status and control register */
485 3fc6c082 bellard
    uint8_t fpscr[8];
486 4ecc3190 bellard
487 a316d335 bellard
    CPU_COMMON
488 a316d335 bellard
489 50443c98 bellard
    int halted; /* TRUE if the CPU is in suspend state */
490 50443c98 bellard
491 ac9eb073 bellard
    int access_type; /* when a memory exception occurs, the access
492 ac9eb073 bellard
                        type is stored here */
493 a541f297 bellard
494 f2e63a42 j_mayer
    /* MMU context - only relevant for full system emulation */
495 f2e63a42 j_mayer
#if !defined(CONFIG_USER_ONLY)
496 f2e63a42 j_mayer
#if defined(TARGET_PPC64)
497 3fc6c082 bellard
    /* Address space register */
498 3fc6c082 bellard
    target_ulong asr;
499 f2e63a42 j_mayer
    /* PowerPC 64 SLB area */
500 f2e63a42 j_mayer
    int slb_nr;
501 f2e63a42 j_mayer
#endif
502 3fc6c082 bellard
    /* segment registers */
503 3fc6c082 bellard
    target_ulong sdr1;
504 3fc6c082 bellard
    target_ulong sr[16];
505 3fc6c082 bellard
    /* BATs */
506 3fc6c082 bellard
    int nb_BATs;
507 3fc6c082 bellard
    target_ulong DBAT[2][8];
508 3fc6c082 bellard
    target_ulong IBAT[2][8];
509 f2e63a42 j_mayer
    /* PowerPC TLB registers (for 4xx and 60x software driven TLBs) */
510 f2e63a42 j_mayer
    int nb_tlb;      /* Total number of TLB                                  */
511 f2e63a42 j_mayer
    int tlb_per_way; /* Speed-up helper: used to avoid divisions at run time */
512 f2e63a42 j_mayer
    int nb_ways;     /* Number of ways in the TLB set                        */
513 f2e63a42 j_mayer
    int last_way;    /* Last used way used to allocate TLB in a LRU way      */
514 f2e63a42 j_mayer
    int id_tlbs;     /* If 1, MMU has separated TLBs for instructions & data */
515 f2e63a42 j_mayer
    int nb_pids;     /* Number of available PID registers                    */
516 f2e63a42 j_mayer
    ppc_tlb_t *tlb;  /* TLB is optional. Allocate them only if needed        */
517 f2e63a42 j_mayer
    /* 403 dedicated access protection registers */
518 f2e63a42 j_mayer
    target_ulong pb[4];
519 f2e63a42 j_mayer
#endif
520 9fddaa0c bellard
521 3fc6c082 bellard
    /* Other registers */
522 3fc6c082 bellard
    /* Special purpose registers */
523 3fc6c082 bellard
    target_ulong spr[1024];
524 f2e63a42 j_mayer
    ppc_spr_t spr_cb[1024];
525 3fc6c082 bellard
    /* Altivec registers */
526 3fc6c082 bellard
    ppc_avr_t avr[32];
527 3fc6c082 bellard
    uint32_t vscr;
528 f2e63a42 j_mayer
#if defined(TARGET_PPCEMB)
529 d9bce9d9 j_mayer
    /* SPE registers */
530 d9bce9d9 j_mayer
    ppc_gpr_t spe_acc;
531 0487d6a8 j_mayer
    float_status spe_status;
532 d9bce9d9 j_mayer
    uint32_t spe_fscr;
533 f2e63a42 j_mayer
#endif
534 3fc6c082 bellard
535 3fc6c082 bellard
    /* Internal devices resources */
536 9fddaa0c bellard
    /* Time base and decrementer */
537 9fddaa0c bellard
    ppc_tb_t *tb_env;
538 3fc6c082 bellard
    /* Device control registers */
539 3fc6c082 bellard
    ppc_dcr_t *dcr_env;
540 3fc6c082 bellard
541 d63001d1 j_mayer
    int dcache_line_size;
542 d63001d1 j_mayer
    int icache_line_size;
543 d63001d1 j_mayer
544 3fc6c082 bellard
    /* Those resources are used during exception processing */
545 3fc6c082 bellard
    /* CPU model definition */
546 a750fc0b j_mayer
    target_ulong msr_mask;
547 a750fc0b j_mayer
    uint8_t mmu_model;
548 a750fc0b j_mayer
    uint8_t excp_model;
549 a750fc0b j_mayer
    uint8_t bus_model;
550 a750fc0b j_mayer
    uint8_t pad;
551 237c0af0 j_mayer
    int bfd_mach;
552 3fc6c082 bellard
    uint32_t flags;
553 3fc6c082 bellard
554 3fc6c082 bellard
    int exception_index;
555 3fc6c082 bellard
    int error_code;
556 3fc6c082 bellard
    int interrupt_request;
557 47103572 j_mayer
    uint32_t pending_interrupts;
558 e9df014c j_mayer
#if !defined(CONFIG_USER_ONLY)
559 e9df014c j_mayer
    /* This is the IRQ controller, which is implementation dependant
560 e9df014c j_mayer
     * and only relevant when emulating a complete machine.
561 e9df014c j_mayer
     */
562 e9df014c j_mayer
    uint32_t irq_input_state;
563 e9df014c j_mayer
    void **irq_inputs;
564 e1833e1f j_mayer
    /* Exception vectors */
565 e1833e1f j_mayer
    target_ulong excp_vectors[POWERPC_EXCP_NB];
566 e1833e1f j_mayer
    target_ulong excp_prefix;
567 e1833e1f j_mayer
    target_ulong ivor_mask;
568 e1833e1f j_mayer
    target_ulong ivpr_mask;
569 d63001d1 j_mayer
    target_ulong hreset_vector;
570 e9df014c j_mayer
#endif
571 3fc6c082 bellard
572 3fc6c082 bellard
    /* Those resources are used only during code translation */
573 3fc6c082 bellard
    /* Next instruction pointer */
574 3fc6c082 bellard
    target_ulong nip;
575 f2e63a42 j_mayer
576 3fc6c082 bellard
    /* opcode handlers */
577 3fc6c082 bellard
    opc_handler_t *opcodes[0x40];
578 3fc6c082 bellard
579 3fc6c082 bellard
    /* Those resources are used only in Qemu core */
580 3fc6c082 bellard
    jmp_buf jmp_env;
581 3fc6c082 bellard
    int user_mode_only; /* user mode only simulation */
582 4296f459 j_mayer
    target_ulong hflags; /* hflags is a MSR & HFLAGS_MASK */
583 6ebbf390 j_mayer
    int mmu_idx;         /* precomputed MMU index to speed up mem accesses */
584 3fc6c082 bellard
585 9fddaa0c bellard
    /* Power management */
586 9fddaa0c bellard
    int power_mode;
587 cd346349 j_mayer
    int (*check_pow)(CPUPPCState *env);
588 a541f297 bellard
589 6d506e6d bellard
    /* temporary hack to handle OSI calls (only used if non NULL) */
590 6d506e6d bellard
    int (*osi_call)(struct CPUPPCState *env);
591 3fc6c082 bellard
};
592 79aceca5 bellard
593 76a66253 j_mayer
/* Context used internally during MMU translations */
594 76a66253 j_mayer
typedef struct mmu_ctx_t mmu_ctx_t;
595 76a66253 j_mayer
struct mmu_ctx_t {
596 76a66253 j_mayer
    target_phys_addr_t raddr;      /* Real address              */
597 76a66253 j_mayer
    int prot;                      /* Protection bits           */
598 76a66253 j_mayer
    target_phys_addr_t pg_addr[2]; /* PTE tables base addresses */
599 76a66253 j_mayer
    target_ulong ptem;             /* Virtual segment ID | API  */
600 76a66253 j_mayer
    int key;                       /* Access key                */
601 b227a8e9 j_mayer
    int nx;                        /* Non-execute area          */
602 76a66253 j_mayer
};
603 76a66253 j_mayer
604 3fc6c082 bellard
/*****************************************************************************/
605 36081602 j_mayer
CPUPPCState *cpu_ppc_init (void);
606 36081602 j_mayer
int cpu_ppc_exec (CPUPPCState *s);
607 36081602 j_mayer
void cpu_ppc_close (CPUPPCState *s);
608 79aceca5 bellard
/* you can call this signal handler from your SIGBUS and SIGSEGV
609 79aceca5 bellard
   signal handlers to inform the virtual CPU of exceptions. non zero
610 79aceca5 bellard
   is returned if the signal was handled by the virtual CPU.  */
611 36081602 j_mayer
int cpu_ppc_signal_handler (int host_signum, void *pinfo,
612 36081602 j_mayer
                            void *puc);
613 79aceca5 bellard
614 a541f297 bellard
void do_interrupt (CPUPPCState *env);
615 e9df014c j_mayer
void ppc_hw_interrupt (CPUPPCState *env);
616 36081602 j_mayer
void cpu_loop_exit (void);
617 a541f297 bellard
618 9a64fbe4 bellard
void dump_stack (CPUPPCState *env);
619 a541f297 bellard
620 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
621 3fc6c082 bellard
target_ulong do_load_ibatu (CPUPPCState *env, int nr);
622 3fc6c082 bellard
target_ulong do_load_ibatl (CPUPPCState *env, int nr);
623 3fc6c082 bellard
void do_store_ibatu (CPUPPCState *env, int nr, target_ulong value);
624 3fc6c082 bellard
void do_store_ibatl (CPUPPCState *env, int nr, target_ulong value);
625 3fc6c082 bellard
target_ulong do_load_dbatu (CPUPPCState *env, int nr);
626 3fc6c082 bellard
target_ulong do_load_dbatl (CPUPPCState *env, int nr);
627 3fc6c082 bellard
void do_store_dbatu (CPUPPCState *env, int nr, target_ulong value);
628 3fc6c082 bellard
void do_store_dbatl (CPUPPCState *env, int nr, target_ulong value);
629 3fc6c082 bellard
target_ulong do_load_sdr1 (CPUPPCState *env);
630 3fc6c082 bellard
void do_store_sdr1 (CPUPPCState *env, target_ulong value);
631 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
632 d9bce9d9 j_mayer
target_ulong ppc_load_asr (CPUPPCState *env);
633 d9bce9d9 j_mayer
void ppc_store_asr (CPUPPCState *env, target_ulong value);
634 12de9a39 j_mayer
target_ulong ppc_load_slb (CPUPPCState *env, int slb_nr);
635 12de9a39 j_mayer
void ppc_store_slb (CPUPPCState *env, int slb_nr, target_ulong rs);
636 12de9a39 j_mayer
#endif /* defined(TARGET_PPC64) */
637 12de9a39 j_mayer
#if 0 // Unused
638 3fc6c082 bellard
target_ulong do_load_sr (CPUPPCState *env, int srnum);
639 76a66253 j_mayer
#endif
640 12de9a39 j_mayer
void do_store_sr (CPUPPCState *env, int srnum, target_ulong value);
641 12de9a39 j_mayer
#endif /* !defined(CONFIG_USER_ONLY) */
642 bfa1e5cf j_mayer
target_ulong ppc_load_xer (CPUPPCState *env);
643 bfa1e5cf j_mayer
void ppc_store_xer (CPUPPCState *env, target_ulong value);
644 0411a972 j_mayer
void ppc_store_msr (CPUPPCState *env, target_ulong value);
645 3fc6c082 bellard
646 0a032cbe j_mayer
void cpu_ppc_reset (void *opaque);
647 0a032cbe j_mayer
CPUPPCState *cpu_ppc_init (void);
648 0a032cbe j_mayer
void cpu_ppc_close(CPUPPCState *env);
649 a541f297 bellard
650 3fc6c082 bellard
int ppc_find_by_name (const unsigned char *name, ppc_def_t **def);
651 3fc6c082 bellard
int ppc_find_by_pvr (uint32_t apvr, ppc_def_t **def);
652 3fc6c082 bellard
void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
653 3fc6c082 bellard
int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def);
654 85c4adf6 bellard
655 9fddaa0c bellard
/* Time-base and decrementer management */
656 9fddaa0c bellard
#ifndef NO_CPU_IO_DEFS
657 9fddaa0c bellard
uint32_t cpu_ppc_load_tbl (CPUPPCState *env);
658 9fddaa0c bellard
uint32_t cpu_ppc_load_tbu (CPUPPCState *env);
659 9fddaa0c bellard
void cpu_ppc_store_tbu (CPUPPCState *env, uint32_t value);
660 9fddaa0c bellard
void cpu_ppc_store_tbl (CPUPPCState *env, uint32_t value);
661 a062e36c j_mayer
uint32_t cpu_ppc_load_atbl (CPUPPCState *env);
662 a062e36c j_mayer
uint32_t cpu_ppc_load_atbu (CPUPPCState *env);
663 a062e36c j_mayer
void cpu_ppc_store_atbl (CPUPPCState *env, uint32_t value);
664 a062e36c j_mayer
void cpu_ppc_store_atbu (CPUPPCState *env, uint32_t value);
665 9fddaa0c bellard
uint32_t cpu_ppc_load_decr (CPUPPCState *env);
666 9fddaa0c bellard
void cpu_ppc_store_decr (CPUPPCState *env, uint32_t value);
667 58a7d328 j_mayer
#if defined(TARGET_PPC64H)
668 58a7d328 j_mayer
uint32_t cpu_ppc_load_hdecr (CPUPPCState *env);
669 58a7d328 j_mayer
void cpu_ppc_store_hdecr (CPUPPCState *env, uint32_t value);
670 58a7d328 j_mayer
uint64_t cpu_ppc_load_purr (CPUPPCState *env);
671 58a7d328 j_mayer
void cpu_ppc_store_purr (CPUPPCState *env, uint64_t value);
672 58a7d328 j_mayer
#endif
673 d9bce9d9 j_mayer
uint32_t cpu_ppc601_load_rtcl (CPUPPCState *env);
674 d9bce9d9 j_mayer
uint32_t cpu_ppc601_load_rtcu (CPUPPCState *env);
675 d9bce9d9 j_mayer
#if !defined(CONFIG_USER_ONLY)
676 d9bce9d9 j_mayer
void cpu_ppc601_store_rtcl (CPUPPCState *env, uint32_t value);
677 d9bce9d9 j_mayer
void cpu_ppc601_store_rtcu (CPUPPCState *env, uint32_t value);
678 d9bce9d9 j_mayer
target_ulong load_40x_pit (CPUPPCState *env);
679 d9bce9d9 j_mayer
void store_40x_pit (CPUPPCState *env, target_ulong val);
680 8ecc7913 j_mayer
void store_40x_dbcr0 (CPUPPCState *env, uint32_t val);
681 c294fc58 j_mayer
void store_40x_sler (CPUPPCState *env, uint32_t val);
682 d9bce9d9 j_mayer
void store_booke_tcr (CPUPPCState *env, target_ulong val);
683 d9bce9d9 j_mayer
void store_booke_tsr (CPUPPCState *env, target_ulong val);
684 0a032cbe j_mayer
void ppc_tlb_invalidate_all (CPUPPCState *env);
685 daf4f96e j_mayer
void ppc_tlb_invalidate_one (CPUPPCState *env, target_ulong addr);
686 daf4f96e j_mayer
#if defined(TARGET_PPC64)
687 daf4f96e j_mayer
void ppc_slb_invalidate_all (CPUPPCState *env);
688 daf4f96e j_mayer
void ppc_slb_invalidate_one (CPUPPCState *env, uint64_t T0);
689 daf4f96e j_mayer
#endif
690 36081602 j_mayer
int ppcemb_tlb_search (CPUPPCState *env, target_ulong address, uint32_t pid);
691 d9bce9d9 j_mayer
#endif
692 9fddaa0c bellard
#endif
693 79aceca5 bellard
694 2e719ba3 j_mayer
/* Device control registers */
695 2e719ba3 j_mayer
int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, target_ulong *valp);
696 2e719ba3 j_mayer
int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val);
697 2e719ba3 j_mayer
698 9467d44c ths
#define CPUState CPUPPCState
699 9467d44c ths
#define cpu_init cpu_ppc_init
700 9467d44c ths
#define cpu_exec cpu_ppc_exec
701 9467d44c ths
#define cpu_gen_code cpu_ppc_gen_code
702 9467d44c ths
#define cpu_signal_handler cpu_ppc_signal_handler
703 c732abe2 j_mayer
#define cpu_list ppc_cpu_list
704 9467d44c ths
705 6ebbf390 j_mayer
/* MMU modes definitions */
706 6ebbf390 j_mayer
#define MMU_MODE0_SUFFIX _user
707 6ebbf390 j_mayer
#define MMU_MODE1_SUFFIX _kernel
708 6ebbf390 j_mayer
#if defined(TARGET_PPC64H)
709 6ebbf390 j_mayer
#define MMU_MODE2_SUFFIX _hypv
710 6ebbf390 j_mayer
#endif
711 6ebbf390 j_mayer
#define MMU_USER_IDX 0
712 6ebbf390 j_mayer
static inline int cpu_mmu_index (CPUState *env)
713 6ebbf390 j_mayer
{
714 6ebbf390 j_mayer
    return env->mmu_idx;
715 6ebbf390 j_mayer
}
716 6ebbf390 j_mayer
717 79aceca5 bellard
#include "cpu-all.h"
718 79aceca5 bellard
719 3fc6c082 bellard
/*****************************************************************************/
720 3fc6c082 bellard
/* Registers definitions */
721 79aceca5 bellard
#define XER_SO 31
722 79aceca5 bellard
#define XER_OV 30
723 79aceca5 bellard
#define XER_CA 29
724 3fc6c082 bellard
#define XER_CMP 8
725 36081602 j_mayer
#define XER_BC  0
726 3fc6c082 bellard
#define xer_so  env->xer[4]
727 3fc6c082 bellard
#define xer_ov  env->xer[6]
728 3fc6c082 bellard
#define xer_ca  env->xer[2]
729 3fc6c082 bellard
#define xer_cmp env->xer[1]
730 36081602 j_mayer
#define xer_bc  env->xer[0]
731 79aceca5 bellard
732 3fc6c082 bellard
/* SPR definitions */
733 76a66253 j_mayer
#define SPR_MQ           (0x000)
734 76a66253 j_mayer
#define SPR_XER          (0x001)
735 76a66253 j_mayer
#define SPR_601_VRTCU    (0x004)
736 76a66253 j_mayer
#define SPR_601_VRTCL    (0x005)
737 76a66253 j_mayer
#define SPR_601_UDECR    (0x006)
738 76a66253 j_mayer
#define SPR_LR           (0x008)
739 76a66253 j_mayer
#define SPR_CTR          (0x009)
740 76a66253 j_mayer
#define SPR_DSISR        (0x012)
741 a750fc0b j_mayer
#define SPR_DAR          (0x013) /* DAE for PowerPC 601 */
742 76a66253 j_mayer
#define SPR_601_RTCU     (0x014)
743 76a66253 j_mayer
#define SPR_601_RTCL     (0x015)
744 76a66253 j_mayer
#define SPR_DECR         (0x016)
745 76a66253 j_mayer
#define SPR_SDR1         (0x019)
746 76a66253 j_mayer
#define SPR_SRR0         (0x01A)
747 76a66253 j_mayer
#define SPR_SRR1         (0x01B)
748 2662a059 j_mayer
#define SPR_AMR          (0x01D)
749 76a66253 j_mayer
#define SPR_BOOKE_PID    (0x030)
750 76a66253 j_mayer
#define SPR_BOOKE_DECAR  (0x036)
751 363be49c j_mayer
#define SPR_BOOKE_CSRR0  (0x03A)
752 363be49c j_mayer
#define SPR_BOOKE_CSRR1  (0x03B)
753 76a66253 j_mayer
#define SPR_BOOKE_DEAR   (0x03D)
754 76a66253 j_mayer
#define SPR_BOOKE_ESR    (0x03E)
755 363be49c j_mayer
#define SPR_BOOKE_IVPR   (0x03F)
756 76a66253 j_mayer
#define SPR_8xx_EIE      (0x050)
757 76a66253 j_mayer
#define SPR_8xx_EID      (0x051)
758 76a66253 j_mayer
#define SPR_8xx_NRE      (0x052)
759 2662a059 j_mayer
#define SPR_CTRL         (0x088)
760 76a66253 j_mayer
#define SPR_58x_CMPA     (0x090)
761 76a66253 j_mayer
#define SPR_58x_CMPB     (0x091)
762 76a66253 j_mayer
#define SPR_58x_CMPC     (0x092)
763 76a66253 j_mayer
#define SPR_58x_CMPD     (0x093)
764 76a66253 j_mayer
#define SPR_58x_ICR      (0x094)
765 76a66253 j_mayer
#define SPR_58x_DER      (0x094)
766 76a66253 j_mayer
#define SPR_58x_COUNTA   (0x096)
767 76a66253 j_mayer
#define SPR_58x_COUNTB   (0x097)
768 2662a059 j_mayer
#define SPR_UCTRL        (0x098)
769 76a66253 j_mayer
#define SPR_58x_CMPE     (0x098)
770 76a66253 j_mayer
#define SPR_58x_CMPF     (0x099)
771 76a66253 j_mayer
#define SPR_58x_CMPG     (0x09A)
772 76a66253 j_mayer
#define SPR_58x_CMPH     (0x09B)
773 76a66253 j_mayer
#define SPR_58x_LCTRL1   (0x09C)
774 76a66253 j_mayer
#define SPR_58x_LCTRL2   (0x09D)
775 76a66253 j_mayer
#define SPR_58x_ICTRL    (0x09E)
776 76a66253 j_mayer
#define SPR_58x_BAR      (0x09F)
777 76a66253 j_mayer
#define SPR_VRSAVE       (0x100)
778 76a66253 j_mayer
#define SPR_USPRG0       (0x100)
779 363be49c j_mayer
#define SPR_USPRG1       (0x101)
780 363be49c j_mayer
#define SPR_USPRG2       (0x102)
781 363be49c j_mayer
#define SPR_USPRG3       (0x103)
782 76a66253 j_mayer
#define SPR_USPRG4       (0x104)
783 76a66253 j_mayer
#define SPR_USPRG5       (0x105)
784 76a66253 j_mayer
#define SPR_USPRG6       (0x106)
785 76a66253 j_mayer
#define SPR_USPRG7       (0x107)
786 76a66253 j_mayer
#define SPR_VTBL         (0x10C)
787 76a66253 j_mayer
#define SPR_VTBU         (0x10D)
788 76a66253 j_mayer
#define SPR_SPRG0        (0x110)
789 76a66253 j_mayer
#define SPR_SPRG1        (0x111)
790 76a66253 j_mayer
#define SPR_SPRG2        (0x112)
791 76a66253 j_mayer
#define SPR_SPRG3        (0x113)
792 76a66253 j_mayer
#define SPR_SPRG4        (0x114)
793 76a66253 j_mayer
#define SPR_SCOMC        (0x114)
794 76a66253 j_mayer
#define SPR_SPRG5        (0x115)
795 76a66253 j_mayer
#define SPR_SCOMD        (0x115)
796 76a66253 j_mayer
#define SPR_SPRG6        (0x116)
797 76a66253 j_mayer
#define SPR_SPRG7        (0x117)
798 76a66253 j_mayer
#define SPR_ASR          (0x118)
799 76a66253 j_mayer
#define SPR_EAR          (0x11A)
800 76a66253 j_mayer
#define SPR_TBL          (0x11C)
801 76a66253 j_mayer
#define SPR_TBU          (0x11D)
802 2662a059 j_mayer
#define SPR_TBU40        (0x11E)
803 76a66253 j_mayer
#define SPR_SVR          (0x11E)
804 76a66253 j_mayer
#define SPR_BOOKE_PIR    (0x11E)
805 76a66253 j_mayer
#define SPR_PVR          (0x11F)
806 76a66253 j_mayer
#define SPR_HSPRG0       (0x130)
807 76a66253 j_mayer
#define SPR_BOOKE_DBSR   (0x130)
808 76a66253 j_mayer
#define SPR_HSPRG1       (0x131)
809 2662a059 j_mayer
#define SPR_HDSISR       (0x132)
810 2662a059 j_mayer
#define SPR_HDAR         (0x133)
811 76a66253 j_mayer
#define SPR_BOOKE_DBCR0  (0x134)
812 76a66253 j_mayer
#define SPR_IBCR         (0x135)
813 2662a059 j_mayer
#define SPR_PURR         (0x135)
814 76a66253 j_mayer
#define SPR_BOOKE_DBCR1  (0x135)
815 76a66253 j_mayer
#define SPR_DBCR         (0x136)
816 76a66253 j_mayer
#define SPR_HDEC         (0x136)
817 76a66253 j_mayer
#define SPR_BOOKE_DBCR2  (0x136)
818 76a66253 j_mayer
#define SPR_HIOR         (0x137)
819 76a66253 j_mayer
#define SPR_MBAR         (0x137)
820 76a66253 j_mayer
#define SPR_RMOR         (0x138)
821 76a66253 j_mayer
#define SPR_BOOKE_IAC1   (0x138)
822 76a66253 j_mayer
#define SPR_HRMOR        (0x139)
823 76a66253 j_mayer
#define SPR_BOOKE_IAC2   (0x139)
824 e1833e1f j_mayer
#define SPR_HSRR0        (0x13A)
825 76a66253 j_mayer
#define SPR_BOOKE_IAC3   (0x13A)
826 e1833e1f j_mayer
#define SPR_HSRR1        (0x13B)
827 76a66253 j_mayer
#define SPR_BOOKE_IAC4   (0x13B)
828 76a66253 j_mayer
#define SPR_LPCR         (0x13C)
829 76a66253 j_mayer
#define SPR_BOOKE_DAC1   (0x13C)
830 76a66253 j_mayer
#define SPR_LPIDR        (0x13D)
831 76a66253 j_mayer
#define SPR_DABR2        (0x13D)
832 76a66253 j_mayer
#define SPR_BOOKE_DAC2   (0x13D)
833 76a66253 j_mayer
#define SPR_BOOKE_DVC1   (0x13E)
834 76a66253 j_mayer
#define SPR_BOOKE_DVC2   (0x13F)
835 76a66253 j_mayer
#define SPR_BOOKE_TSR    (0x150)
836 76a66253 j_mayer
#define SPR_BOOKE_TCR    (0x154)
837 76a66253 j_mayer
#define SPR_BOOKE_IVOR0  (0x190)
838 76a66253 j_mayer
#define SPR_BOOKE_IVOR1  (0x191)
839 76a66253 j_mayer
#define SPR_BOOKE_IVOR2  (0x192)
840 76a66253 j_mayer
#define SPR_BOOKE_IVOR3  (0x193)
841 76a66253 j_mayer
#define SPR_BOOKE_IVOR4  (0x194)
842 76a66253 j_mayer
#define SPR_BOOKE_IVOR5  (0x195)
843 76a66253 j_mayer
#define SPR_BOOKE_IVOR6  (0x196)
844 76a66253 j_mayer
#define SPR_BOOKE_IVOR7  (0x197)
845 76a66253 j_mayer
#define SPR_BOOKE_IVOR8  (0x198)
846 76a66253 j_mayer
#define SPR_BOOKE_IVOR9  (0x199)
847 76a66253 j_mayer
#define SPR_BOOKE_IVOR10 (0x19A)
848 76a66253 j_mayer
#define SPR_BOOKE_IVOR11 (0x19B)
849 76a66253 j_mayer
#define SPR_BOOKE_IVOR12 (0x19C)
850 76a66253 j_mayer
#define SPR_BOOKE_IVOR13 (0x19D)
851 76a66253 j_mayer
#define SPR_BOOKE_IVOR14 (0x19E)
852 76a66253 j_mayer
#define SPR_BOOKE_IVOR15 (0x19F)
853 2662a059 j_mayer
#define SPR_BOOKE_SPEFSCR (0x200)
854 76a66253 j_mayer
#define SPR_E500_BBEAR   (0x201)
855 76a66253 j_mayer
#define SPR_E500_BBTAR   (0x202)
856 a062e36c j_mayer
#define SPR_ATBL         (0x20E)
857 a062e36c j_mayer
#define SPR_ATBU         (0x20F)
858 76a66253 j_mayer
#define SPR_IBAT0U       (0x210)
859 363be49c j_mayer
#define SPR_BOOKE_IVOR32 (0x210)
860 76a66253 j_mayer
#define SPR_IBAT0L       (0x211)
861 363be49c j_mayer
#define SPR_BOOKE_IVOR33 (0x211)
862 76a66253 j_mayer
#define SPR_IBAT1U       (0x212)
863 363be49c j_mayer
#define SPR_BOOKE_IVOR34 (0x212)
864 76a66253 j_mayer
#define SPR_IBAT1L       (0x213)
865 363be49c j_mayer
#define SPR_BOOKE_IVOR35 (0x213)
866 76a66253 j_mayer
#define SPR_IBAT2U       (0x214)
867 363be49c j_mayer
#define SPR_BOOKE_IVOR36 (0x214)
868 76a66253 j_mayer
#define SPR_IBAT2L       (0x215)
869 76a66253 j_mayer
#define SPR_E500_L1CFG0  (0x215)
870 363be49c j_mayer
#define SPR_BOOKE_IVOR37 (0x215)
871 76a66253 j_mayer
#define SPR_IBAT3U       (0x216)
872 76a66253 j_mayer
#define SPR_E500_L1CFG1  (0x216)
873 76a66253 j_mayer
#define SPR_IBAT3L       (0x217)
874 76a66253 j_mayer
#define SPR_DBAT0U       (0x218)
875 76a66253 j_mayer
#define SPR_DBAT0L       (0x219)
876 76a66253 j_mayer
#define SPR_DBAT1U       (0x21A)
877 76a66253 j_mayer
#define SPR_DBAT1L       (0x21B)
878 76a66253 j_mayer
#define SPR_DBAT2U       (0x21C)
879 76a66253 j_mayer
#define SPR_DBAT2L       (0x21D)
880 76a66253 j_mayer
#define SPR_DBAT3U       (0x21E)
881 76a66253 j_mayer
#define SPR_DBAT3L       (0x21F)
882 76a66253 j_mayer
#define SPR_IBAT4U       (0x230)
883 76a66253 j_mayer
#define SPR_IBAT4L       (0x231)
884 76a66253 j_mayer
#define SPR_IBAT5U       (0x232)
885 76a66253 j_mayer
#define SPR_IBAT5L       (0x233)
886 76a66253 j_mayer
#define SPR_IBAT6U       (0x234)
887 76a66253 j_mayer
#define SPR_IBAT6L       (0x235)
888 76a66253 j_mayer
#define SPR_IBAT7U       (0x236)
889 76a66253 j_mayer
#define SPR_IBAT7L       (0x237)
890 76a66253 j_mayer
#define SPR_DBAT4U       (0x238)
891 76a66253 j_mayer
#define SPR_DBAT4L       (0x239)
892 76a66253 j_mayer
#define SPR_DBAT5U       (0x23A)
893 363be49c j_mayer
#define SPR_BOOKE_MCSRR0 (0x23A)
894 76a66253 j_mayer
#define SPR_DBAT5L       (0x23B)
895 363be49c j_mayer
#define SPR_BOOKE_MCSRR1 (0x23B)
896 76a66253 j_mayer
#define SPR_DBAT6U       (0x23C)
897 363be49c j_mayer
#define SPR_BOOKE_MCSR   (0x23C)
898 76a66253 j_mayer
#define SPR_DBAT6L       (0x23D)
899 76a66253 j_mayer
#define SPR_E500_MCAR    (0x23D)
900 76a66253 j_mayer
#define SPR_DBAT7U       (0x23E)
901 363be49c j_mayer
#define SPR_BOOKE_DSRR0  (0x23E)
902 76a66253 j_mayer
#define SPR_DBAT7L       (0x23F)
903 363be49c j_mayer
#define SPR_BOOKE_DSRR1  (0x23F)
904 363be49c j_mayer
#define SPR_BOOKE_SPRG8  (0x25C)
905 363be49c j_mayer
#define SPR_BOOKE_SPRG9  (0x25D)
906 363be49c j_mayer
#define SPR_BOOKE_MAS0   (0x270)
907 363be49c j_mayer
#define SPR_BOOKE_MAS1   (0x271)
908 363be49c j_mayer
#define SPR_BOOKE_MAS2   (0x272)
909 363be49c j_mayer
#define SPR_BOOKE_MAS3   (0x273)
910 363be49c j_mayer
#define SPR_BOOKE_MAS4   (0x274)
911 363be49c j_mayer
#define SPR_BOOKE_MAS6   (0x276)
912 363be49c j_mayer
#define SPR_BOOKE_PID1   (0x279)
913 363be49c j_mayer
#define SPR_BOOKE_PID2   (0x27A)
914 363be49c j_mayer
#define SPR_BOOKE_TLB0CFG (0x2B0)
915 363be49c j_mayer
#define SPR_BOOKE_TLB1CFG (0x2B1)
916 363be49c j_mayer
#define SPR_BOOKE_TLB2CFG (0x2B2)
917 363be49c j_mayer
#define SPR_BOOKE_TLB3CFG (0x2B3)
918 363be49c j_mayer
#define SPR_BOOKE_EPR    (0x2BE)
919 2662a059 j_mayer
#define SPR_PERF0        (0x300)
920 2662a059 j_mayer
#define SPR_PERF1        (0x301)
921 2662a059 j_mayer
#define SPR_PERF2        (0x302)
922 2662a059 j_mayer
#define SPR_PERF3        (0x303)
923 2662a059 j_mayer
#define SPR_PERF4        (0x304)
924 2662a059 j_mayer
#define SPR_PERF5        (0x305)
925 2662a059 j_mayer
#define SPR_PERF6        (0x306)
926 2662a059 j_mayer
#define SPR_PERF7        (0x307)
927 2662a059 j_mayer
#define SPR_PERF8        (0x308)
928 2662a059 j_mayer
#define SPR_PERF9        (0x309)
929 2662a059 j_mayer
#define SPR_PERFA        (0x30A)
930 2662a059 j_mayer
#define SPR_PERFB        (0x30B)
931 2662a059 j_mayer
#define SPR_PERFC        (0x30C)
932 2662a059 j_mayer
#define SPR_PERFD        (0x30D)
933 2662a059 j_mayer
#define SPR_PERFE        (0x30E)
934 2662a059 j_mayer
#define SPR_PERFF        (0x30F)
935 2662a059 j_mayer
#define SPR_UPERF0       (0x310)
936 2662a059 j_mayer
#define SPR_UPERF1       (0x311)
937 2662a059 j_mayer
#define SPR_UPERF2       (0x312)
938 2662a059 j_mayer
#define SPR_UPERF3       (0x313)
939 2662a059 j_mayer
#define SPR_UPERF4       (0x314)
940 2662a059 j_mayer
#define SPR_UPERF5       (0x315)
941 2662a059 j_mayer
#define SPR_UPERF6       (0x316)
942 2662a059 j_mayer
#define SPR_UPERF7       (0x317)
943 2662a059 j_mayer
#define SPR_UPERF8       (0x318)
944 2662a059 j_mayer
#define SPR_UPERF9       (0x319)
945 2662a059 j_mayer
#define SPR_UPERFA       (0x31A)
946 2662a059 j_mayer
#define SPR_UPERFB       (0x31B)
947 2662a059 j_mayer
#define SPR_UPERFC       (0x31C)
948 2662a059 j_mayer
#define SPR_UPERFD       (0x31D)
949 2662a059 j_mayer
#define SPR_UPERFE       (0x31E)
950 2662a059 j_mayer
#define SPR_UPERFF       (0x31F)
951 76a66253 j_mayer
#define SPR_440_INV0     (0x370)
952 76a66253 j_mayer
#define SPR_440_INV1     (0x371)
953 76a66253 j_mayer
#define SPR_440_INV2     (0x372)
954 76a66253 j_mayer
#define SPR_440_INV3     (0x373)
955 2662a059 j_mayer
#define SPR_440_ITV0     (0x374)
956 2662a059 j_mayer
#define SPR_440_ITV1     (0x375)
957 2662a059 j_mayer
#define SPR_440_ITV2     (0x376)
958 2662a059 j_mayer
#define SPR_440_ITV3     (0x377)
959 a750fc0b j_mayer
#define SPR_440_CCR1     (0x378)
960 a750fc0b j_mayer
#define SPR_DCRIPR       (0x37B)
961 2662a059 j_mayer
#define SPR_PPR          (0x380)
962 76a66253 j_mayer
#define SPR_440_DNV0     (0x390)
963 76a66253 j_mayer
#define SPR_440_DNV1     (0x391)
964 76a66253 j_mayer
#define SPR_440_DNV2     (0x392)
965 76a66253 j_mayer
#define SPR_440_DNV3     (0x393)
966 2662a059 j_mayer
#define SPR_440_DTV0     (0x394)
967 2662a059 j_mayer
#define SPR_440_DTV1     (0x395)
968 2662a059 j_mayer
#define SPR_440_DTV2     (0x396)
969 2662a059 j_mayer
#define SPR_440_DTV3     (0x397)
970 76a66253 j_mayer
#define SPR_440_DVLIM    (0x398)
971 76a66253 j_mayer
#define SPR_440_IVLIM    (0x399)
972 76a66253 j_mayer
#define SPR_440_RSTCFG   (0x39B)
973 2662a059 j_mayer
#define SPR_BOOKE_DCDBTRL (0x39C)
974 2662a059 j_mayer
#define SPR_BOOKE_DCDBTRH (0x39D)
975 2662a059 j_mayer
#define SPR_BOOKE_ICDBTRL (0x39E)
976 2662a059 j_mayer
#define SPR_BOOKE_ICDBTRH (0x39F)
977 a750fc0b j_mayer
#define SPR_UMMCR2       (0x3A0)
978 a750fc0b j_mayer
#define SPR_UPMC5        (0x3A1)
979 a750fc0b j_mayer
#define SPR_UPMC6        (0x3A2)
980 a750fc0b j_mayer
#define SPR_UBAMR        (0x3A7)
981 76a66253 j_mayer
#define SPR_UMMCR0       (0x3A8)
982 76a66253 j_mayer
#define SPR_UPMC1        (0x3A9)
983 76a66253 j_mayer
#define SPR_UPMC2        (0x3AA)
984 a750fc0b j_mayer
#define SPR_USIAR        (0x3AB)
985 76a66253 j_mayer
#define SPR_UMMCR1       (0x3AC)
986 76a66253 j_mayer
#define SPR_UPMC3        (0x3AD)
987 76a66253 j_mayer
#define SPR_UPMC4        (0x3AE)
988 76a66253 j_mayer
#define SPR_USDA         (0x3AF)
989 76a66253 j_mayer
#define SPR_40x_ZPR      (0x3B0)
990 363be49c j_mayer
#define SPR_BOOKE_MAS7   (0x3B0)
991 a750fc0b j_mayer
#define SPR_620_PMR0     (0x3B0)
992 a750fc0b j_mayer
#define SPR_MMCR2        (0x3B0)
993 a750fc0b j_mayer
#define SPR_PMC5         (0x3B1)
994 76a66253 j_mayer
#define SPR_40x_PID      (0x3B1)
995 a750fc0b j_mayer
#define SPR_620_PMR1     (0x3B1)
996 a750fc0b j_mayer
#define SPR_PMC6         (0x3B2)
997 76a66253 j_mayer
#define SPR_440_MMUCR    (0x3B2)
998 a750fc0b j_mayer
#define SPR_620_PMR2     (0x3B2)
999 76a66253 j_mayer
#define SPR_4xx_CCR0     (0x3B3)
1000 363be49c j_mayer
#define SPR_BOOKE_EPLC   (0x3B3)
1001 a750fc0b j_mayer
#define SPR_620_PMR3     (0x3B3)
1002 76a66253 j_mayer
#define SPR_405_IAC3     (0x3B4)
1003 363be49c j_mayer
#define SPR_BOOKE_EPSC   (0x3B4)
1004 a750fc0b j_mayer
#define SPR_620_PMR4     (0x3B4)
1005 76a66253 j_mayer
#define SPR_405_IAC4     (0x3B5)
1006 a750fc0b j_mayer
#define SPR_620_PMR5     (0x3B5)
1007 76a66253 j_mayer
#define SPR_405_DVC1     (0x3B6)
1008 a750fc0b j_mayer
#define SPR_620_PMR6     (0x3B6)
1009 76a66253 j_mayer
#define SPR_405_DVC2     (0x3B7)
1010 a750fc0b j_mayer
#define SPR_620_PMR7     (0x3B7)
1011 a750fc0b j_mayer
#define SPR_BAMR         (0x3B7)
1012 76a66253 j_mayer
#define SPR_MMCR0        (0x3B8)
1013 a750fc0b j_mayer
#define SPR_620_PMR8     (0x3B8)
1014 76a66253 j_mayer
#define SPR_PMC1         (0x3B9)
1015 76a66253 j_mayer
#define SPR_40x_SGR      (0x3B9)
1016 a750fc0b j_mayer
#define SPR_620_PMR9     (0x3B9)
1017 76a66253 j_mayer
#define SPR_PMC2         (0x3BA)
1018 76a66253 j_mayer
#define SPR_40x_DCWR     (0x3BA)
1019 a750fc0b j_mayer
#define SPR_620_PMRA     (0x3BA)
1020 a750fc0b j_mayer
#define SPR_SIAR         (0x3BB)
1021 76a66253 j_mayer
#define SPR_405_SLER     (0x3BB)
1022 a750fc0b j_mayer
#define SPR_620_PMRB     (0x3BB)
1023 76a66253 j_mayer
#define SPR_MMCR1        (0x3BC)
1024 76a66253 j_mayer
#define SPR_405_SU0R     (0x3BC)
1025 a750fc0b j_mayer
#define SPR_620_PMRC     (0x3BC)
1026 a750fc0b j_mayer
#define SPR_401_SKR      (0x3BC)
1027 76a66253 j_mayer
#define SPR_PMC3         (0x3BD)
1028 76a66253 j_mayer
#define SPR_405_DBCR1    (0x3BD)
1029 a750fc0b j_mayer
#define SPR_620_PMRD     (0x3BD)
1030 76a66253 j_mayer
#define SPR_PMC4         (0x3BE)
1031 a750fc0b j_mayer
#define SPR_620_PMRE     (0x3BE)
1032 76a66253 j_mayer
#define SPR_SDA          (0x3BF)
1033 a750fc0b j_mayer
#define SPR_620_PMRF     (0x3BF)
1034 76a66253 j_mayer
#define SPR_403_VTBL     (0x3CC)
1035 76a66253 j_mayer
#define SPR_403_VTBU     (0x3CD)
1036 76a66253 j_mayer
#define SPR_DMISS        (0x3D0)
1037 76a66253 j_mayer
#define SPR_DCMP         (0x3D1)
1038 76a66253 j_mayer
#define SPR_HASH1        (0x3D2)
1039 76a66253 j_mayer
#define SPR_HASH2        (0x3D3)
1040 2662a059 j_mayer
#define SPR_BOOKE_ICDBDR (0x3D3)
1041 a750fc0b j_mayer
#define SPR_TLBMISS      (0x3D4)
1042 76a66253 j_mayer
#define SPR_IMISS        (0x3D4)
1043 76a66253 j_mayer
#define SPR_40x_ESR      (0x3D4)
1044 a750fc0b j_mayer
#define SPR_PTEHI        (0x3D5)
1045 76a66253 j_mayer
#define SPR_ICMP         (0x3D5)
1046 76a66253 j_mayer
#define SPR_40x_DEAR     (0x3D5)
1047 a750fc0b j_mayer
#define SPR_PTELO        (0x3D6)
1048 76a66253 j_mayer
#define SPR_RPA          (0x3D6)
1049 76a66253 j_mayer
#define SPR_40x_EVPR     (0x3D6)
1050 a750fc0b j_mayer
#define SPR_L3PM         (0x3D7)
1051 76a66253 j_mayer
#define SPR_403_CDBCR    (0x3D7)
1052 a750fc0b j_mayer
#define SPR_L3OHCR       (0x3D8)
1053 76a66253 j_mayer
#define SPR_TCR          (0x3D8)
1054 76a66253 j_mayer
#define SPR_40x_TSR      (0x3D8)
1055 76a66253 j_mayer
#define SPR_IBR          (0x3DA)
1056 76a66253 j_mayer
#define SPR_40x_TCR      (0x3DA)
1057 a750fc0b j_mayer
#define SPR_ESASRR       (0x3DB)
1058 76a66253 j_mayer
#define SPR_40x_PIT      (0x3DB)
1059 76a66253 j_mayer
#define SPR_403_TBL      (0x3DC)
1060 76a66253 j_mayer
#define SPR_403_TBU      (0x3DD)
1061 76a66253 j_mayer
#define SPR_SEBR         (0x3DE)
1062 76a66253 j_mayer
#define SPR_40x_SRR2     (0x3DE)
1063 76a66253 j_mayer
#define SPR_SER          (0x3DF)
1064 76a66253 j_mayer
#define SPR_40x_SRR3     (0x3DF)
1065 a750fc0b j_mayer
#define SPR_L3ITCR0      (0x3E8)
1066 a750fc0b j_mayer
#define SPR_L3ITCR1      (0x3E9)
1067 a750fc0b j_mayer
#define SPR_L3ITCR2      (0x3EA)
1068 a750fc0b j_mayer
#define SPR_L3ITCR3      (0x3EB)
1069 76a66253 j_mayer
#define SPR_HID0         (0x3F0)
1070 76a66253 j_mayer
#define SPR_40x_DBSR     (0x3F0)
1071 76a66253 j_mayer
#define SPR_HID1         (0x3F1)
1072 76a66253 j_mayer
#define SPR_IABR         (0x3F2)
1073 76a66253 j_mayer
#define SPR_40x_DBCR0    (0x3F2)
1074 76a66253 j_mayer
#define SPR_601_HID2     (0x3F2)
1075 76a66253 j_mayer
#define SPR_E500_L1CSR0  (0x3F2)
1076 a750fc0b j_mayer
#define SPR_ICTRL        (0x3F3)
1077 76a66253 j_mayer
#define SPR_HID2         (0x3F3)
1078 76a66253 j_mayer
#define SPR_E500_L1CSR1  (0x3F3)
1079 76a66253 j_mayer
#define SPR_440_DBDR     (0x3F3)
1080 a750fc0b j_mayer
#define SPR_LDSTDB       (0x3F4)
1081 76a66253 j_mayer
#define SPR_40x_IAC1     (0x3F4)
1082 65f9ee8d j_mayer
#define SPR_MMUCSR0      (0x3F4)
1083 76a66253 j_mayer
#define SPR_DABR         (0x3F5)
1084 3fc6c082 bellard
#define DABR_MASK (~(target_ulong)0x7)
1085 76a66253 j_mayer
#define SPR_E500_BUCSR   (0x3F5)
1086 76a66253 j_mayer
#define SPR_40x_IAC2     (0x3F5)
1087 76a66253 j_mayer
#define SPR_601_HID5     (0x3F5)
1088 76a66253 j_mayer
#define SPR_40x_DAC1     (0x3F6)
1089 a750fc0b j_mayer
#define SPR_MSSCR0       (0x3F6)
1090 d63001d1 j_mayer
#define SPR_970_HID5     (0x3F6)
1091 a750fc0b j_mayer
#define SPR_MSSSR0       (0x3F7)
1092 2662a059 j_mayer
#define SPR_DABRX        (0x3F7)
1093 76a66253 j_mayer
#define SPR_40x_DAC2     (0x3F7)
1094 65f9ee8d j_mayer
#define SPR_MMUCFG       (0x3F7)
1095 a750fc0b j_mayer
#define SPR_LDSTCR       (0x3F8)
1096 a750fc0b j_mayer
#define SPR_L2PMCR       (0x3F8)
1097 76a66253 j_mayer
#define SPR_750_HID2     (0x3F8)
1098 a750fc0b j_mayer
#define SPR_620_HID8     (0x3F8)
1099 76a66253 j_mayer
#define SPR_L2CR         (0x3F9)
1100 a750fc0b j_mayer
#define SPR_620_HID9     (0x3F9)
1101 a750fc0b j_mayer
#define SPR_L3CR         (0x3FA)
1102 76a66253 j_mayer
#define SPR_IABR2        (0x3FA)
1103 76a66253 j_mayer
#define SPR_40x_DCCR     (0x3FA)
1104 76a66253 j_mayer
#define SPR_ICTC         (0x3FB)
1105 76a66253 j_mayer
#define SPR_40x_ICCR     (0x3FB)
1106 76a66253 j_mayer
#define SPR_THRM1        (0x3FC)
1107 76a66253 j_mayer
#define SPR_403_PBL1     (0x3FC)
1108 76a66253 j_mayer
#define SPR_SP           (0x3FD)
1109 76a66253 j_mayer
#define SPR_THRM2        (0x3FD)
1110 76a66253 j_mayer
#define SPR_403_PBU1     (0x3FD)
1111 a750fc0b j_mayer
#define SPR_604_HID13    (0x3FD)
1112 76a66253 j_mayer
#define SPR_LT           (0x3FE)
1113 76a66253 j_mayer
#define SPR_THRM3        (0x3FE)
1114 76a66253 j_mayer
#define SPR_FPECR        (0x3FE)
1115 76a66253 j_mayer
#define SPR_403_PBL2     (0x3FE)
1116 76a66253 j_mayer
#define SPR_PIR          (0x3FF)
1117 76a66253 j_mayer
#define SPR_403_PBU2     (0x3FF)
1118 76a66253 j_mayer
#define SPR_601_HID15    (0x3FF)
1119 a750fc0b j_mayer
#define SPR_604_HID15    (0x3FF)
1120 76a66253 j_mayer
#define SPR_E500_SVR     (0x3FF)
1121 79aceca5 bellard
1122 76a66253 j_mayer
/*****************************************************************************/
1123 9a64fbe4 bellard
/* Memory access type :
1124 9a64fbe4 bellard
 * may be needed for precise access rights control and precise exceptions.
1125 9a64fbe4 bellard
 */
1126 79aceca5 bellard
enum {
1127 9a64fbe4 bellard
    /* 1 bit to define user level / supervisor access */
1128 9a64fbe4 bellard
    ACCESS_USER  = 0x00,
1129 9a64fbe4 bellard
    ACCESS_SUPER = 0x01,
1130 9a64fbe4 bellard
    /* Type of instruction that generated the access */
1131 9a64fbe4 bellard
    ACCESS_CODE  = 0x10, /* Code fetch access                */
1132 9a64fbe4 bellard
    ACCESS_INT   = 0x20, /* Integer load/store access        */
1133 9a64fbe4 bellard
    ACCESS_FLOAT = 0x30, /* floating point load/store access */
1134 9a64fbe4 bellard
    ACCESS_RES   = 0x40, /* load/store with reservation      */
1135 9a64fbe4 bellard
    ACCESS_EXT   = 0x50, /* external access                  */
1136 9a64fbe4 bellard
    ACCESS_CACHE = 0x60, /* Cache manipulation               */
1137 9a64fbe4 bellard
};
1138 9a64fbe4 bellard
1139 47103572 j_mayer
/* Hardware interruption sources:
1140 47103572 j_mayer
 * all those exception can be raised simulteaneously
1141 47103572 j_mayer
 */
1142 e9df014c j_mayer
/* Input pins definitions */
1143 e9df014c j_mayer
enum {
1144 e9df014c j_mayer
    /* 6xx bus input pins */
1145 24be5ae3 j_mayer
    PPC6xx_INPUT_HRESET     = 0,
1146 24be5ae3 j_mayer
    PPC6xx_INPUT_SRESET     = 1,
1147 24be5ae3 j_mayer
    PPC6xx_INPUT_CKSTP_IN   = 2,
1148 24be5ae3 j_mayer
    PPC6xx_INPUT_MCP        = 3,
1149 24be5ae3 j_mayer
    PPC6xx_INPUT_SMI        = 4,
1150 24be5ae3 j_mayer
    PPC6xx_INPUT_INT        = 5,
1151 d68f1306 j_mayer
    PPC6xx_INPUT_TBEN       = 6,
1152 d68f1306 j_mayer
    PPC6xx_INPUT_WAKEUP     = 7,
1153 d68f1306 j_mayer
    PPC6xx_INPUT_NB,
1154 24be5ae3 j_mayer
};
1155 24be5ae3 j_mayer
1156 24be5ae3 j_mayer
enum {
1157 e9df014c j_mayer
    /* Embedded PowerPC input pins */
1158 24be5ae3 j_mayer
    PPCBookE_INPUT_HRESET     = 0,
1159 24be5ae3 j_mayer
    PPCBookE_INPUT_SRESET     = 1,
1160 24be5ae3 j_mayer
    PPCBookE_INPUT_CKSTP_IN   = 2,
1161 24be5ae3 j_mayer
    PPCBookE_INPUT_MCP        = 3,
1162 24be5ae3 j_mayer
    PPCBookE_INPUT_SMI        = 4,
1163 24be5ae3 j_mayer
    PPCBookE_INPUT_INT        = 5,
1164 24be5ae3 j_mayer
    PPCBookE_INPUT_CINT       = 6,
1165 d68f1306 j_mayer
    PPCBookE_INPUT_NB,
1166 24be5ae3 j_mayer
};
1167 24be5ae3 j_mayer
1168 24be5ae3 j_mayer
enum {
1169 4e290a0b j_mayer
    /* PowerPC 40x input pins */
1170 4e290a0b j_mayer
    PPC40x_INPUT_RESET_CORE = 0,
1171 4e290a0b j_mayer
    PPC40x_INPUT_RESET_CHIP = 1,
1172 4e290a0b j_mayer
    PPC40x_INPUT_RESET_SYS  = 2,
1173 4e290a0b j_mayer
    PPC40x_INPUT_CINT       = 3,
1174 4e290a0b j_mayer
    PPC40x_INPUT_INT        = 4,
1175 4e290a0b j_mayer
    PPC40x_INPUT_HALT       = 5,
1176 4e290a0b j_mayer
    PPC40x_INPUT_DEBUG      = 6,
1177 4e290a0b j_mayer
    PPC40x_INPUT_NB,
1178 e9df014c j_mayer
};
1179 e9df014c j_mayer
1180 00af685f j_mayer
#if defined(TARGET_PPC64)
1181 d0dfae6e j_mayer
enum {
1182 d0dfae6e j_mayer
    /* PowerPC 970 input pins */
1183 d0dfae6e j_mayer
    PPC970_INPUT_HRESET     = 0,
1184 d0dfae6e j_mayer
    PPC970_INPUT_SRESET     = 1,
1185 d0dfae6e j_mayer
    PPC970_INPUT_CKSTP      = 2,
1186 d0dfae6e j_mayer
    PPC970_INPUT_TBEN       = 3,
1187 d0dfae6e j_mayer
    PPC970_INPUT_MCP        = 4,
1188 d0dfae6e j_mayer
    PPC970_INPUT_INT        = 5,
1189 d0dfae6e j_mayer
    PPC970_INPUT_THINT      = 6,
1190 d0dfae6e j_mayer
};
1191 00af685f j_mayer
#endif
1192 d0dfae6e j_mayer
1193 e9df014c j_mayer
/* Hardware exceptions definitions */
1194 47103572 j_mayer
enum {
1195 e9df014c j_mayer
    /* External hardware exception sources */
1196 e1833e1f j_mayer
    PPC_INTERRUPT_RESET     = 0,  /* Reset exception                      */
1197 d68f1306 j_mayer
    PPC_INTERRUPT_WAKEUP,         /* Wakeup exception                     */
1198 d68f1306 j_mayer
    PPC_INTERRUPT_MCK,            /* Machine check exception              */
1199 d68f1306 j_mayer
    PPC_INTERRUPT_EXT,            /* External interrupt                   */
1200 d68f1306 j_mayer
    PPC_INTERRUPT_SMI,            /* System management interrupt          */
1201 d68f1306 j_mayer
    PPC_INTERRUPT_CEXT,           /* Critical external interrupt          */
1202 d68f1306 j_mayer
    PPC_INTERRUPT_DEBUG,          /* External debug exception             */
1203 d68f1306 j_mayer
    PPC_INTERRUPT_THERM,          /* Thermal exception                    */
1204 e9df014c j_mayer
    /* Internal hardware exception sources */
1205 d68f1306 j_mayer
    PPC_INTERRUPT_DECR,           /* Decrementer exception                */
1206 d68f1306 j_mayer
    PPC_INTERRUPT_HDECR,          /* Hypervisor decrementer exception     */
1207 d68f1306 j_mayer
    PPC_INTERRUPT_PIT,            /* Programmable inteval timer interrupt */
1208 d68f1306 j_mayer
    PPC_INTERRUPT_FIT,            /* Fixed interval timer interrupt       */
1209 d68f1306 j_mayer
    PPC_INTERRUPT_WDT,            /* Watchdog timer interrupt             */
1210 d68f1306 j_mayer
    PPC_INTERRUPT_CDOORBELL,      /* Critical doorbell interrupt          */
1211 d68f1306 j_mayer
    PPC_INTERRUPT_DOORBELL,       /* Doorbell interrupt                   */
1212 d68f1306 j_mayer
    PPC_INTERRUPT_PERFM,          /* Performance monitor interrupt        */
1213 47103572 j_mayer
};
1214 47103572 j_mayer
1215 9a64fbe4 bellard
/*****************************************************************************/
1216 9a64fbe4 bellard
1217 79aceca5 bellard
#endif /* !defined (__CPU_PPC_H__) */