Statistics
| Branch: | Revision:

root / target-ppc / cpu.h @ 1e6784f9

History | View | Annotate | Download (45.1 kB)

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