Statistics
| Branch: | Revision:

root / target-ppc / cpu.h @ 96091698

History | View | Annotate | Download (90.5 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 8167ee88 Blue Swirl
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 79aceca5 bellard
 */
19 79aceca5 bellard
#if !defined (__CPU_PPC_H__)
20 79aceca5 bellard
#define __CPU_PPC_H__
21 79aceca5 bellard
22 3fc6c082 bellard
#include "config.h"
23 9a78eead Stefan Weil
#include "qemu-common.h"
24 3fc6c082 bellard
25 a4f30719 j_mayer
//#define PPC_EMULATE_32BITS_HYPV
26 a4f30719 j_mayer
27 76a66253 j_mayer
#if defined (TARGET_PPC64)
28 3cd7d1dd j_mayer
/* PowerPC 64 definitions */
29 d9d7210c j_mayer
#define TARGET_LONG_BITS 64
30 35cdaad6 j_mayer
#define TARGET_PAGE_BITS 12
31 3cd7d1dd j_mayer
32 52705890 Richard Henderson
/* Note that the official physical address space bits is 62-M where M
33 52705890 Richard Henderson
   is implementation dependent.  I've not looked up M for the set of
34 52705890 Richard Henderson
   cpus we emulate at the system level.  */
35 52705890 Richard Henderson
#define TARGET_PHYS_ADDR_SPACE_BITS 62
36 52705890 Richard Henderson
37 52705890 Richard Henderson
/* Note that the PPC environment architecture talks about 80 bit virtual
38 52705890 Richard Henderson
   addresses, with segmentation.  Obviously that's not all visible to a
39 52705890 Richard Henderson
   single process, which is all we're concerned with here.  */
40 52705890 Richard Henderson
#ifdef TARGET_ABI32
41 52705890 Richard Henderson
# define TARGET_VIRT_ADDR_SPACE_BITS 32
42 52705890 Richard Henderson
#else
43 52705890 Richard Henderson
# define TARGET_VIRT_ADDR_SPACE_BITS 64
44 52705890 Richard Henderson
#endif
45 52705890 Richard Henderson
46 81762d6d David Gibson
#define TARGET_PAGE_BITS_16M 24
47 81762d6d David Gibson
48 3cd7d1dd j_mayer
#else /* defined (TARGET_PPC64) */
49 3cd7d1dd j_mayer
/* PowerPC 32 definitions */
50 d9d7210c j_mayer
#define TARGET_LONG_BITS 32
51 3cd7d1dd j_mayer
52 3cd7d1dd j_mayer
#if defined(TARGET_PPCEMB)
53 3cd7d1dd j_mayer
/* Specific definitions for PowerPC embedded */
54 3cd7d1dd j_mayer
/* BookE have 36 bits physical address space */
55 3cd7d1dd j_mayer
#if defined(CONFIG_USER_ONLY)
56 3cd7d1dd j_mayer
/* It looks like a lot of Linux programs assume page size
57 3cd7d1dd j_mayer
 * is 4kB long. This is evil, but we have to deal with it...
58 3cd7d1dd j_mayer
 */
59 35cdaad6 j_mayer
#define TARGET_PAGE_BITS 12
60 3cd7d1dd j_mayer
#else /* defined(CONFIG_USER_ONLY) */
61 3cd7d1dd j_mayer
/* Pages can be 1 kB small */
62 3cd7d1dd j_mayer
#define TARGET_PAGE_BITS 10
63 3cd7d1dd j_mayer
#endif /* defined(CONFIG_USER_ONLY) */
64 3cd7d1dd j_mayer
#else /* defined(TARGET_PPCEMB) */
65 3cd7d1dd j_mayer
/* "standard" PowerPC 32 definitions */
66 3cd7d1dd j_mayer
#define TARGET_PAGE_BITS 12
67 3cd7d1dd j_mayer
#endif /* defined(TARGET_PPCEMB) */
68 3cd7d1dd j_mayer
69 8b242eba Alexander Graf
#define TARGET_PHYS_ADDR_SPACE_BITS 36
70 52705890 Richard Henderson
#define TARGET_VIRT_ADDR_SPACE_BITS 32
71 52705890 Richard Henderson
72 3cd7d1dd j_mayer
#endif /* defined (TARGET_PPC64) */
73 3cf1e035 bellard
74 9349b4f9 Andreas Färber
#define CPUArchState struct CPUPPCState
75 c2764719 pbrook
76 79aceca5 bellard
#include "cpu-defs.h"
77 79aceca5 bellard
78 4ecc3190 bellard
#include "softfloat.h"
79 4ecc3190 bellard
80 1fddef4b bellard
#define TARGET_HAS_ICE 1
81 1fddef4b bellard
82 7f70c937 blueswir1
#if defined (TARGET_PPC64)
83 76a66253 j_mayer
#define ELF_MACHINE     EM_PPC64
84 76a66253 j_mayer
#else
85 76a66253 j_mayer
#define ELF_MACHINE     EM_PPC
86 76a66253 j_mayer
#endif
87 9042c0e2 ths
88 3fc6c082 bellard
/*****************************************************************************/
89 a750fc0b j_mayer
/* MMU model                                                                 */
90 c227f099 Anthony Liguori
typedef enum powerpc_mmu_t powerpc_mmu_t;
91 c227f099 Anthony Liguori
enum powerpc_mmu_t {
92 add78955 j_mayer
    POWERPC_MMU_UNKNOWN    = 0x00000000,
93 a750fc0b j_mayer
    /* Standard 32 bits PowerPC MMU                            */
94 add78955 j_mayer
    POWERPC_MMU_32B        = 0x00000001,
95 a750fc0b j_mayer
    /* PowerPC 6xx MMU with software TLB                       */
96 add78955 j_mayer
    POWERPC_MMU_SOFT_6xx   = 0x00000002,
97 a750fc0b j_mayer
    /* PowerPC 74xx MMU with software TLB                      */
98 add78955 j_mayer
    POWERPC_MMU_SOFT_74xx  = 0x00000003,
99 a750fc0b j_mayer
    /* PowerPC 4xx MMU with software TLB                       */
100 add78955 j_mayer
    POWERPC_MMU_SOFT_4xx   = 0x00000004,
101 a750fc0b j_mayer
    /* PowerPC 4xx MMU with software TLB and zones protections */
102 add78955 j_mayer
    POWERPC_MMU_SOFT_4xx_Z = 0x00000005,
103 b4095fed j_mayer
    /* PowerPC MMU in real mode only                           */
104 add78955 j_mayer
    POWERPC_MMU_REAL       = 0x00000006,
105 b4095fed j_mayer
    /* Freescale MPC8xx MMU model                              */
106 add78955 j_mayer
    POWERPC_MMU_MPC8xx     = 0x00000007,
107 a750fc0b j_mayer
    /* BookE MMU model                                         */
108 add78955 j_mayer
    POWERPC_MMU_BOOKE      = 0x00000008,
109 01662f3e Alexander Graf
    /* BookE 2.06 MMU model                                    */
110 01662f3e Alexander Graf
    POWERPC_MMU_BOOKE206   = 0x00000009,
111 faadf50e j_mayer
    /* PowerPC 601 MMU model (specific BATs format)            */
112 add78955 j_mayer
    POWERPC_MMU_601        = 0x0000000A,
113 00af685f j_mayer
#if defined(TARGET_PPC64)
114 add78955 j_mayer
#define POWERPC_MMU_64       0x00010000
115 cdaee006 David Gibson
#define POWERPC_MMU_1TSEG    0x00020000
116 12de9a39 j_mayer
    /* 64 bits PowerPC MMU                                     */
117 add78955 j_mayer
    POWERPC_MMU_64B        = POWERPC_MMU_64 | 0x00000001,
118 add78955 j_mayer
    /* 620 variant (no segment exceptions)                     */
119 add78955 j_mayer
    POWERPC_MMU_620        = POWERPC_MMU_64 | 0x00000002,
120 9d52e907 David Gibson
    /* Architecture 2.06 variant                               */
121 9d52e907 David Gibson
    POWERPC_MMU_2_06       = POWERPC_MMU_64 | POWERPC_MMU_1TSEG | 0x00000003,
122 4656e1f0 Benjamin Herrenschmidt
    /* Architecture 2.06 "degraded" (no 1T segments)           */
123 4656e1f0 Benjamin Herrenschmidt
    POWERPC_MMU_2_06d      = POWERPC_MMU_64 | 0x00000003,
124 00af685f j_mayer
#endif /* defined(TARGET_PPC64) */
125 3fc6c082 bellard
};
126 3fc6c082 bellard
127 3fc6c082 bellard
/*****************************************************************************/
128 a750fc0b j_mayer
/* Exception model                                                           */
129 c227f099 Anthony Liguori
typedef enum powerpc_excp_t powerpc_excp_t;
130 c227f099 Anthony Liguori
enum powerpc_excp_t {
131 a750fc0b j_mayer
    POWERPC_EXCP_UNKNOWN   = 0,
132 3fc6c082 bellard
    /* Standard PowerPC exception model */
133 a750fc0b j_mayer
    POWERPC_EXCP_STD,
134 2662a059 j_mayer
    /* PowerPC 40x exception model      */
135 a750fc0b j_mayer
    POWERPC_EXCP_40x,
136 2662a059 j_mayer
    /* PowerPC 601 exception model      */
137 a750fc0b j_mayer
    POWERPC_EXCP_601,
138 2662a059 j_mayer
    /* PowerPC 602 exception model      */
139 a750fc0b j_mayer
    POWERPC_EXCP_602,
140 2662a059 j_mayer
    /* PowerPC 603 exception model      */
141 a750fc0b j_mayer
    POWERPC_EXCP_603,
142 a750fc0b j_mayer
    /* PowerPC 603e exception model     */
143 a750fc0b j_mayer
    POWERPC_EXCP_603E,
144 a750fc0b j_mayer
    /* PowerPC G2 exception model       */
145 a750fc0b j_mayer
    POWERPC_EXCP_G2,
146 2662a059 j_mayer
    /* PowerPC 604 exception model      */
147 a750fc0b j_mayer
    POWERPC_EXCP_604,
148 2662a059 j_mayer
    /* PowerPC 7x0 exception model      */
149 a750fc0b j_mayer
    POWERPC_EXCP_7x0,
150 2662a059 j_mayer
    /* PowerPC 7x5 exception model      */
151 a750fc0b j_mayer
    POWERPC_EXCP_7x5,
152 2662a059 j_mayer
    /* PowerPC 74xx exception model     */
153 a750fc0b j_mayer
    POWERPC_EXCP_74xx,
154 2662a059 j_mayer
    /* BookE exception model            */
155 a750fc0b j_mayer
    POWERPC_EXCP_BOOKE,
156 00af685f j_mayer
#if defined(TARGET_PPC64)
157 00af685f j_mayer
    /* PowerPC 970 exception model      */
158 00af685f j_mayer
    POWERPC_EXCP_970,
159 9d52e907 David Gibson
    /* POWER7 exception model           */
160 9d52e907 David Gibson
    POWERPC_EXCP_POWER7,
161 00af685f j_mayer
#endif /* defined(TARGET_PPC64) */
162 a750fc0b j_mayer
};
163 a750fc0b j_mayer
164 a750fc0b j_mayer
/*****************************************************************************/
165 e1833e1f j_mayer
/* Exception vectors definitions                                             */
166 e1833e1f j_mayer
enum {
167 e1833e1f j_mayer
    POWERPC_EXCP_NONE    = -1,
168 e1833e1f j_mayer
    /* The 64 first entries are used by the PowerPC embedded specification   */
169 e1833e1f j_mayer
    POWERPC_EXCP_CRITICAL = 0,  /* Critical input                            */
170 e1833e1f j_mayer
    POWERPC_EXCP_MCHECK   = 1,  /* Machine check exception                   */
171 e1833e1f j_mayer
    POWERPC_EXCP_DSI      = 2,  /* Data storage exception                    */
172 e1833e1f j_mayer
    POWERPC_EXCP_ISI      = 3,  /* Instruction storage exception             */
173 e1833e1f j_mayer
    POWERPC_EXCP_EXTERNAL = 4,  /* External input                            */
174 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN    = 5,  /* Alignment exception                       */
175 e1833e1f j_mayer
    POWERPC_EXCP_PROGRAM  = 6,  /* Program exception                         */
176 e1833e1f j_mayer
    POWERPC_EXCP_FPU      = 7,  /* Floating-point unavailable exception      */
177 e1833e1f j_mayer
    POWERPC_EXCP_SYSCALL  = 8,  /* System call exception                     */
178 e1833e1f j_mayer
    POWERPC_EXCP_APU      = 9,  /* Auxiliary processor unavailable           */
179 e1833e1f j_mayer
    POWERPC_EXCP_DECR     = 10, /* Decrementer exception                     */
180 e1833e1f j_mayer
    POWERPC_EXCP_FIT      = 11, /* Fixed-interval timer interrupt            */
181 e1833e1f j_mayer
    POWERPC_EXCP_WDT      = 12, /* Watchdog timer interrupt                  */
182 b4095fed j_mayer
    POWERPC_EXCP_DTLB     = 13, /* Data TLB miss                             */
183 b4095fed j_mayer
    POWERPC_EXCP_ITLB     = 14, /* Instruction TLB miss                      */
184 e1833e1f j_mayer
    POWERPC_EXCP_DEBUG    = 15, /* Debug interrupt                           */
185 e1833e1f j_mayer
    /* Vectors 16 to 31 are reserved                                         */
186 e1833e1f j_mayer
    POWERPC_EXCP_SPEU     = 32, /* SPE/embedded floating-point unavailable   */
187 e1833e1f j_mayer
    POWERPC_EXCP_EFPDI    = 33, /* Embedded floating-point data interrupt    */
188 e1833e1f j_mayer
    POWERPC_EXCP_EFPRI    = 34, /* Embedded floating-point round interrupt   */
189 e1833e1f j_mayer
    POWERPC_EXCP_EPERFM   = 35, /* Embedded performance monitor interrupt    */
190 e1833e1f j_mayer
    POWERPC_EXCP_DOORI    = 36, /* Embedded doorbell interrupt               */
191 e1833e1f j_mayer
    POWERPC_EXCP_DOORCI   = 37, /* Embedded doorbell critical interrupt      */
192 0ef654e3 Alexander Graf
    POWERPC_EXCP_GDOORI   = 38, /* Embedded guest doorbell interrupt         */
193 0ef654e3 Alexander Graf
    POWERPC_EXCP_GDOORCI  = 39, /* Embedded guest doorbell critical interrupt*/
194 0ef654e3 Alexander Graf
    POWERPC_EXCP_HYPPRIV  = 41, /* Embedded hypervisor priv instruction      */
195 0ef654e3 Alexander Graf
    /* Vectors 42 to 63 are reserved                                         */
196 e1833e1f j_mayer
    /* Exceptions defined in the PowerPC server specification                */
197 e1833e1f j_mayer
    POWERPC_EXCP_RESET    = 64, /* System reset exception                    */
198 e1833e1f j_mayer
    POWERPC_EXCP_DSEG     = 65, /* Data segment exception                    */
199 e1833e1f j_mayer
    POWERPC_EXCP_ISEG     = 66, /* Instruction segment exception             */
200 e1833e1f j_mayer
    POWERPC_EXCP_HDECR    = 67, /* Hypervisor decrementer exception          */
201 e1833e1f j_mayer
    POWERPC_EXCP_TRACE    = 68, /* Trace exception                           */
202 e1833e1f j_mayer
    POWERPC_EXCP_HDSI     = 69, /* Hypervisor data storage exception         */
203 e1833e1f j_mayer
    POWERPC_EXCP_HISI     = 70, /* Hypervisor instruction storage exception  */
204 e1833e1f j_mayer
    POWERPC_EXCP_HDSEG    = 71, /* Hypervisor data segment exception         */
205 e1833e1f j_mayer
    POWERPC_EXCP_HISEG    = 72, /* Hypervisor instruction segment exception  */
206 e1833e1f j_mayer
    POWERPC_EXCP_VPU      = 73, /* Vector unavailable exception              */
207 e1833e1f j_mayer
    /* 40x specific exceptions                                               */
208 e1833e1f j_mayer
    POWERPC_EXCP_PIT      = 74, /* Programmable interval timer interrupt     */
209 e1833e1f j_mayer
    /* 601 specific exceptions                                               */
210 e1833e1f j_mayer
    POWERPC_EXCP_IO       = 75, /* IO error exception                        */
211 e1833e1f j_mayer
    POWERPC_EXCP_RUNM     = 76, /* Run mode exception                        */
212 e1833e1f j_mayer
    /* 602 specific exceptions                                               */
213 e1833e1f j_mayer
    POWERPC_EXCP_EMUL     = 77, /* Emulation trap exception                  */
214 e1833e1f j_mayer
    /* 602/603 specific exceptions                                           */
215 b4095fed j_mayer
    POWERPC_EXCP_IFTLB    = 78, /* Instruction fetch TLB miss                */
216 e1833e1f j_mayer
    POWERPC_EXCP_DLTLB    = 79, /* Data load TLB miss                        */
217 e1833e1f j_mayer
    POWERPC_EXCP_DSTLB    = 80, /* Data store TLB miss                       */
218 e1833e1f j_mayer
    /* Exceptions available on most PowerPC                                  */
219 e1833e1f j_mayer
    POWERPC_EXCP_FPA      = 81, /* Floating-point assist exception           */
220 b4095fed j_mayer
    POWERPC_EXCP_DABR     = 82, /* Data address breakpoint                   */
221 b4095fed j_mayer
    POWERPC_EXCP_IABR     = 83, /* Instruction address breakpoint            */
222 b4095fed j_mayer
    POWERPC_EXCP_SMI      = 84, /* System management interrupt               */
223 b4095fed j_mayer
    POWERPC_EXCP_PERFM    = 85, /* Embedded performance monitor interrupt    */
224 e1833e1f j_mayer
    /* 7xx/74xx specific exceptions                                          */
225 b4095fed j_mayer
    POWERPC_EXCP_THERM    = 86, /* Thermal interrupt                         */
226 e1833e1f j_mayer
    /* 74xx specific exceptions                                              */
227 b4095fed j_mayer
    POWERPC_EXCP_VPUA     = 87, /* Vector assist exception                   */
228 e1833e1f j_mayer
    /* 970FX specific exceptions                                             */
229 b4095fed j_mayer
    POWERPC_EXCP_SOFTP    = 88, /* Soft patch exception                      */
230 b4095fed j_mayer
    POWERPC_EXCP_MAINT    = 89, /* Maintenance exception                     */
231 5b46d07d Stefan Weil
    /* Freescale embedded cores specific exceptions                          */
232 b4095fed j_mayer
    POWERPC_EXCP_MEXTBR   = 90, /* Maskable external breakpoint              */
233 b4095fed j_mayer
    POWERPC_EXCP_NMEXTBR  = 91, /* Non maskable external breakpoint          */
234 b4095fed j_mayer
    POWERPC_EXCP_ITLBE    = 92, /* Instruction TLB error                     */
235 b4095fed j_mayer
    POWERPC_EXCP_DTLBE    = 93, /* Data TLB error                            */
236 e1833e1f j_mayer
    /* EOL                                                                   */
237 e1833e1f j_mayer
    POWERPC_EXCP_NB       = 96,
238 5cbdb3a3 Stefan Weil
    /* QEMU exceptions: used internally during code translation              */
239 e1833e1f j_mayer
    POWERPC_EXCP_STOP         = 0x200, /* stop translation                   */
240 e1833e1f j_mayer
    POWERPC_EXCP_BRANCH       = 0x201, /* branch instruction                 */
241 5cbdb3a3 Stefan Weil
    /* QEMU exceptions: special cases we want to stop translation            */
242 e1833e1f j_mayer
    POWERPC_EXCP_SYNC         = 0x202, /* context synchronizing instruction  */
243 e1833e1f j_mayer
    POWERPC_EXCP_SYSCALL_USER = 0x203, /* System call in user mode only      */
244 4425265b Nathan Froyd
    POWERPC_EXCP_STCX         = 0x204 /* Conditional stores in user mode     */
245 e1833e1f j_mayer
};
246 e1833e1f j_mayer
247 e1833e1f j_mayer
/* Exceptions error codes                                                    */
248 e1833e1f j_mayer
enum {
249 e1833e1f j_mayer
    /* Exception subtypes for POWERPC_EXCP_ALIGN                             */
250 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_FP      = 0x01,  /* FP alignment exception            */
251 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_LST     = 0x02,  /* Unaligned mult/extern load/store  */
252 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_LE      = 0x03,  /* Multiple little-endian access     */
253 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_PROT    = 0x04,  /* Access cross protection boundary  */
254 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_BAT     = 0x05,  /* Access cross a BAT/seg boundary   */
255 e1833e1f j_mayer
    POWERPC_EXCP_ALIGN_CACHE   = 0x06,  /* Impossible dcbz access            */
256 e1833e1f j_mayer
    /* Exception subtypes for POWERPC_EXCP_PROGRAM                           */
257 e1833e1f j_mayer
    /* FP exceptions                                                         */
258 e1833e1f j_mayer
    POWERPC_EXCP_FP            = 0x10,
259 e1833e1f j_mayer
    POWERPC_EXCP_FP_OX         = 0x01,  /* FP overflow                       */
260 e1833e1f j_mayer
    POWERPC_EXCP_FP_UX         = 0x02,  /* FP underflow                      */
261 e1833e1f j_mayer
    POWERPC_EXCP_FP_ZX         = 0x03,  /* FP divide by zero                 */
262 e1833e1f j_mayer
    POWERPC_EXCP_FP_XX         = 0x04,  /* FP inexact                        */
263 7c58044c j_mayer
    POWERPC_EXCP_FP_VXSNAN     = 0x05,  /* FP invalid SNaN op                */
264 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXISI      = 0x06,  /* FP invalid infinite subtraction   */
265 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXIDI      = 0x07,  /* FP invalid infinite divide        */
266 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXZDZ      = 0x08,  /* FP invalid zero divide            */
267 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXIMZ      = 0x09,  /* FP invalid infinite * zero        */
268 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXVC       = 0x0A,  /* FP invalid compare                */
269 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXSOFT     = 0x0B,  /* FP invalid operation              */
270 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXSQRT     = 0x0C,  /* FP invalid square root            */
271 e1833e1f j_mayer
    POWERPC_EXCP_FP_VXCVI      = 0x0D,  /* FP invalid integer conversion     */
272 e1833e1f j_mayer
    /* Invalid instruction                                                   */
273 e1833e1f j_mayer
    POWERPC_EXCP_INVAL         = 0x20,
274 e1833e1f j_mayer
    POWERPC_EXCP_INVAL_INVAL   = 0x01,  /* Invalid instruction               */
275 e1833e1f j_mayer
    POWERPC_EXCP_INVAL_LSWX    = 0x02,  /* Invalid lswx instruction          */
276 e1833e1f j_mayer
    POWERPC_EXCP_INVAL_SPR     = 0x03,  /* Invalid SPR access                */
277 e1833e1f j_mayer
    POWERPC_EXCP_INVAL_FP      = 0x04,  /* Unimplemented mandatory fp instr  */
278 e1833e1f j_mayer
    /* Privileged instruction                                                */
279 e1833e1f j_mayer
    POWERPC_EXCP_PRIV          = 0x30,
280 e1833e1f j_mayer
    POWERPC_EXCP_PRIV_OPC      = 0x01,  /* Privileged operation exception    */
281 e1833e1f j_mayer
    POWERPC_EXCP_PRIV_REG      = 0x02,  /* Privileged register exception     */
282 e1833e1f j_mayer
    /* Trap                                                                  */
283 e1833e1f j_mayer
    POWERPC_EXCP_TRAP          = 0x40,
284 e1833e1f j_mayer
};
285 e1833e1f j_mayer
286 e1833e1f j_mayer
/*****************************************************************************/
287 a750fc0b j_mayer
/* Input pins model                                                          */
288 c227f099 Anthony Liguori
typedef enum powerpc_input_t powerpc_input_t;
289 c227f099 Anthony Liguori
enum powerpc_input_t {
290 a750fc0b j_mayer
    PPC_FLAGS_INPUT_UNKNOWN = 0,
291 2662a059 j_mayer
    /* PowerPC 6xx bus                  */
292 a750fc0b j_mayer
    PPC_FLAGS_INPUT_6xx,
293 2662a059 j_mayer
    /* BookE bus                        */
294 a750fc0b j_mayer
    PPC_FLAGS_INPUT_BookE,
295 a750fc0b j_mayer
    /* PowerPC 405 bus                  */
296 a750fc0b j_mayer
    PPC_FLAGS_INPUT_405,
297 2662a059 j_mayer
    /* PowerPC 970 bus                  */
298 a750fc0b j_mayer
    PPC_FLAGS_INPUT_970,
299 9d52e907 David Gibson
    /* PowerPC POWER7 bus               */
300 9d52e907 David Gibson
    PPC_FLAGS_INPUT_POWER7,
301 a750fc0b j_mayer
    /* PowerPC 401 bus                  */
302 a750fc0b j_mayer
    PPC_FLAGS_INPUT_401,
303 b4095fed j_mayer
    /* Freescale RCPU bus               */
304 b4095fed j_mayer
    PPC_FLAGS_INPUT_RCPU,
305 3fc6c082 bellard
};
306 3fc6c082 bellard
307 a750fc0b j_mayer
#define PPC_INPUT(env) (env->bus_model)
308 3fc6c082 bellard
309 be147d08 j_mayer
/*****************************************************************************/
310 c227f099 Anthony Liguori
typedef struct ppc_def_t ppc_def_t;
311 c227f099 Anthony Liguori
typedef struct opc_handler_t opc_handler_t;
312 79aceca5 bellard
313 3fc6c082 bellard
/*****************************************************************************/
314 3fc6c082 bellard
/* Types used to describe some PowerPC registers */
315 3fc6c082 bellard
typedef struct CPUPPCState CPUPPCState;
316 c227f099 Anthony Liguori
typedef struct ppc_tb_t ppc_tb_t;
317 c227f099 Anthony Liguori
typedef struct ppc_spr_t ppc_spr_t;
318 c227f099 Anthony Liguori
typedef struct ppc_dcr_t ppc_dcr_t;
319 c227f099 Anthony Liguori
typedef union ppc_avr_t ppc_avr_t;
320 c227f099 Anthony Liguori
typedef union ppc_tlb_t ppc_tlb_t;
321 76a66253 j_mayer
322 3fc6c082 bellard
/* SPR access micro-ops generations callbacks */
323 c227f099 Anthony Liguori
struct ppc_spr_t {
324 45d827d2 aurel32
    void (*uea_read)(void *opaque, int gpr_num, int spr_num);
325 45d827d2 aurel32
    void (*uea_write)(void *opaque, int spr_num, int gpr_num);
326 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
327 45d827d2 aurel32
    void (*oea_read)(void *opaque, int gpr_num, int spr_num);
328 45d827d2 aurel32
    void (*oea_write)(void *opaque, int spr_num, int gpr_num);
329 45d827d2 aurel32
    void (*hea_read)(void *opaque, int gpr_num, int spr_num);
330 45d827d2 aurel32
    void (*hea_write)(void *opaque, int spr_num, int gpr_num);
331 be147d08 j_mayer
#endif
332 b55266b5 blueswir1
    const char *name;
333 3fc6c082 bellard
};
334 3fc6c082 bellard
335 3fc6c082 bellard
/* Altivec registers (128 bits) */
336 c227f099 Anthony Liguori
union ppc_avr_t {
337 0f6fbcbc aurel32
    float32 f[4];
338 a9d9eb8f j_mayer
    uint8_t u8[16];
339 a9d9eb8f j_mayer
    uint16_t u16[8];
340 a9d9eb8f j_mayer
    uint32_t u32[4];
341 ab5f265d aurel32
    int8_t s8[16];
342 ab5f265d aurel32
    int16_t s16[8];
343 ab5f265d aurel32
    int32_t s32[4];
344 a9d9eb8f j_mayer
    uint64_t u64[2];
345 3fc6c082 bellard
};
346 9fddaa0c bellard
347 3c7b48b7 Paul Brook
#if !defined(CONFIG_USER_ONLY)
348 3fc6c082 bellard
/* Software TLB cache */
349 c227f099 Anthony Liguori
typedef struct ppc6xx_tlb_t ppc6xx_tlb_t;
350 c227f099 Anthony Liguori
struct ppc6xx_tlb_t {
351 76a66253 j_mayer
    target_ulong pte0;
352 76a66253 j_mayer
    target_ulong pte1;
353 76a66253 j_mayer
    target_ulong EPN;
354 1d0a48fb j_mayer
};
355 1d0a48fb j_mayer
356 c227f099 Anthony Liguori
typedef struct ppcemb_tlb_t ppcemb_tlb_t;
357 c227f099 Anthony Liguori
struct ppcemb_tlb_t {
358 c227f099 Anthony Liguori
    target_phys_addr_t RPN;
359 1d0a48fb j_mayer
    target_ulong EPN;
360 76a66253 j_mayer
    target_ulong PID;
361 c55e9aef j_mayer
    target_ulong size;
362 c55e9aef j_mayer
    uint32_t prot;
363 c55e9aef j_mayer
    uint32_t attr; /* Storage attributes */
364 1d0a48fb j_mayer
};
365 1d0a48fb j_mayer
366 d1e256fe Alexander Graf
typedef struct ppcmas_tlb_t {
367 d1e256fe Alexander Graf
     uint32_t mas8;
368 d1e256fe Alexander Graf
     uint32_t mas1;
369 d1e256fe Alexander Graf
     uint64_t mas2;
370 d1e256fe Alexander Graf
     uint64_t mas7_3;
371 d1e256fe Alexander Graf
} ppcmas_tlb_t;
372 d1e256fe Alexander Graf
373 c227f099 Anthony Liguori
union ppc_tlb_t {
374 1c53accc Alexander Graf
    ppc6xx_tlb_t *tlb6;
375 1c53accc Alexander Graf
    ppcemb_tlb_t *tlbe;
376 1c53accc Alexander Graf
    ppcmas_tlb_t *tlbm;
377 3fc6c082 bellard
};
378 1c53accc Alexander Graf
379 1c53accc Alexander Graf
/* possible TLB variants */
380 1c53accc Alexander Graf
#define TLB_NONE               0
381 1c53accc Alexander Graf
#define TLB_6XX                1
382 1c53accc Alexander Graf
#define TLB_EMB                2
383 1c53accc Alexander Graf
#define TLB_MAS                3
384 3c7b48b7 Paul Brook
#endif
385 3fc6c082 bellard
386 bb593904 David Gibson
#define SDR_32_HTABORG         0xFFFF0000UL
387 bb593904 David Gibson
#define SDR_32_HTABMASK        0x000001FFUL
388 bb593904 David Gibson
389 bb593904 David Gibson
#if defined(TARGET_PPC64)
390 bb593904 David Gibson
#define SDR_64_HTABORG         0xFFFFFFFFFFFC0000ULL
391 bb593904 David Gibson
#define SDR_64_HTABSIZE        0x000000000000001FULL
392 bb593904 David Gibson
#endif /* defined(TARGET_PPC64 */
393 bb593904 David Gibson
394 fda6a0ec David Gibson
#define HASH_PTE_SIZE_32       8
395 fda6a0ec David Gibson
#define HASH_PTE_SIZE_64       16
396 fda6a0ec David Gibson
397 c227f099 Anthony Liguori
typedef struct ppc_slb_t ppc_slb_t;
398 c227f099 Anthony Liguori
struct ppc_slb_t {
399 81762d6d David Gibson
    uint64_t esid;
400 81762d6d David Gibson
    uint64_t vsid;
401 8eee0af9 blueswir1
};
402 8eee0af9 blueswir1
403 81762d6d David Gibson
/* Bits in the SLB ESID word */
404 81762d6d David Gibson
#define SLB_ESID_ESID           0xFFFFFFFFF0000000ULL
405 81762d6d David Gibson
#define SLB_ESID_V              0x0000000008000000ULL /* valid */
406 81762d6d David Gibson
407 81762d6d David Gibson
/* Bits in the SLB VSID word */
408 81762d6d David Gibson
#define SLB_VSID_SHIFT          12
409 cdaee006 David Gibson
#define SLB_VSID_SHIFT_1T       24
410 81762d6d David Gibson
#define SLB_VSID_SSIZE_SHIFT    62
411 81762d6d David Gibson
#define SLB_VSID_B              0xc000000000000000ULL
412 81762d6d David Gibson
#define SLB_VSID_B_256M         0x0000000000000000ULL
413 cdaee006 David Gibson
#define SLB_VSID_B_1T           0x4000000000000000ULL
414 81762d6d David Gibson
#define SLB_VSID_VSID           0x3FFFFFFFFFFFF000ULL
415 256cebe5 David Gibson
#define SLB_VSID_PTEM           (SLB_VSID_B | SLB_VSID_VSID)
416 81762d6d David Gibson
#define SLB_VSID_KS             0x0000000000000800ULL
417 81762d6d David Gibson
#define SLB_VSID_KP             0x0000000000000400ULL
418 81762d6d David Gibson
#define SLB_VSID_N              0x0000000000000200ULL /* no-execute */
419 81762d6d David Gibson
#define SLB_VSID_L              0x0000000000000100ULL
420 81762d6d David Gibson
#define SLB_VSID_C              0x0000000000000080ULL /* class */
421 81762d6d David Gibson
#define SLB_VSID_LP             0x0000000000000030ULL
422 81762d6d David Gibson
#define SLB_VSID_ATTR           0x0000000000000FFFULL
423 81762d6d David Gibson
424 81762d6d David Gibson
#define SEGMENT_SHIFT_256M      28
425 81762d6d David Gibson
#define SEGMENT_MASK_256M       (~((1ULL << SEGMENT_SHIFT_256M) - 1))
426 81762d6d David Gibson
427 cdaee006 David Gibson
#define SEGMENT_SHIFT_1T        40
428 cdaee006 David Gibson
#define SEGMENT_MASK_1T         (~((1ULL << SEGMENT_SHIFT_1T) - 1))
429 cdaee006 David Gibson
430 cdaee006 David Gibson
431 3fc6c082 bellard
/*****************************************************************************/
432 3fc6c082 bellard
/* Machine state register bits definition                                    */
433 76a66253 j_mayer
#define MSR_SF   63 /* Sixty-four-bit mode                            hflags */
434 bd928eba j_mayer
#define MSR_TAG  62 /* Tag-active mode (POWERx ?)                            */
435 3fc6c082 bellard
#define MSR_ISF  61 /* Sixty-four-bit interrupt mode on 630                  */
436 a4f30719 j_mayer
#define MSR_SHV  60 /* hypervisor state                               hflags */
437 363be49c j_mayer
#define MSR_CM   31 /* Computation mode for BookE                     hflags */
438 363be49c j_mayer
#define MSR_ICM  30 /* Interrupt computation mode for BookE                  */
439 a4f30719 j_mayer
#define MSR_THV  29 /* hypervisor state for 32 bits PowerPC           hflags */
440 71afeb61 Alexander Graf
#define MSR_GS   28 /* guest state for BookE                                 */
441 363be49c j_mayer
#define MSR_UCLE 26 /* User-mode cache lock enable for BookE                 */
442 d26bfc9a j_mayer
#define MSR_VR   25 /* altivec available                            x hflags */
443 d26bfc9a j_mayer
#define MSR_SPE  25 /* SPE enable for BookE                         x hflags */
444 76a66253 j_mayer
#define MSR_AP   23 /* Access privilege state on 602                  hflags */
445 76a66253 j_mayer
#define MSR_SA   22 /* Supervisor access mode on 602                  hflags */
446 3fc6c082 bellard
#define MSR_KEY  19 /* key bit on 603e                                       */
447 25ba3a68 j_mayer
#define MSR_POW  18 /* Power management                                      */
448 d26bfc9a j_mayer
#define MSR_TGPR 17 /* TGPR usage on 602/603                        x        */
449 d26bfc9a j_mayer
#define MSR_CE   17 /* Critical interrupt enable on embedded PowerPC x       */
450 3fc6c082 bellard
#define MSR_ILE  16 /* Interrupt little-endian mode                          */
451 3fc6c082 bellard
#define MSR_EE   15 /* External interrupt enable                             */
452 76a66253 j_mayer
#define MSR_PR   14 /* Problem state                                  hflags */
453 76a66253 j_mayer
#define MSR_FP   13 /* Floating point available                       hflags */
454 3fc6c082 bellard
#define MSR_ME   12 /* Machine check interrupt enable                        */
455 76a66253 j_mayer
#define MSR_FE0  11 /* Floating point exception mode 0                hflags */
456 d26bfc9a j_mayer
#define MSR_SE   10 /* Single-step trace enable                     x hflags */
457 d26bfc9a j_mayer
#define MSR_DWE  10 /* Debug wait enable on 405                     x        */
458 d26bfc9a j_mayer
#define MSR_UBLE 10 /* User BTB lock enable on e500                 x        */
459 d26bfc9a j_mayer
#define MSR_BE   9  /* Branch trace enable                          x hflags */
460 d26bfc9a j_mayer
#define MSR_DE   9  /* Debug interrupts enable on embedded PowerPC  x        */
461 76a66253 j_mayer
#define MSR_FE1  8  /* Floating point exception mode 1                hflags */
462 3fc6c082 bellard
#define MSR_AL   7  /* AL bit on POWER                                       */
463 0411a972 j_mayer
#define MSR_EP   6  /* Exception prefix on 601                               */
464 3fc6c082 bellard
#define MSR_IR   5  /* Instruction relocate                                  */
465 3fc6c082 bellard
#define MSR_DR   4  /* Data relocate                                         */
466 25ba3a68 j_mayer
#define MSR_PE   3  /* Protection enable on 403                              */
467 d26bfc9a j_mayer
#define MSR_PX   2  /* Protection exclusive on 403                  x        */
468 d26bfc9a j_mayer
#define MSR_PMM  2  /* Performance monitor mark on POWER            x        */
469 d26bfc9a j_mayer
#define MSR_RI   1  /* Recoverable interrupt                        1        */
470 d26bfc9a j_mayer
#define MSR_LE   0  /* Little-endian mode                           1 hflags */
471 0411a972 j_mayer
472 0411a972 j_mayer
#define msr_sf   ((env->msr >> MSR_SF)   & 1)
473 0411a972 j_mayer
#define msr_isf  ((env->msr >> MSR_ISF)  & 1)
474 a4f30719 j_mayer
#define msr_shv  ((env->msr >> MSR_SHV)  & 1)
475 0411a972 j_mayer
#define msr_cm   ((env->msr >> MSR_CM)   & 1)
476 0411a972 j_mayer
#define msr_icm  ((env->msr >> MSR_ICM)  & 1)
477 a4f30719 j_mayer
#define msr_thv  ((env->msr >> MSR_THV)  & 1)
478 71afeb61 Alexander Graf
#define msr_gs   ((env->msr >> MSR_GS)   & 1)
479 0411a972 j_mayer
#define msr_ucle ((env->msr >> MSR_UCLE) & 1)
480 0411a972 j_mayer
#define msr_vr   ((env->msr >> MSR_VR)   & 1)
481 f9320410 aurel32
#define msr_spe  ((env->msr >> MSR_SPE)  & 1)
482 0411a972 j_mayer
#define msr_ap   ((env->msr >> MSR_AP)   & 1)
483 0411a972 j_mayer
#define msr_sa   ((env->msr >> MSR_SA)   & 1)
484 0411a972 j_mayer
#define msr_key  ((env->msr >> MSR_KEY)  & 1)
485 0411a972 j_mayer
#define msr_pow  ((env->msr >> MSR_POW)  & 1)
486 0411a972 j_mayer
#define msr_tgpr ((env->msr >> MSR_TGPR) & 1)
487 0411a972 j_mayer
#define msr_ce   ((env->msr >> MSR_CE)   & 1)
488 0411a972 j_mayer
#define msr_ile  ((env->msr >> MSR_ILE)  & 1)
489 0411a972 j_mayer
#define msr_ee   ((env->msr >> MSR_EE)   & 1)
490 0411a972 j_mayer
#define msr_pr   ((env->msr >> MSR_PR)   & 1)
491 0411a972 j_mayer
#define msr_fp   ((env->msr >> MSR_FP)   & 1)
492 0411a972 j_mayer
#define msr_me   ((env->msr >> MSR_ME)   & 1)
493 0411a972 j_mayer
#define msr_fe0  ((env->msr >> MSR_FE0)  & 1)
494 0411a972 j_mayer
#define msr_se   ((env->msr >> MSR_SE)   & 1)
495 0411a972 j_mayer
#define msr_dwe  ((env->msr >> MSR_DWE)  & 1)
496 0411a972 j_mayer
#define msr_uble ((env->msr >> MSR_UBLE) & 1)
497 0411a972 j_mayer
#define msr_be   ((env->msr >> MSR_BE)   & 1)
498 0411a972 j_mayer
#define msr_de   ((env->msr >> MSR_DE)   & 1)
499 0411a972 j_mayer
#define msr_fe1  ((env->msr >> MSR_FE1)  & 1)
500 0411a972 j_mayer
#define msr_al   ((env->msr >> MSR_AL)   & 1)
501 0411a972 j_mayer
#define msr_ep   ((env->msr >> MSR_EP)   & 1)
502 0411a972 j_mayer
#define msr_ir   ((env->msr >> MSR_IR)   & 1)
503 0411a972 j_mayer
#define msr_dr   ((env->msr >> MSR_DR)   & 1)
504 0411a972 j_mayer
#define msr_pe   ((env->msr >> MSR_PE)   & 1)
505 0411a972 j_mayer
#define msr_px   ((env->msr >> MSR_PX)   & 1)
506 0411a972 j_mayer
#define msr_pmm  ((env->msr >> MSR_PMM)  & 1)
507 0411a972 j_mayer
#define msr_ri   ((env->msr >> MSR_RI)   & 1)
508 0411a972 j_mayer
#define msr_le   ((env->msr >> MSR_LE)   & 1)
509 a4f30719 j_mayer
/* Hypervisor bit is more specific */
510 a4f30719 j_mayer
#if defined(TARGET_PPC64)
511 a4f30719 j_mayer
#define MSR_HVB (1ULL << MSR_SHV)
512 a4f30719 j_mayer
#define msr_hv  msr_shv
513 a4f30719 j_mayer
#else
514 a4f30719 j_mayer
#if defined(PPC_EMULATE_32BITS_HYPV)
515 a4f30719 j_mayer
#define MSR_HVB (1ULL << MSR_THV)
516 a4f30719 j_mayer
#define msr_hv  msr_thv
517 a4f30719 j_mayer
#else
518 a4f30719 j_mayer
#define MSR_HVB (0ULL)
519 a4f30719 j_mayer
#define msr_hv  (0)
520 a4f30719 j_mayer
#endif
521 a4f30719 j_mayer
#endif
522 79aceca5 bellard
523 a586e548 Edgar E. Iglesias
/* Exception state register bits definition                                  */
524 542df9bf Alexander Graf
#define ESR_PIL   (1 << (63 - 36)) /* Illegal Instruction                    */
525 542df9bf Alexander Graf
#define ESR_PPR   (1 << (63 - 37)) /* Privileged Instruction                 */
526 542df9bf Alexander Graf
#define ESR_PTR   (1 << (63 - 38)) /* Trap                                   */
527 542df9bf Alexander Graf
#define ESR_FP    (1 << (63 - 39)) /* Floating-Point Operation               */
528 542df9bf Alexander Graf
#define ESR_ST    (1 << (63 - 40)) /* Store Operation                        */
529 542df9bf Alexander Graf
#define ESR_AP    (1 << (63 - 44)) /* Auxiliary Processor Operation          */
530 542df9bf Alexander Graf
#define ESR_PUO   (1 << (63 - 45)) /* Unimplemented Operation                */
531 542df9bf Alexander Graf
#define ESR_BO    (1 << (63 - 46)) /* Byte Ordering                          */
532 542df9bf Alexander Graf
#define ESR_PIE   (1 << (63 - 47)) /* Imprecise exception                    */
533 542df9bf Alexander Graf
#define ESR_DATA  (1 << (63 - 53)) /* Data Access (Embedded page table)      */
534 542df9bf Alexander Graf
#define ESR_TLBI  (1 << (63 - 54)) /* TLB Ineligible (Embedded page table)   */
535 542df9bf Alexander Graf
#define ESR_PT    (1 << (63 - 55)) /* Page Table (Embedded page table)       */
536 542df9bf Alexander Graf
#define ESR_SPV   (1 << (63 - 56)) /* SPE/VMX operation                      */
537 542df9bf Alexander Graf
#define ESR_EPID  (1 << (63 - 57)) /* External Process ID operation          */
538 542df9bf Alexander Graf
#define ESR_VLEMI (1 << (63 - 58)) /* VLE operation                          */
539 542df9bf Alexander Graf
#define ESR_MIF   (1 << (63 - 62)) /* Misaligned instruction (VLE)           */
540 a586e548 Edgar E. Iglesias
541 d26bfc9a j_mayer
enum {
542 4018bae9 j_mayer
    POWERPC_FLAG_NONE     = 0x00000000,
543 d26bfc9a j_mayer
    /* Flag for MSR bit 25 signification (VRE/SPE)                           */
544 4018bae9 j_mayer
    POWERPC_FLAG_SPE      = 0x00000001,
545 4018bae9 j_mayer
    POWERPC_FLAG_VRE      = 0x00000002,
546 d26bfc9a j_mayer
    /* Flag for MSR bit 17 signification (TGPR/CE)                           */
547 4018bae9 j_mayer
    POWERPC_FLAG_TGPR     = 0x00000004,
548 4018bae9 j_mayer
    POWERPC_FLAG_CE       = 0x00000008,
549 d26bfc9a j_mayer
    /* Flag for MSR bit 10 signification (SE/DWE/UBLE)                       */
550 4018bae9 j_mayer
    POWERPC_FLAG_SE       = 0x00000010,
551 4018bae9 j_mayer
    POWERPC_FLAG_DWE      = 0x00000020,
552 4018bae9 j_mayer
    POWERPC_FLAG_UBLE     = 0x00000040,
553 d26bfc9a j_mayer
    /* Flag for MSR bit 9 signification (BE/DE)                              */
554 4018bae9 j_mayer
    POWERPC_FLAG_BE       = 0x00000080,
555 4018bae9 j_mayer
    POWERPC_FLAG_DE       = 0x00000100,
556 a4f30719 j_mayer
    /* Flag for MSR bit 2 signification (PX/PMM)                             */
557 4018bae9 j_mayer
    POWERPC_FLAG_PX       = 0x00000200,
558 4018bae9 j_mayer
    POWERPC_FLAG_PMM      = 0x00000400,
559 4018bae9 j_mayer
    /* Flag for special features                                             */
560 4018bae9 j_mayer
    /* Decrementer clock: RTC clock (POWER, 601) or bus clock                */
561 4018bae9 j_mayer
    POWERPC_FLAG_RTC_CLK  = 0x00010000,
562 4018bae9 j_mayer
    POWERPC_FLAG_BUS_CLK  = 0x00020000,
563 697ab892 David Gibson
    /* Has CFAR                                                              */
564 697ab892 David Gibson
    POWERPC_FLAG_CFAR     = 0x00040000,
565 d26bfc9a j_mayer
};
566 d26bfc9a j_mayer
567 7c58044c j_mayer
/*****************************************************************************/
568 7c58044c j_mayer
/* Floating point status and control register                                */
569 7c58044c j_mayer
#define FPSCR_FX     31 /* Floating-point exception summary                  */
570 7c58044c j_mayer
#define FPSCR_FEX    30 /* Floating-point enabled exception summary          */
571 7c58044c j_mayer
#define FPSCR_VX     29 /* Floating-point invalid operation exception summ.  */
572 7c58044c j_mayer
#define FPSCR_OX     28 /* Floating-point overflow exception                 */
573 7c58044c j_mayer
#define FPSCR_UX     27 /* Floating-point underflow exception                */
574 7c58044c j_mayer
#define FPSCR_ZX     26 /* Floating-point zero divide exception              */
575 7c58044c j_mayer
#define FPSCR_XX     25 /* Floating-point inexact exception                  */
576 7c58044c j_mayer
#define FPSCR_VXSNAN 24 /* Floating-point invalid operation exception (sNan) */
577 7c58044c j_mayer
#define FPSCR_VXISI  23 /* Floating-point invalid operation exception (inf)  */
578 7c58044c j_mayer
#define FPSCR_VXIDI  22 /* Floating-point invalid operation exception (inf)  */
579 7c58044c j_mayer
#define FPSCR_VXZDZ  21 /* Floating-point invalid operation exception (zero) */
580 7c58044c j_mayer
#define FPSCR_VXIMZ  20 /* Floating-point invalid operation exception (inf)  */
581 7c58044c j_mayer
#define FPSCR_VXVC   19 /* Floating-point invalid operation exception (comp) */
582 7c58044c j_mayer
#define FPSCR_FR     18 /* Floating-point fraction rounded                   */
583 7c58044c j_mayer
#define FPSCR_FI     17 /* Floating-point fraction inexact                   */
584 7c58044c j_mayer
#define FPSCR_C      16 /* Floating-point result class descriptor            */
585 7c58044c j_mayer
#define FPSCR_FL     15 /* Floating-point less than or negative              */
586 7c58044c j_mayer
#define FPSCR_FG     14 /* Floating-point greater than or negative           */
587 7c58044c j_mayer
#define FPSCR_FE     13 /* Floating-point equal or zero                      */
588 7c58044c j_mayer
#define FPSCR_FU     12 /* Floating-point unordered or NaN                   */
589 7c58044c j_mayer
#define FPSCR_FPCC   12 /* Floating-point condition code                     */
590 7c58044c j_mayer
#define FPSCR_FPRF   12 /* Floating-point result flags                       */
591 7c58044c j_mayer
#define FPSCR_VXSOFT 10 /* Floating-point invalid operation exception (soft) */
592 7c58044c j_mayer
#define FPSCR_VXSQRT 9  /* Floating-point invalid operation exception (sqrt) */
593 7c58044c j_mayer
#define FPSCR_VXCVI  8  /* Floating-point invalid operation exception (int)  */
594 7c58044c j_mayer
#define FPSCR_VE     7  /* Floating-point invalid operation exception enable */
595 7c58044c j_mayer
#define FPSCR_OE     6  /* Floating-point overflow exception enable          */
596 7c58044c j_mayer
#define FPSCR_UE     5  /* Floating-point undeflow exception enable          */
597 7c58044c j_mayer
#define FPSCR_ZE     4  /* Floating-point zero divide exception enable       */
598 7c58044c j_mayer
#define FPSCR_XE     3  /* Floating-point inexact exception enable           */
599 7c58044c j_mayer
#define FPSCR_NI     2  /* Floating-point non-IEEE mode                      */
600 7c58044c j_mayer
#define FPSCR_RN1    1
601 7c58044c j_mayer
#define FPSCR_RN     0  /* Floating-point rounding control                   */
602 7c58044c j_mayer
#define fpscr_fex    (((env->fpscr) >> FPSCR_FEX)    & 0x1)
603 7c58044c j_mayer
#define fpscr_vx     (((env->fpscr) >> FPSCR_VX)     & 0x1)
604 7c58044c j_mayer
#define fpscr_ox     (((env->fpscr) >> FPSCR_OX)     & 0x1)
605 7c58044c j_mayer
#define fpscr_ux     (((env->fpscr) >> FPSCR_UX)     & 0x1)
606 7c58044c j_mayer
#define fpscr_zx     (((env->fpscr) >> FPSCR_ZX)     & 0x1)
607 7c58044c j_mayer
#define fpscr_xx     (((env->fpscr) >> FPSCR_XX)     & 0x1)
608 7c58044c j_mayer
#define fpscr_vxsnan (((env->fpscr) >> FPSCR_VXSNAN) & 0x1)
609 7c58044c j_mayer
#define fpscr_vxisi  (((env->fpscr) >> FPSCR_VXISI)  & 0x1)
610 7c58044c j_mayer
#define fpscr_vxidi  (((env->fpscr) >> FPSCR_VXIDI)  & 0x1)
611 7c58044c j_mayer
#define fpscr_vxzdz  (((env->fpscr) >> FPSCR_VXZDZ)  & 0x1)
612 7c58044c j_mayer
#define fpscr_vximz  (((env->fpscr) >> FPSCR_VXIMZ)  & 0x1)
613 7c58044c j_mayer
#define fpscr_vxvc   (((env->fpscr) >> FPSCR_VXVC)   & 0x1)
614 7c58044c j_mayer
#define fpscr_fpcc   (((env->fpscr) >> FPSCR_FPCC)   & 0xF)
615 7c58044c j_mayer
#define fpscr_vxsoft (((env->fpscr) >> FPSCR_VXSOFT) & 0x1)
616 7c58044c j_mayer
#define fpscr_vxsqrt (((env->fpscr) >> FPSCR_VXSQRT) & 0x1)
617 7c58044c j_mayer
#define fpscr_vxcvi  (((env->fpscr) >> FPSCR_VXCVI)  & 0x1)
618 7c58044c j_mayer
#define fpscr_ve     (((env->fpscr) >> FPSCR_VE)     & 0x1)
619 7c58044c j_mayer
#define fpscr_oe     (((env->fpscr) >> FPSCR_OE)     & 0x1)
620 7c58044c j_mayer
#define fpscr_ue     (((env->fpscr) >> FPSCR_UE)     & 0x1)
621 7c58044c j_mayer
#define fpscr_ze     (((env->fpscr) >> FPSCR_ZE)     & 0x1)
622 7c58044c j_mayer
#define fpscr_xe     (((env->fpscr) >> FPSCR_XE)     & 0x1)
623 7c58044c j_mayer
#define fpscr_ni     (((env->fpscr) >> FPSCR_NI)     & 0x1)
624 7c58044c j_mayer
#define fpscr_rn     (((env->fpscr) >> FPSCR_RN)     & 0x3)
625 7c58044c j_mayer
/* Invalid operation exception summary */
626 7c58044c j_mayer
#define fpscr_ix ((env->fpscr) & ((1 << FPSCR_VXSNAN) | (1 << FPSCR_VXISI)  | \
627 7c58044c j_mayer
                                  (1 << FPSCR_VXIDI)  | (1 << FPSCR_VXZDZ)  | \
628 7c58044c j_mayer
                                  (1 << FPSCR_VXIMZ)  | (1 << FPSCR_VXVC)   | \
629 7c58044c j_mayer
                                  (1 << FPSCR_VXSOFT) | (1 << FPSCR_VXSQRT) | \
630 7c58044c j_mayer
                                  (1 << FPSCR_VXCVI)))
631 7c58044c j_mayer
/* exception summary */
632 7c58044c j_mayer
#define fpscr_ex  (((env->fpscr) >> FPSCR_XX) & 0x1F)
633 7c58044c j_mayer
/* enabled exception summary */
634 7c58044c j_mayer
#define fpscr_eex (((env->fpscr) >> FPSCR_XX) & ((env->fpscr) >> FPSCR_XE) &  \
635 7c58044c j_mayer
                   0x1F)
636 7c58044c j_mayer
637 7c58044c j_mayer
/*****************************************************************************/
638 6fa724a3 aurel32
/* Vector status and control register */
639 6fa724a3 aurel32
#define VSCR_NJ                16 /* Vector non-java */
640 6fa724a3 aurel32
#define VSCR_SAT        0 /* Vector saturation */
641 6fa724a3 aurel32
#define vscr_nj                (((env->vscr) >> VSCR_NJ)        & 0x1)
642 6fa724a3 aurel32
#define vscr_sat        (((env->vscr) >> VSCR_SAT)        & 0x1)
643 6fa724a3 aurel32
644 6fa724a3 aurel32
/*****************************************************************************/
645 01662f3e Alexander Graf
/* BookE e500 MMU registers */
646 01662f3e Alexander Graf
647 01662f3e Alexander Graf
#define MAS0_NV_SHIFT      0
648 01662f3e Alexander Graf
#define MAS0_NV_MASK       (0xfff << MAS0_NV_SHIFT)
649 01662f3e Alexander Graf
650 01662f3e Alexander Graf
#define MAS0_WQ_SHIFT      12
651 01662f3e Alexander Graf
#define MAS0_WQ_MASK       (3 << MAS0_WQ_SHIFT)
652 01662f3e Alexander Graf
/* Write TLB entry regardless of reservation */
653 01662f3e Alexander Graf
#define MAS0_WQ_ALWAYS     (0 << MAS0_WQ_SHIFT)
654 01662f3e Alexander Graf
/* Write TLB entry only already in use */
655 01662f3e Alexander Graf
#define MAS0_WQ_COND       (1 << MAS0_WQ_SHIFT)
656 01662f3e Alexander Graf
/* Clear TLB entry */
657 01662f3e Alexander Graf
#define MAS0_WQ_CLR_RSRV   (2 << MAS0_WQ_SHIFT)
658 01662f3e Alexander Graf
659 01662f3e Alexander Graf
#define MAS0_HES_SHIFT     14
660 01662f3e Alexander Graf
#define MAS0_HES           (1 << MAS0_HES_SHIFT)
661 01662f3e Alexander Graf
662 01662f3e Alexander Graf
#define MAS0_ESEL_SHIFT    16
663 01662f3e Alexander Graf
#define MAS0_ESEL_MASK     (0xfff << MAS0_ESEL_SHIFT)
664 01662f3e Alexander Graf
665 01662f3e Alexander Graf
#define MAS0_TLBSEL_SHIFT  28
666 01662f3e Alexander Graf
#define MAS0_TLBSEL_MASK   (3 << MAS0_TLBSEL_SHIFT)
667 01662f3e Alexander Graf
#define MAS0_TLBSEL_TLB0   (0 << MAS0_TLBSEL_SHIFT)
668 01662f3e Alexander Graf
#define MAS0_TLBSEL_TLB1   (1 << MAS0_TLBSEL_SHIFT)
669 01662f3e Alexander Graf
#define MAS0_TLBSEL_TLB2   (2 << MAS0_TLBSEL_SHIFT)
670 01662f3e Alexander Graf
#define MAS0_TLBSEL_TLB3   (3 << MAS0_TLBSEL_SHIFT)
671 01662f3e Alexander Graf
672 01662f3e Alexander Graf
#define MAS0_ATSEL_SHIFT   31
673 01662f3e Alexander Graf
#define MAS0_ATSEL         (1 << MAS0_ATSEL_SHIFT)
674 01662f3e Alexander Graf
#define MAS0_ATSEL_TLB     0
675 01662f3e Alexander Graf
#define MAS0_ATSEL_LRAT    MAS0_ATSEL
676 01662f3e Alexander Graf
677 2bd9543c Scott Wood
#define MAS1_TSIZE_SHIFT   7
678 2bd9543c Scott Wood
#define MAS1_TSIZE_MASK    (0x1f << MAS1_TSIZE_SHIFT)
679 01662f3e Alexander Graf
680 01662f3e Alexander Graf
#define MAS1_TS_SHIFT      12
681 01662f3e Alexander Graf
#define MAS1_TS            (1 << MAS1_TS_SHIFT)
682 01662f3e Alexander Graf
683 01662f3e Alexander Graf
#define MAS1_IND_SHIFT     13
684 01662f3e Alexander Graf
#define MAS1_IND           (1 << MAS1_IND_SHIFT)
685 01662f3e Alexander Graf
686 01662f3e Alexander Graf
#define MAS1_TID_SHIFT     16
687 01662f3e Alexander Graf
#define MAS1_TID_MASK      (0x3fff << MAS1_TID_SHIFT)
688 01662f3e Alexander Graf
689 01662f3e Alexander Graf
#define MAS1_IPROT_SHIFT   30
690 01662f3e Alexander Graf
#define MAS1_IPROT         (1 << MAS1_IPROT_SHIFT)
691 01662f3e Alexander Graf
692 01662f3e Alexander Graf
#define MAS1_VALID_SHIFT   31
693 01662f3e Alexander Graf
#define MAS1_VALID         0x80000000
694 01662f3e Alexander Graf
695 01662f3e Alexander Graf
#define MAS2_EPN_SHIFT     12
696 96091698 Alexander Graf
#define MAS2_EPN_MASK      (~0ULL << MAS2_EPN_SHIFT)
697 01662f3e Alexander Graf
698 01662f3e Alexander Graf
#define MAS2_ACM_SHIFT     6
699 01662f3e Alexander Graf
#define MAS2_ACM           (1 << MAS2_ACM_SHIFT)
700 01662f3e Alexander Graf
701 01662f3e Alexander Graf
#define MAS2_VLE_SHIFT     5
702 01662f3e Alexander Graf
#define MAS2_VLE           (1 << MAS2_VLE_SHIFT)
703 01662f3e Alexander Graf
704 01662f3e Alexander Graf
#define MAS2_W_SHIFT       4
705 01662f3e Alexander Graf
#define MAS2_W             (1 << MAS2_W_SHIFT)
706 01662f3e Alexander Graf
707 01662f3e Alexander Graf
#define MAS2_I_SHIFT       3
708 01662f3e Alexander Graf
#define MAS2_I             (1 << MAS2_I_SHIFT)
709 01662f3e Alexander Graf
710 01662f3e Alexander Graf
#define MAS2_M_SHIFT       2
711 01662f3e Alexander Graf
#define MAS2_M             (1 << MAS2_M_SHIFT)
712 01662f3e Alexander Graf
713 01662f3e Alexander Graf
#define MAS2_G_SHIFT       1
714 01662f3e Alexander Graf
#define MAS2_G             (1 << MAS2_G_SHIFT)
715 01662f3e Alexander Graf
716 01662f3e Alexander Graf
#define MAS2_E_SHIFT       0
717 01662f3e Alexander Graf
#define MAS2_E             (1 << MAS2_E_SHIFT)
718 01662f3e Alexander Graf
719 01662f3e Alexander Graf
#define MAS3_RPN_SHIFT     12
720 01662f3e Alexander Graf
#define MAS3_RPN_MASK      (0xfffff << MAS3_RPN_SHIFT)
721 01662f3e Alexander Graf
722 01662f3e Alexander Graf
#define MAS3_U0                 0x00000200
723 01662f3e Alexander Graf
#define MAS3_U1                 0x00000100
724 01662f3e Alexander Graf
#define MAS3_U2                 0x00000080
725 01662f3e Alexander Graf
#define MAS3_U3                 0x00000040
726 01662f3e Alexander Graf
#define MAS3_UX                 0x00000020
727 01662f3e Alexander Graf
#define MAS3_SX                 0x00000010
728 01662f3e Alexander Graf
#define MAS3_UW                 0x00000008
729 01662f3e Alexander Graf
#define MAS3_SW                 0x00000004
730 01662f3e Alexander Graf
#define MAS3_UR                 0x00000002
731 01662f3e Alexander Graf
#define MAS3_SR                 0x00000001
732 01662f3e Alexander Graf
#define MAS3_SPSIZE_SHIFT       1
733 01662f3e Alexander Graf
#define MAS3_SPSIZE_MASK        (0x3e << MAS3_SPSIZE_SHIFT)
734 01662f3e Alexander Graf
735 01662f3e Alexander Graf
#define MAS4_TLBSELD_SHIFT      MAS0_TLBSEL_SHIFT
736 01662f3e Alexander Graf
#define MAS4_TLBSELD_MASK       MAS0_TLBSEL_MASK
737 01662f3e Alexander Graf
#define MAS4_TIDSELD_MASK       0x00030000
738 01662f3e Alexander Graf
#define MAS4_TIDSELD_PID0       0x00000000
739 01662f3e Alexander Graf
#define MAS4_TIDSELD_PID1       0x00010000
740 01662f3e Alexander Graf
#define MAS4_TIDSELD_PID2       0x00020000
741 01662f3e Alexander Graf
#define MAS4_TIDSELD_PIDZ       0x00030000
742 01662f3e Alexander Graf
#define MAS4_INDD               0x00008000      /* Default IND */
743 01662f3e Alexander Graf
#define MAS4_TSIZED_SHIFT       MAS1_TSIZE_SHIFT
744 01662f3e Alexander Graf
#define MAS4_TSIZED_MASK        MAS1_TSIZE_MASK
745 01662f3e Alexander Graf
#define MAS4_ACMD               0x00000040
746 01662f3e Alexander Graf
#define MAS4_VLED               0x00000020
747 01662f3e Alexander Graf
#define MAS4_WD                 0x00000010
748 01662f3e Alexander Graf
#define MAS4_ID                 0x00000008
749 01662f3e Alexander Graf
#define MAS4_MD                 0x00000004
750 01662f3e Alexander Graf
#define MAS4_GD                 0x00000002
751 01662f3e Alexander Graf
#define MAS4_ED                 0x00000001
752 01662f3e Alexander Graf
#define MAS4_WIMGED_MASK        0x0000001f      /* Default WIMGE */
753 01662f3e Alexander Graf
#define MAS4_WIMGED_SHIFT       0
754 01662f3e Alexander Graf
755 01662f3e Alexander Graf
#define MAS5_SGS                0x80000000
756 01662f3e Alexander Graf
#define MAS5_SLPID_MASK         0x00000fff
757 01662f3e Alexander Graf
758 01662f3e Alexander Graf
#define MAS6_SPID0              0x3fff0000
759 01662f3e Alexander Graf
#define MAS6_SPID1              0x00007ffe
760 01662f3e Alexander Graf
#define MAS6_ISIZE(x)           MAS1_TSIZE(x)
761 01662f3e Alexander Graf
#define MAS6_SAS                0x00000001
762 01662f3e Alexander Graf
#define MAS6_SPID               MAS6_SPID0
763 01662f3e Alexander Graf
#define MAS6_SIND               0x00000002      /* Indirect page */
764 01662f3e Alexander Graf
#define MAS6_SIND_SHIFT         1
765 01662f3e Alexander Graf
#define MAS6_SPID_MASK          0x3fff0000
766 01662f3e Alexander Graf
#define MAS6_SPID_SHIFT         16
767 01662f3e Alexander Graf
#define MAS6_ISIZE_MASK         0x00000f80
768 01662f3e Alexander Graf
#define MAS6_ISIZE_SHIFT        7
769 01662f3e Alexander Graf
770 01662f3e Alexander Graf
#define MAS7_RPN                0xffffffff
771 01662f3e Alexander Graf
772 01662f3e Alexander Graf
#define MAS8_TGS                0x80000000
773 01662f3e Alexander Graf
#define MAS8_VF                 0x40000000
774 01662f3e Alexander Graf
#define MAS8_TLBPID             0x00000fff
775 01662f3e Alexander Graf
776 01662f3e Alexander Graf
/* Bit definitions for MMUCFG */
777 01662f3e Alexander Graf
#define MMUCFG_MAVN     0x00000003      /* MMU Architecture Version Number */
778 01662f3e Alexander Graf
#define MMUCFG_MAVN_V1  0x00000000      /* v1.0 */
779 01662f3e Alexander Graf
#define MMUCFG_MAVN_V2  0x00000001      /* v2.0 */
780 01662f3e Alexander Graf
#define MMUCFG_NTLBS    0x0000000c      /* Number of TLBs */
781 01662f3e Alexander Graf
#define MMUCFG_PIDSIZE  0x000007c0      /* PID Reg Size */
782 01662f3e Alexander Graf
#define MMUCFG_TWC      0x00008000      /* TLB Write Conditional (v2.0) */
783 01662f3e Alexander Graf
#define MMUCFG_LRAT     0x00010000      /* LRAT Supported (v2.0) */
784 01662f3e Alexander Graf
#define MMUCFG_RASIZE   0x00fe0000      /* Real Addr Size */
785 01662f3e Alexander Graf
#define MMUCFG_LPIDSIZE 0x0f000000      /* LPID Reg Size */
786 01662f3e Alexander Graf
787 01662f3e Alexander Graf
/* Bit definitions for MMUCSR0 */
788 01662f3e Alexander Graf
#define MMUCSR0_TLB1FI  0x00000002      /* TLB1 Flash invalidate */
789 01662f3e Alexander Graf
#define MMUCSR0_TLB0FI  0x00000004      /* TLB0 Flash invalidate */
790 01662f3e Alexander Graf
#define MMUCSR0_TLB2FI  0x00000040      /* TLB2 Flash invalidate */
791 01662f3e Alexander Graf
#define MMUCSR0_TLB3FI  0x00000020      /* TLB3 Flash invalidate */
792 01662f3e Alexander Graf
#define MMUCSR0_TLBFI   (MMUCSR0_TLB0FI | MMUCSR0_TLB1FI | \
793 01662f3e Alexander Graf
                         MMUCSR0_TLB2FI | MMUCSR0_TLB3FI)
794 01662f3e Alexander Graf
#define MMUCSR0_TLB0PS  0x00000780      /* TLB0 Page Size */
795 01662f3e Alexander Graf
#define MMUCSR0_TLB1PS  0x00007800      /* TLB1 Page Size */
796 01662f3e Alexander Graf
#define MMUCSR0_TLB2PS  0x00078000      /* TLB2 Page Size */
797 01662f3e Alexander Graf
#define MMUCSR0_TLB3PS  0x00780000      /* TLB3 Page Size */
798 01662f3e Alexander Graf
799 01662f3e Alexander Graf
/* TLBnCFG encoding */
800 01662f3e Alexander Graf
#define TLBnCFG_N_ENTRY         0x00000fff      /* number of entries */
801 01662f3e Alexander Graf
#define TLBnCFG_HES             0x00002000      /* HW select supported */
802 01662f3e Alexander Graf
#define TLBnCFG_AVAIL           0x00004000      /* variable page size */
803 01662f3e Alexander Graf
#define TLBnCFG_IPROT           0x00008000      /* IPROT supported */
804 01662f3e Alexander Graf
#define TLBnCFG_GTWE            0x00010000      /* Guest can write */
805 01662f3e Alexander Graf
#define TLBnCFG_IND             0x00020000      /* IND entries supported */
806 01662f3e Alexander Graf
#define TLBnCFG_PT              0x00040000      /* Can load from page table */
807 01662f3e Alexander Graf
#define TLBnCFG_MINSIZE         0x00f00000      /* Minimum Page Size (v1.0) */
808 01662f3e Alexander Graf
#define TLBnCFG_MINSIZE_SHIFT   20
809 01662f3e Alexander Graf
#define TLBnCFG_MAXSIZE         0x000f0000      /* Maximum Page Size (v1.0) */
810 01662f3e Alexander Graf
#define TLBnCFG_MAXSIZE_SHIFT   16
811 01662f3e Alexander Graf
#define TLBnCFG_ASSOC           0xff000000      /* Associativity */
812 01662f3e Alexander Graf
#define TLBnCFG_ASSOC_SHIFT     24
813 01662f3e Alexander Graf
814 01662f3e Alexander Graf
/* TLBnPS encoding */
815 01662f3e Alexander Graf
#define TLBnPS_4K               0x00000004
816 01662f3e Alexander Graf
#define TLBnPS_8K               0x00000008
817 01662f3e Alexander Graf
#define TLBnPS_16K              0x00000010
818 01662f3e Alexander Graf
#define TLBnPS_32K              0x00000020
819 01662f3e Alexander Graf
#define TLBnPS_64K              0x00000040
820 01662f3e Alexander Graf
#define TLBnPS_128K             0x00000080
821 01662f3e Alexander Graf
#define TLBnPS_256K             0x00000100
822 01662f3e Alexander Graf
#define TLBnPS_512K             0x00000200
823 01662f3e Alexander Graf
#define TLBnPS_1M               0x00000400
824 01662f3e Alexander Graf
#define TLBnPS_2M               0x00000800
825 01662f3e Alexander Graf
#define TLBnPS_4M               0x00001000
826 01662f3e Alexander Graf
#define TLBnPS_8M               0x00002000
827 01662f3e Alexander Graf
#define TLBnPS_16M              0x00004000
828 01662f3e Alexander Graf
#define TLBnPS_32M              0x00008000
829 01662f3e Alexander Graf
#define TLBnPS_64M              0x00010000
830 01662f3e Alexander Graf
#define TLBnPS_128M             0x00020000
831 01662f3e Alexander Graf
#define TLBnPS_256M             0x00040000
832 01662f3e Alexander Graf
#define TLBnPS_512M             0x00080000
833 01662f3e Alexander Graf
#define TLBnPS_1G               0x00100000
834 01662f3e Alexander Graf
#define TLBnPS_2G               0x00200000
835 01662f3e Alexander Graf
#define TLBnPS_4G               0x00400000
836 01662f3e Alexander Graf
#define TLBnPS_8G               0x00800000
837 01662f3e Alexander Graf
#define TLBnPS_16G              0x01000000
838 01662f3e Alexander Graf
#define TLBnPS_32G              0x02000000
839 01662f3e Alexander Graf
#define TLBnPS_64G              0x04000000
840 01662f3e Alexander Graf
#define TLBnPS_128G             0x08000000
841 01662f3e Alexander Graf
#define TLBnPS_256G             0x10000000
842 01662f3e Alexander Graf
843 01662f3e Alexander Graf
/* tlbilx action encoding */
844 01662f3e Alexander Graf
#define TLBILX_T_ALL                    0
845 01662f3e Alexander Graf
#define TLBILX_T_TID                    1
846 01662f3e Alexander Graf
#define TLBILX_T_FULLMATCH              3
847 01662f3e Alexander Graf
#define TLBILX_T_CLASS0                 4
848 01662f3e Alexander Graf
#define TLBILX_T_CLASS1                 5
849 01662f3e Alexander Graf
#define TLBILX_T_CLASS2                 6
850 01662f3e Alexander Graf
#define TLBILX_T_CLASS3                 7
851 01662f3e Alexander Graf
852 01662f3e Alexander Graf
/* BookE 2.06 helper defines */
853 01662f3e Alexander Graf
854 01662f3e Alexander Graf
#define BOOKE206_FLUSH_TLB0    (1 << 0)
855 01662f3e Alexander Graf
#define BOOKE206_FLUSH_TLB1    (1 << 1)
856 01662f3e Alexander Graf
#define BOOKE206_FLUSH_TLB2    (1 << 2)
857 01662f3e Alexander Graf
#define BOOKE206_FLUSH_TLB3    (1 << 3)
858 01662f3e Alexander Graf
859 01662f3e Alexander Graf
/* number of possible TLBs */
860 01662f3e Alexander Graf
#define BOOKE206_MAX_TLBN      4
861 01662f3e Alexander Graf
862 01662f3e Alexander Graf
/*****************************************************************************/
863 58e00a24 Alexander Graf
/* Embedded.Processor Control */
864 58e00a24 Alexander Graf
865 58e00a24 Alexander Graf
#define DBELL_TYPE_SHIFT               27
866 58e00a24 Alexander Graf
#define DBELL_TYPE_MASK                (0x1f << DBELL_TYPE_SHIFT)
867 58e00a24 Alexander Graf
#define DBELL_TYPE_DBELL               (0x00 << DBELL_TYPE_SHIFT)
868 58e00a24 Alexander Graf
#define DBELL_TYPE_DBELL_CRIT          (0x01 << DBELL_TYPE_SHIFT)
869 58e00a24 Alexander Graf
#define DBELL_TYPE_G_DBELL             (0x02 << DBELL_TYPE_SHIFT)
870 58e00a24 Alexander Graf
#define DBELL_TYPE_G_DBELL_CRIT        (0x03 << DBELL_TYPE_SHIFT)
871 58e00a24 Alexander Graf
#define DBELL_TYPE_G_DBELL_MC          (0x04 << DBELL_TYPE_SHIFT)
872 58e00a24 Alexander Graf
873 58e00a24 Alexander Graf
#define DBELL_BRDCAST                  (1 << 26)
874 58e00a24 Alexander Graf
#define DBELL_LPIDTAG_SHIFT            14
875 58e00a24 Alexander Graf
#define DBELL_LPIDTAG_MASK             (0xfff << DBELL_LPIDTAG_SHIFT)
876 58e00a24 Alexander Graf
#define DBELL_PIRTAG_MASK              0x3fff
877 58e00a24 Alexander Graf
878 58e00a24 Alexander Graf
/*****************************************************************************/
879 4656e1f0 Benjamin Herrenschmidt
/* Segment page size information, used by recent hash MMUs
880 4656e1f0 Benjamin Herrenschmidt
 * The format of this structure mirrors kvm_ppc_smmu_info
881 4656e1f0 Benjamin Herrenschmidt
 */
882 4656e1f0 Benjamin Herrenschmidt
883 4656e1f0 Benjamin Herrenschmidt
#define PPC_PAGE_SIZES_MAX_SZ   8
884 4656e1f0 Benjamin Herrenschmidt
885 4656e1f0 Benjamin Herrenschmidt
struct ppc_one_page_size {
886 4656e1f0 Benjamin Herrenschmidt
    uint32_t page_shift;  /* Page shift (or 0) */
887 4656e1f0 Benjamin Herrenschmidt
    uint32_t pte_enc;     /* Encoding in the HPTE (>>12) */
888 4656e1f0 Benjamin Herrenschmidt
};
889 4656e1f0 Benjamin Herrenschmidt
890 4656e1f0 Benjamin Herrenschmidt
struct ppc_one_seg_page_size {
891 4656e1f0 Benjamin Herrenschmidt
    uint32_t page_shift;  /* Base page shift of segment (or 0) */
892 4656e1f0 Benjamin Herrenschmidt
    uint32_t slb_enc;     /* SLB encoding for BookS */
893 4656e1f0 Benjamin Herrenschmidt
    struct ppc_one_page_size enc[PPC_PAGE_SIZES_MAX_SZ];
894 4656e1f0 Benjamin Herrenschmidt
};
895 4656e1f0 Benjamin Herrenschmidt
896 4656e1f0 Benjamin Herrenschmidt
struct ppc_segment_page_sizes {
897 4656e1f0 Benjamin Herrenschmidt
    struct ppc_one_seg_page_size sps[PPC_PAGE_SIZES_MAX_SZ];
898 4656e1f0 Benjamin Herrenschmidt
};
899 4656e1f0 Benjamin Herrenschmidt
900 4656e1f0 Benjamin Herrenschmidt
901 4656e1f0 Benjamin Herrenschmidt
/*****************************************************************************/
902 7c58044c j_mayer
/* The whole PowerPC CPU context */
903 6ebbf390 j_mayer
#define NB_MMU_MODES 3
904 6ebbf390 j_mayer
905 a7342588 David Gibson
struct ppc_def_t {
906 a7342588 David Gibson
    const char *name;
907 a7342588 David Gibson
    uint32_t pvr;
908 a7342588 David Gibson
    uint32_t svr;
909 a7342588 David Gibson
    uint64_t insns_flags;
910 a7342588 David Gibson
    uint64_t insns_flags2;
911 a7342588 David Gibson
    uint64_t msr_mask;
912 a7342588 David Gibson
    powerpc_mmu_t   mmu_model;
913 a7342588 David Gibson
    powerpc_excp_t  excp_model;
914 a7342588 David Gibson
    powerpc_input_t bus_model;
915 a7342588 David Gibson
    uint32_t flags;
916 a7342588 David Gibson
    int bfd_mach;
917 4656e1f0 Benjamin Herrenschmidt
#if defined(TARGET_PPC64)
918 4656e1f0 Benjamin Herrenschmidt
    const struct ppc_segment_page_sizes *sps;
919 4656e1f0 Benjamin Herrenschmidt
#endif
920 a7342588 David Gibson
    void (*init_proc)(CPUPPCState *env);
921 a7342588 David Gibson
    int  (*check_pow)(CPUPPCState *env);
922 a7342588 David Gibson
};
923 a7342588 David Gibson
924 3fc6c082 bellard
struct CPUPPCState {
925 3fc6c082 bellard
    /* First are the most commonly used resources
926 3fc6c082 bellard
     * during translated code execution
927 3fc6c082 bellard
     */
928 79aceca5 bellard
    /* general purpose registers */
929 bd7d9a6d aurel32
    target_ulong gpr[32];
930 65d6c0f3 j_mayer
#if !defined(TARGET_PPC64)
931 3cd7d1dd j_mayer
    /* Storage for GPR MSB, used by the SPE extension */
932 bd7d9a6d aurel32
    target_ulong gprh[32];
933 3cd7d1dd j_mayer
#endif
934 3fc6c082 bellard
    /* LR */
935 3fc6c082 bellard
    target_ulong lr;
936 3fc6c082 bellard
    /* CTR */
937 3fc6c082 bellard
    target_ulong ctr;
938 3fc6c082 bellard
    /* condition register */
939 47e4661c aurel32
    uint32_t crf[8];
940 697ab892 David Gibson
#if defined(TARGET_PPC64)
941 697ab892 David Gibson
    /* CFAR */
942 697ab892 David Gibson
    target_ulong cfar;
943 697ab892 David Gibson
#endif
944 79aceca5 bellard
    /* XER */
945 3d7b417e aurel32
    target_ulong xer;
946 79aceca5 bellard
    /* Reservation address */
947 18b21a2f Nathan Froyd
    target_ulong reserve_addr;
948 18b21a2f Nathan Froyd
    /* Reservation value */
949 18b21a2f Nathan Froyd
    target_ulong reserve_val;
950 4425265b Nathan Froyd
    /* Reservation store address */
951 4425265b Nathan Froyd
    target_ulong reserve_ea;
952 4425265b Nathan Froyd
    /* Reserved store source register and size */
953 4425265b Nathan Froyd
    target_ulong reserve_info;
954 3fc6c082 bellard
955 3fc6c082 bellard
    /* Those ones are used in supervisor mode only */
956 79aceca5 bellard
    /* machine state register */
957 0411a972 j_mayer
    target_ulong msr;
958 3fc6c082 bellard
    /* temporary general purpose registers */
959 bd7d9a6d aurel32
    target_ulong tgpr[4]; /* Used to speed-up TLB assist handlers */
960 3fc6c082 bellard
961 3fc6c082 bellard
    /* Floating point execution context */
962 4ecc3190 bellard
    float_status fp_status;
963 3fc6c082 bellard
    /* floating point registers */
964 3fc6c082 bellard
    float64 fpr[32];
965 3fc6c082 bellard
    /* floating point status and control register */
966 7c58044c j_mayer
    uint32_t fpscr;
967 4ecc3190 bellard
968 cb2dbfc3 Aurelien Jarno
    /* Next instruction pointer */
969 cb2dbfc3 Aurelien Jarno
    target_ulong nip;
970 a316d335 bellard
971 ac9eb073 bellard
    int access_type; /* when a memory exception occurs, the access
972 ac9eb073 bellard
                        type is stored here */
973 a541f297 bellard
974 cb2dbfc3 Aurelien Jarno
    CPU_COMMON
975 cb2dbfc3 Aurelien Jarno
976 f2e63a42 j_mayer
    /* MMU context - only relevant for full system emulation */
977 f2e63a42 j_mayer
#if !defined(CONFIG_USER_ONLY)
978 f2e63a42 j_mayer
#if defined(TARGET_PPC64)
979 3fc6c082 bellard
    /* Address space register */
980 3fc6c082 bellard
    target_ulong asr;
981 f2e63a42 j_mayer
    /* PowerPC 64 SLB area */
982 c227f099 Anthony Liguori
    ppc_slb_t slb[64];
983 f2e63a42 j_mayer
    int slb_nr;
984 f2e63a42 j_mayer
#endif
985 3fc6c082 bellard
    /* segment registers */
986 bb593904 David Gibson
    target_phys_addr_t htab_base;
987 bb593904 David Gibson
    target_phys_addr_t htab_mask;
988 74d37793 aurel32
    target_ulong sr[32];
989 f43e3525 David Gibson
    /* externally stored hash table */
990 f43e3525 David Gibson
    uint8_t *external_htab;
991 3fc6c082 bellard
    /* BATs */
992 3fc6c082 bellard
    int nb_BATs;
993 3fc6c082 bellard
    target_ulong DBAT[2][8];
994 3fc6c082 bellard
    target_ulong IBAT[2][8];
995 01662f3e Alexander Graf
    /* PowerPC TLB registers (for 4xx, e500 and 60x software driven TLBs) */
996 f2e63a42 j_mayer
    int nb_tlb;      /* Total number of TLB                                  */
997 f2e63a42 j_mayer
    int tlb_per_way; /* Speed-up helper: used to avoid divisions at run time */
998 f2e63a42 j_mayer
    int nb_ways;     /* Number of ways in the TLB set                        */
999 f2e63a42 j_mayer
    int last_way;    /* Last used way used to allocate TLB in a LRU way      */
1000 f2e63a42 j_mayer
    int id_tlbs;     /* If 1, MMU has separated TLBs for instructions & data */
1001 f2e63a42 j_mayer
    int nb_pids;     /* Number of available PID registers                    */
1002 1c53accc Alexander Graf
    int tlb_type;    /* Type of TLB we're dealing with                       */
1003 1c53accc Alexander Graf
    ppc_tlb_t tlb;   /* TLB is optional. Allocate them only if needed        */
1004 f2e63a42 j_mayer
    /* 403 dedicated access protection registers */
1005 f2e63a42 j_mayer
    target_ulong pb[4];
1006 93dd5e85 Scott Wood
    bool tlb_dirty;   /* Set to non-zero when modifying TLB                  */
1007 93dd5e85 Scott Wood
    bool kvm_sw_tlb;  /* non-zero if KVM SW TLB API is active                */
1008 f2e63a42 j_mayer
#endif
1009 9fddaa0c bellard
1010 3fc6c082 bellard
    /* Other registers */
1011 3fc6c082 bellard
    /* Special purpose registers */
1012 3fc6c082 bellard
    target_ulong spr[1024];
1013 c227f099 Anthony Liguori
    ppc_spr_t spr_cb[1024];
1014 3fc6c082 bellard
    /* Altivec registers */
1015 c227f099 Anthony Liguori
    ppc_avr_t avr[32];
1016 3fc6c082 bellard
    uint32_t vscr;
1017 d9bce9d9 j_mayer
    /* SPE registers */
1018 2231ef10 aurel32
    uint64_t spe_acc;
1019 d9bce9d9 j_mayer
    uint32_t spe_fscr;
1020 fbd265b6 aurel32
    /* SPE and Altivec can share a status since they will never be used
1021 fbd265b6 aurel32
     * simultaneously */
1022 fbd265b6 aurel32
    float_status vec_status;
1023 3fc6c082 bellard
1024 3fc6c082 bellard
    /* Internal devices resources */
1025 9fddaa0c bellard
    /* Time base and decrementer */
1026 c227f099 Anthony Liguori
    ppc_tb_t *tb_env;
1027 3fc6c082 bellard
    /* Device control registers */
1028 c227f099 Anthony Liguori
    ppc_dcr_t *dcr_env;
1029 3fc6c082 bellard
1030 d63001d1 j_mayer
    int dcache_line_size;
1031 d63001d1 j_mayer
    int icache_line_size;
1032 d63001d1 j_mayer
1033 3fc6c082 bellard
    /* Those resources are used during exception processing */
1034 3fc6c082 bellard
    /* CPU model definition */
1035 a750fc0b j_mayer
    target_ulong msr_mask;
1036 c227f099 Anthony Liguori
    powerpc_mmu_t mmu_model;
1037 c227f099 Anthony Liguori
    powerpc_excp_t excp_model;
1038 c227f099 Anthony Liguori
    powerpc_input_t bus_model;
1039 237c0af0 j_mayer
    int bfd_mach;
1040 3fc6c082 bellard
    uint32_t flags;
1041 c29b735c Nathan Froyd
    uint64_t insns_flags;
1042 a5858d7a Alexander Graf
    uint64_t insns_flags2;
1043 4656e1f0 Benjamin Herrenschmidt
#if defined(TARGET_PPC64)
1044 4656e1f0 Benjamin Herrenschmidt
    struct ppc_segment_page_sizes sps;
1045 4656e1f0 Benjamin Herrenschmidt
#endif
1046 3fc6c082 bellard
1047 ed120055 David Gibson
#if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
1048 ed120055 David Gibson
    target_phys_addr_t vpa;
1049 ed120055 David Gibson
    target_phys_addr_t slb_shadow;
1050 ed120055 David Gibson
    target_phys_addr_t dispatch_trace_log;
1051 ed120055 David Gibson
    uint32_t dtl_size;
1052 ed120055 David Gibson
#endif /* TARGET_PPC64 */
1053 ed120055 David Gibson
1054 3fc6c082 bellard
    int error_code;
1055 47103572 j_mayer
    uint32_t pending_interrupts;
1056 e9df014c j_mayer
#if !defined(CONFIG_USER_ONLY)
1057 4abf79a4 Dong Xu Wang
    /* This is the IRQ controller, which is implementation dependent
1058 e9df014c j_mayer
     * and only relevant when emulating a complete machine.
1059 e9df014c j_mayer
     */
1060 e9df014c j_mayer
    uint32_t irq_input_state;
1061 e9df014c j_mayer
    void **irq_inputs;
1062 e1833e1f j_mayer
    /* Exception vectors */
1063 e1833e1f j_mayer
    target_ulong excp_vectors[POWERPC_EXCP_NB];
1064 e1833e1f j_mayer
    target_ulong excp_prefix;
1065 fc1c67bc Blue Swirl
    target_ulong hreset_excp_prefix;
1066 e1833e1f j_mayer
    target_ulong ivor_mask;
1067 e1833e1f j_mayer
    target_ulong ivpr_mask;
1068 d63001d1 j_mayer
    target_ulong hreset_vector;
1069 2a7a47fc Alexander Graf
    target_phys_addr_t mpic_cpu_base;
1070 e9df014c j_mayer
#endif
1071 3fc6c082 bellard
1072 3fc6c082 bellard
    /* Those resources are used only during code translation */
1073 3fc6c082 bellard
    /* opcode handlers */
1074 c227f099 Anthony Liguori
    opc_handler_t *opcodes[0x40];
1075 3fc6c082 bellard
1076 5cbdb3a3 Stefan Weil
    /* Those resources are used only in QEMU core */
1077 056401ea j_mayer
    target_ulong hflags;      /* hflags is a MSR & HFLAGS_MASK         */
1078 4abf79a4 Dong Xu Wang
    target_ulong hflags_nmsr; /* specific hflags, not coming from MSR */
1079 6ebbf390 j_mayer
    int mmu_idx;         /* precomputed MMU index to speed up mem accesses */
1080 3fc6c082 bellard
1081 9fddaa0c bellard
    /* Power management */
1082 9fddaa0c bellard
    int power_mode;
1083 cd346349 j_mayer
    int (*check_pow)(CPUPPCState *env);
1084 a541f297 bellard
1085 2c50e26e Edgar E. Iglesias
#if !defined(CONFIG_USER_ONLY)
1086 2c50e26e Edgar E. Iglesias
    void *load_info;    /* Holds boot loading state.  */
1087 2c50e26e Edgar E. Iglesias
#endif
1088 ddd1055b Fabien Chouteau
1089 ddd1055b Fabien Chouteau
    /* booke timers */
1090 ddd1055b Fabien Chouteau
1091 ddd1055b Fabien Chouteau
    /* Specifies bit locations of the Time Base used to signal a fixed timer
1092 ddd1055b Fabien Chouteau
     * exception on a transition from 0 to 1. (watchdog or fixed-interval timer)
1093 ddd1055b Fabien Chouteau
     *
1094 ddd1055b Fabien Chouteau
     * 0 selects the least significant bit.
1095 ddd1055b Fabien Chouteau
     * 63 selects the most significant bit.
1096 ddd1055b Fabien Chouteau
     */
1097 ddd1055b Fabien Chouteau
    uint8_t fit_period[4];
1098 ddd1055b Fabien Chouteau
    uint8_t wdt_period[4];
1099 3fc6c082 bellard
};
1100 79aceca5 bellard
1101 ddd1055b Fabien Chouteau
#define SET_FIT_PERIOD(a_, b_, c_, d_)          \
1102 ddd1055b Fabien Chouteau
do {                                            \
1103 ddd1055b Fabien Chouteau
    env->fit_period[0] = (a_);                  \
1104 ddd1055b Fabien Chouteau
    env->fit_period[1] = (b_);                  \
1105 ddd1055b Fabien Chouteau
    env->fit_period[2] = (c_);                  \
1106 ddd1055b Fabien Chouteau
    env->fit_period[3] = (d_);                  \
1107 ddd1055b Fabien Chouteau
 } while (0)
1108 ddd1055b Fabien Chouteau
1109 ddd1055b Fabien Chouteau
#define SET_WDT_PERIOD(a_, b_, c_, d_)          \
1110 ddd1055b Fabien Chouteau
do {                                            \
1111 ddd1055b Fabien Chouteau
    env->wdt_period[0] = (a_);                  \
1112 ddd1055b Fabien Chouteau
    env->wdt_period[1] = (b_);                  \
1113 ddd1055b Fabien Chouteau
    env->wdt_period[2] = (c_);                  \
1114 ddd1055b Fabien Chouteau
    env->wdt_period[3] = (d_);                  \
1115 ddd1055b Fabien Chouteau
 } while (0)
1116 ddd1055b Fabien Chouteau
1117 3c7b48b7 Paul Brook
#if !defined(CONFIG_USER_ONLY)
1118 76a66253 j_mayer
/* Context used internally during MMU translations */
1119 c227f099 Anthony Liguori
typedef struct mmu_ctx_t mmu_ctx_t;
1120 c227f099 Anthony Liguori
struct mmu_ctx_t {
1121 c227f099 Anthony Liguori
    target_phys_addr_t raddr;      /* Real address              */
1122 c227f099 Anthony Liguori
    target_phys_addr_t eaddr;      /* Effective address         */
1123 76a66253 j_mayer
    int prot;                      /* Protection bits           */
1124 fda6a0ec David Gibson
    target_phys_addr_t hash[2];    /* Pagetable hash values     */
1125 76a66253 j_mayer
    target_ulong ptem;             /* Virtual segment ID | API  */
1126 76a66253 j_mayer
    int key;                       /* Access key                */
1127 b227a8e9 j_mayer
    int nx;                        /* Non-execute area          */
1128 76a66253 j_mayer
};
1129 3c7b48b7 Paul Brook
#endif
1130 76a66253 j_mayer
1131 1d0cb67d Andreas Färber
#include "cpu-qom.h"
1132 1d0cb67d Andreas Färber
1133 3fc6c082 bellard
/*****************************************************************************/
1134 397b457d Andreas Färber
PowerPCCPU *cpu_ppc_init(const char *cpu_model);
1135 2e70f6ef pbrook
void ppc_translate_init(void);
1136 36081602 j_mayer
int cpu_ppc_exec (CPUPPCState *s);
1137 79aceca5 bellard
/* you can call this signal handler from your SIGBUS and SIGSEGV
1138 79aceca5 bellard
   signal handlers to inform the virtual CPU of exceptions. non zero
1139 79aceca5 bellard
   is returned if the signal was handled by the virtual CPU.  */
1140 36081602 j_mayer
int cpu_ppc_signal_handler (int host_signum, void *pinfo,
1141 36081602 j_mayer
                            void *puc);
1142 93220573 aurel32
int cpu_ppc_handle_mmu_fault (CPUPPCState *env, target_ulong address, int rw,
1143 97b348e7 Blue Swirl
                              int mmu_idx);
1144 0b5c1ce8 Nathan Froyd
#define cpu_handle_mmu_fault cpu_ppc_handle_mmu_fault
1145 3c7b48b7 Paul Brook
#if !defined(CONFIG_USER_ONLY)
1146 c227f099 Anthony Liguori
int get_physical_address (CPUPPCState *env, mmu_ctx_t *ctx, target_ulong vaddr,
1147 93220573 aurel32
                          int rw, int access_type);
1148 3c7b48b7 Paul Brook
#endif
1149 a541f297 bellard
void do_interrupt (CPUPPCState *env);
1150 e9df014c j_mayer
void ppc_hw_interrupt (CPUPPCState *env);
1151 a541f297 bellard
1152 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
1153 45d827d2 aurel32
void ppc_store_sdr1 (CPUPPCState *env, target_ulong value);
1154 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
1155 d9bce9d9 j_mayer
void ppc_store_asr (CPUPPCState *env, target_ulong value);
1156 81762d6d David Gibson
int ppc_store_slb (CPUPPCState *env, target_ulong rb, target_ulong rs);
1157 12de9a39 j_mayer
#endif /* defined(TARGET_PPC64) */
1158 12de9a39 j_mayer
#endif /* !defined(CONFIG_USER_ONLY) */
1159 0411a972 j_mayer
void ppc_store_msr (CPUPPCState *env, target_ulong value);
1160 3fc6c082 bellard
1161 9a78eead Stefan Weil
void ppc_cpu_list (FILE *f, fprintf_function cpu_fprintf);
1162 aaed909a bellard
1163 a1e98583 David Gibson
const ppc_def_t *ppc_find_by_pvr(uint32_t pvr);
1164 c227f099 Anthony Liguori
const ppc_def_t *cpu_ppc_find_by_name (const char *name);
1165 c227f099 Anthony Liguori
int cpu_ppc_register_internal (CPUPPCState *env, const ppc_def_t *def);
1166 85c4adf6 bellard
1167 9fddaa0c bellard
/* Time-base and decrementer management */
1168 9fddaa0c bellard
#ifndef NO_CPU_IO_DEFS
1169 e3ea6529 Alexander Graf
uint64_t cpu_ppc_load_tbl (CPUPPCState *env);
1170 9fddaa0c bellard
uint32_t cpu_ppc_load_tbu (CPUPPCState *env);
1171 9fddaa0c bellard
void cpu_ppc_store_tbu (CPUPPCState *env, uint32_t value);
1172 9fddaa0c bellard
void cpu_ppc_store_tbl (CPUPPCState *env, uint32_t value);
1173 b711de95 Aurelien Jarno
uint64_t cpu_ppc_load_atbl (CPUPPCState *env);
1174 a062e36c j_mayer
uint32_t cpu_ppc_load_atbu (CPUPPCState *env);
1175 a062e36c j_mayer
void cpu_ppc_store_atbl (CPUPPCState *env, uint32_t value);
1176 a062e36c j_mayer
void cpu_ppc_store_atbu (CPUPPCState *env, uint32_t value);
1177 9fddaa0c bellard
uint32_t cpu_ppc_load_decr (CPUPPCState *env);
1178 9fddaa0c bellard
void cpu_ppc_store_decr (CPUPPCState *env, uint32_t value);
1179 58a7d328 j_mayer
uint32_t cpu_ppc_load_hdecr (CPUPPCState *env);
1180 58a7d328 j_mayer
void cpu_ppc_store_hdecr (CPUPPCState *env, uint32_t value);
1181 58a7d328 j_mayer
uint64_t cpu_ppc_load_purr (CPUPPCState *env);
1182 58a7d328 j_mayer
void cpu_ppc_store_purr (CPUPPCState *env, uint64_t value);
1183 d9bce9d9 j_mayer
uint32_t cpu_ppc601_load_rtcl (CPUPPCState *env);
1184 d9bce9d9 j_mayer
uint32_t cpu_ppc601_load_rtcu (CPUPPCState *env);
1185 d9bce9d9 j_mayer
#if !defined(CONFIG_USER_ONLY)
1186 d9bce9d9 j_mayer
void cpu_ppc601_store_rtcl (CPUPPCState *env, uint32_t value);
1187 d9bce9d9 j_mayer
void cpu_ppc601_store_rtcu (CPUPPCState *env, uint32_t value);
1188 d9bce9d9 j_mayer
target_ulong load_40x_pit (CPUPPCState *env);
1189 d9bce9d9 j_mayer
void store_40x_pit (CPUPPCState *env, target_ulong val);
1190 8ecc7913 j_mayer
void store_40x_dbcr0 (CPUPPCState *env, uint32_t val);
1191 c294fc58 j_mayer
void store_40x_sler (CPUPPCState *env, uint32_t val);
1192 d9bce9d9 j_mayer
void store_booke_tcr (CPUPPCState *env, target_ulong val);
1193 d9bce9d9 j_mayer
void store_booke_tsr (CPUPPCState *env, target_ulong val);
1194 1328c2bf Andreas Färber
void booke206_flush_tlb(CPUPPCState *env, int flags, const int check_iprot);
1195 1328c2bf Andreas Färber
target_phys_addr_t booke206_tlb_to_page_size(CPUPPCState *env, ppcmas_tlb_t *tlb);
1196 1328c2bf Andreas Färber
int ppcmas_tlb_check(CPUPPCState *env, ppcmas_tlb_t *tlb,
1197 d1e256fe Alexander Graf
                     target_phys_addr_t *raddrp, target_ulong address,
1198 d1e256fe Alexander Graf
                     uint32_t pid);
1199 0a032cbe j_mayer
void ppc_tlb_invalidate_all (CPUPPCState *env);
1200 daf4f96e j_mayer
void ppc_tlb_invalidate_one (CPUPPCState *env, target_ulong addr);
1201 d9bce9d9 j_mayer
#endif
1202 9fddaa0c bellard
#endif
1203 79aceca5 bellard
1204 636aa200 Blue Swirl
static inline uint64_t ppc_dump_gpr(CPUPPCState *env, int gprn)
1205 6b542af7 j_mayer
{
1206 6b542af7 j_mayer
    uint64_t gprv;
1207 6b542af7 j_mayer
1208 6b542af7 j_mayer
    gprv = env->gpr[gprn];
1209 6b542af7 j_mayer
#if !defined(TARGET_PPC64)
1210 6b542af7 j_mayer
    if (env->flags & POWERPC_FLAG_SPE) {
1211 6b542af7 j_mayer
        /* If the CPU implements the SPE extension, we have to get the
1212 6b542af7 j_mayer
         * high bits of the GPR from the gprh storage area
1213 6b542af7 j_mayer
         */
1214 6b542af7 j_mayer
        gprv &= 0xFFFFFFFFULL;
1215 6b542af7 j_mayer
        gprv |= (uint64_t)env->gprh[gprn] << 32;
1216 6b542af7 j_mayer
    }
1217 6b542af7 j_mayer
#endif
1218 6b542af7 j_mayer
1219 6b542af7 j_mayer
    return gprv;
1220 6b542af7 j_mayer
}
1221 6b542af7 j_mayer
1222 2e719ba3 j_mayer
/* Device control registers */
1223 73b01960 Alexander Graf
int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, uint32_t *valp);
1224 73b01960 Alexander Graf
int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, uint32_t val);
1225 2e719ba3 j_mayer
1226 397b457d Andreas Färber
static inline CPUPPCState *cpu_init(const char *cpu_model)
1227 397b457d Andreas Färber
{
1228 397b457d Andreas Färber
    PowerPCCPU *cpu = cpu_ppc_init(cpu_model);
1229 397b457d Andreas Färber
    if (cpu == NULL) {
1230 397b457d Andreas Färber
        return NULL;
1231 397b457d Andreas Färber
    }
1232 397b457d Andreas Färber
    return &cpu->env;
1233 397b457d Andreas Färber
}
1234 397b457d Andreas Färber
1235 9467d44c ths
#define cpu_exec cpu_ppc_exec
1236 9467d44c ths
#define cpu_gen_code cpu_ppc_gen_code
1237 9467d44c ths
#define cpu_signal_handler cpu_ppc_signal_handler
1238 c732abe2 j_mayer
#define cpu_list ppc_cpu_list
1239 9467d44c ths
1240 fc1c67bc Blue Swirl
#define CPU_SAVE_VERSION 4
1241 b3c7724c pbrook
1242 6ebbf390 j_mayer
/* MMU modes definitions */
1243 6ebbf390 j_mayer
#define MMU_MODE0_SUFFIX _user
1244 6ebbf390 j_mayer
#define MMU_MODE1_SUFFIX _kernel
1245 6ebbf390 j_mayer
#define MMU_MODE2_SUFFIX _hypv
1246 6ebbf390 j_mayer
#define MMU_USER_IDX 0
1247 1328c2bf Andreas Färber
static inline int cpu_mmu_index (CPUPPCState *env)
1248 6ebbf390 j_mayer
{
1249 6ebbf390 j_mayer
    return env->mmu_idx;
1250 6ebbf390 j_mayer
}
1251 6ebbf390 j_mayer
1252 6e68e076 pbrook
#if defined(CONFIG_USER_ONLY)
1253 1328c2bf Andreas Färber
static inline void cpu_clone_regs(CPUPPCState *env, target_ulong newsp)
1254 6e68e076 pbrook
{
1255 f8ed7070 pbrook
    if (newsp)
1256 6e68e076 pbrook
        env->gpr[1] = newsp;
1257 d11f69b2 Nathan Froyd
    env->gpr[3] = 0;
1258 6e68e076 pbrook
}
1259 6e68e076 pbrook
#endif
1260 6e68e076 pbrook
1261 79aceca5 bellard
#include "cpu-all.h"
1262 79aceca5 bellard
1263 3fc6c082 bellard
/*****************************************************************************/
1264 e1571908 aurel32
/* CRF definitions */
1265 57951c27 aurel32
#define CRF_LT        3
1266 57951c27 aurel32
#define CRF_GT        2
1267 57951c27 aurel32
#define CRF_EQ        1
1268 57951c27 aurel32
#define CRF_SO        0
1269 e6bba2ef Nathan Froyd
#define CRF_CH        (1 << CRF_LT)
1270 e6bba2ef Nathan Froyd
#define CRF_CL        (1 << CRF_GT)
1271 e6bba2ef Nathan Froyd
#define CRF_CH_OR_CL  (1 << CRF_EQ)
1272 e6bba2ef Nathan Froyd
#define CRF_CH_AND_CL (1 << CRF_SO)
1273 e1571908 aurel32
1274 e1571908 aurel32
/* XER definitions */
1275 3d7b417e aurel32
#define XER_SO  31
1276 3d7b417e aurel32
#define XER_OV  30
1277 3d7b417e aurel32
#define XER_CA  29
1278 3d7b417e aurel32
#define XER_CMP  8
1279 3d7b417e aurel32
#define XER_BC   0
1280 3d7b417e aurel32
#define xer_so  ((env->xer >> XER_SO)  &    1)
1281 3d7b417e aurel32
#define xer_ov  ((env->xer >> XER_OV)  &    1)
1282 3d7b417e aurel32
#define xer_ca  ((env->xer >> XER_CA)  &    1)
1283 3d7b417e aurel32
#define xer_cmp ((env->xer >> XER_CMP) & 0xFF)
1284 3d7b417e aurel32
#define xer_bc  ((env->xer >> XER_BC)  & 0x7F)
1285 79aceca5 bellard
1286 3fc6c082 bellard
/* SPR definitions */
1287 80d11f44 j_mayer
#define SPR_MQ                (0x000)
1288 80d11f44 j_mayer
#define SPR_XER               (0x001)
1289 80d11f44 j_mayer
#define SPR_601_VRTCU         (0x004)
1290 80d11f44 j_mayer
#define SPR_601_VRTCL         (0x005)
1291 80d11f44 j_mayer
#define SPR_601_UDECR         (0x006)
1292 80d11f44 j_mayer
#define SPR_LR                (0x008)
1293 80d11f44 j_mayer
#define SPR_CTR               (0x009)
1294 697ab892 David Gibson
#define SPR_DSCR              (0x011)
1295 80d11f44 j_mayer
#define SPR_DSISR             (0x012)
1296 80d11f44 j_mayer
#define SPR_DAR               (0x013) /* DAE for PowerPC 601 */
1297 80d11f44 j_mayer
#define SPR_601_RTCU          (0x014)
1298 80d11f44 j_mayer
#define SPR_601_RTCL          (0x015)
1299 80d11f44 j_mayer
#define SPR_DECR              (0x016)
1300 80d11f44 j_mayer
#define SPR_SDR1              (0x019)
1301 80d11f44 j_mayer
#define SPR_SRR0              (0x01A)
1302 80d11f44 j_mayer
#define SPR_SRR1              (0x01B)
1303 697ab892 David Gibson
#define SPR_CFAR              (0x01C)
1304 80d11f44 j_mayer
#define SPR_AMR               (0x01D)
1305 80d11f44 j_mayer
#define SPR_BOOKE_PID         (0x030)
1306 80d11f44 j_mayer
#define SPR_BOOKE_DECAR       (0x036)
1307 80d11f44 j_mayer
#define SPR_BOOKE_CSRR0       (0x03A)
1308 80d11f44 j_mayer
#define SPR_BOOKE_CSRR1       (0x03B)
1309 80d11f44 j_mayer
#define SPR_BOOKE_DEAR        (0x03D)
1310 80d11f44 j_mayer
#define SPR_BOOKE_ESR         (0x03E)
1311 80d11f44 j_mayer
#define SPR_BOOKE_IVPR        (0x03F)
1312 80d11f44 j_mayer
#define SPR_MPC_EIE           (0x050)
1313 80d11f44 j_mayer
#define SPR_MPC_EID           (0x051)
1314 80d11f44 j_mayer
#define SPR_MPC_NRI           (0x052)
1315 80d11f44 j_mayer
#define SPR_CTRL              (0x088)
1316 80d11f44 j_mayer
#define SPR_MPC_CMPA          (0x090)
1317 80d11f44 j_mayer
#define SPR_MPC_CMPB          (0x091)
1318 80d11f44 j_mayer
#define SPR_MPC_CMPC          (0x092)
1319 80d11f44 j_mayer
#define SPR_MPC_CMPD          (0x093)
1320 80d11f44 j_mayer
#define SPR_MPC_ECR           (0x094)
1321 80d11f44 j_mayer
#define SPR_MPC_DER           (0x095)
1322 80d11f44 j_mayer
#define SPR_MPC_COUNTA        (0x096)
1323 80d11f44 j_mayer
#define SPR_MPC_COUNTB        (0x097)
1324 80d11f44 j_mayer
#define SPR_UCTRL             (0x098)
1325 80d11f44 j_mayer
#define SPR_MPC_CMPE          (0x098)
1326 80d11f44 j_mayer
#define SPR_MPC_CMPF          (0x099)
1327 80d11f44 j_mayer
#define SPR_MPC_CMPG          (0x09A)
1328 80d11f44 j_mayer
#define SPR_MPC_CMPH          (0x09B)
1329 80d11f44 j_mayer
#define SPR_MPC_LCTRL1        (0x09C)
1330 80d11f44 j_mayer
#define SPR_MPC_LCTRL2        (0x09D)
1331 80d11f44 j_mayer
#define SPR_MPC_ICTRL         (0x09E)
1332 80d11f44 j_mayer
#define SPR_MPC_BAR           (0x09F)
1333 80d11f44 j_mayer
#define SPR_VRSAVE            (0x100)
1334 80d11f44 j_mayer
#define SPR_USPRG0            (0x100)
1335 80d11f44 j_mayer
#define SPR_USPRG1            (0x101)
1336 80d11f44 j_mayer
#define SPR_USPRG2            (0x102)
1337 80d11f44 j_mayer
#define SPR_USPRG3            (0x103)
1338 80d11f44 j_mayer
#define SPR_USPRG4            (0x104)
1339 80d11f44 j_mayer
#define SPR_USPRG5            (0x105)
1340 80d11f44 j_mayer
#define SPR_USPRG6            (0x106)
1341 80d11f44 j_mayer
#define SPR_USPRG7            (0x107)
1342 80d11f44 j_mayer
#define SPR_VTBL              (0x10C)
1343 80d11f44 j_mayer
#define SPR_VTBU              (0x10D)
1344 80d11f44 j_mayer
#define SPR_SPRG0             (0x110)
1345 80d11f44 j_mayer
#define SPR_SPRG1             (0x111)
1346 80d11f44 j_mayer
#define SPR_SPRG2             (0x112)
1347 80d11f44 j_mayer
#define SPR_SPRG3             (0x113)
1348 80d11f44 j_mayer
#define SPR_SPRG4             (0x114)
1349 80d11f44 j_mayer
#define SPR_SCOMC             (0x114)
1350 80d11f44 j_mayer
#define SPR_SPRG5             (0x115)
1351 80d11f44 j_mayer
#define SPR_SCOMD             (0x115)
1352 80d11f44 j_mayer
#define SPR_SPRG6             (0x116)
1353 80d11f44 j_mayer
#define SPR_SPRG7             (0x117)
1354 80d11f44 j_mayer
#define SPR_ASR               (0x118)
1355 80d11f44 j_mayer
#define SPR_EAR               (0x11A)
1356 80d11f44 j_mayer
#define SPR_TBL               (0x11C)
1357 80d11f44 j_mayer
#define SPR_TBU               (0x11D)
1358 80d11f44 j_mayer
#define SPR_TBU40             (0x11E)
1359 80d11f44 j_mayer
#define SPR_SVR               (0x11E)
1360 80d11f44 j_mayer
#define SPR_BOOKE_PIR         (0x11E)
1361 80d11f44 j_mayer
#define SPR_PVR               (0x11F)
1362 80d11f44 j_mayer
#define SPR_HSPRG0            (0x130)
1363 80d11f44 j_mayer
#define SPR_BOOKE_DBSR        (0x130)
1364 80d11f44 j_mayer
#define SPR_HSPRG1            (0x131)
1365 80d11f44 j_mayer
#define SPR_HDSISR            (0x132)
1366 80d11f44 j_mayer
#define SPR_HDAR              (0x133)
1367 90dc8812 Scott Wood
#define SPR_BOOKE_EPCR        (0x133)
1368 9d52e907 David Gibson
#define SPR_SPURR             (0x134)
1369 80d11f44 j_mayer
#define SPR_BOOKE_DBCR0       (0x134)
1370 80d11f44 j_mayer
#define SPR_IBCR              (0x135)
1371 80d11f44 j_mayer
#define SPR_PURR              (0x135)
1372 80d11f44 j_mayer
#define SPR_BOOKE_DBCR1       (0x135)
1373 80d11f44 j_mayer
#define SPR_DBCR              (0x136)
1374 80d11f44 j_mayer
#define SPR_HDEC              (0x136)
1375 80d11f44 j_mayer
#define SPR_BOOKE_DBCR2       (0x136)
1376 80d11f44 j_mayer
#define SPR_HIOR              (0x137)
1377 80d11f44 j_mayer
#define SPR_MBAR              (0x137)
1378 80d11f44 j_mayer
#define SPR_RMOR              (0x138)
1379 80d11f44 j_mayer
#define SPR_BOOKE_IAC1        (0x138)
1380 80d11f44 j_mayer
#define SPR_HRMOR             (0x139)
1381 80d11f44 j_mayer
#define SPR_BOOKE_IAC2        (0x139)
1382 80d11f44 j_mayer
#define SPR_HSRR0             (0x13A)
1383 80d11f44 j_mayer
#define SPR_BOOKE_IAC3        (0x13A)
1384 80d11f44 j_mayer
#define SPR_HSRR1             (0x13B)
1385 80d11f44 j_mayer
#define SPR_BOOKE_IAC4        (0x13B)
1386 80d11f44 j_mayer
#define SPR_LPCR              (0x13C)
1387 80d11f44 j_mayer
#define SPR_BOOKE_DAC1        (0x13C)
1388 80d11f44 j_mayer
#define SPR_LPIDR             (0x13D)
1389 80d11f44 j_mayer
#define SPR_DABR2             (0x13D)
1390 80d11f44 j_mayer
#define SPR_BOOKE_DAC2        (0x13D)
1391 80d11f44 j_mayer
#define SPR_BOOKE_DVC1        (0x13E)
1392 80d11f44 j_mayer
#define SPR_BOOKE_DVC2        (0x13F)
1393 80d11f44 j_mayer
#define SPR_BOOKE_TSR         (0x150)
1394 80d11f44 j_mayer
#define SPR_BOOKE_TCR         (0x154)
1395 a1ef618a Alexander Graf
#define SPR_BOOKE_TLB0PS      (0x158)
1396 a1ef618a Alexander Graf
#define SPR_BOOKE_TLB1PS      (0x159)
1397 a1ef618a Alexander Graf
#define SPR_BOOKE_TLB2PS      (0x15A)
1398 a1ef618a Alexander Graf
#define SPR_BOOKE_TLB3PS      (0x15B)
1399 84755ed5 Alexander Graf
#define SPR_BOOKE_MAS7_MAS3   (0x174)
1400 80d11f44 j_mayer
#define SPR_BOOKE_IVOR0       (0x190)
1401 80d11f44 j_mayer
#define SPR_BOOKE_IVOR1       (0x191)
1402 80d11f44 j_mayer
#define SPR_BOOKE_IVOR2       (0x192)
1403 80d11f44 j_mayer
#define SPR_BOOKE_IVOR3       (0x193)
1404 80d11f44 j_mayer
#define SPR_BOOKE_IVOR4       (0x194)
1405 80d11f44 j_mayer
#define SPR_BOOKE_IVOR5       (0x195)
1406 80d11f44 j_mayer
#define SPR_BOOKE_IVOR6       (0x196)
1407 80d11f44 j_mayer
#define SPR_BOOKE_IVOR7       (0x197)
1408 80d11f44 j_mayer
#define SPR_BOOKE_IVOR8       (0x198)
1409 80d11f44 j_mayer
#define SPR_BOOKE_IVOR9       (0x199)
1410 80d11f44 j_mayer
#define SPR_BOOKE_IVOR10      (0x19A)
1411 80d11f44 j_mayer
#define SPR_BOOKE_IVOR11      (0x19B)
1412 80d11f44 j_mayer
#define SPR_BOOKE_IVOR12      (0x19C)
1413 80d11f44 j_mayer
#define SPR_BOOKE_IVOR13      (0x19D)
1414 80d11f44 j_mayer
#define SPR_BOOKE_IVOR14      (0x19E)
1415 80d11f44 j_mayer
#define SPR_BOOKE_IVOR15      (0x19F)
1416 e9205258 Alexander Graf
#define SPR_BOOKE_IVOR38      (0x1B0)
1417 e9205258 Alexander Graf
#define SPR_BOOKE_IVOR39      (0x1B1)
1418 e9205258 Alexander Graf
#define SPR_BOOKE_IVOR40      (0x1B2)
1419 e9205258 Alexander Graf
#define SPR_BOOKE_IVOR41      (0x1B3)
1420 e9205258 Alexander Graf
#define SPR_BOOKE_IVOR42      (0x1B4)
1421 80d11f44 j_mayer
#define SPR_BOOKE_SPEFSCR     (0x200)
1422 80d11f44 j_mayer
#define SPR_Exxx_BBEAR        (0x201)
1423 80d11f44 j_mayer
#define SPR_Exxx_BBTAR        (0x202)
1424 80d11f44 j_mayer
#define SPR_Exxx_L1CFG0       (0x203)
1425 80d11f44 j_mayer
#define SPR_Exxx_NPIDR        (0x205)
1426 80d11f44 j_mayer
#define SPR_ATBL              (0x20E)
1427 80d11f44 j_mayer
#define SPR_ATBU              (0x20F)
1428 80d11f44 j_mayer
#define SPR_IBAT0U            (0x210)
1429 80d11f44 j_mayer
#define SPR_BOOKE_IVOR32      (0x210)
1430 80d11f44 j_mayer
#define SPR_RCPU_MI_GRA       (0x210)
1431 80d11f44 j_mayer
#define SPR_IBAT0L            (0x211)
1432 80d11f44 j_mayer
#define SPR_BOOKE_IVOR33      (0x211)
1433 80d11f44 j_mayer
#define SPR_IBAT1U            (0x212)
1434 80d11f44 j_mayer
#define SPR_BOOKE_IVOR34      (0x212)
1435 80d11f44 j_mayer
#define SPR_IBAT1L            (0x213)
1436 80d11f44 j_mayer
#define SPR_BOOKE_IVOR35      (0x213)
1437 80d11f44 j_mayer
#define SPR_IBAT2U            (0x214)
1438 80d11f44 j_mayer
#define SPR_BOOKE_IVOR36      (0x214)
1439 80d11f44 j_mayer
#define SPR_IBAT2L            (0x215)
1440 80d11f44 j_mayer
#define SPR_BOOKE_IVOR37      (0x215)
1441 80d11f44 j_mayer
#define SPR_IBAT3U            (0x216)
1442 80d11f44 j_mayer
#define SPR_IBAT3L            (0x217)
1443 80d11f44 j_mayer
#define SPR_DBAT0U            (0x218)
1444 80d11f44 j_mayer
#define SPR_RCPU_L2U_GRA      (0x218)
1445 80d11f44 j_mayer
#define SPR_DBAT0L            (0x219)
1446 80d11f44 j_mayer
#define SPR_DBAT1U            (0x21A)
1447 80d11f44 j_mayer
#define SPR_DBAT1L            (0x21B)
1448 80d11f44 j_mayer
#define SPR_DBAT2U            (0x21C)
1449 80d11f44 j_mayer
#define SPR_DBAT2L            (0x21D)
1450 80d11f44 j_mayer
#define SPR_DBAT3U            (0x21E)
1451 80d11f44 j_mayer
#define SPR_DBAT3L            (0x21F)
1452 80d11f44 j_mayer
#define SPR_IBAT4U            (0x230)
1453 80d11f44 j_mayer
#define SPR_RPCU_BBCMCR       (0x230)
1454 80d11f44 j_mayer
#define SPR_MPC_IC_CST        (0x230)
1455 80d11f44 j_mayer
#define SPR_Exxx_CTXCR        (0x230)
1456 80d11f44 j_mayer
#define SPR_IBAT4L            (0x231)
1457 80d11f44 j_mayer
#define SPR_MPC_IC_ADR        (0x231)
1458 80d11f44 j_mayer
#define SPR_Exxx_DBCR3        (0x231)
1459 80d11f44 j_mayer
#define SPR_IBAT5U            (0x232)
1460 80d11f44 j_mayer
#define SPR_MPC_IC_DAT        (0x232)
1461 80d11f44 j_mayer
#define SPR_Exxx_DBCNT        (0x232)
1462 80d11f44 j_mayer
#define SPR_IBAT5L            (0x233)
1463 80d11f44 j_mayer
#define SPR_IBAT6U            (0x234)
1464 80d11f44 j_mayer
#define SPR_IBAT6L            (0x235)
1465 80d11f44 j_mayer
#define SPR_IBAT7U            (0x236)
1466 80d11f44 j_mayer
#define SPR_IBAT7L            (0x237)
1467 80d11f44 j_mayer
#define SPR_DBAT4U            (0x238)
1468 80d11f44 j_mayer
#define SPR_RCPU_L2U_MCR      (0x238)
1469 80d11f44 j_mayer
#define SPR_MPC_DC_CST        (0x238)
1470 80d11f44 j_mayer
#define SPR_Exxx_ALTCTXCR     (0x238)
1471 80d11f44 j_mayer
#define SPR_DBAT4L            (0x239)
1472 80d11f44 j_mayer
#define SPR_MPC_DC_ADR        (0x239)
1473 80d11f44 j_mayer
#define SPR_DBAT5U            (0x23A)
1474 80d11f44 j_mayer
#define SPR_BOOKE_MCSRR0      (0x23A)
1475 80d11f44 j_mayer
#define SPR_MPC_DC_DAT        (0x23A)
1476 80d11f44 j_mayer
#define SPR_DBAT5L            (0x23B)
1477 80d11f44 j_mayer
#define SPR_BOOKE_MCSRR1      (0x23B)
1478 80d11f44 j_mayer
#define SPR_DBAT6U            (0x23C)
1479 80d11f44 j_mayer
#define SPR_BOOKE_MCSR        (0x23C)
1480 80d11f44 j_mayer
#define SPR_DBAT6L            (0x23D)
1481 80d11f44 j_mayer
#define SPR_Exxx_MCAR         (0x23D)
1482 80d11f44 j_mayer
#define SPR_DBAT7U            (0x23E)
1483 80d11f44 j_mayer
#define SPR_BOOKE_DSRR0       (0x23E)
1484 80d11f44 j_mayer
#define SPR_DBAT7L            (0x23F)
1485 80d11f44 j_mayer
#define SPR_BOOKE_DSRR1       (0x23F)
1486 80d11f44 j_mayer
#define SPR_BOOKE_SPRG8       (0x25C)
1487 80d11f44 j_mayer
#define SPR_BOOKE_SPRG9       (0x25D)
1488 80d11f44 j_mayer
#define SPR_BOOKE_MAS0        (0x270)
1489 80d11f44 j_mayer
#define SPR_BOOKE_MAS1        (0x271)
1490 80d11f44 j_mayer
#define SPR_BOOKE_MAS2        (0x272)
1491 80d11f44 j_mayer
#define SPR_BOOKE_MAS3        (0x273)
1492 80d11f44 j_mayer
#define SPR_BOOKE_MAS4        (0x274)
1493 80d11f44 j_mayer
#define SPR_BOOKE_MAS5        (0x275)
1494 80d11f44 j_mayer
#define SPR_BOOKE_MAS6        (0x276)
1495 80d11f44 j_mayer
#define SPR_BOOKE_PID1        (0x279)
1496 80d11f44 j_mayer
#define SPR_BOOKE_PID2        (0x27A)
1497 80d11f44 j_mayer
#define SPR_MPC_DPDR          (0x280)
1498 80d11f44 j_mayer
#define SPR_MPC_IMMR          (0x288)
1499 80d11f44 j_mayer
#define SPR_BOOKE_TLB0CFG     (0x2B0)
1500 80d11f44 j_mayer
#define SPR_BOOKE_TLB1CFG     (0x2B1)
1501 80d11f44 j_mayer
#define SPR_BOOKE_TLB2CFG     (0x2B2)
1502 80d11f44 j_mayer
#define SPR_BOOKE_TLB3CFG     (0x2B3)
1503 80d11f44 j_mayer
#define SPR_BOOKE_EPR         (0x2BE)
1504 80d11f44 j_mayer
#define SPR_PERF0             (0x300)
1505 80d11f44 j_mayer
#define SPR_RCPU_MI_RBA0      (0x300)
1506 80d11f44 j_mayer
#define SPR_MPC_MI_CTR        (0x300)
1507 80d11f44 j_mayer
#define SPR_PERF1             (0x301)
1508 80d11f44 j_mayer
#define SPR_RCPU_MI_RBA1      (0x301)
1509 80d11f44 j_mayer
#define SPR_PERF2             (0x302)
1510 80d11f44 j_mayer
#define SPR_RCPU_MI_RBA2      (0x302)
1511 80d11f44 j_mayer
#define SPR_MPC_MI_AP         (0x302)
1512 80d11f44 j_mayer
#define SPR_PERF3             (0x303)
1513 082c6681 j_mayer
#define SPR_620_PMC1R         (0x303)
1514 80d11f44 j_mayer
#define SPR_RCPU_MI_RBA3      (0x303)
1515 80d11f44 j_mayer
#define SPR_MPC_MI_EPN        (0x303)
1516 80d11f44 j_mayer
#define SPR_PERF4             (0x304)
1517 082c6681 j_mayer
#define SPR_620_PMC2R         (0x304)
1518 80d11f44 j_mayer
#define SPR_PERF5             (0x305)
1519 80d11f44 j_mayer
#define SPR_MPC_MI_TWC        (0x305)
1520 80d11f44 j_mayer
#define SPR_PERF6             (0x306)
1521 80d11f44 j_mayer
#define SPR_MPC_MI_RPN        (0x306)
1522 80d11f44 j_mayer
#define SPR_PERF7             (0x307)
1523 80d11f44 j_mayer
#define SPR_PERF8             (0x308)
1524 80d11f44 j_mayer
#define SPR_RCPU_L2U_RBA0     (0x308)
1525 80d11f44 j_mayer
#define SPR_MPC_MD_CTR        (0x308)
1526 80d11f44 j_mayer
#define SPR_PERF9             (0x309)
1527 80d11f44 j_mayer
#define SPR_RCPU_L2U_RBA1     (0x309)
1528 80d11f44 j_mayer
#define SPR_MPC_MD_CASID      (0x309)
1529 80d11f44 j_mayer
#define SPR_PERFA             (0x30A)
1530 80d11f44 j_mayer
#define SPR_RCPU_L2U_RBA2     (0x30A)
1531 80d11f44 j_mayer
#define SPR_MPC_MD_AP         (0x30A)
1532 80d11f44 j_mayer
#define SPR_PERFB             (0x30B)
1533 082c6681 j_mayer
#define SPR_620_MMCR0R        (0x30B)
1534 80d11f44 j_mayer
#define SPR_RCPU_L2U_RBA3     (0x30B)
1535 80d11f44 j_mayer
#define SPR_MPC_MD_EPN        (0x30B)
1536 80d11f44 j_mayer
#define SPR_PERFC             (0x30C)
1537 80d11f44 j_mayer
#define SPR_MPC_MD_TWB        (0x30C)
1538 80d11f44 j_mayer
#define SPR_PERFD             (0x30D)
1539 80d11f44 j_mayer
#define SPR_MPC_MD_TWC        (0x30D)
1540 80d11f44 j_mayer
#define SPR_PERFE             (0x30E)
1541 80d11f44 j_mayer
#define SPR_MPC_MD_RPN        (0x30E)
1542 80d11f44 j_mayer
#define SPR_PERFF             (0x30F)
1543 80d11f44 j_mayer
#define SPR_MPC_MD_TW         (0x30F)
1544 80d11f44 j_mayer
#define SPR_UPERF0            (0x310)
1545 80d11f44 j_mayer
#define SPR_UPERF1            (0x311)
1546 80d11f44 j_mayer
#define SPR_UPERF2            (0x312)
1547 80d11f44 j_mayer
#define SPR_UPERF3            (0x313)
1548 082c6681 j_mayer
#define SPR_620_PMC1W         (0x313)
1549 80d11f44 j_mayer
#define SPR_UPERF4            (0x314)
1550 082c6681 j_mayer
#define SPR_620_PMC2W         (0x314)
1551 80d11f44 j_mayer
#define SPR_UPERF5            (0x315)
1552 80d11f44 j_mayer
#define SPR_UPERF6            (0x316)
1553 80d11f44 j_mayer
#define SPR_UPERF7            (0x317)
1554 80d11f44 j_mayer
#define SPR_UPERF8            (0x318)
1555 80d11f44 j_mayer
#define SPR_UPERF9            (0x319)
1556 80d11f44 j_mayer
#define SPR_UPERFA            (0x31A)
1557 80d11f44 j_mayer
#define SPR_UPERFB            (0x31B)
1558 082c6681 j_mayer
#define SPR_620_MMCR0W        (0x31B)
1559 80d11f44 j_mayer
#define SPR_UPERFC            (0x31C)
1560 80d11f44 j_mayer
#define SPR_UPERFD            (0x31D)
1561 80d11f44 j_mayer
#define SPR_UPERFE            (0x31E)
1562 80d11f44 j_mayer
#define SPR_UPERFF            (0x31F)
1563 80d11f44 j_mayer
#define SPR_RCPU_MI_RA0       (0x320)
1564 80d11f44 j_mayer
#define SPR_MPC_MI_DBCAM      (0x320)
1565 80d11f44 j_mayer
#define SPR_RCPU_MI_RA1       (0x321)
1566 80d11f44 j_mayer
#define SPR_MPC_MI_DBRAM0     (0x321)
1567 80d11f44 j_mayer
#define SPR_RCPU_MI_RA2       (0x322)
1568 80d11f44 j_mayer
#define SPR_MPC_MI_DBRAM1     (0x322)
1569 80d11f44 j_mayer
#define SPR_RCPU_MI_RA3       (0x323)
1570 80d11f44 j_mayer
#define SPR_RCPU_L2U_RA0      (0x328)
1571 80d11f44 j_mayer
#define SPR_MPC_MD_DBCAM      (0x328)
1572 80d11f44 j_mayer
#define SPR_RCPU_L2U_RA1      (0x329)
1573 80d11f44 j_mayer
#define SPR_MPC_MD_DBRAM0     (0x329)
1574 80d11f44 j_mayer
#define SPR_RCPU_L2U_RA2      (0x32A)
1575 80d11f44 j_mayer
#define SPR_MPC_MD_DBRAM1     (0x32A)
1576 80d11f44 j_mayer
#define SPR_RCPU_L2U_RA3      (0x32B)
1577 80d11f44 j_mayer
#define SPR_440_INV0          (0x370)
1578 80d11f44 j_mayer
#define SPR_440_INV1          (0x371)
1579 80d11f44 j_mayer
#define SPR_440_INV2          (0x372)
1580 80d11f44 j_mayer
#define SPR_440_INV3          (0x373)
1581 80d11f44 j_mayer
#define SPR_440_ITV0          (0x374)
1582 80d11f44 j_mayer
#define SPR_440_ITV1          (0x375)
1583 80d11f44 j_mayer
#define SPR_440_ITV2          (0x376)
1584 80d11f44 j_mayer
#define SPR_440_ITV3          (0x377)
1585 80d11f44 j_mayer
#define SPR_440_CCR1          (0x378)
1586 80d11f44 j_mayer
#define SPR_DCRIPR            (0x37B)
1587 80d11f44 j_mayer
#define SPR_PPR               (0x380)
1588 bd928eba j_mayer
#define SPR_750_GQR0          (0x390)
1589 80d11f44 j_mayer
#define SPR_440_DNV0          (0x390)
1590 bd928eba j_mayer
#define SPR_750_GQR1          (0x391)
1591 80d11f44 j_mayer
#define SPR_440_DNV1          (0x391)
1592 bd928eba j_mayer
#define SPR_750_GQR2          (0x392)
1593 80d11f44 j_mayer
#define SPR_440_DNV2          (0x392)
1594 bd928eba j_mayer
#define SPR_750_GQR3          (0x393)
1595 80d11f44 j_mayer
#define SPR_440_DNV3          (0x393)
1596 bd928eba j_mayer
#define SPR_750_GQR4          (0x394)
1597 80d11f44 j_mayer
#define SPR_440_DTV0          (0x394)
1598 bd928eba j_mayer
#define SPR_750_GQR5          (0x395)
1599 80d11f44 j_mayer
#define SPR_440_DTV1          (0x395)
1600 bd928eba j_mayer
#define SPR_750_GQR6          (0x396)
1601 80d11f44 j_mayer
#define SPR_440_DTV2          (0x396)
1602 bd928eba j_mayer
#define SPR_750_GQR7          (0x397)
1603 80d11f44 j_mayer
#define SPR_440_DTV3          (0x397)
1604 bd928eba j_mayer
#define SPR_750_THRM4         (0x398)
1605 bd928eba j_mayer
#define SPR_750CL_HID2        (0x398)
1606 80d11f44 j_mayer
#define SPR_440_DVLIM         (0x398)
1607 bd928eba j_mayer
#define SPR_750_WPAR          (0x399)
1608 80d11f44 j_mayer
#define SPR_440_IVLIM         (0x399)
1609 bd928eba j_mayer
#define SPR_750_DMAU          (0x39A)
1610 bd928eba j_mayer
#define SPR_750_DMAL          (0x39B)
1611 80d11f44 j_mayer
#define SPR_440_RSTCFG        (0x39B)
1612 80d11f44 j_mayer
#define SPR_BOOKE_DCDBTRL     (0x39C)
1613 80d11f44 j_mayer
#define SPR_BOOKE_DCDBTRH     (0x39D)
1614 80d11f44 j_mayer
#define SPR_BOOKE_ICDBTRL     (0x39E)
1615 80d11f44 j_mayer
#define SPR_BOOKE_ICDBTRH     (0x39F)
1616 80d11f44 j_mayer
#define SPR_UMMCR2            (0x3A0)
1617 80d11f44 j_mayer
#define SPR_UPMC5             (0x3A1)
1618 80d11f44 j_mayer
#define SPR_UPMC6             (0x3A2)
1619 80d11f44 j_mayer
#define SPR_UBAMR             (0x3A7)
1620 80d11f44 j_mayer
#define SPR_UMMCR0            (0x3A8)
1621 80d11f44 j_mayer
#define SPR_UPMC1             (0x3A9)
1622 80d11f44 j_mayer
#define SPR_UPMC2             (0x3AA)
1623 80d11f44 j_mayer
#define SPR_USIAR             (0x3AB)
1624 80d11f44 j_mayer
#define SPR_UMMCR1            (0x3AC)
1625 80d11f44 j_mayer
#define SPR_UPMC3             (0x3AD)
1626 80d11f44 j_mayer
#define SPR_UPMC4             (0x3AE)
1627 80d11f44 j_mayer
#define SPR_USDA              (0x3AF)
1628 80d11f44 j_mayer
#define SPR_40x_ZPR           (0x3B0)
1629 80d11f44 j_mayer
#define SPR_BOOKE_MAS7        (0x3B0)
1630 80d11f44 j_mayer
#define SPR_620_PMR0          (0x3B0)
1631 80d11f44 j_mayer
#define SPR_MMCR2             (0x3B0)
1632 80d11f44 j_mayer
#define SPR_PMC5              (0x3B1)
1633 80d11f44 j_mayer
#define SPR_40x_PID           (0x3B1)
1634 80d11f44 j_mayer
#define SPR_620_PMR1          (0x3B1)
1635 80d11f44 j_mayer
#define SPR_PMC6              (0x3B2)
1636 80d11f44 j_mayer
#define SPR_440_MMUCR         (0x3B2)
1637 80d11f44 j_mayer
#define SPR_620_PMR2          (0x3B2)
1638 80d11f44 j_mayer
#define SPR_4xx_CCR0          (0x3B3)
1639 80d11f44 j_mayer
#define SPR_BOOKE_EPLC        (0x3B3)
1640 80d11f44 j_mayer
#define SPR_620_PMR3          (0x3B3)
1641 80d11f44 j_mayer
#define SPR_405_IAC3          (0x3B4)
1642 80d11f44 j_mayer
#define SPR_BOOKE_EPSC        (0x3B4)
1643 80d11f44 j_mayer
#define SPR_620_PMR4          (0x3B4)
1644 80d11f44 j_mayer
#define SPR_405_IAC4          (0x3B5)
1645 80d11f44 j_mayer
#define SPR_620_PMR5          (0x3B5)
1646 80d11f44 j_mayer
#define SPR_405_DVC1          (0x3B6)
1647 80d11f44 j_mayer
#define SPR_620_PMR6          (0x3B6)
1648 80d11f44 j_mayer
#define SPR_405_DVC2          (0x3B7)
1649 80d11f44 j_mayer
#define SPR_620_PMR7          (0x3B7)
1650 80d11f44 j_mayer
#define SPR_BAMR              (0x3B7)
1651 80d11f44 j_mayer
#define SPR_MMCR0             (0x3B8)
1652 80d11f44 j_mayer
#define SPR_620_PMR8          (0x3B8)
1653 80d11f44 j_mayer
#define SPR_PMC1              (0x3B9)
1654 80d11f44 j_mayer
#define SPR_40x_SGR           (0x3B9)
1655 80d11f44 j_mayer
#define SPR_620_PMR9          (0x3B9)
1656 80d11f44 j_mayer
#define SPR_PMC2              (0x3BA)
1657 80d11f44 j_mayer
#define SPR_40x_DCWR          (0x3BA)
1658 80d11f44 j_mayer
#define SPR_620_PMRA          (0x3BA)
1659 80d11f44 j_mayer
#define SPR_SIAR              (0x3BB)
1660 80d11f44 j_mayer
#define SPR_405_SLER          (0x3BB)
1661 80d11f44 j_mayer
#define SPR_620_PMRB          (0x3BB)
1662 80d11f44 j_mayer
#define SPR_MMCR1             (0x3BC)
1663 80d11f44 j_mayer
#define SPR_405_SU0R          (0x3BC)
1664 80d11f44 j_mayer
#define SPR_620_PMRC          (0x3BC)
1665 80d11f44 j_mayer
#define SPR_401_SKR           (0x3BC)
1666 80d11f44 j_mayer
#define SPR_PMC3              (0x3BD)
1667 80d11f44 j_mayer
#define SPR_405_DBCR1         (0x3BD)
1668 80d11f44 j_mayer
#define SPR_620_PMRD          (0x3BD)
1669 80d11f44 j_mayer
#define SPR_PMC4              (0x3BE)
1670 80d11f44 j_mayer
#define SPR_620_PMRE          (0x3BE)
1671 80d11f44 j_mayer
#define SPR_SDA               (0x3BF)
1672 80d11f44 j_mayer
#define SPR_620_PMRF          (0x3BF)
1673 80d11f44 j_mayer
#define SPR_403_VTBL          (0x3CC)
1674 80d11f44 j_mayer
#define SPR_403_VTBU          (0x3CD)
1675 80d11f44 j_mayer
#define SPR_DMISS             (0x3D0)
1676 80d11f44 j_mayer
#define SPR_DCMP              (0x3D1)
1677 80d11f44 j_mayer
#define SPR_HASH1             (0x3D2)
1678 80d11f44 j_mayer
#define SPR_HASH2             (0x3D3)
1679 80d11f44 j_mayer
#define SPR_BOOKE_ICDBDR      (0x3D3)
1680 80d11f44 j_mayer
#define SPR_TLBMISS           (0x3D4)
1681 80d11f44 j_mayer
#define SPR_IMISS             (0x3D4)
1682 80d11f44 j_mayer
#define SPR_40x_ESR           (0x3D4)
1683 80d11f44 j_mayer
#define SPR_PTEHI             (0x3D5)
1684 80d11f44 j_mayer
#define SPR_ICMP              (0x3D5)
1685 80d11f44 j_mayer
#define SPR_40x_DEAR          (0x3D5)
1686 80d11f44 j_mayer
#define SPR_PTELO             (0x3D6)
1687 80d11f44 j_mayer
#define SPR_RPA               (0x3D6)
1688 80d11f44 j_mayer
#define SPR_40x_EVPR          (0x3D6)
1689 80d11f44 j_mayer
#define SPR_L3PM              (0x3D7)
1690 80d11f44 j_mayer
#define SPR_403_CDBCR         (0x3D7)
1691 4e777442 j_mayer
#define SPR_L3ITCR0           (0x3D8)
1692 80d11f44 j_mayer
#define SPR_TCR               (0x3D8)
1693 80d11f44 j_mayer
#define SPR_40x_TSR           (0x3D8)
1694 80d11f44 j_mayer
#define SPR_IBR               (0x3DA)
1695 80d11f44 j_mayer
#define SPR_40x_TCR           (0x3DA)
1696 80d11f44 j_mayer
#define SPR_ESASRR            (0x3DB)
1697 80d11f44 j_mayer
#define SPR_40x_PIT           (0x3DB)
1698 80d11f44 j_mayer
#define SPR_403_TBL           (0x3DC)
1699 80d11f44 j_mayer
#define SPR_403_TBU           (0x3DD)
1700 80d11f44 j_mayer
#define SPR_SEBR              (0x3DE)
1701 80d11f44 j_mayer
#define SPR_40x_SRR2          (0x3DE)
1702 80d11f44 j_mayer
#define SPR_SER               (0x3DF)
1703 80d11f44 j_mayer
#define SPR_40x_SRR3          (0x3DF)
1704 4e777442 j_mayer
#define SPR_L3OHCR            (0x3E8)
1705 80d11f44 j_mayer
#define SPR_L3ITCR1           (0x3E9)
1706 80d11f44 j_mayer
#define SPR_L3ITCR2           (0x3EA)
1707 80d11f44 j_mayer
#define SPR_L3ITCR3           (0x3EB)
1708 80d11f44 j_mayer
#define SPR_HID0              (0x3F0)
1709 80d11f44 j_mayer
#define SPR_40x_DBSR          (0x3F0)
1710 80d11f44 j_mayer
#define SPR_HID1              (0x3F1)
1711 80d11f44 j_mayer
#define SPR_IABR              (0x3F2)
1712 80d11f44 j_mayer
#define SPR_40x_DBCR0         (0x3F2)
1713 80d11f44 j_mayer
#define SPR_601_HID2          (0x3F2)
1714 80d11f44 j_mayer
#define SPR_Exxx_L1CSR0       (0x3F2)
1715 80d11f44 j_mayer
#define SPR_ICTRL             (0x3F3)
1716 80d11f44 j_mayer
#define SPR_HID2              (0x3F3)
1717 bd928eba j_mayer
#define SPR_750CL_HID4        (0x3F3)
1718 80d11f44 j_mayer
#define SPR_Exxx_L1CSR1       (0x3F3)
1719 80d11f44 j_mayer
#define SPR_440_DBDR          (0x3F3)
1720 80d11f44 j_mayer
#define SPR_LDSTDB            (0x3F4)
1721 bd928eba j_mayer
#define SPR_750_TDCL          (0x3F4)
1722 80d11f44 j_mayer
#define SPR_40x_IAC1          (0x3F4)
1723 80d11f44 j_mayer
#define SPR_MMUCSR0           (0x3F4)
1724 80d11f44 j_mayer
#define SPR_DABR              (0x3F5)
1725 3fc6c082 bellard
#define DABR_MASK (~(target_ulong)0x7)
1726 80d11f44 j_mayer
#define SPR_Exxx_BUCSR        (0x3F5)
1727 80d11f44 j_mayer
#define SPR_40x_IAC2          (0x3F5)
1728 80d11f44 j_mayer
#define SPR_601_HID5          (0x3F5)
1729 80d11f44 j_mayer
#define SPR_40x_DAC1          (0x3F6)
1730 80d11f44 j_mayer
#define SPR_MSSCR0            (0x3F6)
1731 80d11f44 j_mayer
#define SPR_970_HID5          (0x3F6)
1732 80d11f44 j_mayer
#define SPR_MSSSR0            (0x3F7)
1733 4e777442 j_mayer
#define SPR_MSSCR1            (0x3F7)
1734 80d11f44 j_mayer
#define SPR_DABRX             (0x3F7)
1735 80d11f44 j_mayer
#define SPR_40x_DAC2          (0x3F7)
1736 80d11f44 j_mayer
#define SPR_MMUCFG            (0x3F7)
1737 80d11f44 j_mayer
#define SPR_LDSTCR            (0x3F8)
1738 80d11f44 j_mayer
#define SPR_L2PMCR            (0x3F8)
1739 bd928eba j_mayer
#define SPR_750FX_HID2        (0x3F8)
1740 082c6681 j_mayer
#define SPR_620_BUSCSR        (0x3F8)
1741 80d11f44 j_mayer
#define SPR_Exxx_L1FINV0      (0x3F8)
1742 80d11f44 j_mayer
#define SPR_L2CR              (0x3F9)
1743 082c6681 j_mayer
#define SPR_620_L2CR          (0x3F9)
1744 80d11f44 j_mayer
#define SPR_L3CR              (0x3FA)
1745 bd928eba j_mayer
#define SPR_750_TDCH          (0x3FA)
1746 80d11f44 j_mayer
#define SPR_IABR2             (0x3FA)
1747 80d11f44 j_mayer
#define SPR_40x_DCCR          (0x3FA)
1748 082c6681 j_mayer
#define SPR_620_L2SR          (0x3FA)
1749 80d11f44 j_mayer
#define SPR_ICTC              (0x3FB)
1750 80d11f44 j_mayer
#define SPR_40x_ICCR          (0x3FB)
1751 80d11f44 j_mayer
#define SPR_THRM1             (0x3FC)
1752 80d11f44 j_mayer
#define SPR_403_PBL1          (0x3FC)
1753 80d11f44 j_mayer
#define SPR_SP                (0x3FD)
1754 80d11f44 j_mayer
#define SPR_THRM2             (0x3FD)
1755 80d11f44 j_mayer
#define SPR_403_PBU1          (0x3FD)
1756 80d11f44 j_mayer
#define SPR_604_HID13         (0x3FD)
1757 80d11f44 j_mayer
#define SPR_LT                (0x3FE)
1758 80d11f44 j_mayer
#define SPR_THRM3             (0x3FE)
1759 80d11f44 j_mayer
#define SPR_RCPU_FPECR        (0x3FE)
1760 80d11f44 j_mayer
#define SPR_403_PBL2          (0x3FE)
1761 80d11f44 j_mayer
#define SPR_PIR               (0x3FF)
1762 80d11f44 j_mayer
#define SPR_403_PBU2          (0x3FF)
1763 80d11f44 j_mayer
#define SPR_601_HID15         (0x3FF)
1764 80d11f44 j_mayer
#define SPR_604_HID15         (0x3FF)
1765 80d11f44 j_mayer
#define SPR_E500_SVR          (0x3FF)
1766 79aceca5 bellard
1767 84755ed5 Alexander Graf
/* Disable MAS Interrupt Updates for Hypervisor */
1768 84755ed5 Alexander Graf
#define EPCR_DMIUH            (1 << 22)
1769 84755ed5 Alexander Graf
/* Disable Guest TLB Management Instructions */
1770 84755ed5 Alexander Graf
#define EPCR_DGTMI            (1 << 23)
1771 84755ed5 Alexander Graf
/* Guest Interrupt Computation Mode */
1772 84755ed5 Alexander Graf
#define EPCR_GICM             (1 << 24)
1773 84755ed5 Alexander Graf
/* Interrupt Computation Mode */
1774 84755ed5 Alexander Graf
#define EPCR_ICM              (1 << 25)
1775 84755ed5 Alexander Graf
/* Disable Embedded Hypervisor Debug */
1776 84755ed5 Alexander Graf
#define EPCR_DUVD             (1 << 26)
1777 84755ed5 Alexander Graf
/* Instruction Storage Interrupt Directed to Guest State */
1778 84755ed5 Alexander Graf
#define EPCR_ISIGS            (1 << 27)
1779 84755ed5 Alexander Graf
/* Data Storage Interrupt Directed to Guest State */
1780 84755ed5 Alexander Graf
#define EPCR_DSIGS            (1 << 28)
1781 84755ed5 Alexander Graf
/* Instruction TLB Error Interrupt Directed to Guest State */
1782 84755ed5 Alexander Graf
#define EPCR_ITLBGS           (1 << 29)
1783 84755ed5 Alexander Graf
/* Data TLB Error Interrupt Directed to Guest State */
1784 84755ed5 Alexander Graf
#define EPCR_DTLBGS           (1 << 30)
1785 84755ed5 Alexander Graf
/* External Input Interrupt Directed to Guest State */
1786 84755ed5 Alexander Graf
#define EPCR_EXTGS            (1 << 31)
1787 84755ed5 Alexander Graf
1788 76a66253 j_mayer
/*****************************************************************************/
1789 c29b735c Nathan Froyd
/* PowerPC Instructions types definitions                                    */
1790 c29b735c Nathan Froyd
enum {
1791 c29b735c Nathan Froyd
    PPC_NONE           = 0x0000000000000000ULL,
1792 c29b735c Nathan Froyd
    /* PowerPC base instructions set                                         */
1793 c29b735c Nathan Froyd
    PPC_INSNS_BASE     = 0x0000000000000001ULL,
1794 c29b735c Nathan Froyd
    /*   integer operations instructions                                     */
1795 c29b735c Nathan Froyd
#define PPC_INTEGER PPC_INSNS_BASE
1796 c29b735c Nathan Froyd
    /*   flow control instructions                                           */
1797 c29b735c Nathan Froyd
#define PPC_FLOW    PPC_INSNS_BASE
1798 c29b735c Nathan Froyd
    /*   virtual memory instructions                                         */
1799 c29b735c Nathan Froyd
#define PPC_MEM     PPC_INSNS_BASE
1800 c29b735c Nathan Froyd
    /*   ld/st with reservation instructions                                 */
1801 c29b735c Nathan Froyd
#define PPC_RES     PPC_INSNS_BASE
1802 c29b735c Nathan Froyd
    /*   spr/msr access instructions                                         */
1803 c29b735c Nathan Froyd
#define PPC_MISC    PPC_INSNS_BASE
1804 c29b735c Nathan Froyd
    /* Deprecated instruction sets                                           */
1805 c29b735c Nathan Froyd
    /*   Original POWER instruction set                                      */
1806 c29b735c Nathan Froyd
    PPC_POWER          = 0x0000000000000002ULL,
1807 c29b735c Nathan Froyd
    /*   POWER2 instruction set extension                                    */
1808 c29b735c Nathan Froyd
    PPC_POWER2         = 0x0000000000000004ULL,
1809 c29b735c Nathan Froyd
    /*   Power RTC support                                                   */
1810 c29b735c Nathan Froyd
    PPC_POWER_RTC      = 0x0000000000000008ULL,
1811 c29b735c Nathan Froyd
    /*   Power-to-PowerPC bridge (601)                                       */
1812 c29b735c Nathan Froyd
    PPC_POWER_BR       = 0x0000000000000010ULL,
1813 c29b735c Nathan Froyd
    /* 64 bits PowerPC instruction set                                       */
1814 c29b735c Nathan Froyd
    PPC_64B            = 0x0000000000000020ULL,
1815 c29b735c Nathan Froyd
    /*   New 64 bits extensions (PowerPC 2.0x)                               */
1816 c29b735c Nathan Froyd
    PPC_64BX           = 0x0000000000000040ULL,
1817 c29b735c Nathan Froyd
    /*   64 bits hypervisor extensions                                       */
1818 c29b735c Nathan Froyd
    PPC_64H            = 0x0000000000000080ULL,
1819 c29b735c Nathan Froyd
    /*   New wait instruction (PowerPC 2.0x)                                 */
1820 c29b735c Nathan Froyd
    PPC_WAIT           = 0x0000000000000100ULL,
1821 c29b735c Nathan Froyd
    /*   Time base mftb instruction                                          */
1822 c29b735c Nathan Froyd
    PPC_MFTB           = 0x0000000000000200ULL,
1823 c29b735c Nathan Froyd
1824 c29b735c Nathan Froyd
    /* Fixed-point unit extensions                                           */
1825 c29b735c Nathan Froyd
    /*   PowerPC 602 specific                                                */
1826 c29b735c Nathan Froyd
    PPC_602_SPEC       = 0x0000000000000400ULL,
1827 c29b735c Nathan Froyd
    /*   isel instruction                                                    */
1828 c29b735c Nathan Froyd
    PPC_ISEL           = 0x0000000000000800ULL,
1829 c29b735c Nathan Froyd
    /*   popcntb instruction                                                 */
1830 c29b735c Nathan Froyd
    PPC_POPCNTB        = 0x0000000000001000ULL,
1831 c29b735c Nathan Froyd
    /*   string load / store                                                 */
1832 c29b735c Nathan Froyd
    PPC_STRING         = 0x0000000000002000ULL,
1833 c29b735c Nathan Froyd
1834 c29b735c Nathan Froyd
    /* Floating-point unit extensions                                        */
1835 c29b735c Nathan Froyd
    /*   Optional floating point instructions                                */
1836 c29b735c Nathan Froyd
    PPC_FLOAT          = 0x0000000000010000ULL,
1837 c29b735c Nathan Froyd
    /* New floating-point extensions (PowerPC 2.0x)                          */
1838 c29b735c Nathan Froyd
    PPC_FLOAT_EXT      = 0x0000000000020000ULL,
1839 c29b735c Nathan Froyd
    PPC_FLOAT_FSQRT    = 0x0000000000040000ULL,
1840 c29b735c Nathan Froyd
    PPC_FLOAT_FRES     = 0x0000000000080000ULL,
1841 c29b735c Nathan Froyd
    PPC_FLOAT_FRSQRTE  = 0x0000000000100000ULL,
1842 c29b735c Nathan Froyd
    PPC_FLOAT_FRSQRTES = 0x0000000000200000ULL,
1843 c29b735c Nathan Froyd
    PPC_FLOAT_FSEL     = 0x0000000000400000ULL,
1844 c29b735c Nathan Froyd
    PPC_FLOAT_STFIWX   = 0x0000000000800000ULL,
1845 c29b735c Nathan Froyd
1846 c29b735c Nathan Froyd
    /* Vector/SIMD extensions                                                */
1847 c29b735c Nathan Froyd
    /*   Altivec support                                                     */
1848 c29b735c Nathan Froyd
    PPC_ALTIVEC        = 0x0000000001000000ULL,
1849 c29b735c Nathan Froyd
    /*   PowerPC 2.03 SPE extension                                          */
1850 c29b735c Nathan Froyd
    PPC_SPE            = 0x0000000002000000ULL,
1851 c29b735c Nathan Froyd
    /*   PowerPC 2.03 SPE single-precision floating-point extension          */
1852 c29b735c Nathan Froyd
    PPC_SPE_SINGLE     = 0x0000000004000000ULL,
1853 c29b735c Nathan Froyd
    /*   PowerPC 2.03 SPE double-precision floating-point extension          */
1854 c29b735c Nathan Froyd
    PPC_SPE_DOUBLE     = 0x0000000008000000ULL,
1855 c29b735c Nathan Froyd
1856 c29b735c Nathan Froyd
    /* Optional memory control instructions                                  */
1857 c29b735c Nathan Froyd
    PPC_MEM_TLBIA      = 0x0000000010000000ULL,
1858 c29b735c Nathan Froyd
    PPC_MEM_TLBIE      = 0x0000000020000000ULL,
1859 c29b735c Nathan Froyd
    PPC_MEM_TLBSYNC    = 0x0000000040000000ULL,
1860 c29b735c Nathan Froyd
    /*   sync instruction                                                    */
1861 c29b735c Nathan Froyd
    PPC_MEM_SYNC       = 0x0000000080000000ULL,
1862 c29b735c Nathan Froyd
    /*   eieio instruction                                                   */
1863 c29b735c Nathan Froyd
    PPC_MEM_EIEIO      = 0x0000000100000000ULL,
1864 c29b735c Nathan Froyd
1865 c29b735c Nathan Froyd
    /* Cache control instructions                                            */
1866 c29b735c Nathan Froyd
    PPC_CACHE          = 0x0000000200000000ULL,
1867 c29b735c Nathan Froyd
    /*   icbi instruction                                                    */
1868 c29b735c Nathan Froyd
    PPC_CACHE_ICBI     = 0x0000000400000000ULL,
1869 c29b735c Nathan Froyd
    /*   dcbz instruction with fixed cache line size                         */
1870 c29b735c Nathan Froyd
    PPC_CACHE_DCBZ     = 0x0000000800000000ULL,
1871 c29b735c Nathan Froyd
    /*   dcbz instruction with tunable cache line size                       */
1872 c29b735c Nathan Froyd
    PPC_CACHE_DCBZT    = 0x0000001000000000ULL,
1873 c29b735c Nathan Froyd
    /*   dcba instruction                                                    */
1874 c29b735c Nathan Froyd
    PPC_CACHE_DCBA     = 0x0000002000000000ULL,
1875 c29b735c Nathan Froyd
    /*   Freescale cache locking instructions                                */
1876 c29b735c Nathan Froyd
    PPC_CACHE_LOCK     = 0x0000004000000000ULL,
1877 c29b735c Nathan Froyd
1878 c29b735c Nathan Froyd
    /* MMU related extensions                                                */
1879 c29b735c Nathan Froyd
    /*   external control instructions                                       */
1880 c29b735c Nathan Froyd
    PPC_EXTERN         = 0x0000010000000000ULL,
1881 c29b735c Nathan Froyd
    /*   segment register access instructions                                */
1882 c29b735c Nathan Froyd
    PPC_SEGMENT        = 0x0000020000000000ULL,
1883 c29b735c Nathan Froyd
    /*   PowerPC 6xx TLB management instructions                             */
1884 c29b735c Nathan Froyd
    PPC_6xx_TLB        = 0x0000040000000000ULL,
1885 c29b735c Nathan Froyd
    /* PowerPC 74xx TLB management instructions                              */
1886 c29b735c Nathan Froyd
    PPC_74xx_TLB       = 0x0000080000000000ULL,
1887 c29b735c Nathan Froyd
    /*   PowerPC 40x TLB management instructions                             */
1888 c29b735c Nathan Froyd
    PPC_40x_TLB        = 0x0000100000000000ULL,
1889 c29b735c Nathan Froyd
    /*   segment register access instructions for PowerPC 64 "bridge"        */
1890 c29b735c Nathan Froyd
    PPC_SEGMENT_64B    = 0x0000200000000000ULL,
1891 c29b735c Nathan Froyd
    /*   SLB management                                                      */
1892 c29b735c Nathan Froyd
    PPC_SLBI           = 0x0000400000000000ULL,
1893 c29b735c Nathan Froyd
1894 c29b735c Nathan Froyd
    /* Embedded PowerPC dedicated instructions                               */
1895 c29b735c Nathan Froyd
    PPC_WRTEE          = 0x0001000000000000ULL,
1896 c29b735c Nathan Froyd
    /* PowerPC 40x exception model                                           */
1897 c29b735c Nathan Froyd
    PPC_40x_EXCP       = 0x0002000000000000ULL,
1898 c29b735c Nathan Froyd
    /* PowerPC 405 Mac instructions                                          */
1899 c29b735c Nathan Froyd
    PPC_405_MAC        = 0x0004000000000000ULL,
1900 c29b735c Nathan Froyd
    /* PowerPC 440 specific instructions                                     */
1901 c29b735c Nathan Froyd
    PPC_440_SPEC       = 0x0008000000000000ULL,
1902 c29b735c Nathan Froyd
    /* BookE (embedded) PowerPC specification                                */
1903 c29b735c Nathan Froyd
    PPC_BOOKE          = 0x0010000000000000ULL,
1904 c29b735c Nathan Froyd
    /* mfapidi instruction                                                   */
1905 c29b735c Nathan Froyd
    PPC_MFAPIDI        = 0x0020000000000000ULL,
1906 c29b735c Nathan Froyd
    /* tlbiva instruction                                                    */
1907 c29b735c Nathan Froyd
    PPC_TLBIVA         = 0x0040000000000000ULL,
1908 c29b735c Nathan Froyd
    /* tlbivax instruction                                                   */
1909 c29b735c Nathan Froyd
    PPC_TLBIVAX        = 0x0080000000000000ULL,
1910 c29b735c Nathan Froyd
    /* PowerPC 4xx dedicated instructions                                    */
1911 c29b735c Nathan Froyd
    PPC_4xx_COMMON     = 0x0100000000000000ULL,
1912 c29b735c Nathan Froyd
    /* PowerPC 40x ibct instructions                                         */
1913 c29b735c Nathan Froyd
    PPC_40x_ICBT       = 0x0200000000000000ULL,
1914 c29b735c Nathan Froyd
    /* rfmci is not implemented in all BookE PowerPC                         */
1915 c29b735c Nathan Froyd
    PPC_RFMCI          = 0x0400000000000000ULL,
1916 c29b735c Nathan Froyd
    /* rfdi instruction                                                      */
1917 c29b735c Nathan Froyd
    PPC_RFDI           = 0x0800000000000000ULL,
1918 c29b735c Nathan Froyd
    /* DCR accesses                                                          */
1919 c29b735c Nathan Froyd
    PPC_DCR            = 0x1000000000000000ULL,
1920 c29b735c Nathan Froyd
    /* DCR extended accesse                                                  */
1921 c29b735c Nathan Froyd
    PPC_DCRX           = 0x2000000000000000ULL,
1922 c29b735c Nathan Froyd
    /* user-mode DCR access, implemented in PowerPC 460                      */
1923 c29b735c Nathan Froyd
    PPC_DCRUX          = 0x4000000000000000ULL,
1924 eaabeef2 David Gibson
    /* popcntw and popcntd instructions                                      */
1925 eaabeef2 David Gibson
    PPC_POPCNTWD       = 0x8000000000000000ULL,
1926 01662f3e Alexander Graf
1927 02d4eae4 David Gibson
#define PPC_TCG_INSNS  (PPC_INSNS_BASE | PPC_POWER | PPC_POWER2 \
1928 02d4eae4 David Gibson
                        | PPC_POWER_RTC | PPC_POWER_BR | PPC_64B \
1929 02d4eae4 David Gibson
                        | PPC_64BX | PPC_64H | PPC_WAIT | PPC_MFTB \
1930 02d4eae4 David Gibson
                        | PPC_602_SPEC | PPC_ISEL | PPC_POPCNTB \
1931 02d4eae4 David Gibson
                        | PPC_STRING | PPC_FLOAT | PPC_FLOAT_EXT \
1932 02d4eae4 David Gibson
                        | PPC_FLOAT_FSQRT | PPC_FLOAT_FRES \
1933 02d4eae4 David Gibson
                        | PPC_FLOAT_FRSQRTE | PPC_FLOAT_FRSQRTES \
1934 02d4eae4 David Gibson
                        | PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX \
1935 02d4eae4 David Gibson
                        | PPC_ALTIVEC | PPC_SPE | PPC_SPE_SINGLE \
1936 02d4eae4 David Gibson
                        | PPC_SPE_DOUBLE | PPC_MEM_TLBIA \
1937 02d4eae4 David Gibson
                        | PPC_MEM_TLBIE | PPC_MEM_TLBSYNC \
1938 02d4eae4 David Gibson
                        | PPC_MEM_SYNC | PPC_MEM_EIEIO \
1939 02d4eae4 David Gibson
                        | PPC_CACHE | PPC_CACHE_ICBI \
1940 02d4eae4 David Gibson
                        | PPC_CACHE_DCBZ | PPC_CACHE_DCBZT \
1941 02d4eae4 David Gibson
                        | PPC_CACHE_DCBA | PPC_CACHE_LOCK \
1942 02d4eae4 David Gibson
                        | PPC_EXTERN | PPC_SEGMENT | PPC_6xx_TLB \
1943 02d4eae4 David Gibson
                        | PPC_74xx_TLB | PPC_40x_TLB | PPC_SEGMENT_64B \
1944 02d4eae4 David Gibson
                        | PPC_SLBI | PPC_WRTEE | PPC_40x_EXCP \
1945 02d4eae4 David Gibson
                        | PPC_405_MAC | PPC_440_SPEC | PPC_BOOKE \
1946 02d4eae4 David Gibson
                        | PPC_MFAPIDI | PPC_TLBIVA | PPC_TLBIVAX \
1947 02d4eae4 David Gibson
                        | PPC_4xx_COMMON | PPC_40x_ICBT | PPC_RFMCI \
1948 02d4eae4 David Gibson
                        | PPC_RFDI | PPC_DCR | PPC_DCRX | PPC_DCRUX \
1949 02d4eae4 David Gibson
                        | PPC_POPCNTWD)
1950 02d4eae4 David Gibson
1951 01662f3e Alexander Graf
    /* extended type values */
1952 01662f3e Alexander Graf
1953 01662f3e Alexander Graf
    /* BookE 2.06 PowerPC specification                                      */
1954 01662f3e Alexander Graf
    PPC2_BOOKE206      = 0x0000000000000001ULL,
1955 a7342588 David Gibson
    /* VSX (extensions to Altivec / VMX)                                     */
1956 a7342588 David Gibson
    PPC2_VSX           = 0x0000000000000002ULL,
1957 a7342588 David Gibson
    /* Decimal Floating Point (DFP)                                          */
1958 a7342588 David Gibson
    PPC2_DFP           = 0x0000000000000004ULL,
1959 3f9f6a50 Alexander Graf
    /* Embedded.Processor Control                                            */
1960 3f9f6a50 Alexander Graf
    PPC2_PRCNTL        = 0x0000000000000008ULL,
1961 cd6e9320 Thomas Huth
    /* Byte-reversed, indexed, double-word load and store                    */
1962 cd6e9320 Thomas Huth
    PPC2_DBRX          = 0x0000000000000010ULL,
1963 02d4eae4 David Gibson
1964 cd6e9320 Thomas Huth
#define PPC_TCG_INSNS2 (PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_DBRX)
1965 c29b735c Nathan Froyd
};
1966 c29b735c Nathan Froyd
1967 c29b735c Nathan Froyd
/*****************************************************************************/
1968 9a64fbe4 bellard
/* Memory access type :
1969 9a64fbe4 bellard
 * may be needed for precise access rights control and precise exceptions.
1970 9a64fbe4 bellard
 */
1971 79aceca5 bellard
enum {
1972 9a64fbe4 bellard
    /* 1 bit to define user level / supervisor access */
1973 9a64fbe4 bellard
    ACCESS_USER  = 0x00,
1974 9a64fbe4 bellard
    ACCESS_SUPER = 0x01,
1975 9a64fbe4 bellard
    /* Type of instruction that generated the access */
1976 9a64fbe4 bellard
    ACCESS_CODE  = 0x10, /* Code fetch access                */
1977 9a64fbe4 bellard
    ACCESS_INT   = 0x20, /* Integer load/store access        */
1978 9a64fbe4 bellard
    ACCESS_FLOAT = 0x30, /* floating point load/store access */
1979 9a64fbe4 bellard
    ACCESS_RES   = 0x40, /* load/store with reservation      */
1980 9a64fbe4 bellard
    ACCESS_EXT   = 0x50, /* external access                  */
1981 9a64fbe4 bellard
    ACCESS_CACHE = 0x60, /* Cache manipulation               */
1982 9a64fbe4 bellard
};
1983 9a64fbe4 bellard
1984 47103572 j_mayer
/* Hardware interruption sources:
1985 47103572 j_mayer
 * all those exception can be raised simulteaneously
1986 47103572 j_mayer
 */
1987 e9df014c j_mayer
/* Input pins definitions */
1988 e9df014c j_mayer
enum {
1989 e9df014c j_mayer
    /* 6xx bus input pins */
1990 24be5ae3 j_mayer
    PPC6xx_INPUT_HRESET     = 0,
1991 24be5ae3 j_mayer
    PPC6xx_INPUT_SRESET     = 1,
1992 24be5ae3 j_mayer
    PPC6xx_INPUT_CKSTP_IN   = 2,
1993 24be5ae3 j_mayer
    PPC6xx_INPUT_MCP        = 3,
1994 24be5ae3 j_mayer
    PPC6xx_INPUT_SMI        = 4,
1995 24be5ae3 j_mayer
    PPC6xx_INPUT_INT        = 5,
1996 d68f1306 j_mayer
    PPC6xx_INPUT_TBEN       = 6,
1997 d68f1306 j_mayer
    PPC6xx_INPUT_WAKEUP     = 7,
1998 d68f1306 j_mayer
    PPC6xx_INPUT_NB,
1999 24be5ae3 j_mayer
};
2000 24be5ae3 j_mayer
2001 24be5ae3 j_mayer
enum {
2002 e9df014c j_mayer
    /* Embedded PowerPC input pins */
2003 24be5ae3 j_mayer
    PPCBookE_INPUT_HRESET     = 0,
2004 24be5ae3 j_mayer
    PPCBookE_INPUT_SRESET     = 1,
2005 24be5ae3 j_mayer
    PPCBookE_INPUT_CKSTP_IN   = 2,
2006 24be5ae3 j_mayer
    PPCBookE_INPUT_MCP        = 3,
2007 24be5ae3 j_mayer
    PPCBookE_INPUT_SMI        = 4,
2008 24be5ae3 j_mayer
    PPCBookE_INPUT_INT        = 5,
2009 24be5ae3 j_mayer
    PPCBookE_INPUT_CINT       = 6,
2010 d68f1306 j_mayer
    PPCBookE_INPUT_NB,
2011 24be5ae3 j_mayer
};
2012 24be5ae3 j_mayer
2013 24be5ae3 j_mayer
enum {
2014 9fdc60bf aurel32
    /* PowerPC E500 input pins */
2015 9fdc60bf aurel32
    PPCE500_INPUT_RESET_CORE = 0,
2016 9fdc60bf aurel32
    PPCE500_INPUT_MCK        = 1,
2017 9fdc60bf aurel32
    PPCE500_INPUT_CINT       = 3,
2018 9fdc60bf aurel32
    PPCE500_INPUT_INT        = 4,
2019 9fdc60bf aurel32
    PPCE500_INPUT_DEBUG      = 6,
2020 9fdc60bf aurel32
    PPCE500_INPUT_NB,
2021 9fdc60bf aurel32
};
2022 9fdc60bf aurel32
2023 9fdc60bf aurel32
enum {
2024 4e290a0b j_mayer
    /* PowerPC 40x input pins */
2025 4e290a0b j_mayer
    PPC40x_INPUT_RESET_CORE = 0,
2026 4e290a0b j_mayer
    PPC40x_INPUT_RESET_CHIP = 1,
2027 4e290a0b j_mayer
    PPC40x_INPUT_RESET_SYS  = 2,
2028 4e290a0b j_mayer
    PPC40x_INPUT_CINT       = 3,
2029 4e290a0b j_mayer
    PPC40x_INPUT_INT        = 4,
2030 4e290a0b j_mayer
    PPC40x_INPUT_HALT       = 5,
2031 4e290a0b j_mayer
    PPC40x_INPUT_DEBUG      = 6,
2032 4e290a0b j_mayer
    PPC40x_INPUT_NB,
2033 e9df014c j_mayer
};
2034 e9df014c j_mayer
2035 b4095fed j_mayer
enum {
2036 b4095fed j_mayer
    /* RCPU input pins */
2037 b4095fed j_mayer
    PPCRCPU_INPUT_PORESET   = 0,
2038 b4095fed j_mayer
    PPCRCPU_INPUT_HRESET    = 1,
2039 b4095fed j_mayer
    PPCRCPU_INPUT_SRESET    = 2,
2040 b4095fed j_mayer
    PPCRCPU_INPUT_IRQ0      = 3,
2041 b4095fed j_mayer
    PPCRCPU_INPUT_IRQ1      = 4,
2042 b4095fed j_mayer
    PPCRCPU_INPUT_IRQ2      = 5,
2043 b4095fed j_mayer
    PPCRCPU_INPUT_IRQ3      = 6,
2044 b4095fed j_mayer
    PPCRCPU_INPUT_IRQ4      = 7,
2045 b4095fed j_mayer
    PPCRCPU_INPUT_IRQ5      = 8,
2046 b4095fed j_mayer
    PPCRCPU_INPUT_IRQ6      = 9,
2047 b4095fed j_mayer
    PPCRCPU_INPUT_IRQ7      = 10,
2048 b4095fed j_mayer
    PPCRCPU_INPUT_NB,
2049 b4095fed j_mayer
};
2050 b4095fed j_mayer
2051 00af685f j_mayer
#if defined(TARGET_PPC64)
2052 d0dfae6e j_mayer
enum {
2053 d0dfae6e j_mayer
    /* PowerPC 970 input pins */
2054 d0dfae6e j_mayer
    PPC970_INPUT_HRESET     = 0,
2055 d0dfae6e j_mayer
    PPC970_INPUT_SRESET     = 1,
2056 d0dfae6e j_mayer
    PPC970_INPUT_CKSTP      = 2,
2057 d0dfae6e j_mayer
    PPC970_INPUT_TBEN       = 3,
2058 d0dfae6e j_mayer
    PPC970_INPUT_MCP        = 4,
2059 d0dfae6e j_mayer
    PPC970_INPUT_INT        = 5,
2060 d0dfae6e j_mayer
    PPC970_INPUT_THINT      = 6,
2061 7b62a955 j_mayer
    PPC970_INPUT_NB,
2062 9d52e907 David Gibson
};
2063 9d52e907 David Gibson
2064 9d52e907 David Gibson
enum {
2065 9d52e907 David Gibson
    /* POWER7 input pins */
2066 9d52e907 David Gibson
    POWER7_INPUT_INT        = 0,
2067 9d52e907 David Gibson
    /* POWER7 probably has other inputs, but we don't care about them
2068 9d52e907 David Gibson
     * for any existing machine.  We can wire these up when we need
2069 9d52e907 David Gibson
     * them */
2070 9d52e907 David Gibson
    POWER7_INPUT_NB,
2071 d0dfae6e j_mayer
};
2072 00af685f j_mayer
#endif
2073 d0dfae6e j_mayer
2074 e9df014c j_mayer
/* Hardware exceptions definitions */
2075 47103572 j_mayer
enum {
2076 e9df014c j_mayer
    /* External hardware exception sources */
2077 e1833e1f j_mayer
    PPC_INTERRUPT_RESET     = 0,  /* Reset exception                      */
2078 d68f1306 j_mayer
    PPC_INTERRUPT_WAKEUP,         /* Wakeup exception                     */
2079 d68f1306 j_mayer
    PPC_INTERRUPT_MCK,            /* Machine check exception              */
2080 d68f1306 j_mayer
    PPC_INTERRUPT_EXT,            /* External interrupt                   */
2081 d68f1306 j_mayer
    PPC_INTERRUPT_SMI,            /* System management interrupt          */
2082 d68f1306 j_mayer
    PPC_INTERRUPT_CEXT,           /* Critical external interrupt          */
2083 d68f1306 j_mayer
    PPC_INTERRUPT_DEBUG,          /* External debug exception             */
2084 d68f1306 j_mayer
    PPC_INTERRUPT_THERM,          /* Thermal exception                    */
2085 e9df014c j_mayer
    /* Internal hardware exception sources */
2086 d68f1306 j_mayer
    PPC_INTERRUPT_DECR,           /* Decrementer exception                */
2087 d68f1306 j_mayer
    PPC_INTERRUPT_HDECR,          /* Hypervisor decrementer exception     */
2088 d68f1306 j_mayer
    PPC_INTERRUPT_PIT,            /* Programmable inteval timer interrupt */
2089 d68f1306 j_mayer
    PPC_INTERRUPT_FIT,            /* Fixed interval timer interrupt       */
2090 d68f1306 j_mayer
    PPC_INTERRUPT_WDT,            /* Watchdog timer interrupt             */
2091 d68f1306 j_mayer
    PPC_INTERRUPT_CDOORBELL,      /* Critical doorbell interrupt          */
2092 d68f1306 j_mayer
    PPC_INTERRUPT_DOORBELL,       /* Doorbell interrupt                   */
2093 d68f1306 j_mayer
    PPC_INTERRUPT_PERFM,          /* Performance monitor interrupt        */
2094 47103572 j_mayer
};
2095 47103572 j_mayer
2096 fc0b2c0f Alexander Graf
/* CPU should be reset next, restart from scratch afterwards */
2097 fc0b2c0f Alexander Graf
#define CPU_INTERRUPT_RESET       CPU_INTERRUPT_TGT_INT_0
2098 fc0b2c0f Alexander Graf
2099 9a64fbe4 bellard
/*****************************************************************************/
2100 9a64fbe4 bellard
2101 1328c2bf Andreas Färber
static inline void cpu_get_tb_cpu_state(CPUPPCState *env, target_ulong *pc,
2102 6b917547 aliguori
                                        target_ulong *cs_base, int *flags)
2103 6b917547 aliguori
{
2104 6b917547 aliguori
    *pc = env->nip;
2105 6b917547 aliguori
    *cs_base = 0;
2106 6b917547 aliguori
    *flags = env->hflags;
2107 6b917547 aliguori
}
2108 6b917547 aliguori
2109 1328c2bf Andreas Färber
static inline void cpu_set_tls(CPUPPCState *env, target_ulong newtls)
2110 174c80d5 Nathan Froyd
{
2111 174c80d5 Nathan Froyd
#if defined(TARGET_PPC64)
2112 174c80d5 Nathan Froyd
    /* The kernel checks TIF_32BIT here; we don't support loading 32-bit
2113 174c80d5 Nathan Froyd
       binaries on PPC64 yet. */
2114 174c80d5 Nathan Froyd
    env->gpr[13] = newtls;
2115 174c80d5 Nathan Froyd
#else
2116 174c80d5 Nathan Froyd
    env->gpr[2] = newtls;
2117 174c80d5 Nathan Froyd
#endif
2118 174c80d5 Nathan Froyd
}
2119 174c80d5 Nathan Froyd
2120 01662f3e Alexander Graf
#if !defined(CONFIG_USER_ONLY)
2121 1328c2bf Andreas Färber
static inline int booke206_tlbm_id(CPUPPCState *env, ppcmas_tlb_t *tlbm)
2122 01662f3e Alexander Graf
{
2123 d1e256fe Alexander Graf
    uintptr_t tlbml = (uintptr_t)tlbm;
2124 1c53accc Alexander Graf
    uintptr_t tlbl = (uintptr_t)env->tlb.tlbm;
2125 01662f3e Alexander Graf
2126 1c53accc Alexander Graf
    return (tlbml - tlbl) / sizeof(env->tlb.tlbm[0]);
2127 01662f3e Alexander Graf
}
2128 01662f3e Alexander Graf
2129 1328c2bf Andreas Färber
static inline int booke206_tlb_size(CPUPPCState *env, int tlbn)
2130 01662f3e Alexander Graf
{
2131 01662f3e Alexander Graf
    uint32_t tlbncfg = env->spr[SPR_BOOKE_TLB0CFG + tlbn];
2132 01662f3e Alexander Graf
    int r = tlbncfg & TLBnCFG_N_ENTRY;
2133 01662f3e Alexander Graf
    return r;
2134 01662f3e Alexander Graf
}
2135 01662f3e Alexander Graf
2136 1328c2bf Andreas Färber
static inline int booke206_tlb_ways(CPUPPCState *env, int tlbn)
2137 01662f3e Alexander Graf
{
2138 01662f3e Alexander Graf
    uint32_t tlbncfg = env->spr[SPR_BOOKE_TLB0CFG + tlbn];
2139 01662f3e Alexander Graf
    int r = tlbncfg >> TLBnCFG_ASSOC_SHIFT;
2140 01662f3e Alexander Graf
    return r;
2141 01662f3e Alexander Graf
}
2142 01662f3e Alexander Graf
2143 1328c2bf Andreas Färber
static inline int booke206_tlbm_to_tlbn(CPUPPCState *env, ppcmas_tlb_t *tlbm)
2144 01662f3e Alexander Graf
{
2145 d1e256fe Alexander Graf
    int id = booke206_tlbm_id(env, tlbm);
2146 01662f3e Alexander Graf
    int end = 0;
2147 01662f3e Alexander Graf
    int i;
2148 01662f3e Alexander Graf
2149 01662f3e Alexander Graf
    for (i = 0; i < BOOKE206_MAX_TLBN; i++) {
2150 01662f3e Alexander Graf
        end += booke206_tlb_size(env, i);
2151 01662f3e Alexander Graf
        if (id < end) {
2152 01662f3e Alexander Graf
            return i;
2153 01662f3e Alexander Graf
        }
2154 01662f3e Alexander Graf
    }
2155 01662f3e Alexander Graf
2156 01662f3e Alexander Graf
    cpu_abort(env, "Unknown TLBe: %d\n", id);
2157 01662f3e Alexander Graf
    return 0;
2158 01662f3e Alexander Graf
}
2159 01662f3e Alexander Graf
2160 1328c2bf Andreas Färber
static inline int booke206_tlbm_to_way(CPUPPCState *env, ppcmas_tlb_t *tlb)
2161 01662f3e Alexander Graf
{
2162 d1e256fe Alexander Graf
    int tlbn = booke206_tlbm_to_tlbn(env, tlb);
2163 d1e256fe Alexander Graf
    int tlbid = booke206_tlbm_id(env, tlb);
2164 01662f3e Alexander Graf
    return tlbid & (booke206_tlb_ways(env, tlbn) - 1);
2165 01662f3e Alexander Graf
}
2166 01662f3e Alexander Graf
2167 1328c2bf Andreas Färber
static inline ppcmas_tlb_t *booke206_get_tlbm(CPUPPCState *env, const int tlbn,
2168 01662f3e Alexander Graf
                                              target_ulong ea, int way)
2169 01662f3e Alexander Graf
{
2170 01662f3e Alexander Graf
    int r;
2171 01662f3e Alexander Graf
    uint32_t ways = booke206_tlb_ways(env, tlbn);
2172 01662f3e Alexander Graf
    int ways_bits = ffs(ways) - 1;
2173 01662f3e Alexander Graf
    int tlb_bits = ffs(booke206_tlb_size(env, tlbn)) - 1;
2174 01662f3e Alexander Graf
    int i;
2175 01662f3e Alexander Graf
2176 01662f3e Alexander Graf
    way &= ways - 1;
2177 01662f3e Alexander Graf
    ea >>= MAS2_EPN_SHIFT;
2178 01662f3e Alexander Graf
    ea &= (1 << (tlb_bits - ways_bits)) - 1;
2179 01662f3e Alexander Graf
    r = (ea << ways_bits) | way;
2180 01662f3e Alexander Graf
2181 3f162d11 Alexander Graf
    if (r >= booke206_tlb_size(env, tlbn)) {
2182 3f162d11 Alexander Graf
        return NULL;
2183 3f162d11 Alexander Graf
    }
2184 3f162d11 Alexander Graf
2185 01662f3e Alexander Graf
    /* bump up to tlbn index */
2186 01662f3e Alexander Graf
    for (i = 0; i < tlbn; i++) {
2187 01662f3e Alexander Graf
        r += booke206_tlb_size(env, i);
2188 01662f3e Alexander Graf
    }
2189 01662f3e Alexander Graf
2190 1c53accc Alexander Graf
    return &env->tlb.tlbm[r];
2191 01662f3e Alexander Graf
}
2192 01662f3e Alexander Graf
2193 a1ef618a Alexander Graf
/* returns bitmap of supported page sizes for a given TLB */
2194 1328c2bf Andreas Färber
static inline uint32_t booke206_tlbnps(CPUPPCState *env, const int tlbn)
2195 a1ef618a Alexander Graf
{
2196 a1ef618a Alexander Graf
    bool mav2 = false;
2197 a1ef618a Alexander Graf
    uint32_t ret = 0;
2198 a1ef618a Alexander Graf
2199 a1ef618a Alexander Graf
    if (mav2) {
2200 a1ef618a Alexander Graf
        ret = env->spr[SPR_BOOKE_TLB0PS + tlbn];
2201 a1ef618a Alexander Graf
    } else {
2202 a1ef618a Alexander Graf
        uint32_t tlbncfg = env->spr[SPR_BOOKE_TLB0CFG + tlbn];
2203 a1ef618a Alexander Graf
        uint32_t min = (tlbncfg & TLBnCFG_MINSIZE) >> TLBnCFG_MINSIZE_SHIFT;
2204 a1ef618a Alexander Graf
        uint32_t max = (tlbncfg & TLBnCFG_MAXSIZE) >> TLBnCFG_MAXSIZE_SHIFT;
2205 a1ef618a Alexander Graf
        int i;
2206 a1ef618a Alexander Graf
        for (i = min; i <= max; i++) {
2207 a1ef618a Alexander Graf
            ret |= (1 << (i << 1));
2208 a1ef618a Alexander Graf
        }
2209 a1ef618a Alexander Graf
    }
2210 a1ef618a Alexander Graf
2211 a1ef618a Alexander Graf
    return ret;
2212 a1ef618a Alexander Graf
}
2213 a1ef618a Alexander Graf
2214 01662f3e Alexander Graf
#endif
2215 01662f3e Alexander Graf
2216 e42a61f1 Alexander Graf
static inline bool msr_is_64bit(CPUPPCState *env, target_ulong msr)
2217 e42a61f1 Alexander Graf
{
2218 e42a61f1 Alexander Graf
    if (env->mmu_model == POWERPC_MMU_BOOKE206) {
2219 e42a61f1 Alexander Graf
        return msr & (1ULL << MSR_CM);
2220 e42a61f1 Alexander Graf
    }
2221 e42a61f1 Alexander Graf
2222 e42a61f1 Alexander Graf
    return msr & (1ULL << MSR_SF);
2223 e42a61f1 Alexander Graf
}
2224 e42a61f1 Alexander Graf
2225 1328c2bf Andreas Färber
extern void (*cpu_ppc_hypercall)(CPUPPCState *);
2226 d569956e David Gibson
2227 1328c2bf Andreas Färber
static inline bool cpu_has_work(CPUPPCState *env)
2228 f081c76c Blue Swirl
{
2229 f081c76c Blue Swirl
    return msr_ee && (env->interrupt_request & CPU_INTERRUPT_HARD);
2230 f081c76c Blue Swirl
}
2231 f081c76c Blue Swirl
2232 f081c76c Blue Swirl
#include "exec-all.h"
2233 f081c76c Blue Swirl
2234 1328c2bf Andreas Färber
static inline void cpu_pc_from_tb(CPUPPCState *env, TranslationBlock *tb)
2235 f081c76c Blue Swirl
{
2236 f081c76c Blue Swirl
    env->nip = tb->pc;
2237 f081c76c Blue Swirl
}
2238 f081c76c Blue Swirl
2239 1328c2bf Andreas Färber
void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUPPCState *env);
2240 bebabbc7 Scott Wood
2241 79aceca5 bellard
#endif /* !defined (__CPU_PPC_H__) */