Statistics
| Branch: | Revision:

root / target-ppc / cpu.h @ c79c73f6

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