Statistics
| Branch: | Revision:

root / target-ppc / cpu.h @ 3c4c9f9f

History | View | Annotate | Download (54.5 kB)

1 79aceca5 bellard
/*
2 3fc6c082 bellard
 *  PowerPC emulation cpu definitions for qemu.
3 79aceca5 bellard
 * 
4 76a66253 j_mayer
 *  Copyright (c) 2003-2007 Jocelyn Mayer
5 79aceca5 bellard
 *
6 79aceca5 bellard
 * This library is free software; you can redistribute it and/or
7 79aceca5 bellard
 * modify it under the terms of the GNU Lesser General Public
8 79aceca5 bellard
 * License as published by the Free Software Foundation; either
9 79aceca5 bellard
 * version 2 of the License, or (at your option) any later version.
10 79aceca5 bellard
 *
11 79aceca5 bellard
 * This library is distributed in the hope that it will be useful,
12 79aceca5 bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 79aceca5 bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 79aceca5 bellard
 * Lesser General Public License for more details.
15 79aceca5 bellard
 *
16 79aceca5 bellard
 * You should have received a copy of the GNU Lesser General Public
17 79aceca5 bellard
 * License along with this library; if not, write to the Free Software
18 79aceca5 bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 79aceca5 bellard
 */
20 79aceca5 bellard
#if !defined (__CPU_PPC_H__)
21 79aceca5 bellard
#define __CPU_PPC_H__
22 79aceca5 bellard
23 3fc6c082 bellard
#include "config.h"
24 de270b3c j_mayer
#include <inttypes.h>
25 3fc6c082 bellard
26 35cdaad6 j_mayer
#if !defined(TARGET_PPCEMB)
27 51789c41 j_mayer
#if defined(TARGET_PPC64) || (HOST_LONG_BITS >= 64)
28 51789c41 j_mayer
/* When using 64 bits temporary registers,
29 51789c41 j_mayer
 * we can use 64 bits GPR with no extra cost
30 51789c41 j_mayer
 */
31 35cdaad6 j_mayer
#define TARGET_PPCEMB
32 35cdaad6 j_mayer
#endif
33 51789c41 j_mayer
#endif
34 51789c41 j_mayer
35 76a66253 j_mayer
#if defined (TARGET_PPC64)
36 76a66253 j_mayer
typedef uint64_t ppc_gpr_t;
37 76a66253 j_mayer
#define TARGET_LONG_BITS 64
38 0487d6a8 j_mayer
#define TARGET_GPR_BITS  64
39 76a66253 j_mayer
#define REGX "%016" PRIx64
40 35cdaad6 j_mayer
#define TARGET_PAGE_BITS 12
41 35cdaad6 j_mayer
#elif defined(TARGET_PPCEMB)
42 e96efcfc j_mayer
/* e500v2 have 36 bits physical address space */
43 e96efcfc j_mayer
#define TARGET_PHYS_ADDR_BITS 64
44 76a66253 j_mayer
/* GPR are 64 bits: used by vector extension */
45 76a66253 j_mayer
typedef uint64_t ppc_gpr_t;
46 3cf1e035 bellard
#define TARGET_LONG_BITS 32
47 0487d6a8 j_mayer
#define TARGET_GPR_BITS  64
48 1b9eb036 j_mayer
#define REGX "%016" PRIx64
49 35cdaad6 j_mayer
/* Pages can be 1 kB small */
50 35cdaad6 j_mayer
#define TARGET_PAGE_BITS 10
51 76a66253 j_mayer
#else
52 76a66253 j_mayer
typedef uint32_t ppc_gpr_t;
53 76a66253 j_mayer
#define TARGET_LONG_BITS 32
54 0487d6a8 j_mayer
#define TARGET_GPR_BITS  32
55 76a66253 j_mayer
#define REGX "%08" PRIx32
56 35cdaad6 j_mayer
#define TARGET_PAGE_BITS 12
57 76a66253 j_mayer
#endif
58 3cf1e035 bellard
59 79aceca5 bellard
#include "cpu-defs.h"
60 79aceca5 bellard
61 e96efcfc j_mayer
#define ADDRX TARGET_FMT_lx
62 e96efcfc j_mayer
#define PADDRX TARGET_FMT_plx
63 e96efcfc j_mayer
64 79aceca5 bellard
#include <setjmp.h>
65 79aceca5 bellard
66 4ecc3190 bellard
#include "softfloat.h"
67 4ecc3190 bellard
68 1fddef4b bellard
#define TARGET_HAS_ICE 1
69 1fddef4b bellard
70 76a66253 j_mayer
#if defined (TARGET_PPC64)
71 76a66253 j_mayer
#define ELF_MACHINE     EM_PPC64
72 76a66253 j_mayer
#else
73 76a66253 j_mayer
#define ELF_MACHINE     EM_PPC
74 76a66253 j_mayer
#endif
75 9042c0e2 ths
76 fdabc366 bellard
/* XXX: this should be tunable: PowerPC 601 & 64 bits PowerPC
77 fdabc366 bellard
 *                              have different cache line sizes
78 fdabc366 bellard
 */
79 fdabc366 bellard
#define ICACHE_LINE_SIZE 32
80 fdabc366 bellard
#define DCACHE_LINE_SIZE 32
81 fdabc366 bellard
82 fdabc366 bellard
/* XXX: put this in a common place */
83 fdabc366 bellard
#define likely(x)   __builtin_expect(!!(x), 1)
84 76a66253 j_mayer
#define unlikely(x) __builtin_expect(!!(x), 0)
85 fdabc366 bellard
86 3fc6c082 bellard
/*****************************************************************************/
87 3fc6c082 bellard
/* PVR definitions for most known PowerPC */
88 3fc6c082 bellard
enum {
89 3fc6c082 bellard
    /* PowerPC 401 cores */
90 3fc6c082 bellard
    CPU_PPC_401A1     = 0x00210000,
91 3fc6c082 bellard
    CPU_PPC_401B2     = 0x00220000,
92 3fc6c082 bellard
    CPU_PPC_401C2     = 0x00230000,
93 3fc6c082 bellard
    CPU_PPC_401D2     = 0x00240000,
94 3fc6c082 bellard
    CPU_PPC_401E2     = 0x00250000,
95 3fc6c082 bellard
    CPU_PPC_401F2     = 0x00260000,
96 3fc6c082 bellard
    CPU_PPC_401G2     = 0x00270000,
97 76a66253 j_mayer
#define CPU_PPC_401 CPU_PPC_401G2
98 76a66253 j_mayer
    CPU_PPC_IOP480    = 0x40100000, /* 401B2 ? */
99 76a66253 j_mayer
    CPU_PPC_COBRA     = 0x10100000, /* IBM Processor for Network Resources */
100 3fc6c082 bellard
    /* PowerPC 403 cores */
101 76a66253 j_mayer
    CPU_PPC_403GA     = 0x00200011,
102 3fc6c082 bellard
    CPU_PPC_403GB     = 0x00200100,
103 3fc6c082 bellard
    CPU_PPC_403GC     = 0x00200200,
104 3fc6c082 bellard
    CPU_PPC_403GCX    = 0x00201400,
105 76a66253 j_mayer
#define CPU_PPC_403 CPU_PPC_403GCX
106 3fc6c082 bellard
    /* PowerPC 405 cores */
107 76a66253 j_mayer
    CPU_PPC_405CR     = 0x40110145,
108 76a66253 j_mayer
#define CPU_PPC_405GP CPU_PPC_405CR
109 76a66253 j_mayer
    CPU_PPC_405EP     = 0x51210950,
110 76a66253 j_mayer
    CPU_PPC_405GPR    = 0x50910951,
111 3fc6c082 bellard
    CPU_PPC_405D2     = 0x20010000,
112 3fc6c082 bellard
    CPU_PPC_405D4     = 0x41810000,
113 76a66253 j_mayer
#define CPU_PPC_405 CPU_PPC_405D4
114 76a66253 j_mayer
    CPU_PPC_NPE405H   = 0x414100C0,
115 76a66253 j_mayer
    CPU_PPC_NPE405H2  = 0x41410140,
116 76a66253 j_mayer
    CPU_PPC_NPE405L   = 0x416100C0,
117 76a66253 j_mayer
    /* XXX: missing 405LP, LC77700 */
118 76a66253 j_mayer
    /* IBM STBxxx (PowerPC 401/403/405 core based microcontrollers) */
119 76a66253 j_mayer
#if 0
120 76a66253 j_mayer
    CPU_PPC_STB01000  = xxx,
121 76a66253 j_mayer
#endif
122 3fc6c082 bellard
#if 0
123 76a66253 j_mayer
    CPU_PPC_STB01010  = xxx,
124 76a66253 j_mayer
#endif
125 76a66253 j_mayer
#if 0
126 76a66253 j_mayer
    CPU_PPC_STB0210   = xxx,
127 3fc6c082 bellard
#endif
128 3fc6c082 bellard
    CPU_PPC_STB03     = 0x40310000,
129 3fc6c082 bellard
#if 0
130 76a66253 j_mayer
    CPU_PPC_STB043    = xxx,
131 3fc6c082 bellard
#endif
132 76a66253 j_mayer
#if 0
133 76a66253 j_mayer
    CPU_PPC_STB045    = xxx,
134 76a66253 j_mayer
#endif
135 76a66253 j_mayer
    CPU_PPC_STB25     = 0x51510950,
136 3fc6c082 bellard
#if 0
137 3fc6c082 bellard
    CPU_PPC_STB130    = xxx,
138 3fc6c082 bellard
#endif
139 76a66253 j_mayer
    /* Xilinx cores */
140 76a66253 j_mayer
    CPU_PPC_X2VP4     = 0x20010820,
141 76a66253 j_mayer
#define CPU_PPC_X2VP7 CPU_PPC_X2VP4
142 76a66253 j_mayer
    CPU_PPC_X2VP20    = 0x20010860,
143 76a66253 j_mayer
#define CPU_PPC_X2VP50 CPU_PPC_X2VP20
144 3fc6c082 bellard
    /* PowerPC 440 cores */
145 76a66253 j_mayer
    CPU_PPC_440EP     = 0x422218D3,
146 76a66253 j_mayer
#define CPU_PPC_440GR CPU_PPC_440EP
147 76a66253 j_mayer
    CPU_PPC_440GP     = 0x40120481,
148 76a66253 j_mayer
    CPU_PPC_440GX     = 0x51B21850,
149 76a66253 j_mayer
    CPU_PPC_440GXc    = 0x51B21892,
150 76a66253 j_mayer
    CPU_PPC_440GXf    = 0x51B21894,
151 76a66253 j_mayer
    CPU_PPC_440SP     = 0x53221850,
152 76a66253 j_mayer
    CPU_PPC_440SP2    = 0x53221891,
153 76a66253 j_mayer
    CPU_PPC_440SPE    = 0x53421890,
154 76a66253 j_mayer
    /* XXX: missing 440GRX */
155 76a66253 j_mayer
    /* PowerPC 460 cores - TODO */
156 76a66253 j_mayer
    /* PowerPC MPC 5xx cores */
157 76a66253 j_mayer
    CPU_PPC_5xx       = 0x00020020,
158 76a66253 j_mayer
    /* PowerPC MPC 8xx cores (aka PowerQUICC) */
159 3fc6c082 bellard
    CPU_PPC_8xx       = 0x00500000,
160 76a66253 j_mayer
    /* PowerPC MPC 8xxx cores (aka PowerQUICC-II) */
161 76a66253 j_mayer
    CPU_PPC_82xx_HIP3 = 0x00810101,
162 76a66253 j_mayer
    CPU_PPC_82xx_HIP4 = 0x80811014,
163 76a66253 j_mayer
    CPU_PPC_827x      = 0x80822013,
164 76a66253 j_mayer
    /* eCores */
165 76a66253 j_mayer
    CPU_PPC_e200      = 0x81120000,
166 76a66253 j_mayer
    CPU_PPC_e500v110  = 0x80200010,
167 76a66253 j_mayer
    CPU_PPC_e500v120  = 0x80200020,
168 76a66253 j_mayer
    CPU_PPC_e500v210  = 0x80210010,
169 76a66253 j_mayer
    CPU_PPC_e500v220  = 0x80210020,
170 76a66253 j_mayer
#define CPU_PPC_e500 CPU_PPC_e500v220
171 76a66253 j_mayer
    CPU_PPC_e600      = 0x80040010,
172 3fc6c082 bellard
    /* PowerPC 6xx cores */
173 76a66253 j_mayer
    CPU_PPC_601       = 0x00010001,
174 76a66253 j_mayer
    CPU_PPC_602       = 0x00050100,
175 76a66253 j_mayer
    CPU_PPC_603       = 0x00030100,
176 76a66253 j_mayer
    CPU_PPC_603E      = 0x00060101,
177 76a66253 j_mayer
    CPU_PPC_603P      = 0x00070000,
178 76a66253 j_mayer
    CPU_PPC_603E7v    = 0x00070100,
179 76a66253 j_mayer
    CPU_PPC_603E7v2   = 0x00070201,
180 76a66253 j_mayer
    CPU_PPC_603E7     = 0x00070200,
181 76a66253 j_mayer
    CPU_PPC_603R      = 0x00071201,
182 76a66253 j_mayer
    CPU_PPC_G2        = 0x00810011,
183 76a66253 j_mayer
    CPU_PPC_G2H4      = 0x80811010,
184 76a66253 j_mayer
    CPU_PPC_G2gp      = 0x80821010,
185 76a66253 j_mayer
    CPU_PPC_G2ls      = 0x90810010,
186 76a66253 j_mayer
    CPU_PPC_G2LE      = 0x80820010,
187 76a66253 j_mayer
    CPU_PPC_G2LEgp    = 0x80822010,
188 76a66253 j_mayer
    CPU_PPC_G2LEls    = 0xA0822010,
189 3fc6c082 bellard
    CPU_PPC_604       = 0x00040000,
190 76a66253 j_mayer
    CPU_PPC_604E      = 0x00090100, /* Also 2110 & 2120 */
191 76a66253 j_mayer
    CPU_PPC_604R      = 0x000a0101,
192 3fc6c082 bellard
    /* PowerPC 74x/75x cores (aka G3) */
193 3fc6c082 bellard
    CPU_PPC_74x       = 0x00080000,
194 76a66253 j_mayer
    CPU_PPC_740E      = 0x00080100,
195 76a66253 j_mayer
    CPU_PPC_750E      = 0x00080200,
196 76a66253 j_mayer
    CPU_PPC_755_10    = 0x00083100,
197 76a66253 j_mayer
    CPU_PPC_755_11    = 0x00083101,
198 76a66253 j_mayer
    CPU_PPC_755_20    = 0x00083200,
199 76a66253 j_mayer
    CPU_PPC_755D      = 0x00083202,
200 76a66253 j_mayer
    CPU_PPC_755E      = 0x00083203,
201 76a66253 j_mayer
#define CPU_PPC_755 CPU_PPC_755E
202 3fc6c082 bellard
    CPU_PPC_74xP      = 0x10080000,
203 76a66253 j_mayer
    CPU_PPC_750CXE21  = 0x00082201,
204 76a66253 j_mayer
    CPU_PPC_750CXE22  = 0x00082212,
205 76a66253 j_mayer
    CPU_PPC_750CXE23  = 0x00082203,
206 3fc6c082 bellard
    CPU_PPC_750CXE24  = 0x00082214,
207 3fc6c082 bellard
    CPU_PPC_750CXE24b = 0x00083214,
208 3fc6c082 bellard
    CPU_PPC_750CXE31  = 0x00083211,
209 3fc6c082 bellard
    CPU_PPC_750CXE31b = 0x00083311,
210 3fc6c082 bellard
#define CPU_PPC_750CXE CPU_PPC_750CXE31b
211 76a66253 j_mayer
    CPU_PPC_750CXR    = 0x00083410,
212 76a66253 j_mayer
    CPU_PPC_750FX10   = 0x70000100,
213 76a66253 j_mayer
    CPU_PPC_750FX20   = 0x70000200,
214 76a66253 j_mayer
    CPU_PPC_750FX21   = 0x70000201,
215 76a66253 j_mayer
    CPU_PPC_750FX22   = 0x70000202,
216 76a66253 j_mayer
    CPU_PPC_750FX23   = 0x70000203,
217 76a66253 j_mayer
#define CPU_PPC_750FX CPU_PPC_750FX23
218 76a66253 j_mayer
    CPU_PPC_750FL     = 0x700A0203,
219 76a66253 j_mayer
    CPU_PPC_750GX10   = 0x70020100,
220 76a66253 j_mayer
    CPU_PPC_750GX11   = 0x70020101,
221 76a66253 j_mayer
    CPU_PPC_750GX12   = 0x70020102,
222 76a66253 j_mayer
#define CPU_PPC_750GX CPU_PPC_750GX12
223 76a66253 j_mayer
    CPU_PPC_750GL     = 0x70020102,
224 76a66253 j_mayer
    CPU_PPC_750L30    = 0x00088300,
225 76a66253 j_mayer
    CPU_PPC_750L32    = 0x00088302,
226 76a66253 j_mayer
    CPU_PPC_750CL     = 0x00087200,
227 3fc6c082 bellard
    /* PowerPC 74xx cores (aka G4) */
228 76a66253 j_mayer
    CPU_PPC_7400      = 0x000C0100,
229 76a66253 j_mayer
    CPU_PPC_7410C     = 0x800C1102,
230 76a66253 j_mayer
    CPU_PPC_7410D     = 0x800C1103,
231 76a66253 j_mayer
    CPU_PPC_7410E     = 0x800C1104,
232 76a66253 j_mayer
    CPU_PPC_7441      = 0x80000210,
233 76a66253 j_mayer
    CPU_PPC_7445      = 0x80010100,
234 76a66253 j_mayer
    CPU_PPC_7447      = 0x80020100,
235 76a66253 j_mayer
    CPU_PPC_7447A     = 0x80030101,
236 76a66253 j_mayer
    CPU_PPC_7448      = 0x80040100,
237 76a66253 j_mayer
    CPU_PPC_7450      = 0x80000200,
238 76a66253 j_mayer
    CPU_PPC_7450b     = 0x80000201,
239 3fc6c082 bellard
    CPU_PPC_7451      = 0x80000203,
240 76a66253 j_mayer
    CPU_PPC_7451G     = 0x80000210,
241 76a66253 j_mayer
    CPU_PPC_7455      = 0x80010201,
242 76a66253 j_mayer
    CPU_PPC_7455F     = 0x80010303,
243 76a66253 j_mayer
    CPU_PPC_7455G     = 0x80010304,
244 76a66253 j_mayer
    CPU_PPC_7457      = 0x80020101,
245 76a66253 j_mayer
    CPU_PPC_7457C     = 0x80020102,
246 3fc6c082 bellard
    CPU_PPC_7457A     = 0x80030000,
247 3fc6c082 bellard
    /* 64 bits PowerPC */
248 3fc6c082 bellard
    CPU_PPC_620       = 0x00140000,
249 3fc6c082 bellard
    CPU_PPC_630       = 0x00400000,
250 3fc6c082 bellard
    CPU_PPC_631       = 0x00410000,
251 3fc6c082 bellard
    CPU_PPC_POWER4    = 0x00350000,
252 3fc6c082 bellard
    CPU_PPC_POWER4P   = 0x00380000,
253 3fc6c082 bellard
    CPU_PPC_POWER5    = 0x003A0000,
254 3fc6c082 bellard
    CPU_PPC_POWER5P   = 0x003B0000,
255 3fc6c082 bellard
    CPU_PPC_970       = 0x00390000,
256 76a66253 j_mayer
    CPU_PPC_970FX10   = 0x00391100,
257 76a66253 j_mayer
    CPU_PPC_970FX20   = 0x003C0200,
258 76a66253 j_mayer
    CPU_PPC_970FX21   = 0x003C0201,
259 76a66253 j_mayer
    CPU_PPC_970FX30   = 0x003C0300,
260 76a66253 j_mayer
    CPU_PPC_970FX31   = 0x003C0301,
261 76a66253 j_mayer
#define CPU_PPC_970FX CPU_PPC_970FX31
262 76a66253 j_mayer
    CPU_PPC_970MP10   = 0x00440100,
263 76a66253 j_mayer
    CPU_PPC_970MP11   = 0x00440101,
264 76a66253 j_mayer
#define CPU_PPC_970MP CPU_PPC_970MP11
265 76a66253 j_mayer
    CPU_PPC_CELL10    = 0x00700100,
266 76a66253 j_mayer
    CPU_PPC_CELL20    = 0x00700400,
267 76a66253 j_mayer
    CPU_PPC_CELL30    = 0x00700500,
268 76a66253 j_mayer
    CPU_PPC_CELL31    = 0x00700501,
269 76a66253 j_mayer
#define CPU_PPC_CELL32 CPU_PPC_CELL31
270 76a66253 j_mayer
#define CPU_PPC_CELL CPU_PPC_CELL32
271 3fc6c082 bellard
    CPU_PPC_RS64      = 0x00330000,
272 3fc6c082 bellard
    CPU_PPC_RS64II    = 0x00340000,
273 3fc6c082 bellard
    CPU_PPC_RS64III   = 0x00360000,
274 3fc6c082 bellard
    CPU_PPC_RS64IV    = 0x00370000,
275 3fc6c082 bellard
    /* Original POWER */
276 3fc6c082 bellard
    /* XXX: should be POWER (RIOS), RSC3308, RSC4608,
277 3fc6c082 bellard
     * POWER2 (RIOS2) & RSC2 (P2SC) here
278 3fc6c082 bellard
     */
279 3fc6c082 bellard
#if 0
280 3fc6c082 bellard
    CPU_POWER         = xxx,
281 3fc6c082 bellard
#endif
282 3fc6c082 bellard
#if 0
283 3fc6c082 bellard
    CPU_POWER2        = xxx,
284 3fc6c082 bellard
#endif
285 3fc6c082 bellard
};
286 3fc6c082 bellard
287 76a66253 j_mayer
/* System version register (used on MPC 8xxx) */
288 3fc6c082 bellard
enum {
289 3fc6c082 bellard
    PPC_SVR_8540      = 0x80300000,
290 76a66253 j_mayer
    PPC_SVR_8541E     = 0x807A0010,
291 76a66253 j_mayer
    PPC_SVR_8543v10   = 0x80320010,
292 76a66253 j_mayer
    PPC_SVR_8543v11   = 0x80320011,
293 76a66253 j_mayer
    PPC_SVR_8543v20   = 0x80320020,
294 76a66253 j_mayer
    PPC_SVR_8543Ev10  = 0x803A0010,
295 76a66253 j_mayer
    PPC_SVR_8543Ev11  = 0x803A0011,
296 76a66253 j_mayer
    PPC_SVR_8543Ev20  = 0x803A0020,
297 76a66253 j_mayer
    PPC_SVR_8545      = 0x80310220,
298 76a66253 j_mayer
    PPC_SVR_8545E     = 0x80390220,
299 76a66253 j_mayer
    PPC_SVR_8547E     = 0x80390120,
300 76a66253 j_mayer
    PPC_SCR_8548v10   = 0x80310010,
301 76a66253 j_mayer
    PPC_SCR_8548v11   = 0x80310011,
302 76a66253 j_mayer
    PPC_SCR_8548v20   = 0x80310020,
303 76a66253 j_mayer
    PPC_SVR_8548Ev10  = 0x80390010,
304 76a66253 j_mayer
    PPC_SVR_8548Ev11  = 0x80390011,
305 76a66253 j_mayer
    PPC_SVR_8548Ev20  = 0x80390020,
306 76a66253 j_mayer
    PPC_SVR_8555E     = 0x80790010,
307 76a66253 j_mayer
    PPC_SVR_8560v10   = 0x80700010,
308 76a66253 j_mayer
    PPC_SVR_8560v20   = 0x80700020,
309 3fc6c082 bellard
};
310 3fc6c082 bellard
311 3fc6c082 bellard
/*****************************************************************************/
312 9a64fbe4 bellard
/* Instruction types */
313 9a64fbe4 bellard
enum {
314 3fc6c082 bellard
    PPC_NONE        = 0x00000000,
315 3fc6c082 bellard
    /* integer operations instructions             */
316 3fc6c082 bellard
    /* flow control instructions                   */
317 3fc6c082 bellard
    /* virtual memory instructions                 */
318 3fc6c082 bellard
    /* ld/st with reservation instructions         */
319 3fc6c082 bellard
    /* cache control instructions                  */
320 3fc6c082 bellard
    /* spr/msr access instructions                 */
321 0487d6a8 j_mayer
    PPC_INSNS_BASE  = 0x0000000000000001ULL,
322 3fc6c082 bellard
#define PPC_INTEGER PPC_INSNS_BASE
323 3fc6c082 bellard
#define PPC_FLOW    PPC_INSNS_BASE
324 3fc6c082 bellard
#define PPC_MEM     PPC_INSNS_BASE
325 3fc6c082 bellard
#define PPC_RES     PPC_INSNS_BASE
326 3fc6c082 bellard
#define PPC_CACHE   PPC_INSNS_BASE
327 3fc6c082 bellard
#define PPC_MISC    PPC_INSNS_BASE
328 3fc6c082 bellard
    /* floating point operations instructions      */
329 0487d6a8 j_mayer
    PPC_FLOAT       = 0x0000000000000002ULL,
330 3fc6c082 bellard
    /* more floating point operations instructions */
331 0487d6a8 j_mayer
    PPC_FLOAT_EXT   = 0x0000000000000004ULL,
332 3fc6c082 bellard
    /* external control instructions               */
333 0487d6a8 j_mayer
    PPC_EXTERN      = 0x0000000000000008ULL,
334 3fc6c082 bellard
    /* segment register access instructions        */
335 0487d6a8 j_mayer
    PPC_SEGMENT     = 0x0000000000000010ULL,
336 3fc6c082 bellard
    /* Optional cache control instructions         */
337 0487d6a8 j_mayer
    PPC_CACHE_OPT   = 0x0000000000000020ULL,
338 3fc6c082 bellard
    /* Optional floating point op instructions     */
339 0487d6a8 j_mayer
    PPC_FLOAT_OPT   = 0x0000000000000040ULL,
340 3fc6c082 bellard
    /* Optional memory control instructions        */
341 0487d6a8 j_mayer
    PPC_MEM_TLBIA   = 0x0000000000000080ULL,
342 0487d6a8 j_mayer
    PPC_MEM_TLBIE   = 0x0000000000000100ULL,
343 0487d6a8 j_mayer
    PPC_MEM_TLBSYNC = 0x0000000000000200ULL,
344 3fc6c082 bellard
    /* eieio & sync                                */
345 0487d6a8 j_mayer
    PPC_MEM_SYNC    = 0x0000000000000400ULL,
346 3fc6c082 bellard
    /* PowerPC 6xx TLB management instructions     */
347 0487d6a8 j_mayer
    PPC_6xx_TLB     = 0x0000000000000800ULL,
348 3fc6c082 bellard
    /* Altivec support                             */
349 0487d6a8 j_mayer
    PPC_ALTIVEC     = 0x0000000000001000ULL,
350 3fc6c082 bellard
    /* Time base support                           */
351 0487d6a8 j_mayer
    PPC_TB          = 0x0000000000002000ULL,
352 3fc6c082 bellard
    /* Embedded PowerPC dedicated instructions     */
353 0487d6a8 j_mayer
    PPC_EMB_COMMON  = 0x0000000000004000ULL,
354 3fc6c082 bellard
    /* PowerPC 40x exception model                 */
355 0487d6a8 j_mayer
    PPC_40x_EXCP    = 0x0000000000008000ULL,
356 3fc6c082 bellard
    /* PowerPC 40x specific instructions           */
357 0487d6a8 j_mayer
    PPC_40x_SPEC    = 0x0000000000010000ULL,
358 3fc6c082 bellard
    /* PowerPC 405 Mac instructions                */
359 0487d6a8 j_mayer
    PPC_405_MAC     = 0x0000000000020000ULL,
360 3fc6c082 bellard
    /* PowerPC 440 specific instructions           */
361 0487d6a8 j_mayer
    PPC_440_SPEC    = 0x0000000000040000ULL,
362 3fc6c082 bellard
    /* Specific extensions */
363 3fc6c082 bellard
    /* Power-to-PowerPC bridge (601)               */
364 0487d6a8 j_mayer
    PPC_POWER_BR    = 0x0000000000080000ULL,
365 3fc6c082 bellard
    /* PowerPC 602 specific */
366 0487d6a8 j_mayer
    PPC_602_SPEC    = 0x0000000000100000ULL,
367 3fc6c082 bellard
    /* Deprecated instructions                     */
368 3fc6c082 bellard
    /* Original POWER instruction set              */
369 0487d6a8 j_mayer
    PPC_POWER       = 0x0000000000200000ULL,
370 3fc6c082 bellard
    /* POWER2 instruction set extension            */
371 0487d6a8 j_mayer
    PPC_POWER2      = 0x0000000000400000ULL,
372 3fc6c082 bellard
    /* Power RTC support */
373 0487d6a8 j_mayer
    PPC_POWER_RTC   = 0x0000000000800000ULL,
374 3fc6c082 bellard
    /* 64 bits PowerPC instructions                */
375 3fc6c082 bellard
    /* 64 bits PowerPC instruction set             */
376 0487d6a8 j_mayer
    PPC_64B         = 0x0000000001000000ULL,
377 3fc6c082 bellard
    /* 64 bits hypervisor extensions               */
378 0487d6a8 j_mayer
    PPC_64H         = 0x0000000002000000ULL,
379 3fc6c082 bellard
    /* 64 bits PowerPC "bridge" features           */
380 0487d6a8 j_mayer
    PPC_64_BRIDGE   = 0x0000000004000000ULL,
381 76a66253 j_mayer
    /* BookE (embedded) PowerPC specification      */
382 0487d6a8 j_mayer
    PPC_BOOKE       = 0x0000000008000000ULL,
383 76a66253 j_mayer
    /* eieio */
384 0487d6a8 j_mayer
    PPC_MEM_EIEIO   = 0x0000000010000000ULL,
385 76a66253 j_mayer
    /* e500 vector instructions */
386 0487d6a8 j_mayer
    PPC_E500_VECTOR = 0x0000000020000000ULL,
387 76a66253 j_mayer
    /* PowerPC 4xx dedicated instructions     */
388 0487d6a8 j_mayer
    PPC_4xx_COMMON  = 0x0000000040000000ULL,
389 d9bce9d9 j_mayer
    /* PowerPC 2.03 specification extensions */
390 0487d6a8 j_mayer
    PPC_203         = 0x0000000080000000ULL,
391 0487d6a8 j_mayer
    /* PowerPC 2.03 SPE extension */
392 0487d6a8 j_mayer
    PPC_SPE         = 0x0000000100000000ULL,
393 0487d6a8 j_mayer
    /* PowerPC 2.03 SPE floating-point extension */
394 0487d6a8 j_mayer
    PPC_SPEFPU      = 0x0000000200000000ULL,
395 426613db j_mayer
    /* SLB management */
396 426613db j_mayer
    PPC_SLBI        = 0x0000000400000000ULL,
397 9a64fbe4 bellard
};
398 79aceca5 bellard
399 3fc6c082 bellard
/* CPU run-time flags (MMU and exception model) */
400 3fc6c082 bellard
enum {
401 3fc6c082 bellard
    /* MMU model */
402 d0dfae6e j_mayer
    PPC_FLAGS_MMU_MASK       = 0x000000FF,
403 3fc6c082 bellard
    /* Standard 32 bits PowerPC MMU */
404 d0dfae6e j_mayer
    PPC_FLAGS_MMU_32B        = 0x00000000,
405 3fc6c082 bellard
    /* Standard 64 bits PowerPC MMU */
406 d0dfae6e j_mayer
    PPC_FLAGS_MMU_64B        = 0x00000001,
407 3fc6c082 bellard
    /* PowerPC 601 MMU */
408 d0dfae6e j_mayer
    PPC_FLAGS_MMU_601        = 0x00000002,
409 3fc6c082 bellard
    /* PowerPC 6xx MMU with software TLB */
410 d0dfae6e j_mayer
    PPC_FLAGS_MMU_SOFT_6xx   = 0x00000003,
411 3fc6c082 bellard
    /* PowerPC 4xx MMU with software TLB */
412 d0dfae6e j_mayer
    PPC_FLAGS_MMU_SOFT_4xx   = 0x00000004,
413 3fc6c082 bellard
    /* PowerPC 403 MMU */
414 d0dfae6e j_mayer
    PPC_FLAGS_MMU_403        = 0x00000005,
415 d0dfae6e j_mayer
    /* BookE FSL MMU model */
416 d0dfae6e j_mayer
    PPC_FLAGS_MMU_BOOKE_FSL  = 0x00000006,
417 d9bce9d9 j_mayer
    /* BookE MMU model */
418 d0dfae6e j_mayer
    PPC_FLAGS_MMU_BOOKE      = 0x00000007,
419 d0dfae6e j_mayer
    /* 64 bits "bridge" PowerPC MMU */
420 d0dfae6e j_mayer
    PPC_FLAGS_MMU_64BRIDGE   = 0x00000008,
421 3fc6c082 bellard
    /* Exception model */
422 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_MASK      = 0x0000FF00,
423 3fc6c082 bellard
    /* Standard PowerPC exception model */
424 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_STD       = 0x00000000,
425 3fc6c082 bellard
    /* PowerPC 40x exception model */
426 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_40x       = 0x00000100,
427 3fc6c082 bellard
    /* PowerPC 601 exception model */
428 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_601       = 0x00000200,
429 3fc6c082 bellard
    /* PowerPC 602 exception model */
430 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_602       = 0x00000300,
431 3fc6c082 bellard
    /* PowerPC 603 exception model */
432 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_603       = 0x00000400,
433 3fc6c082 bellard
    /* PowerPC 604 exception model */
434 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_604       = 0x00000500,
435 3fc6c082 bellard
    /* PowerPC 7x0 exception model */
436 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_7x0       = 0x00000600,
437 3fc6c082 bellard
    /* PowerPC 7x5 exception model */
438 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_7x5       = 0x00000700,
439 3fc6c082 bellard
    /* PowerPC 74xx exception model */
440 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_74xx      = 0x00000800,
441 3fc6c082 bellard
    /* PowerPC 970 exception model */
442 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_970       = 0x00000900,
443 d9bce9d9 j_mayer
    /* BookE exception model */
444 d0dfae6e j_mayer
    PPC_FLAGS_EXCP_BOOKE     = 0x00000A00,
445 d0dfae6e j_mayer
    /* Input pins model */
446 d0dfae6e j_mayer
    PPC_FLAGS_INPUT_MASK     = 0x000F0000,
447 d0dfae6e j_mayer
    PPC_FLAGS_INPUT_6xx      = 0x00000000,
448 d0dfae6e j_mayer
    PPC_FLAGS_INPUT_BookE    = 0x00010000,
449 d0dfae6e j_mayer
    PPC_FLAGS_INPUT_40x      = 0x00020000,
450 d0dfae6e j_mayer
    PPC_FLAGS_INPUT_970      = 0x00030000,
451 3fc6c082 bellard
};
452 3fc6c082 bellard
453 3fc6c082 bellard
#define PPC_MMU(env) (env->flags & PPC_FLAGS_MMU_MASK)
454 3fc6c082 bellard
#define PPC_EXCP(env) (env->flags & PPC_FLAGS_EXCP_MASK)
455 d0dfae6e j_mayer
#define PPC_INPUT(env) (env->flags & PPC_FLAGS_INPUT_MASK)
456 3fc6c082 bellard
457 3fc6c082 bellard
/*****************************************************************************/
458 3fc6c082 bellard
/* Supported instruction set definitions */
459 3fc6c082 bellard
/* This generates an empty opcode table... */
460 3fc6c082 bellard
#define PPC_INSNS_TODO (PPC_NONE)
461 3fc6c082 bellard
#define PPC_FLAGS_TODO (0x00000000)
462 3fc6c082 bellard
463 3fc6c082 bellard
/* PowerPC 40x instruction set */
464 76a66253 j_mayer
#define PPC_INSNS_EMB (PPC_INSNS_BASE | PPC_MEM_TLBSYNC | PPC_EMB_COMMON)
465 3fc6c082 bellard
/* PowerPC 401 */
466 3fc6c082 bellard
#define PPC_INSNS_401 (PPC_INSNS_TODO)
467 3fc6c082 bellard
#define PPC_FLAGS_401 (PPC_FLAGS_TODO)
468 3fc6c082 bellard
/* PowerPC 403 */
469 76a66253 j_mayer
#define PPC_INSNS_403 (PPC_INSNS_EMB | PPC_MEM_SYNC | PPC_MEM_EIEIO |         \
470 76a66253 j_mayer
                       PPC_MEM_TLBIA | PPC_4xx_COMMON | PPC_40x_EXCP |        \
471 76a66253 j_mayer
                       PPC_40x_SPEC)
472 d0dfae6e j_mayer
#define PPC_FLAGS_403 (PPC_FLAGS_MMU_403 | PPC_FLAGS_EXCP_40x |               \
473 d0dfae6e j_mayer
                       PPC_FLAGS_INPUT_40x)
474 3fc6c082 bellard
/* PowerPC 405 */
475 76a66253 j_mayer
#define PPC_INSNS_405 (PPC_INSNS_EMB | PPC_MEM_SYNC | PPC_MEM_EIEIO |         \
476 76a66253 j_mayer
                       PPC_CACHE_OPT | PPC_MEM_TLBIA | PPC_TB |               \
477 76a66253 j_mayer
                       PPC_4xx_COMMON | PPC_40x_SPEC |  PPC_40x_EXCP |        \
478 3fc6c082 bellard
                       PPC_405_MAC)
479 d0dfae6e j_mayer
#define PPC_FLAGS_405 (PPC_FLAGS_MMU_SOFT_4xx | PPC_FLAGS_EXCP_40x |          \
480 d0dfae6e j_mayer
                       PPC_FLAGS_INPUT_40x)
481 3fc6c082 bellard
/* PowerPC 440 */
482 76a66253 j_mayer
#define PPC_INSNS_440 (PPC_INSNS_EMB | PPC_CACHE_OPT | PPC_BOOKE |            \
483 76a66253 j_mayer
                       PPC_4xx_COMMON | PPC_405_MAC | PPC_440_SPEC)
484 d0dfae6e j_mayer
#define PPC_FLAGS_440 (PPC_FLAGS_MMU_BOOKE | PPC_FLAGS_EXCP_BOOKE |           \
485 d0dfae6e j_mayer
                       PPC_FLAGS_INPUT_BookE)
486 76a66253 j_mayer
/* Generic BookE PowerPC */
487 76a66253 j_mayer
#define PPC_INSNS_BOOKE (PPC_INSNS_EMB | PPC_BOOKE | PPC_MEM_EIEIO |          \
488 76a66253 j_mayer
                         PPC_FLOAT | PPC_FLOAT_OPT | PPC_CACHE_OPT)
489 d0dfae6e j_mayer
#define PPC_FLAGS_BOOKE (PPC_FLAGS_MMU_BOOKE | PPC_FLAGS_EXCP_BOOKE |         \
490 d0dfae6e j_mayer
                         PPC_FLAGS_INPUT_BookE)
491 76a66253 j_mayer
/* e500 core */
492 76a66253 j_mayer
#define PPC_INSNS_E500 (PPC_INSNS_EMB | PPC_BOOKE | PPC_MEM_EIEIO |           \
493 76a66253 j_mayer
                        PPC_CACHE_OPT | PPC_E500_VECTOR)
494 d0dfae6e j_mayer
#define PPC_FLAGS_E500 (PPC_FLAGS_MMU_SOFT_4xx | PPC_FLAGS_EXCP_40x |         \
495 d0dfae6e j_mayer
                        PPC_FLAGS_INPUT_BookE)
496 3fc6c082 bellard
/* Non-embedded PowerPC */
497 3fc6c082 bellard
#define PPC_INSNS_COMMON  (PPC_INSNS_BASE | PPC_FLOAT | PPC_MEM_SYNC |        \
498 d0dfae6e j_mayer
                           PPC_MEM_EIEIO | PPC_SEGMENT | PPC_MEM_TLBIE)
499 3fc6c082 bellard
/* PowerPC 601 */
500 3fc6c082 bellard
#define PPC_INSNS_601 (PPC_INSNS_COMMON | PPC_EXTERN | PPC_POWER_BR)
501 d0dfae6e j_mayer
#define PPC_FLAGS_601 (PPC_FLAGS_MMU_601 | PPC_FLAGS_EXCP_601 |               \
502 d0dfae6e j_mayer
                       PPC_FLAGS_INPUT_6xx)
503 3fc6c082 bellard
/* PowerPC 602 */
504 3fc6c082 bellard
#define PPC_INSNS_602 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_6xx_TLB |       \
505 76a66253 j_mayer
                       PPC_MEM_TLBSYNC | PPC_TB | PPC_602_SPEC)
506 d0dfae6e j_mayer
#define PPC_FLAGS_602 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_602 |          \
507 d0dfae6e j_mayer
                       PPC_FLAGS_INPUT_6xx)
508 3fc6c082 bellard
/* PowerPC 603 */
509 3fc6c082 bellard
#define PPC_INSNS_603 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_6xx_TLB |       \
510 3fc6c082 bellard
                       PPC_MEM_TLBSYNC | PPC_EXTERN | PPC_TB)
511 d0dfae6e j_mayer
#define PPC_FLAGS_603 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_603 |          \
512 d0dfae6e j_mayer
                       PPC_FLAGS_INPUT_6xx)
513 3fc6c082 bellard
/* PowerPC G2 */
514 3fc6c082 bellard
#define PPC_INSNS_G2 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_6xx_TLB |        \
515 3fc6c082 bellard
                      PPC_MEM_TLBSYNC | PPC_EXTERN | PPC_TB)
516 d0dfae6e j_mayer
#define PPC_FLAGS_G2 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_603 |           \
517 d0dfae6e j_mayer
                      PPC_FLAGS_INPUT_6xx)
518 3fc6c082 bellard
/* PowerPC 604 */
519 3fc6c082 bellard
#define PPC_INSNS_604 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_EXTERN |        \
520 3fc6c082 bellard
                       PPC_MEM_TLBSYNC | PPC_TB)
521 d0dfae6e j_mayer
#define PPC_FLAGS_604 (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_604 |               \
522 d0dfae6e j_mayer
                       PPC_FLAGS_INPUT_6xx)
523 3fc6c082 bellard
/* PowerPC 740/750 (aka G3) */
524 3fc6c082 bellard
#define PPC_INSNS_7x0 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_EXTERN |        \
525 3fc6c082 bellard
                       PPC_MEM_TLBSYNC | PPC_TB)
526 d0dfae6e j_mayer
#define PPC_FLAGS_7x0 (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_7x0 |               \
527 d0dfae6e j_mayer
                       PPC_FLAGS_INPUT_6xx)
528 3fc6c082 bellard
/* PowerPC 745/755 */
529 3fc6c082 bellard
#define PPC_INSNS_7x5 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_EXTERN |        \
530 3fc6c082 bellard
                       PPC_MEM_TLBSYNC | PPC_TB | PPC_6xx_TLB)
531 d0dfae6e j_mayer
#define PPC_FLAGS_7x5 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_7x5 |          \
532 d0dfae6e j_mayer
                       PPC_FLAGS_INPUT_6xx)
533 3fc6c082 bellard
/* PowerPC 74xx (aka G4) */
534 3fc6c082 bellard
#define PPC_INSNS_74xx (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_ALTIVEC |      \
535 3fc6c082 bellard
                        PPC_MEM_TLBSYNC | PPC_TB)
536 d0dfae6e j_mayer
#define PPC_FLAGS_74xx (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_74xx |             \
537 d0dfae6e j_mayer
                        PPC_FLAGS_INPUT_6xx)
538 426613db j_mayer
/* PowerPC 970 (aka G5) */
539 426613db j_mayer
#define PPC_INSNS_970  (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_FLOAT_OPT |    \
540 426613db j_mayer
                        PPC_ALTIVEC | PPC_MEM_TLBSYNC | PPC_TB |              \
541 426613db j_mayer
                        PPC_64B | PPC_64_BRIDGE | PPC_SLBI)
542 d0dfae6e j_mayer
#define PPC_FLAGS_970  (PPC_FLAGS_MMU_64BRIDGE | PPC_FLAGS_EXCP_970 |         \
543 d0dfae6e j_mayer
                        PPC_FLAGS_INPUT_970)
544 3fc6c082 bellard
545 3fc6c082 bellard
/* Default PowerPC will be 604/970 */
546 3fc6c082 bellard
#define PPC_INSNS_PPC32 PPC_INSNS_604
547 3fc6c082 bellard
#define PPC_FLAGS_PPC32 PPC_FLAGS_604
548 3fc6c082 bellard
#define PPC_INSNS_PPC64 PPC_INSNS_970
549 3fc6c082 bellard
#define PPC_FLAGS_PPC64 PPC_FLAGS_970
550 3fc6c082 bellard
#define PPC_INSNS_DEFAULT PPC_INSNS_604
551 3fc6c082 bellard
#define PPC_FLAGS_DEFAULT PPC_FLAGS_604
552 3fc6c082 bellard
typedef struct ppc_def_t ppc_def_t;
553 79aceca5 bellard
554 3fc6c082 bellard
/*****************************************************************************/
555 3fc6c082 bellard
/* Types used to describe some PowerPC registers */
556 3fc6c082 bellard
typedef struct CPUPPCState CPUPPCState;
557 3fc6c082 bellard
typedef struct opc_handler_t opc_handler_t;
558 9fddaa0c bellard
typedef struct ppc_tb_t ppc_tb_t;
559 3fc6c082 bellard
typedef struct ppc_spr_t ppc_spr_t;
560 3fc6c082 bellard
typedef struct ppc_dcr_t ppc_dcr_t;
561 3fc6c082 bellard
typedef struct ppc_avr_t ppc_avr_t;
562 1d0a48fb j_mayer
typedef union ppc_tlb_t ppc_tlb_t;
563 76a66253 j_mayer
564 3fc6c082 bellard
/* SPR access micro-ops generations callbacks */
565 3fc6c082 bellard
struct ppc_spr_t {
566 3fc6c082 bellard
    void (*uea_read)(void *opaque, int spr_num);
567 3fc6c082 bellard
    void (*uea_write)(void *opaque, int spr_num);
568 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
569 3fc6c082 bellard
    void (*oea_read)(void *opaque, int spr_num);
570 3fc6c082 bellard
    void (*oea_write)(void *opaque, int spr_num);
571 76a66253 j_mayer
#endif
572 3fc6c082 bellard
    const unsigned char *name;
573 3fc6c082 bellard
};
574 3fc6c082 bellard
575 3fc6c082 bellard
/* Altivec registers (128 bits) */
576 3fc6c082 bellard
struct ppc_avr_t {
577 3fc6c082 bellard
    uint32_t u[4];
578 3fc6c082 bellard
};
579 9fddaa0c bellard
580 3fc6c082 bellard
/* Software TLB cache */
581 1d0a48fb j_mayer
typedef struct ppc6xx_tlb_t ppc6xx_tlb_t;
582 1d0a48fb j_mayer
struct ppc6xx_tlb_t {
583 76a66253 j_mayer
    target_ulong pte0;
584 76a66253 j_mayer
    target_ulong pte1;
585 76a66253 j_mayer
    target_ulong EPN;
586 1d0a48fb j_mayer
};
587 1d0a48fb j_mayer
588 1d0a48fb j_mayer
typedef struct ppcemb_tlb_t ppcemb_tlb_t;
589 1d0a48fb j_mayer
struct ppcemb_tlb_t {
590 c55e9aef j_mayer
    target_phys_addr_t RPN;
591 1d0a48fb j_mayer
    target_ulong EPN;
592 76a66253 j_mayer
    target_ulong PID;
593 c55e9aef j_mayer
    target_ulong size;
594 c55e9aef j_mayer
    uint32_t prot;
595 c55e9aef j_mayer
    uint32_t attr; /* Storage attributes */
596 1d0a48fb j_mayer
};
597 1d0a48fb j_mayer
598 1d0a48fb j_mayer
union ppc_tlb_t {
599 1d0a48fb j_mayer
    ppc6xx_tlb_t tlb6;
600 1d0a48fb j_mayer
    ppcemb_tlb_t tlbe;
601 3fc6c082 bellard
};
602 3fc6c082 bellard
603 3fc6c082 bellard
/*****************************************************************************/
604 3fc6c082 bellard
/* Machine state register bits definition                                    */
605 76a66253 j_mayer
#define MSR_SF   63 /* Sixty-four-bit mode                            hflags */
606 3fc6c082 bellard
#define MSR_ISF  61 /* Sixty-four-bit interrupt mode on 630                  */
607 76a66253 j_mayer
#define MSR_HV   60 /* hypervisor state                               hflags */
608 363be49c j_mayer
#define MSR_CM   31 /* Computation mode for BookE                     hflags */
609 363be49c j_mayer
#define MSR_ICM  30 /* Interrupt computation mode for BookE                  */
610 363be49c j_mayer
#define MSR_UCLE 26 /* User-mode cache lock enable for BookE                 */
611 76a66253 j_mayer
#define MSR_VR   25 /* altivec available                              hflags */
612 363be49c j_mayer
#define MSR_SPE  25 /* SPE enable for BookE                           hflags */
613 76a66253 j_mayer
#define MSR_AP   23 /* Access privilege state on 602                  hflags */
614 76a66253 j_mayer
#define MSR_SA   22 /* Supervisor access mode on 602                  hflags */
615 3fc6c082 bellard
#define MSR_KEY  19 /* key bit on 603e                                       */
616 3fc6c082 bellard
#define MSR_POW  18 /* Power management                                      */
617 3fc6c082 bellard
#define MSR_WE   18 /* Wait state enable on embedded PowerPC                 */
618 3fc6c082 bellard
#define MSR_TGPR 17 /* TGPR usage on 602/603                                 */
619 76a66253 j_mayer
#define MSR_TLB  17 /* TLB update on ?                                       */
620 3fc6c082 bellard
#define MSR_CE   17 /* Critical interrupt enable on embedded PowerPC         */
621 3fc6c082 bellard
#define MSR_ILE  16 /* Interrupt little-endian mode                          */
622 3fc6c082 bellard
#define MSR_EE   15 /* External interrupt enable                             */
623 76a66253 j_mayer
#define MSR_PR   14 /* Problem state                                  hflags */
624 76a66253 j_mayer
#define MSR_FP   13 /* Floating point available                       hflags */
625 3fc6c082 bellard
#define MSR_ME   12 /* Machine check interrupt enable                        */
626 76a66253 j_mayer
#define MSR_FE0  11 /* Floating point exception mode 0                hflags */
627 76a66253 j_mayer
#define MSR_SE   10 /* Single-step trace enable                       hflags */
628 3fc6c082 bellard
#define MSR_DWE  10 /* Debug wait enable on 405                              */
629 76a66253 j_mayer
#define MSR_UBLE 10 /* User BTB lock enable on e500                          */
630 76a66253 j_mayer
#define MSR_BE   9  /* Branch trace enable                            hflags */
631 3fc6c082 bellard
#define MSR_DE   9  /* Debug interrupts enable on embedded PowerPC           */
632 76a66253 j_mayer
#define MSR_FE1  8  /* Floating point exception mode 1                hflags */
633 3fc6c082 bellard
#define MSR_AL   7  /* AL bit on POWER                                       */
634 3fc6c082 bellard
#define MSR_IP   6  /* Interrupt prefix                                      */
635 3fc6c082 bellard
#define MSR_IR   5  /* Instruction relocate                                  */
636 3fc6c082 bellard
#define MSR_IS   5  /* Instruction address space on embedded PowerPC         */
637 3fc6c082 bellard
#define MSR_DR   4  /* Data relocate                                         */
638 3fc6c082 bellard
#define MSR_DS   4  /* Data address space on embedded PowerPC                */
639 3fc6c082 bellard
#define MSR_PE   3  /* Protection enable on 403                              */
640 3fc6c082 bellard
#define MSR_EP   3  /* Exception prefix on 601                               */
641 3fc6c082 bellard
#define MSR_PX   2  /* Protection exclusive on 403                           */
642 3fc6c082 bellard
#define MSR_PMM  2  /* Performance monitor mark on POWER                     */
643 3fc6c082 bellard
#define MSR_RI   1  /* Recoverable interrupt                                 */
644 76a66253 j_mayer
#define MSR_LE   0  /* Little-endian mode                             hflags */
645 3fc6c082 bellard
#define msr_sf   env->msr[MSR_SF]
646 3fc6c082 bellard
#define msr_isf  env->msr[MSR_ISF]
647 3fc6c082 bellard
#define msr_hv   env->msr[MSR_HV]
648 363be49c j_mayer
#define msr_cm   env->msr[MSR_CM]
649 363be49c j_mayer
#define msr_icm  env->msr[MSR_ICM]
650 76a66253 j_mayer
#define msr_ucle env->msr[MSR_UCLE]
651 3fc6c082 bellard
#define msr_vr   env->msr[MSR_VR]
652 76a66253 j_mayer
#define msr_spe  env->msr[MSR_SPE]
653 3fc6c082 bellard
#define msr_ap   env->msr[MSR_AP]
654 3fc6c082 bellard
#define msr_sa   env->msr[MSR_SA]
655 3fc6c082 bellard
#define msr_key  env->msr[MSR_KEY]
656 76a66253 j_mayer
#define msr_pow  env->msr[MSR_POW]
657 3fc6c082 bellard
#define msr_we   env->msr[MSR_WE]
658 3fc6c082 bellard
#define msr_tgpr env->msr[MSR_TGPR]
659 3fc6c082 bellard
#define msr_tlb  env->msr[MSR_TLB]
660 3fc6c082 bellard
#define msr_ce   env->msr[MSR_CE]
661 76a66253 j_mayer
#define msr_ile  env->msr[MSR_ILE]
662 76a66253 j_mayer
#define msr_ee   env->msr[MSR_EE]
663 76a66253 j_mayer
#define msr_pr   env->msr[MSR_PR]
664 76a66253 j_mayer
#define msr_fp   env->msr[MSR_FP]
665 76a66253 j_mayer
#define msr_me   env->msr[MSR_ME]
666 76a66253 j_mayer
#define msr_fe0  env->msr[MSR_FE0]
667 76a66253 j_mayer
#define msr_se   env->msr[MSR_SE]
668 3fc6c082 bellard
#define msr_dwe  env->msr[MSR_DWE]
669 76a66253 j_mayer
#define msr_uble env->msr[MSR_UBLE]
670 76a66253 j_mayer
#define msr_be   env->msr[MSR_BE]
671 3fc6c082 bellard
#define msr_de   env->msr[MSR_DE]
672 76a66253 j_mayer
#define msr_fe1  env->msr[MSR_FE1]
673 3fc6c082 bellard
#define msr_al   env->msr[MSR_AL]
674 76a66253 j_mayer
#define msr_ip   env->msr[MSR_IP]
675 76a66253 j_mayer
#define msr_ir   env->msr[MSR_IR]
676 3fc6c082 bellard
#define msr_is   env->msr[MSR_IS]
677 76a66253 j_mayer
#define msr_dr   env->msr[MSR_DR]
678 3fc6c082 bellard
#define msr_ds   env->msr[MSR_DS]
679 3fc6c082 bellard
#define msr_pe   env->msr[MSR_PE]
680 3fc6c082 bellard
#define msr_ep   env->msr[MSR_EP]
681 3fc6c082 bellard
#define msr_px   env->msr[MSR_PX]
682 3fc6c082 bellard
#define msr_pmm  env->msr[MSR_PMM]
683 76a66253 j_mayer
#define msr_ri   env->msr[MSR_RI]
684 76a66253 j_mayer
#define msr_le   env->msr[MSR_LE]
685 79aceca5 bellard
686 3fc6c082 bellard
/*****************************************************************************/
687 3fc6c082 bellard
/* The whole PowerPC CPU context */
688 3fc6c082 bellard
struct CPUPPCState {
689 3fc6c082 bellard
    /* First are the most commonly used resources
690 3fc6c082 bellard
     * during translated code execution
691 3fc6c082 bellard
     */
692 0487d6a8 j_mayer
#if TARGET_GPR_BITS > HOST_LONG_BITS
693 3fc6c082 bellard
    /* temporary fixed-point registers
694 3fc6c082 bellard
     * used to emulate 64 bits target on 32 bits hosts
695 0487d6a8 j_mayer
     */ 
696 3c4c9f9f ths
    ppc_gpr_t t0, t1, t2;
697 3fc6c082 bellard
#endif
698 d9bce9d9 j_mayer
    ppc_avr_t t0_avr, t1_avr, t2_avr;
699 d9bce9d9 j_mayer
700 79aceca5 bellard
    /* general purpose registers */
701 76a66253 j_mayer
    ppc_gpr_t gpr[32];
702 3fc6c082 bellard
    /* LR */
703 3fc6c082 bellard
    target_ulong lr;
704 3fc6c082 bellard
    /* CTR */
705 3fc6c082 bellard
    target_ulong ctr;
706 3fc6c082 bellard
    /* condition register */
707 3fc6c082 bellard
    uint8_t crf[8];
708 79aceca5 bellard
    /* XER */
709 3fc6c082 bellard
    /* XXX: We use only 5 fields, but we want to keep the structure aligned */
710 3fc6c082 bellard
    uint8_t xer[8];
711 79aceca5 bellard
    /* Reservation address */
712 3fc6c082 bellard
    target_ulong reserve;
713 3fc6c082 bellard
714 3fc6c082 bellard
    /* Those ones are used in supervisor mode only */
715 79aceca5 bellard
    /* machine state register */
716 3fc6c082 bellard
    uint8_t msr[64];
717 3fc6c082 bellard
    /* temporary general purpose registers */
718 76a66253 j_mayer
    ppc_gpr_t tgpr[4]; /* Used to speed-up TLB assist handlers */
719 3fc6c082 bellard
720 3fc6c082 bellard
    /* Floating point execution context */
721 76a66253 j_mayer
    /* temporary float registers */
722 4ecc3190 bellard
    float64 ft0;
723 4ecc3190 bellard
    float64 ft1;
724 4ecc3190 bellard
    float64 ft2;
725 4ecc3190 bellard
    float_status fp_status;
726 3fc6c082 bellard
    /* floating point registers */
727 3fc6c082 bellard
    float64 fpr[32];
728 3fc6c082 bellard
    /* floating point status and control register */
729 3fc6c082 bellard
    uint8_t fpscr[8];
730 4ecc3190 bellard
731 a316d335 bellard
    CPU_COMMON
732 a316d335 bellard
733 50443c98 bellard
    int halted; /* TRUE if the CPU is in suspend state */
734 50443c98 bellard
735 ac9eb073 bellard
    int access_type; /* when a memory exception occurs, the access
736 ac9eb073 bellard
                        type is stored here */
737 a541f297 bellard
738 3fc6c082 bellard
    /* MMU context */
739 3fc6c082 bellard
    /* Address space register */
740 3fc6c082 bellard
    target_ulong asr;
741 3fc6c082 bellard
    /* segment registers */
742 3fc6c082 bellard
    target_ulong sdr1;
743 3fc6c082 bellard
    target_ulong sr[16];
744 3fc6c082 bellard
    /* BATs */
745 3fc6c082 bellard
    int nb_BATs;
746 3fc6c082 bellard
    target_ulong DBAT[2][8];
747 3fc6c082 bellard
    target_ulong IBAT[2][8];
748 9fddaa0c bellard
749 3fc6c082 bellard
    /* Other registers */
750 3fc6c082 bellard
    /* Special purpose registers */
751 3fc6c082 bellard
    target_ulong spr[1024];
752 3fc6c082 bellard
    /* Altivec registers */
753 3fc6c082 bellard
    ppc_avr_t avr[32];
754 3fc6c082 bellard
    uint32_t vscr;
755 d9bce9d9 j_mayer
    /* SPE registers */
756 d9bce9d9 j_mayer
    ppc_gpr_t spe_acc;
757 0487d6a8 j_mayer
    float_status spe_status;
758 d9bce9d9 j_mayer
    uint32_t spe_fscr;
759 3fc6c082 bellard
760 3fc6c082 bellard
    /* Internal devices resources */
761 9fddaa0c bellard
    /* Time base and decrementer */
762 9fddaa0c bellard
    ppc_tb_t *tb_env;
763 3fc6c082 bellard
    /* Device control registers */
764 3fc6c082 bellard
    ppc_dcr_t *dcr_env;
765 3fc6c082 bellard
766 3fc6c082 bellard
    /* PowerPC TLB registers (for 4xx and 60x software driven TLBs) */
767 76a66253 j_mayer
    int nb_tlb;      /* Total number of TLB                                  */
768 76a66253 j_mayer
    int tlb_per_way; /* Speed-up helper: used to avoid divisions at run time */
769 76a66253 j_mayer
    int nb_ways;     /* Number of ways in the TLB set                        */
770 76a66253 j_mayer
    int last_way;    /* Last used way used to allocate TLB in a LRU way      */
771 76a66253 j_mayer
    int id_tlbs;     /* If 1, MMU has separated TLBs for instructions & data */
772 363be49c j_mayer
    int nb_pids;     /* Number of available PID registers                    */
773 76a66253 j_mayer
    ppc_tlb_t *tlb;  /* TLB is optional. Allocate them only if needed        */
774 3fc6c082 bellard
    /* 403 dedicated access protection registers */
775 3fc6c082 bellard
    target_ulong pb[4];
776 3fc6c082 bellard
777 3fc6c082 bellard
    /* Those resources are used during exception processing */
778 3fc6c082 bellard
    /* CPU model definition */
779 3fc6c082 bellard
    uint64_t msr_mask;
780 3fc6c082 bellard
    uint32_t flags;
781 3fc6c082 bellard
782 3fc6c082 bellard
    int exception_index;
783 3fc6c082 bellard
    int error_code;
784 3fc6c082 bellard
    int interrupt_request;
785 47103572 j_mayer
    uint32_t pending_interrupts;
786 e9df014c j_mayer
#if !defined(CONFIG_USER_ONLY)
787 e9df014c j_mayer
    /* This is the IRQ controller, which is implementation dependant
788 e9df014c j_mayer
     * and only relevant when emulating a complete machine.
789 e9df014c j_mayer
     */
790 e9df014c j_mayer
    uint32_t irq_input_state;
791 e9df014c j_mayer
    void **irq_inputs;
792 e9df014c j_mayer
#endif
793 3fc6c082 bellard
794 3fc6c082 bellard
    /* Those resources are used only during code translation */
795 3fc6c082 bellard
    /* Next instruction pointer */
796 3fc6c082 bellard
    target_ulong nip;
797 3fc6c082 bellard
    /* SPR translation callbacks */
798 3fc6c082 bellard
    ppc_spr_t spr_cb[1024];
799 3fc6c082 bellard
    /* opcode handlers */
800 3fc6c082 bellard
    opc_handler_t *opcodes[0x40];
801 3fc6c082 bellard
802 3fc6c082 bellard
    /* Those resources are used only in Qemu core */
803 3fc6c082 bellard
    jmp_buf jmp_env;
804 3fc6c082 bellard
    int user_mode_only; /* user mode only simulation */
805 3fc6c082 bellard
    uint32_t hflags;
806 3fc6c082 bellard
807 9fddaa0c bellard
    /* Power management */
808 9fddaa0c bellard
    int power_mode;
809 a541f297 bellard
810 6d506e6d bellard
    /* temporary hack to handle OSI calls (only used if non NULL) */
811 6d506e6d bellard
    int (*osi_call)(struct CPUPPCState *env);
812 3fc6c082 bellard
};
813 79aceca5 bellard
814 76a66253 j_mayer
/* Context used internally during MMU translations */
815 76a66253 j_mayer
typedef struct mmu_ctx_t mmu_ctx_t;
816 76a66253 j_mayer
struct mmu_ctx_t {
817 76a66253 j_mayer
    target_phys_addr_t raddr;      /* Real address              */
818 76a66253 j_mayer
    int prot;                      /* Protection bits           */
819 76a66253 j_mayer
    target_phys_addr_t pg_addr[2]; /* PTE tables base addresses */
820 76a66253 j_mayer
    target_ulong ptem;             /* Virtual segment ID | API  */
821 76a66253 j_mayer
    int key;                       /* Access key                */
822 76a66253 j_mayer
};
823 76a66253 j_mayer
824 3fc6c082 bellard
/*****************************************************************************/
825 79aceca5 bellard
CPUPPCState *cpu_ppc_init(void);
826 79aceca5 bellard
int cpu_ppc_exec(CPUPPCState *s);
827 79aceca5 bellard
void cpu_ppc_close(CPUPPCState *s);
828 79aceca5 bellard
/* you can call this signal handler from your SIGBUS and SIGSEGV
829 79aceca5 bellard
   signal handlers to inform the virtual CPU of exceptions. non zero
830 79aceca5 bellard
   is returned if the signal was handled by the virtual CPU.  */
831 5a7b542b ths
int cpu_ppc_signal_handler(int host_signum, void *pinfo, 
832 79aceca5 bellard
                           void *puc);
833 79aceca5 bellard
834 a541f297 bellard
void do_interrupt (CPUPPCState *env);
835 e9df014c j_mayer
void ppc_hw_interrupt (CPUPPCState *env);
836 9a64fbe4 bellard
void cpu_loop_exit(void);
837 a541f297 bellard
838 9a64fbe4 bellard
void dump_stack (CPUPPCState *env);
839 a541f297 bellard
840 76a66253 j_mayer
#if !defined(CONFIG_USER_ONLY)
841 3fc6c082 bellard
target_ulong do_load_ibatu (CPUPPCState *env, int nr);
842 3fc6c082 bellard
target_ulong do_load_ibatl (CPUPPCState *env, int nr);
843 3fc6c082 bellard
void do_store_ibatu (CPUPPCState *env, int nr, target_ulong value);
844 3fc6c082 bellard
void do_store_ibatl (CPUPPCState *env, int nr, target_ulong value);
845 3fc6c082 bellard
target_ulong do_load_dbatu (CPUPPCState *env, int nr);
846 3fc6c082 bellard
target_ulong do_load_dbatl (CPUPPCState *env, int nr);
847 3fc6c082 bellard
void do_store_dbatu (CPUPPCState *env, int nr, target_ulong value);
848 3fc6c082 bellard
void do_store_dbatl (CPUPPCState *env, int nr, target_ulong value);
849 3fc6c082 bellard
target_ulong do_load_sdr1 (CPUPPCState *env);
850 3fc6c082 bellard
void do_store_sdr1 (CPUPPCState *env, target_ulong value);
851 d9bce9d9 j_mayer
#if defined(TARGET_PPC64)
852 d9bce9d9 j_mayer
target_ulong ppc_load_asr (CPUPPCState *env);
853 d9bce9d9 j_mayer
void ppc_store_asr (CPUPPCState *env, target_ulong value);
854 d9bce9d9 j_mayer
#endif
855 3fc6c082 bellard
target_ulong do_load_sr (CPUPPCState *env, int srnum);
856 3fc6c082 bellard
void do_store_sr (CPUPPCState *env, int srnum, target_ulong value);
857 76a66253 j_mayer
#endif
858 76a66253 j_mayer
uint32_t ppc_load_xer (CPUPPCState *env);
859 76a66253 j_mayer
void ppc_store_xer (CPUPPCState *env, uint32_t value);
860 3fc6c082 bellard
target_ulong do_load_msr (CPUPPCState *env);
861 3fc6c082 bellard
void do_store_msr (CPUPPCState *env, target_ulong value);
862 426613db j_mayer
void ppc_store_msr_32 (CPUPPCState *env, uint32_t value);
863 3fc6c082 bellard
864 3fc6c082 bellard
void do_compute_hflags (CPUPPCState *env);
865 0a032cbe j_mayer
void cpu_ppc_reset (void *opaque);
866 0a032cbe j_mayer
CPUPPCState *cpu_ppc_init (void);
867 0a032cbe j_mayer
void cpu_ppc_close(CPUPPCState *env);
868 a541f297 bellard
869 3fc6c082 bellard
int ppc_find_by_name (const unsigned char *name, ppc_def_t **def);
870 3fc6c082 bellard
int ppc_find_by_pvr (uint32_t apvr, ppc_def_t **def);
871 3fc6c082 bellard
void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
872 3fc6c082 bellard
int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def);
873 85c4adf6 bellard
874 9fddaa0c bellard
/* Time-base and decrementer management */
875 9fddaa0c bellard
#ifndef NO_CPU_IO_DEFS
876 9fddaa0c bellard
uint32_t cpu_ppc_load_tbl (CPUPPCState *env);
877 9fddaa0c bellard
uint32_t cpu_ppc_load_tbu (CPUPPCState *env);
878 9fddaa0c bellard
void cpu_ppc_store_tbu (CPUPPCState *env, uint32_t value);
879 9fddaa0c bellard
void cpu_ppc_store_tbl (CPUPPCState *env, uint32_t value);
880 9fddaa0c bellard
uint32_t cpu_ppc_load_decr (CPUPPCState *env);
881 9fddaa0c bellard
void cpu_ppc_store_decr (CPUPPCState *env, uint32_t value);
882 d9bce9d9 j_mayer
uint32_t cpu_ppc601_load_rtcl (CPUPPCState *env);
883 d9bce9d9 j_mayer
uint32_t cpu_ppc601_load_rtcu (CPUPPCState *env);
884 d9bce9d9 j_mayer
#if !defined(CONFIG_USER_ONLY)
885 d9bce9d9 j_mayer
void cpu_ppc601_store_rtcl (CPUPPCState *env, uint32_t value);
886 d9bce9d9 j_mayer
void cpu_ppc601_store_rtcu (CPUPPCState *env, uint32_t value);
887 d9bce9d9 j_mayer
target_ulong load_40x_pit (CPUPPCState *env);
888 d9bce9d9 j_mayer
void store_40x_pit (CPUPPCState *env, target_ulong val);
889 8ecc7913 j_mayer
void store_40x_dbcr0 (CPUPPCState *env, uint32_t val);
890 c294fc58 j_mayer
void store_40x_sler (CPUPPCState *env, uint32_t val);
891 d9bce9d9 j_mayer
void store_booke_tcr (CPUPPCState *env, target_ulong val);
892 d9bce9d9 j_mayer
void store_booke_tsr (CPUPPCState *env, target_ulong val);
893 0a032cbe j_mayer
void ppc_tlb_invalidate_all (CPUPPCState *env);
894 c294fc58 j_mayer
int ppcemb_tlb_search (CPUPPCState *env, target_ulong address);
895 d9bce9d9 j_mayer
#endif
896 9fddaa0c bellard
#endif
897 79aceca5 bellard
898 2e719ba3 j_mayer
/* Device control registers */
899 2e719ba3 j_mayer
int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, target_ulong *valp);
900 2e719ba3 j_mayer
int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val);
901 2e719ba3 j_mayer
902 9467d44c ths
#define CPUState CPUPPCState
903 9467d44c ths
#define cpu_init cpu_ppc_init
904 9467d44c ths
#define cpu_exec cpu_ppc_exec
905 9467d44c ths
#define cpu_gen_code cpu_ppc_gen_code
906 9467d44c ths
#define cpu_signal_handler cpu_ppc_signal_handler
907 9467d44c ths
908 79aceca5 bellard
#include "cpu-all.h"
909 79aceca5 bellard
910 3fc6c082 bellard
/*****************************************************************************/
911 3fc6c082 bellard
/* Registers definitions */
912 79aceca5 bellard
#define ugpr(n) (env->gpr[n])
913 79aceca5 bellard
914 79aceca5 bellard
#define XER_SO 31
915 79aceca5 bellard
#define XER_OV 30
916 79aceca5 bellard
#define XER_CA 29
917 3fc6c082 bellard
#define XER_CMP 8
918 79aceca5 bellard
#define XER_BC 0
919 3fc6c082 bellard
#define xer_so  env->xer[4]
920 3fc6c082 bellard
#define xer_ov  env->xer[6]
921 3fc6c082 bellard
#define xer_ca  env->xer[2]
922 3fc6c082 bellard
#define xer_cmp env->xer[1]
923 9a64fbe4 bellard
#define xer_bc env->xer[0]
924 79aceca5 bellard
925 3fc6c082 bellard
/* SPR definitions */
926 76a66253 j_mayer
#define SPR_MQ           (0x000)
927 76a66253 j_mayer
#define SPR_XER          (0x001)
928 76a66253 j_mayer
#define SPR_601_VRTCU    (0x004)
929 76a66253 j_mayer
#define SPR_601_VRTCL    (0x005)
930 76a66253 j_mayer
#define SPR_601_UDECR    (0x006)
931 76a66253 j_mayer
#define SPR_LR           (0x008)
932 76a66253 j_mayer
#define SPR_CTR          (0x009)
933 76a66253 j_mayer
#define SPR_DSISR        (0x012)
934 76a66253 j_mayer
#define SPR_DAR          (0x013)
935 76a66253 j_mayer
#define SPR_601_RTCU     (0x014)
936 76a66253 j_mayer
#define SPR_601_RTCL     (0x015)
937 76a66253 j_mayer
#define SPR_DECR         (0x016)
938 76a66253 j_mayer
#define SPR_SDR1         (0x019)
939 76a66253 j_mayer
#define SPR_SRR0         (0x01A)
940 76a66253 j_mayer
#define SPR_SRR1         (0x01B)
941 76a66253 j_mayer
#define SPR_BOOKE_PID    (0x030)
942 76a66253 j_mayer
#define SPR_BOOKE_DECAR  (0x036)
943 363be49c j_mayer
#define SPR_BOOKE_CSRR0  (0x03A)
944 363be49c j_mayer
#define SPR_BOOKE_CSRR1  (0x03B)
945 76a66253 j_mayer
#define SPR_BOOKE_DEAR   (0x03D)
946 76a66253 j_mayer
#define SPR_BOOKE_ESR    (0x03E)
947 363be49c j_mayer
#define SPR_BOOKE_IVPR   (0x03F)
948 76a66253 j_mayer
#define SPR_8xx_EIE      (0x050)
949 76a66253 j_mayer
#define SPR_8xx_EID      (0x051)
950 76a66253 j_mayer
#define SPR_8xx_NRE      (0x052)
951 76a66253 j_mayer
#define SPR_58x_CMPA     (0x090)
952 76a66253 j_mayer
#define SPR_58x_CMPB     (0x091)
953 76a66253 j_mayer
#define SPR_58x_CMPC     (0x092)
954 76a66253 j_mayer
#define SPR_58x_CMPD     (0x093)
955 76a66253 j_mayer
#define SPR_58x_ICR      (0x094)
956 76a66253 j_mayer
#define SPR_58x_DER      (0x094)
957 76a66253 j_mayer
#define SPR_58x_COUNTA   (0x096)
958 76a66253 j_mayer
#define SPR_58x_COUNTB   (0x097)
959 76a66253 j_mayer
#define SPR_58x_CMPE     (0x098)
960 76a66253 j_mayer
#define SPR_58x_CMPF     (0x099)
961 76a66253 j_mayer
#define SPR_58x_CMPG     (0x09A)
962 76a66253 j_mayer
#define SPR_58x_CMPH     (0x09B)
963 76a66253 j_mayer
#define SPR_58x_LCTRL1   (0x09C)
964 76a66253 j_mayer
#define SPR_58x_LCTRL2   (0x09D)
965 76a66253 j_mayer
#define SPR_58x_ICTRL    (0x09E)
966 76a66253 j_mayer
#define SPR_58x_BAR      (0x09F)
967 76a66253 j_mayer
#define SPR_VRSAVE       (0x100)
968 76a66253 j_mayer
#define SPR_USPRG0       (0x100)
969 363be49c j_mayer
#define SPR_USPRG1       (0x101)
970 363be49c j_mayer
#define SPR_USPRG2       (0x102)
971 363be49c j_mayer
#define SPR_USPRG3       (0x103)
972 76a66253 j_mayer
#define SPR_USPRG4       (0x104)
973 76a66253 j_mayer
#define SPR_USPRG5       (0x105)
974 76a66253 j_mayer
#define SPR_USPRG6       (0x106)
975 76a66253 j_mayer
#define SPR_USPRG7       (0x107)
976 76a66253 j_mayer
#define SPR_VTBL         (0x10C)
977 76a66253 j_mayer
#define SPR_VTBU         (0x10D)
978 76a66253 j_mayer
#define SPR_SPRG0        (0x110)
979 76a66253 j_mayer
#define SPR_SPRG1        (0x111)
980 76a66253 j_mayer
#define SPR_SPRG2        (0x112)
981 76a66253 j_mayer
#define SPR_SPRG3        (0x113)
982 76a66253 j_mayer
#define SPR_SPRG4        (0x114)
983 76a66253 j_mayer
#define SPR_SCOMC        (0x114)
984 76a66253 j_mayer
#define SPR_SPRG5        (0x115)
985 76a66253 j_mayer
#define SPR_SCOMD        (0x115)
986 76a66253 j_mayer
#define SPR_SPRG6        (0x116)
987 76a66253 j_mayer
#define SPR_SPRG7        (0x117)
988 76a66253 j_mayer
#define SPR_ASR          (0x118)
989 76a66253 j_mayer
#define SPR_EAR          (0x11A)
990 76a66253 j_mayer
#define SPR_TBL          (0x11C)
991 76a66253 j_mayer
#define SPR_TBU          (0x11D)
992 76a66253 j_mayer
#define SPR_SVR          (0x11E)
993 76a66253 j_mayer
#define SPR_BOOKE_PIR    (0x11E)
994 76a66253 j_mayer
#define SPR_PVR          (0x11F)
995 76a66253 j_mayer
#define SPR_HSPRG0       (0x130)
996 76a66253 j_mayer
#define SPR_BOOKE_DBSR   (0x130)
997 76a66253 j_mayer
#define SPR_HSPRG1       (0x131)
998 76a66253 j_mayer
#define SPR_BOOKE_DBCR0  (0x134)
999 76a66253 j_mayer
#define SPR_IBCR         (0x135)
1000 76a66253 j_mayer
#define SPR_BOOKE_DBCR1  (0x135)
1001 76a66253 j_mayer
#define SPR_DBCR         (0x136)
1002 76a66253 j_mayer
#define SPR_HDEC         (0x136)
1003 76a66253 j_mayer
#define SPR_BOOKE_DBCR2  (0x136)
1004 76a66253 j_mayer
#define SPR_HIOR         (0x137)
1005 76a66253 j_mayer
#define SPR_MBAR         (0x137)
1006 76a66253 j_mayer
#define SPR_RMOR         (0x138)
1007 76a66253 j_mayer
#define SPR_BOOKE_IAC1   (0x138)
1008 76a66253 j_mayer
#define SPR_HRMOR        (0x139)
1009 76a66253 j_mayer
#define SPR_BOOKE_IAC2   (0x139)
1010 76a66253 j_mayer
#define SPR_HSSR0        (0x13A)
1011 76a66253 j_mayer
#define SPR_BOOKE_IAC3   (0x13A)
1012 76a66253 j_mayer
#define SPR_HSSR1        (0x13B)
1013 76a66253 j_mayer
#define SPR_BOOKE_IAC4   (0x13B)
1014 76a66253 j_mayer
#define SPR_LPCR         (0x13C)
1015 76a66253 j_mayer
#define SPR_BOOKE_DAC1   (0x13C)
1016 76a66253 j_mayer
#define SPR_LPIDR        (0x13D)
1017 76a66253 j_mayer
#define SPR_DABR2        (0x13D)
1018 76a66253 j_mayer
#define SPR_BOOKE_DAC2   (0x13D)
1019 76a66253 j_mayer
#define SPR_BOOKE_DVC1   (0x13E)
1020 76a66253 j_mayer
#define SPR_BOOKE_DVC2   (0x13F)
1021 76a66253 j_mayer
#define SPR_BOOKE_TSR    (0x150)
1022 76a66253 j_mayer
#define SPR_BOOKE_TCR    (0x154)
1023 76a66253 j_mayer
#define SPR_BOOKE_IVOR0  (0x190)
1024 76a66253 j_mayer
#define SPR_BOOKE_IVOR1  (0x191)
1025 76a66253 j_mayer
#define SPR_BOOKE_IVOR2  (0x192)
1026 76a66253 j_mayer
#define SPR_BOOKE_IVOR3  (0x193)
1027 76a66253 j_mayer
#define SPR_BOOKE_IVOR4  (0x194)
1028 76a66253 j_mayer
#define SPR_BOOKE_IVOR5  (0x195)
1029 76a66253 j_mayer
#define SPR_BOOKE_IVOR6  (0x196)
1030 76a66253 j_mayer
#define SPR_BOOKE_IVOR7  (0x197)
1031 76a66253 j_mayer
#define SPR_BOOKE_IVOR8  (0x198)
1032 76a66253 j_mayer
#define SPR_BOOKE_IVOR9  (0x199)
1033 76a66253 j_mayer
#define SPR_BOOKE_IVOR10 (0x19A)
1034 76a66253 j_mayer
#define SPR_BOOKE_IVOR11 (0x19B)
1035 76a66253 j_mayer
#define SPR_BOOKE_IVOR12 (0x19C)
1036 76a66253 j_mayer
#define SPR_BOOKE_IVOR13 (0x19D)
1037 76a66253 j_mayer
#define SPR_BOOKE_IVOR14 (0x19E)
1038 76a66253 j_mayer
#define SPR_BOOKE_IVOR15 (0x19F)
1039 76a66253 j_mayer
#define SPR_E500_SPEFSCR (0x200)
1040 76a66253 j_mayer
#define SPR_E500_BBEAR   (0x201)
1041 76a66253 j_mayer
#define SPR_E500_BBTAR   (0x202)
1042 76a66253 j_mayer
#define SPR_BOOKE_ATBL   (0x20E)
1043 76a66253 j_mayer
#define SPR_BOOKE_ATBU   (0x20F)
1044 76a66253 j_mayer
#define SPR_IBAT0U       (0x210)
1045 363be49c j_mayer
#define SPR_BOOKE_IVOR32 (0x210)
1046 76a66253 j_mayer
#define SPR_IBAT0L       (0x211)
1047 363be49c j_mayer
#define SPR_BOOKE_IVOR33 (0x211)
1048 76a66253 j_mayer
#define SPR_IBAT1U       (0x212)
1049 363be49c j_mayer
#define SPR_BOOKE_IVOR34 (0x212)
1050 76a66253 j_mayer
#define SPR_IBAT1L       (0x213)
1051 363be49c j_mayer
#define SPR_BOOKE_IVOR35 (0x213)
1052 76a66253 j_mayer
#define SPR_IBAT2U       (0x214)
1053 363be49c j_mayer
#define SPR_BOOKE_IVOR36 (0x214)
1054 76a66253 j_mayer
#define SPR_IBAT2L       (0x215)
1055 76a66253 j_mayer
#define SPR_E500_L1CFG0  (0x215)
1056 363be49c j_mayer
#define SPR_BOOKE_IVOR37 (0x215)
1057 76a66253 j_mayer
#define SPR_IBAT3U       (0x216)
1058 76a66253 j_mayer
#define SPR_E500_L1CFG1  (0x216)
1059 76a66253 j_mayer
#define SPR_IBAT3L       (0x217)
1060 76a66253 j_mayer
#define SPR_DBAT0U       (0x218)
1061 76a66253 j_mayer
#define SPR_DBAT0L       (0x219)
1062 76a66253 j_mayer
#define SPR_DBAT1U       (0x21A)
1063 76a66253 j_mayer
#define SPR_DBAT1L       (0x21B)
1064 76a66253 j_mayer
#define SPR_DBAT2U       (0x21C)
1065 76a66253 j_mayer
#define SPR_DBAT2L       (0x21D)
1066 76a66253 j_mayer
#define SPR_DBAT3U       (0x21E)
1067 76a66253 j_mayer
#define SPR_DBAT3L       (0x21F)
1068 76a66253 j_mayer
#define SPR_IBAT4U       (0x230)
1069 76a66253 j_mayer
#define SPR_IBAT4L       (0x231)
1070 76a66253 j_mayer
#define SPR_IBAT5U       (0x232)
1071 76a66253 j_mayer
#define SPR_IBAT5L       (0x233)
1072 76a66253 j_mayer
#define SPR_IBAT6U       (0x234)
1073 76a66253 j_mayer
#define SPR_IBAT6L       (0x235)
1074 76a66253 j_mayer
#define SPR_IBAT7U       (0x236)
1075 76a66253 j_mayer
#define SPR_IBAT7L       (0x237)
1076 76a66253 j_mayer
#define SPR_DBAT4U       (0x238)
1077 76a66253 j_mayer
#define SPR_DBAT4L       (0x239)
1078 76a66253 j_mayer
#define SPR_DBAT5U       (0x23A)
1079 363be49c j_mayer
#define SPR_BOOKE_MCSRR0 (0x23A)
1080 76a66253 j_mayer
#define SPR_DBAT5L       (0x23B)
1081 363be49c j_mayer
#define SPR_BOOKE_MCSRR1 (0x23B)
1082 76a66253 j_mayer
#define SPR_DBAT6U       (0x23C)
1083 363be49c j_mayer
#define SPR_BOOKE_MCSR   (0x23C)
1084 76a66253 j_mayer
#define SPR_DBAT6L       (0x23D)
1085 76a66253 j_mayer
#define SPR_E500_MCAR    (0x23D)
1086 76a66253 j_mayer
#define SPR_DBAT7U       (0x23E)
1087 363be49c j_mayer
#define SPR_BOOKE_DSRR0  (0x23E)
1088 76a66253 j_mayer
#define SPR_DBAT7L       (0x23F)
1089 363be49c j_mayer
#define SPR_BOOKE_DSRR1  (0x23F)
1090 363be49c j_mayer
#define SPR_BOOKE_SPRG8  (0x25C)
1091 363be49c j_mayer
#define SPR_BOOKE_SPRG9  (0x25D)
1092 363be49c j_mayer
#define SPR_BOOKE_MAS0   (0x270)
1093 363be49c j_mayer
#define SPR_BOOKE_MAS1   (0x271)
1094 363be49c j_mayer
#define SPR_BOOKE_MAS2   (0x272)
1095 363be49c j_mayer
#define SPR_BOOKE_MAS3   (0x273)
1096 363be49c j_mayer
#define SPR_BOOKE_MAS4   (0x274)
1097 363be49c j_mayer
#define SPR_BOOKE_MAS6   (0x276)
1098 363be49c j_mayer
#define SPR_BOOKE_PID1   (0x279)
1099 363be49c j_mayer
#define SPR_BOOKE_PID2   (0x27A)
1100 363be49c j_mayer
#define SPR_BOOKE_TLB0CFG (0x2B0)
1101 363be49c j_mayer
#define SPR_BOOKE_TLB1CFG (0x2B1)
1102 363be49c j_mayer
#define SPR_BOOKE_TLB2CFG (0x2B2)
1103 363be49c j_mayer
#define SPR_BOOKE_TLB3CFG (0x2B3)
1104 363be49c j_mayer
#define SPR_BOOKE_EPR    (0x2BE)
1105 76a66253 j_mayer
#define SPR_440_INV0     (0x370)
1106 76a66253 j_mayer
#define SPR_440_INV1     (0x371)
1107 76a66253 j_mayer
#define SPR_440_INV2     (0x372)
1108 76a66253 j_mayer
#define SPR_440_INV3     (0x373)
1109 76a66253 j_mayer
#define SPR_440_IVT0     (0x374)
1110 76a66253 j_mayer
#define SPR_440_IVT1     (0x375)
1111 76a66253 j_mayer
#define SPR_440_IVT2     (0x376)
1112 76a66253 j_mayer
#define SPR_440_IVT3     (0x377)
1113 76a66253 j_mayer
#define SPR_440_DNV0     (0x390)
1114 76a66253 j_mayer
#define SPR_440_DNV1     (0x391)
1115 76a66253 j_mayer
#define SPR_440_DNV2     (0x392)
1116 76a66253 j_mayer
#define SPR_440_DNV3     (0x393)
1117 76a66253 j_mayer
#define SPR_440_DVT0     (0x394)
1118 76a66253 j_mayer
#define SPR_440_DVT1     (0x395)
1119 76a66253 j_mayer
#define SPR_440_DVT2     (0x396)
1120 76a66253 j_mayer
#define SPR_440_DVT3     (0x397)
1121 76a66253 j_mayer
#define SPR_440_DVLIM    (0x398)
1122 76a66253 j_mayer
#define SPR_440_IVLIM    (0x399)
1123 76a66253 j_mayer
#define SPR_440_RSTCFG   (0x39B)
1124 363be49c j_mayer
#define SPR_BOOKE_DCBTRL (0x39C)
1125 363be49c j_mayer
#define SPR_BOOKE_DCBTRH (0x39D)
1126 363be49c j_mayer
#define SPR_BOOKE_ICBTRL (0x39E)
1127 363be49c j_mayer
#define SPR_BOOKE_ICBTRH (0x39F)
1128 76a66253 j_mayer
#define SPR_UMMCR0       (0x3A8)
1129 76a66253 j_mayer
#define SPR_UPMC1        (0x3A9)
1130 76a66253 j_mayer
#define SPR_UPMC2        (0x3AA)
1131 76a66253 j_mayer
#define SPR_USIA         (0x3AB)
1132 76a66253 j_mayer
#define SPR_UMMCR1       (0x3AC)
1133 76a66253 j_mayer
#define SPR_UPMC3        (0x3AD)
1134 76a66253 j_mayer
#define SPR_UPMC4        (0x3AE)
1135 76a66253 j_mayer
#define SPR_USDA         (0x3AF)
1136 76a66253 j_mayer
#define SPR_40x_ZPR      (0x3B0)
1137 363be49c j_mayer
#define SPR_BOOKE_MAS7   (0x3B0)
1138 76a66253 j_mayer
#define SPR_40x_PID      (0x3B1)
1139 76a66253 j_mayer
#define SPR_440_MMUCR    (0x3B2)
1140 76a66253 j_mayer
#define SPR_4xx_CCR0     (0x3B3)
1141 363be49c j_mayer
#define SPR_BOOKE_EPLC   (0x3B3)
1142 76a66253 j_mayer
#define SPR_405_IAC3     (0x3B4)
1143 363be49c j_mayer
#define SPR_BOOKE_EPSC   (0x3B4)
1144 76a66253 j_mayer
#define SPR_405_IAC4     (0x3B5)
1145 76a66253 j_mayer
#define SPR_405_DVC1     (0x3B6)
1146 76a66253 j_mayer
#define SPR_405_DVC2     (0x3B7)
1147 76a66253 j_mayer
#define SPR_MMCR0        (0x3B8)
1148 76a66253 j_mayer
#define SPR_PMC1         (0x3B9)
1149 76a66253 j_mayer
#define SPR_40x_SGR      (0x3B9)
1150 76a66253 j_mayer
#define SPR_PMC2         (0x3BA)
1151 76a66253 j_mayer
#define SPR_40x_DCWR     (0x3BA)
1152 76a66253 j_mayer
#define SPR_SIA          (0x3BB)
1153 76a66253 j_mayer
#define SPR_405_SLER     (0x3BB)
1154 76a66253 j_mayer
#define SPR_MMCR1        (0x3BC)
1155 76a66253 j_mayer
#define SPR_405_SU0R     (0x3BC)
1156 76a66253 j_mayer
#define SPR_PMC3         (0x3BD)
1157 76a66253 j_mayer
#define SPR_405_DBCR1    (0x3BD)
1158 76a66253 j_mayer
#define SPR_PMC4         (0x3BE)
1159 76a66253 j_mayer
#define SPR_SDA          (0x3BF)
1160 76a66253 j_mayer
#define SPR_403_VTBL     (0x3CC)
1161 76a66253 j_mayer
#define SPR_403_VTBU     (0x3CD)
1162 76a66253 j_mayer
#define SPR_DMISS        (0x3D0)
1163 76a66253 j_mayer
#define SPR_DCMP         (0x3D1)
1164 76a66253 j_mayer
#define SPR_HASH1        (0x3D2)
1165 76a66253 j_mayer
#define SPR_HASH2        (0x3D3)
1166 363be49c j_mayer
#define SPR_BOOKE_ICBDR  (0x3D3)
1167 76a66253 j_mayer
#define SPR_IMISS        (0x3D4)
1168 76a66253 j_mayer
#define SPR_40x_ESR      (0x3D4)
1169 76a66253 j_mayer
#define SPR_ICMP         (0x3D5)
1170 76a66253 j_mayer
#define SPR_40x_DEAR     (0x3D5)
1171 76a66253 j_mayer
#define SPR_RPA          (0x3D6)
1172 76a66253 j_mayer
#define SPR_40x_EVPR     (0x3D6)
1173 76a66253 j_mayer
#define SPR_403_CDBCR    (0x3D7)
1174 76a66253 j_mayer
#define SPR_TCR          (0x3D8)
1175 76a66253 j_mayer
#define SPR_40x_TSR      (0x3D8)
1176 76a66253 j_mayer
#define SPR_IBR          (0x3DA)
1177 76a66253 j_mayer
#define SPR_40x_TCR      (0x3DA)
1178 76a66253 j_mayer
#define SPR_ESASR        (0x3DB)
1179 76a66253 j_mayer
#define SPR_40x_PIT      (0x3DB)
1180 76a66253 j_mayer
#define SPR_403_TBL      (0x3DC)
1181 76a66253 j_mayer
#define SPR_403_TBU      (0x3DD)
1182 76a66253 j_mayer
#define SPR_SEBR         (0x3DE)
1183 76a66253 j_mayer
#define SPR_40x_SRR2     (0x3DE)
1184 76a66253 j_mayer
#define SPR_SER          (0x3DF)
1185 76a66253 j_mayer
#define SPR_40x_SRR3     (0x3DF)
1186 76a66253 j_mayer
#define SPR_HID0         (0x3F0)
1187 76a66253 j_mayer
#define SPR_40x_DBSR     (0x3F0)
1188 76a66253 j_mayer
#define SPR_HID1         (0x3F1)
1189 76a66253 j_mayer
#define SPR_IABR         (0x3F2)
1190 76a66253 j_mayer
#define SPR_40x_DBCR0    (0x3F2)
1191 76a66253 j_mayer
#define SPR_601_HID2     (0x3F2)
1192 76a66253 j_mayer
#define SPR_E500_L1CSR0  (0x3F2)
1193 76a66253 j_mayer
#define SPR_HID2         (0x3F3)
1194 76a66253 j_mayer
#define SPR_E500_L1CSR1  (0x3F3)
1195 76a66253 j_mayer
#define SPR_440_DBDR     (0x3F3)
1196 76a66253 j_mayer
#define SPR_40x_IAC1     (0x3F4)
1197 363be49c j_mayer
#define SPR_BOOKE_MMUCSR0 (0x3F4)
1198 76a66253 j_mayer
#define SPR_DABR         (0x3F5)
1199 3fc6c082 bellard
#define DABR_MASK (~(target_ulong)0x7)
1200 76a66253 j_mayer
#define SPR_E500_BUCSR   (0x3F5)
1201 76a66253 j_mayer
#define SPR_40x_IAC2     (0x3F5)
1202 76a66253 j_mayer
#define SPR_601_HID5     (0x3F5)
1203 76a66253 j_mayer
#define SPR_40x_DAC1     (0x3F6)
1204 76a66253 j_mayer
#define SPR_40x_DAC2     (0x3F7)
1205 363be49c j_mayer
#define SPR_BOOKE_MMUCFG (0x3F7)
1206 76a66253 j_mayer
#define SPR_L2PM         (0x3F8)
1207 76a66253 j_mayer
#define SPR_750_HID2     (0x3F8)
1208 76a66253 j_mayer
#define SPR_L2CR         (0x3F9)
1209 76a66253 j_mayer
#define SPR_IABR2        (0x3FA)
1210 76a66253 j_mayer
#define SPR_40x_DCCR     (0x3FA)
1211 76a66253 j_mayer
#define SPR_ICTC         (0x3FB)
1212 76a66253 j_mayer
#define SPR_40x_ICCR     (0x3FB)
1213 76a66253 j_mayer
#define SPR_THRM1        (0x3FC)
1214 76a66253 j_mayer
#define SPR_403_PBL1     (0x3FC)
1215 76a66253 j_mayer
#define SPR_SP           (0x3FD)
1216 76a66253 j_mayer
#define SPR_THRM2        (0x3FD)
1217 76a66253 j_mayer
#define SPR_403_PBU1     (0x3FD)
1218 76a66253 j_mayer
#define SPR_LT           (0x3FE)
1219 76a66253 j_mayer
#define SPR_THRM3        (0x3FE)
1220 76a66253 j_mayer
#define SPR_FPECR        (0x3FE)
1221 76a66253 j_mayer
#define SPR_403_PBL2     (0x3FE)
1222 76a66253 j_mayer
#define SPR_PIR          (0x3FF)
1223 76a66253 j_mayer
#define SPR_403_PBU2     (0x3FF)
1224 76a66253 j_mayer
#define SPR_601_HID15    (0x3FF)
1225 76a66253 j_mayer
#define SPR_E500_SVR     (0x3FF)
1226 79aceca5 bellard
1227 76a66253 j_mayer
/*****************************************************************************/
1228 9a64fbe4 bellard
/* Memory access type :
1229 9a64fbe4 bellard
 * may be needed for precise access rights control and precise exceptions.
1230 9a64fbe4 bellard
 */
1231 79aceca5 bellard
enum {
1232 9a64fbe4 bellard
    /* 1 bit to define user level / supervisor access */
1233 9a64fbe4 bellard
    ACCESS_USER  = 0x00,
1234 9a64fbe4 bellard
    ACCESS_SUPER = 0x01,
1235 9a64fbe4 bellard
    /* Type of instruction that generated the access */
1236 9a64fbe4 bellard
    ACCESS_CODE  = 0x10, /* Code fetch access                */
1237 9a64fbe4 bellard
    ACCESS_INT   = 0x20, /* Integer load/store access        */
1238 9a64fbe4 bellard
    ACCESS_FLOAT = 0x30, /* floating point load/store access */
1239 9a64fbe4 bellard
    ACCESS_RES   = 0x40, /* load/store with reservation      */
1240 9a64fbe4 bellard
    ACCESS_EXT   = 0x50, /* external access                  */
1241 9a64fbe4 bellard
    ACCESS_CACHE = 0x60, /* Cache manipulation               */
1242 9a64fbe4 bellard
};
1243 9a64fbe4 bellard
1244 9a64fbe4 bellard
/*****************************************************************************/
1245 9a64fbe4 bellard
/* Exceptions */
1246 2be0071f bellard
#define EXCP_NONE          -1
1247 2be0071f bellard
/* PowerPC hardware exceptions : exception vectors defined in PowerPC book 3 */
1248 2be0071f bellard
#define EXCP_RESET         0x0100 /* System reset                            */
1249 2be0071f bellard
#define EXCP_MACHINE_CHECK 0x0200 /* Machine check exception                 */
1250 2be0071f bellard
#define EXCP_DSI           0x0300 /* Data storage exception                  */
1251 2be0071f bellard
#define EXCP_DSEG          0x0380 /* Data segment exception                  */
1252 2be0071f bellard
#define EXCP_ISI           0x0400 /* Instruction storage exception           */
1253 2be0071f bellard
#define EXCP_ISEG          0x0480 /* Instruction segment exception           */
1254 2be0071f bellard
#define EXCP_EXTERNAL      0x0500 /* External interruption                   */
1255 2be0071f bellard
#define EXCP_ALIGN         0x0600 /* Alignment exception                     */
1256 2be0071f bellard
#define EXCP_PROGRAM       0x0700 /* Program exception                       */
1257 2be0071f bellard
#define EXCP_NO_FP         0x0800 /* Floating point unavailable exception    */
1258 2be0071f bellard
#define EXCP_DECR          0x0900 /* Decrementer exception                   */
1259 2be0071f bellard
#define EXCP_HDECR         0x0980 /* Hypervisor decrementer exception        */
1260 2be0071f bellard
#define EXCP_SYSCALL       0x0C00 /* System call                             */
1261 2be0071f bellard
#define EXCP_TRACE         0x0D00 /* Trace exception                         */
1262 2be0071f bellard
#define EXCP_PERF          0x0F00 /* Performance monitor exception           */
1263 2be0071f bellard
/* Exceptions defined in PowerPC 32 bits programming environment manual      */
1264 2be0071f bellard
#define EXCP_FP_ASSIST     0x0E00 /* Floating-point assist                   */
1265 2be0071f bellard
/* Implementation specific exceptions                                        */
1266 2be0071f bellard
/* 40x exceptions                                                            */
1267 2be0071f bellard
#define EXCP_40x_PIT       0x1000 /* Programmable interval timer interrupt   */
1268 2be0071f bellard
#define EXCP_40x_FIT       0x1010 /* Fixed interval timer interrupt          */
1269 2be0071f bellard
#define EXCP_40x_WATCHDOG  0x1020 /* Watchdog timer exception                */
1270 2be0071f bellard
#define EXCP_40x_DTLBMISS  0x1100 /* Data TLB miss exception                 */
1271 2be0071f bellard
#define EXCP_40x_ITLBMISS  0x1200 /* Instruction TLB miss exception          */
1272 2be0071f bellard
#define EXCP_40x_DEBUG     0x2000 /* Debug exception                         */
1273 2be0071f bellard
/* 405 specific exceptions                                                   */
1274 2be0071f bellard
#define EXCP_405_APU       0x0F20 /* APU unavailable exception               */
1275 2be0071f bellard
/* TLB assist exceptions (602/603)                                           */
1276 2be0071f bellard
#define EXCP_I_TLBMISS     0x1000 /* Instruction TLB miss                    */
1277 2be0071f bellard
#define EXCP_DL_TLBMISS    0x1100 /* Data load TLB miss                      */
1278 2be0071f bellard
#define EXCP_DS_TLBMISS    0x1200 /* Data store TLB miss                     */
1279 2be0071f bellard
/* Breakpoint exceptions (602/603/604/620/740/745/750/755...)                */
1280 2be0071f bellard
#define EXCP_IABR          0x1300 /* Instruction address breakpoint          */
1281 2be0071f bellard
#define EXCP_SMI           0x1400 /* System management interrupt             */
1282 2be0071f bellard
/* Altivec related exceptions                                                */
1283 2be0071f bellard
#define EXCP_VPU           0x0F20 /* VPU unavailable exception               */
1284 2be0071f bellard
/* 601 specific exceptions                                                   */
1285 2be0071f bellard
#define EXCP_601_IO        0x0600 /* IO error exception                      */
1286 2be0071f bellard
#define EXCP_601_RUNM      0x2000 /* Run mode exception                      */
1287 2be0071f bellard
/* 602 specific exceptions                                                   */
1288 2be0071f bellard
#define EXCP_602_WATCHDOG  0x1500 /* Watchdog exception                      */
1289 2be0071f bellard
#define EXCP_602_EMUL      0x1600 /* Emulation trap exception                */
1290 2be0071f bellard
/* G2 specific exceptions                                                    */
1291 2be0071f bellard
#define EXCP_G2_CRIT       0x0A00 /* Critical interrupt                      */
1292 2be0071f bellard
/* MPC740/745/750 & IBM 750 specific exceptions                              */
1293 2be0071f bellard
#define EXCP_THRM          0x1700 /* Thermal management interrupt            */
1294 2be0071f bellard
/* 74xx specific exceptions                                                  */
1295 2be0071f bellard
#define EXCP_74xx_VPUA     0x1600 /* VPU assist exception                    */
1296 2be0071f bellard
/* 970FX specific exceptions                                                 */
1297 2be0071f bellard
#define EXCP_970_SOFTP     0x1500 /* Soft patch exception                    */
1298 2be0071f bellard
#define EXCP_970_MAINT     0x1600 /* Maintenance exception                   */
1299 2be0071f bellard
#define EXCP_970_THRM      0x1800 /* Thermal exception                       */
1300 2be0071f bellard
#define EXCP_970_VPUA      0x1700 /* VPU assist exception                    */
1301 0487d6a8 j_mayer
/* SPE related exceptions                                                    */
1302 0487d6a8 j_mayer
#define EXCP_NO_SPE        0x0F20 /* SPE unavailable exception               */
1303 2be0071f bellard
/* End of exception vectors area                                             */
1304 2be0071f bellard
#define EXCP_PPC_MAX       0x4000
1305 2be0071f bellard
/* Qemu exceptions: special cases we want to stop translation                */
1306 2be0071f bellard
#define EXCP_MTMSR         0x11000 /* mtmsr instruction:                     */
1307 76a66253 j_mayer
                                   /* may change privilege level             */
1308 2be0071f bellard
#define EXCP_BRANCH        0x11001 /* branch instruction                     */
1309 2be0071f bellard
#define EXCP_SYSCALL_USER  0x12000 /* System call in user mode only          */
1310 2be0071f bellard
#define EXCP_INTERRUPT_CRITICAL 0x13000 /* critical IRQ                      */
1311 2be0071f bellard
1312 9a64fbe4 bellard
/* Error codes */
1313 9a64fbe4 bellard
enum {
1314 9a64fbe4 bellard
    /* Exception subtypes for EXCP_ALIGN                            */
1315 9a64fbe4 bellard
    EXCP_ALIGN_FP      = 0x01,  /* FP alignment exception           */
1316 9a64fbe4 bellard
    EXCP_ALIGN_LST     = 0x02,  /* Unaligned mult/extern load/store */
1317 9a64fbe4 bellard
    EXCP_ALIGN_LE      = 0x03,  /* Multiple little-endian access    */
1318 9a64fbe4 bellard
    EXCP_ALIGN_PROT    = 0x04,  /* Access cross protection boundary */
1319 9a64fbe4 bellard
    EXCP_ALIGN_BAT     = 0x05,  /* Access cross a BAT/seg boundary  */
1320 9a64fbe4 bellard
    EXCP_ALIGN_CACHE   = 0x06,  /* Impossible dcbz access           */
1321 9a64fbe4 bellard
    /* Exception subtypes for EXCP_PROGRAM                          */
1322 79aceca5 bellard
    /* FP exceptions */
1323 9a64fbe4 bellard
    EXCP_FP            = 0x10,
1324 9a64fbe4 bellard
    EXCP_FP_OX         = 0x01,  /* FP overflow                      */
1325 9a64fbe4 bellard
    EXCP_FP_UX         = 0x02,  /* FP underflow                     */
1326 9a64fbe4 bellard
    EXCP_FP_ZX         = 0x03,  /* FP divide by zero                */
1327 9a64fbe4 bellard
    EXCP_FP_XX         = 0x04,  /* FP inexact                       */
1328 9a64fbe4 bellard
    EXCP_FP_VXNAN      = 0x05,  /* FP invalid SNaN op               */
1329 0cfec834 ths
    EXCP_FP_VXISI      = 0x06,  /* FP invalid infinite subtraction */
1330 9a64fbe4 bellard
    EXCP_FP_VXIDI      = 0x07,  /* FP invalid infinite divide       */
1331 9a64fbe4 bellard
    EXCP_FP_VXZDZ      = 0x08,  /* FP invalid zero divide           */
1332 9a64fbe4 bellard
    EXCP_FP_VXIMZ      = 0x09,  /* FP invalid infinite * zero       */
1333 9a64fbe4 bellard
    EXCP_FP_VXVC       = 0x0A,  /* FP invalid compare               */
1334 9a64fbe4 bellard
    EXCP_FP_VXSOFT     = 0x0B,  /* FP invalid operation             */
1335 9a64fbe4 bellard
    EXCP_FP_VXSQRT     = 0x0C,  /* FP invalid square root           */
1336 9a64fbe4 bellard
    EXCP_FP_VXCVI      = 0x0D,  /* FP invalid integer conversion    */
1337 79aceca5 bellard
    /* Invalid instruction */
1338 9a64fbe4 bellard
    EXCP_INVAL         = 0x20,
1339 9a64fbe4 bellard
    EXCP_INVAL_INVAL   = 0x01,  /* Invalid instruction              */
1340 9a64fbe4 bellard
    EXCP_INVAL_LSWX    = 0x02,  /* Invalid lswx instruction         */
1341 9a64fbe4 bellard
    EXCP_INVAL_SPR     = 0x03,  /* Invalid SPR access               */
1342 9a64fbe4 bellard
    EXCP_INVAL_FP      = 0x04,  /* Unimplemented mandatory fp instr */
1343 79aceca5 bellard
    /* Privileged instruction */
1344 9a64fbe4 bellard
    EXCP_PRIV          = 0x30,
1345 9a64fbe4 bellard
    EXCP_PRIV_OPC      = 0x01,
1346 9a64fbe4 bellard
    EXCP_PRIV_REG      = 0x02,
1347 79aceca5 bellard
    /* Trap */
1348 9a64fbe4 bellard
    EXCP_TRAP          = 0x40,
1349 79aceca5 bellard
};
1350 79aceca5 bellard
1351 47103572 j_mayer
/* Hardware interruption sources:
1352 47103572 j_mayer
 * all those exception can be raised simulteaneously
1353 47103572 j_mayer
 */
1354 e9df014c j_mayer
/* Input pins definitions */
1355 e9df014c j_mayer
enum {
1356 e9df014c j_mayer
    /* 6xx bus input pins */
1357 24be5ae3 j_mayer
    PPC6xx_INPUT_HRESET     = 0,
1358 24be5ae3 j_mayer
    PPC6xx_INPUT_SRESET     = 1,
1359 24be5ae3 j_mayer
    PPC6xx_INPUT_CKSTP_IN   = 2,
1360 24be5ae3 j_mayer
    PPC6xx_INPUT_MCP        = 3,
1361 24be5ae3 j_mayer
    PPC6xx_INPUT_SMI        = 4,
1362 24be5ae3 j_mayer
    PPC6xx_INPUT_INT        = 5,
1363 24be5ae3 j_mayer
};
1364 24be5ae3 j_mayer
1365 24be5ae3 j_mayer
enum {
1366 e9df014c j_mayer
    /* Embedded PowerPC input pins */
1367 24be5ae3 j_mayer
    PPCBookE_INPUT_HRESET     = 0,
1368 24be5ae3 j_mayer
    PPCBookE_INPUT_SRESET     = 1,
1369 24be5ae3 j_mayer
    PPCBookE_INPUT_CKSTP_IN   = 2,
1370 24be5ae3 j_mayer
    PPCBookE_INPUT_MCP        = 3,
1371 24be5ae3 j_mayer
    PPCBookE_INPUT_SMI        = 4,
1372 24be5ae3 j_mayer
    PPCBookE_INPUT_INT        = 5,
1373 24be5ae3 j_mayer
    PPCBookE_INPUT_CINT       = 6,
1374 24be5ae3 j_mayer
};
1375 24be5ae3 j_mayer
1376 24be5ae3 j_mayer
enum {
1377 24be5ae3 j_mayer
    /* PowerPC 405 input pins */
1378 24be5ae3 j_mayer
    PPC405_INPUT_RESET_CORE = 0,
1379 24be5ae3 j_mayer
    PPC405_INPUT_RESET_CHIP = 1,
1380 24be5ae3 j_mayer
    PPC405_INPUT_RESET_SYS  = 2,
1381 24be5ae3 j_mayer
    PPC405_INPUT_CINT       = 3,
1382 24be5ae3 j_mayer
    PPC405_INPUT_INT        = 4,
1383 24be5ae3 j_mayer
    PPC405_INPUT_HALT       = 5,
1384 24be5ae3 j_mayer
    PPC405_INPUT_DEBUG      = 6,
1385 e9df014c j_mayer
};
1386 e9df014c j_mayer
1387 d0dfae6e j_mayer
enum {
1388 d0dfae6e j_mayer
    /* PowerPC 970 input pins */
1389 d0dfae6e j_mayer
    PPC970_INPUT_HRESET     = 0,
1390 d0dfae6e j_mayer
    PPC970_INPUT_SRESET     = 1,
1391 d0dfae6e j_mayer
    PPC970_INPUT_CKSTP      = 2,
1392 d0dfae6e j_mayer
    PPC970_INPUT_TBEN       = 3,
1393 d0dfae6e j_mayer
    PPC970_INPUT_MCP        = 4,
1394 d0dfae6e j_mayer
    PPC970_INPUT_INT        = 5,
1395 d0dfae6e j_mayer
    PPC970_INPUT_THINT      = 6,
1396 d0dfae6e j_mayer
};
1397 d0dfae6e j_mayer
1398 e9df014c j_mayer
/* Hardware exceptions definitions */
1399 47103572 j_mayer
enum {
1400 e9df014c j_mayer
    /* External hardware exception sources */
1401 e9df014c j_mayer
    PPC_INTERRUPT_RESET  = 0,  /* Reset exception                      */
1402 e9df014c j_mayer
    PPC_INTERRUPT_MCK    = 1,  /* Machine check exception              */
1403 e9df014c j_mayer
    PPC_INTERRUPT_EXT    = 2,  /* External interrupt                   */
1404 e9df014c j_mayer
    PPC_INTERRUPT_SMI    = 3,  /* System management interrupt          */
1405 e9df014c j_mayer
    PPC_INTERRUPT_CEXT   = 4,  /* Critical external interrupt          */
1406 e9df014c j_mayer
    PPC_INTERRUPT_DEBUG  = 5,  /* External debug exception             */
1407 d0dfae6e j_mayer
    PPC_INTERRUPT_THERM  = 6,  /* Thermal exception                    */
1408 e9df014c j_mayer
    /* Internal hardware exception sources */
1409 d0dfae6e j_mayer
    PPC_INTERRUPT_DECR   = 7,  /* Decrementer exception                */
1410 d0dfae6e j_mayer
    PPC_INTERRUPT_HDECR  = 8,  /* Hypervisor decrementer exception     */
1411 d0dfae6e j_mayer
    PPC_INTERRUPT_PIT    = 9,  /* Programmable inteval timer interrupt */
1412 d0dfae6e j_mayer
    PPC_INTERRUPT_FIT    = 10, /* Fixed interval timer interrupt       */
1413 d0dfae6e j_mayer
    PPC_INTERRUPT_WDT    = 11, /* Watchdog timer interrupt             */
1414 47103572 j_mayer
};
1415 47103572 j_mayer
1416 9a64fbe4 bellard
/*****************************************************************************/
1417 9a64fbe4 bellard
1418 79aceca5 bellard
#endif /* !defined (__CPU_PPC_H__) */