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