Fix miscellaneous display warnings for PowerPC & alpha targets
[qemu] / target-alpha / cpu.h
1 /*
2  *  Alpha emulation cpu definitions for qemu.
3  * 
4  *  Copyright (c) 2007 Jocelyn Mayer
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #if !defined (__CPU_ALPHA_H__)
22 #define __CPU_ALPHA_H__
23
24 #include "config.h"
25
26 #define TARGET_LONG_BITS 64
27
28 #include "cpu-defs.h"
29
30
31 #include <setjmp.h>
32
33 #include "softfloat.h"
34
35 /* XXX: put this in a common place */
36 #define likely(x)   __builtin_expect(!!(x), 1)
37 #define unlikely(x)   __builtin_expect(!!(x), 0)
38
39 #define TARGET_HAS_ICE 1
40
41 #define ELF_MACHINE     EM_ALPHA
42
43 #define ICACHE_LINE_SIZE 32
44 #define DCACHE_LINE_SIZE 32
45
46 #define TARGET_PAGE_BITS 12
47
48 #define VA_BITS 43
49
50 /* Alpha major type */
51 enum {
52     ALPHA_EV3  = 1,
53     ALPHA_EV4  = 2,
54     ALPHA_SIM  = 3,
55     ALPHA_LCA  = 4,
56     ALPHA_EV5  = 5, /* 21164 */
57     ALPHA_EV45 = 6, /* 21064A */
58     ALPHA_EV56 = 7, /* 21164A */
59 };
60
61 /* EV4 minor type */
62 enum {
63     ALPHA_EV4_2 = 0,
64     ALPHA_EV4_3 = 1,
65 };
66
67 /* LCA minor type */
68 enum {
69     ALPHA_LCA_1 = 1, /* 21066 */
70     ALPHA_LCA_2 = 2, /* 20166 */
71     ALPHA_LCA_3 = 3, /* 21068 */
72     ALPHA_LCA_4 = 4, /* 21068 */
73     ALPHA_LCA_5 = 5, /* 21066A */
74     ALPHA_LCA_6 = 6, /* 21068A */
75 };
76
77 /* EV5 minor type */
78 enum {
79     ALPHA_EV5_1 = 1, /* Rev BA, CA */
80     ALPHA_EV5_2 = 2, /* Rev DA, EA */
81     ALPHA_EV5_3 = 3, /* Pass 3 */
82     ALPHA_EV5_4 = 4, /* Pass 3.2 */
83     ALPHA_EV5_5 = 5, /* Pass 4 */
84 };
85
86 /* EV45 minor type */
87 enum {
88     ALPHA_EV45_1 = 1, /* Pass 1 */
89     ALPHA_EV45_2 = 2, /* Pass 1.1 */
90     ALPHA_EV45_3 = 3, /* Pass 2 */
91 };
92
93 /* EV56 minor type */
94 enum {
95     ALPHA_EV56_1 = 1, /* Pass 1 */
96     ALPHA_EV56_2 = 2, /* Pass 2 */
97 };
98
99 enum {
100     IMPLVER_2106x = 0, /* EV4, EV45 & LCA45 */
101     IMPLVER_21164 = 1, /* EV5, EV56 & PCA45 */
102     IMPLVER_21264 = 2, /* EV6, EV67 & EV68x */
103     IMPLVER_21364 = 3, /* EV7 & EV79 */
104 };
105
106 enum {
107     AMASK_BWX      = 0x00000001,
108     AMASK_FIX      = 0x00000002,
109     AMASK_CIX      = 0x00000004,
110     AMASK_MVI      = 0x00000100,
111     AMASK_TRAP     = 0x00000200,
112     AMASK_PREFETCH = 0x00001000,
113 };
114
115 enum {
116     VAX_ROUND_NORMAL = 0,
117     VAX_ROUND_CHOPPED,
118 };
119
120 enum {
121     IEEE_ROUND_NORMAL = 0,
122     IEEE_ROUND_DYNAMIC,
123     IEEE_ROUND_PLUS,
124     IEEE_ROUND_MINUS,
125     IEEE_ROUND_CHOPPED,
126 };
127
128 /* IEEE floating-point operations encoding */
129 /* Trap mode */
130 enum {
131     FP_TRAP_I   = 0x0,
132     FP_TRAP_U   = 0x1,
133     FP_TRAP_S  = 0x4,
134     FP_TRAP_SU  = 0x5,
135     FP_TRAP_SUI = 0x7,
136 };
137
138 /* Rounding mode */
139 enum {
140     FP_ROUND_CHOPPED = 0x0,
141     FP_ROUND_MINUS   = 0x1,
142     FP_ROUND_NORMAL  = 0x2,
143     FP_ROUND_DYNAMIC = 0x3,
144 };
145
146 /* Internal processor registers */
147 /* XXX: TOFIX: most of those registers are implementation dependant */
148 enum {
149     /* Ebox IPRs */
150     IPR_CC           = 0xC0,
151     IPR_CC_CTL       = 0xC1,
152     IPR_VA           = 0xC2,
153     IPR_VA_CTL       = 0xC4,
154     IPR_VA_FORM      = 0xC3,
155     /* Ibox IPRs */
156     IPR_ITB_TAG      = 0x00,
157     IPR_ITB_PTE      = 0x01,
158     IPT_ITB_IAP      = 0x02,
159     IPT_ITB_IA       = 0x03,
160     IPT_ITB_IS       = 0x04,
161     IPR_PMPC         = 0x05,
162     IPR_EXC_ADDR     = 0x06,
163     IPR_IVA_FORM     = 0x07,
164     IPR_CM           = 0x09,
165     IPR_IER          = 0x0A,
166     IPR_SIRR         = 0x0C,
167     IPR_ISUM         = 0x0D,
168     IPR_HW_INT_CLR   = 0x0E,
169     IPR_EXC_SUM      = 0x0F,
170     IPR_PAL_BASE     = 0x10,
171     IPR_I_CTL        = 0x11,
172     IPR_I_STAT       = 0x16,
173     IPR_IC_FLUSH     = 0x13,
174     IPR_IC_FLUSH_ASM = 0x12,
175     IPR_CLR_MAP      = 0x15,
176     IPR_SLEEP        = 0x17,
177     IPR_PCTX         = 0x40,
178     IPR_PCTR_CTL     = 0x14,
179     /* Mbox IPRs */
180     IPR_DTB_TAG0     = 0x20,
181     IPR_DTB_TAG1     = 0xA0,
182     IPR_DTB_PTE0     = 0x21,
183     IPR_DTB_PTE1     = 0xA1,
184     IPR_DTB_ALTMODE  = 0xA6,
185     IPR_DTB_IAP      = 0xA2,
186     IPR_DTB_IA       = 0xA3,
187     IPR_DTB_IS0      = 0x24,
188     IPR_DTB_IS1      = 0xA4,
189     IPR_DTB_ASN0     = 0x25,
190     IPR_DTB_ASN1     = 0xA5,
191     IPR_MM_STAT      = 0x27,
192     IPR_M_CTL        = 0x28,
193     IPR_DC_CTL       = 0x29,
194     IPR_DC_STAT      = 0x2A,
195     /* Cbox IPRs */
196     IPR_C_DATA       = 0x2B,
197     IPR_C_SHIFT      = 0x2C,
198
199     IPR_ASN,
200     IPR_ASTEN,
201     IPR_ASTSR,
202     IPR_DATFX,
203     IPR_ESP,
204     IPR_FEN,
205     IPR_IPIR,
206     IPR_IPL,
207     IPR_KSP,
208     IPR_MCES,
209     IPR_PERFMON,
210     IPR_PCBB,
211     IPR_PRBR,
212     IPR_PTBR,
213     IPR_SCBB,
214     IPR_SISR,
215     IPR_SSP,
216     IPR_SYSPTBR,
217     IPR_TBCHK,
218     IPR_TBIA,
219     IPR_TBIAP,
220     IPR_TBIS,
221     IPR_TBISD,
222     IPR_TBISI,
223     IPR_USP,
224     IPR_VIRBND,
225     IPR_VPTB,
226     IPR_WHAMI,
227     IPR_ALT_MODE,
228     IPR_LAST,
229 };
230
231 typedef struct CPUAlphaState CPUAlphaState;
232
233 typedef struct pal_handler_t pal_handler_t;
234 struct pal_handler_t {
235     /* Reset */
236     void (*reset)(CPUAlphaState *env);
237     /* Uncorrectable hardware error */
238     void (*machine_check)(CPUAlphaState *env);
239     /* Arithmetic exception */
240     void (*arithmetic)(CPUAlphaState *env);
241     /* Interrupt / correctable hardware error */
242     void (*interrupt)(CPUAlphaState *env);
243     /* Data fault */
244     void (*dfault)(CPUAlphaState *env);
245     /* DTB miss pal */
246     void (*dtb_miss_pal)(CPUAlphaState *env);
247     /* DTB miss native */
248     void (*dtb_miss_native)(CPUAlphaState *env);
249     /* Unaligned access */
250     void (*unalign)(CPUAlphaState *env);
251     /* ITB miss */
252     void (*itb_miss)(CPUAlphaState *env);
253     /* Instruction stream access violation */
254     void (*itb_acv)(CPUAlphaState *env);
255     /* Reserved or privileged opcode */
256     void (*opcdec)(CPUAlphaState *env);
257     /* Floating point exception */
258     void (*fen)(CPUAlphaState *env);
259     /* Call pal instruction */
260     void (*call_pal)(CPUAlphaState *env, uint32_t palcode);
261 };
262
263 struct CPUAlphaState {
264     uint64_t ir[31];
265     float64  fir[31];
266     float_status fp_status;
267     uint64_t fpcr;
268     uint64_t pc;
269     uint64_t lock;
270     uint32_t pcc[2];
271     uint64_t ipr[IPR_LAST];
272     uint64_t ps;
273     uint64_t unique;
274     int saved_mode; /* Used for HW_LD / HW_ST */
275
276 #if TARGET_LONG_BITS > HOST_LONG_BITS
277     /* temporary fixed-point registers
278      * used to emulate 64 bits target on 32 bits hosts
279      */ 
280     target_ulong t0, t1, t2;
281 #endif
282     /* */
283     double ft0, ft1, ft2;
284
285     /* Those resources are used only in Qemu core */
286     CPU_COMMON
287
288     jmp_buf jmp_env;
289     int user_mode_only; /* user mode only simulation */
290     uint32_t hflags;
291     int halted;
292
293     int exception_index;
294     int error_code;
295     int interrupt_request;
296
297     uint32_t features;
298     uint32_t amask;
299     int implver;
300     pal_handler_t *pal_handler;
301 };
302
303 #include "cpu-all.h"
304
305 enum {
306     FEATURE_ASN    = 0x00000001,
307     FEATURE_SPS    = 0x00000002,
308     FEATURE_VIRBND = 0x00000004,
309     FEATURE_TBCHK  = 0x00000008,
310 };
311
312 enum {
313     EXCP_RESET            = 0x0000,
314     EXCP_MCHK             = 0x0020,
315     EXCP_ARITH            = 0x0060,
316     EXCP_HW_INTERRUPT     = 0x00E0,
317     EXCP_DFAULT           = 0x01E0,
318     EXCP_DTB_MISS_PAL     = 0x09E0,
319     EXCP_ITB_MISS         = 0x03E0,
320     EXCP_ITB_ACV          = 0x07E0,
321     EXCP_DTB_MISS_NATIVE  = 0x08E0,
322     EXCP_UNALIGN          = 0x11E0,
323     EXCP_OPCDEC           = 0x13E0,
324     EXCP_FEN              = 0x17E0,
325     EXCP_CALL_PAL         = 0x2000,
326     EXCP_CALL_PALP        = 0x3000,
327     EXCP_CALL_PALE        = 0x4000,
328     /* Pseudo exception for console */
329     EXCP_CONSOLE_DISPATCH = 0x4001,
330     EXCP_CONSOLE_FIXUP    = 0x4002,
331 };
332
333 /* Arithmetic exception */
334 enum {
335     EXCP_ARITH_OVERFLOW,
336 };
337
338 enum {
339     PALCODE_CALL = 0x00000000,
340     PALCODE_LD   = 0x01000000,
341     PALCODE_ST   = 0x02000000,
342     PALCODE_MFPR = 0x03000000,
343     PALCODE_MTPR = 0x04000000,
344     PALCODE_REI  = 0x05000000,
345     PALCODE_INIT = 0xF0000000,
346 };
347
348 enum {
349     IR_V0   = 0,
350     IR_T0   = 1,
351     IR_T1   = 2,
352     IR_T2   = 3,
353     IR_T3   = 4,
354     IR_T4   = 5,
355     IR_T5   = 6,
356     IR_T6   = 7,
357     IR_T7   = 8,
358     IR_S0   = 9,
359     IR_S1   = 10,
360     IR_S2   = 11,
361     IR_S3   = 12,
362     IR_S4   = 13,
363     IR_S5   = 14,
364     IR_S6   = 15,
365 #define IR_FP IR_S6
366     IR_A0   = 16,
367     IR_A1   = 17,
368     IR_A2   = 18,
369     IR_A3   = 19,
370     IR_A4   = 20,
371     IR_A5   = 21,
372     IR_T8   = 22,
373     IR_T9   = 23,
374     IR_T10  = 24,
375     IR_T11  = 25,
376     IR_RA   = 26,
377     IR_T12  = 27,
378 #define IR_PV IR_T12
379     IR_AT   = 28,
380     IR_GP   = 29,
381     IR_SP   = 30,
382     IR_ZERO = 31,
383 };
384
385 CPUAlphaState * cpu_alpha_init (void);
386 int cpu_alpha_exec(CPUAlphaState *s);
387 /* you can call this signal handler from your SIGBUS and SIGSEGV
388    signal handlers to inform the virtual CPU of exceptions. non zero
389    is returned if the signal was handled by the virtual CPU.  */
390 int cpu_alpha_signal_handler(int host_signum, void *pinfo, 
391                              void *puc);
392 int cpu_alpha_mfpr (CPUState *env, int iprn, uint64_t *valp);
393 int cpu_alpha_mtpr (CPUState *env, int iprn, uint64_t val, uint64_t *oldvalp);
394 void cpu_loop_exit (void);
395 void pal_init (CPUState *env);
396 void call_pal (CPUState *env, int palcode);
397
398 #endif /* !defined (__CPU_ALPHA_H__) */