Statistics
| Branch: | Revision:

root / target-ppc / cpu.h @ d7e4b87e

History | View | Annotate | Download (44.8 kB)

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