Statistics
| Branch: | Revision:

root / target-alpha / cpu.h @ 198a74de

History | View | Annotate | Download (9.3 kB)

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
struct CPUAlphaState {
260
    uint64_t ir[31];
261
    float64  fir[31];
262
    float_status fp_status;
263
    uint64_t fpcr;
264
    uint64_t pc;
265
    uint64_t lock;
266
    uint32_t pcc[2];
267
    uint64_t ipr[IPR_LAST];
268
    uint64_t ps;
269
    uint64_t unique;
270
    int saved_mode; /* Used for HW_LD / HW_ST */
271

    
272
#if TARGET_LONG_BITS > HOST_LONG_BITS
273
    /* temporary fixed-point registers
274
     * used to emulate 64 bits target on 32 bits hosts
275
     */
276
    target_ulong t0, t1, t2;
277
#endif
278
    /* */
279
    double ft0, ft1, ft2;
280

    
281
    /* Those resources are used only in Qemu core */
282
    CPU_COMMON
283

    
284
    jmp_buf jmp_env;
285
    int user_mode_only; /* user mode only simulation */
286
    uint32_t hflags;
287
    int halted;
288

    
289
    int exception_index;
290
    int error_code;
291
    int interrupt_request;
292

    
293
    uint32_t features;
294
    uint32_t amask;
295
    int implver;
296
    pal_handler_t *pal_handler;
297
};
298

    
299
#define CPUState CPUAlphaState
300
#define cpu_init cpu_alpha_init
301
#define cpu_exec cpu_alpha_exec
302
#define cpu_gen_code cpu_alpha_gen_code
303
#define cpu_signal_handler cpu_alpha_signal_handler
304

    
305
#include "cpu-all.h"
306

    
307
enum {
308
    FEATURE_ASN    = 0x00000001,
309
    FEATURE_SPS    = 0x00000002,
310
    FEATURE_VIRBND = 0x00000004,
311
    FEATURE_TBCHK  = 0x00000008,
312
};
313

    
314
enum {
315
    EXCP_RESET            = 0x0000,
316
    EXCP_MCHK             = 0x0020,
317
    EXCP_ARITH            = 0x0060,
318
    EXCP_HW_INTERRUPT     = 0x00E0,
319
    EXCP_DFAULT           = 0x01E0,
320
    EXCP_DTB_MISS_PAL     = 0x09E0,
321
    EXCP_ITB_MISS         = 0x03E0,
322
    EXCP_ITB_ACV          = 0x07E0,
323
    EXCP_DTB_MISS_NATIVE  = 0x08E0,
324
    EXCP_UNALIGN          = 0x11E0,
325
    EXCP_OPCDEC           = 0x13E0,
326
    EXCP_FEN              = 0x17E0,
327
    EXCP_CALL_PAL         = 0x2000,
328
    EXCP_CALL_PALP        = 0x3000,
329
    EXCP_CALL_PALE        = 0x4000,
330
    /* Pseudo exception for console */
331
    EXCP_CONSOLE_DISPATCH = 0x4001,
332
    EXCP_CONSOLE_FIXUP    = 0x4002,
333
};
334

    
335
/* Arithmetic exception */
336
enum {
337
    EXCP_ARITH_OVERFLOW,
338
};
339

    
340
enum {
341
    PALCODE_CALL = 0x00000000,
342
    PALCODE_LD   = 0x01000000,
343
    PALCODE_ST   = 0x02000000,
344
    PALCODE_MFPR = 0x03000000,
345
    PALCODE_MTPR = 0x04000000,
346
    PALCODE_REI  = 0x05000000,
347
    PALCODE_INIT = 0xF0000000,
348
};
349

    
350
enum {
351
    IR_V0   = 0,
352
    IR_T0   = 1,
353
    IR_T1   = 2,
354
    IR_T2   = 3,
355
    IR_T3   = 4,
356
    IR_T4   = 5,
357
    IR_T5   = 6,
358
    IR_T6   = 7,
359
    IR_T7   = 8,
360
    IR_S0   = 9,
361
    IR_S1   = 10,
362
    IR_S2   = 11,
363
    IR_S3   = 12,
364
    IR_S4   = 13,
365
    IR_S5   = 14,
366
    IR_S6   = 15,
367
#define IR_FP IR_S6
368
    IR_A0   = 16,
369
    IR_A1   = 17,
370
    IR_A2   = 18,
371
    IR_A3   = 19,
372
    IR_A4   = 20,
373
    IR_A5   = 21,
374
    IR_T8   = 22,
375
    IR_T9   = 23,
376
    IR_T10  = 24,
377
    IR_T11  = 25,
378
    IR_RA   = 26,
379
    IR_T12  = 27,
380
#define IR_PV IR_T12
381
    IR_AT   = 28,
382
    IR_GP   = 29,
383
    IR_SP   = 30,
384
    IR_ZERO = 31,
385
};
386

    
387
CPUAlphaState * cpu_alpha_init (void);
388
int cpu_alpha_exec(CPUAlphaState *s);
389
/* you can call this signal handler from your SIGBUS and SIGSEGV
390
   signal handlers to inform the virtual CPU of exceptions. non zero
391
   is returned if the signal was handled by the virtual CPU.  */
392
int cpu_alpha_signal_handler(int host_signum, void *pinfo,
393
                             void *puc);
394
int cpu_alpha_mfpr (CPUState *env, int iprn, uint64_t *valp);
395
int cpu_alpha_mtpr (CPUState *env, int iprn, uint64_t val, uint64_t *oldvalp);
396
void cpu_loop_exit (void);
397
void pal_init (CPUState *env);
398
void call_pal (CPUState *env, int palcode);
399

    
400
#endif /* !defined (__CPU_ALPHA_H__) */