Statistics
| Branch: | Revision:

root / target-alpha / cpu.h @ 26b46094

History | View | Annotate | Download (11.1 kB)

1 4c9649a9 j_mayer
/*
2 4c9649a9 j_mayer
 *  Alpha emulation cpu definitions for qemu.
3 5fafdf24 ths
 *
4 4c9649a9 j_mayer
 *  Copyright (c) 2007 Jocelyn Mayer
5 4c9649a9 j_mayer
 *
6 4c9649a9 j_mayer
 * This library is free software; you can redistribute it and/or
7 4c9649a9 j_mayer
 * modify it under the terms of the GNU Lesser General Public
8 4c9649a9 j_mayer
 * License as published by the Free Software Foundation; either
9 4c9649a9 j_mayer
 * version 2 of the License, or (at your option) any later version.
10 4c9649a9 j_mayer
 *
11 4c9649a9 j_mayer
 * This library is distributed in the hope that it will be useful,
12 4c9649a9 j_mayer
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 4c9649a9 j_mayer
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 4c9649a9 j_mayer
 * Lesser General Public License for more details.
15 4c9649a9 j_mayer
 *
16 4c9649a9 j_mayer
 * You should have received a copy of the GNU Lesser General Public
17 8167ee88 Blue Swirl
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 4c9649a9 j_mayer
 */
19 4c9649a9 j_mayer
20 4c9649a9 j_mayer
#if !defined (__CPU_ALPHA_H__)
21 4c9649a9 j_mayer
#define __CPU_ALPHA_H__
22 4c9649a9 j_mayer
23 4c9649a9 j_mayer
#include "config.h"
24 4c9649a9 j_mayer
25 4c9649a9 j_mayer
#define TARGET_LONG_BITS 64
26 4c9649a9 j_mayer
27 c2764719 pbrook
#define CPUState struct CPUAlphaState
28 c2764719 pbrook
29 4c9649a9 j_mayer
#include "cpu-defs.h"
30 4c9649a9 j_mayer
31 4c9649a9 j_mayer
#include <setjmp.h>
32 4c9649a9 j_mayer
33 4c9649a9 j_mayer
#include "softfloat.h"
34 4c9649a9 j_mayer
35 4c9649a9 j_mayer
#define TARGET_HAS_ICE 1
36 4c9649a9 j_mayer
37 f071b4d3 j_mayer
#define ELF_MACHINE     EM_ALPHA
38 4c9649a9 j_mayer
39 4c9649a9 j_mayer
#define ICACHE_LINE_SIZE 32
40 4c9649a9 j_mayer
#define DCACHE_LINE_SIZE 32
41 4c9649a9 j_mayer
42 b09d9d46 aurel32
#define TARGET_PAGE_BITS 13
43 4c9649a9 j_mayer
44 52705890 Richard Henderson
/* ??? EV4 has 34 phys addr bits, EV5 has 40, EV6 has 44.  */
45 52705890 Richard Henderson
#define TARGET_PHYS_ADDR_SPACE_BITS        44
46 52705890 Richard Henderson
#define TARGET_VIRT_ADDR_SPACE_BITS        (30 + TARGET_PAGE_BITS)
47 4c9649a9 j_mayer
48 4c9649a9 j_mayer
/* Alpha major type */
49 4c9649a9 j_mayer
enum {
50 4c9649a9 j_mayer
    ALPHA_EV3  = 1,
51 4c9649a9 j_mayer
    ALPHA_EV4  = 2,
52 4c9649a9 j_mayer
    ALPHA_SIM  = 3,
53 4c9649a9 j_mayer
    ALPHA_LCA  = 4,
54 4c9649a9 j_mayer
    ALPHA_EV5  = 5, /* 21164 */
55 4c9649a9 j_mayer
    ALPHA_EV45 = 6, /* 21064A */
56 4c9649a9 j_mayer
    ALPHA_EV56 = 7, /* 21164A */
57 4c9649a9 j_mayer
};
58 4c9649a9 j_mayer
59 4c9649a9 j_mayer
/* EV4 minor type */
60 4c9649a9 j_mayer
enum {
61 4c9649a9 j_mayer
    ALPHA_EV4_2 = 0,
62 4c9649a9 j_mayer
    ALPHA_EV4_3 = 1,
63 4c9649a9 j_mayer
};
64 4c9649a9 j_mayer
65 4c9649a9 j_mayer
/* LCA minor type */
66 4c9649a9 j_mayer
enum {
67 4c9649a9 j_mayer
    ALPHA_LCA_1 = 1, /* 21066 */
68 4c9649a9 j_mayer
    ALPHA_LCA_2 = 2, /* 20166 */
69 4c9649a9 j_mayer
    ALPHA_LCA_3 = 3, /* 21068 */
70 4c9649a9 j_mayer
    ALPHA_LCA_4 = 4, /* 21068 */
71 4c9649a9 j_mayer
    ALPHA_LCA_5 = 5, /* 21066A */
72 4c9649a9 j_mayer
    ALPHA_LCA_6 = 6, /* 21068A */
73 4c9649a9 j_mayer
};
74 4c9649a9 j_mayer
75 4c9649a9 j_mayer
/* EV5 minor type */
76 4c9649a9 j_mayer
enum {
77 4c9649a9 j_mayer
    ALPHA_EV5_1 = 1, /* Rev BA, CA */
78 4c9649a9 j_mayer
    ALPHA_EV5_2 = 2, /* Rev DA, EA */
79 4c9649a9 j_mayer
    ALPHA_EV5_3 = 3, /* Pass 3 */
80 4c9649a9 j_mayer
    ALPHA_EV5_4 = 4, /* Pass 3.2 */
81 4c9649a9 j_mayer
    ALPHA_EV5_5 = 5, /* Pass 4 */
82 4c9649a9 j_mayer
};
83 4c9649a9 j_mayer
84 4c9649a9 j_mayer
/* EV45 minor type */
85 4c9649a9 j_mayer
enum {
86 4c9649a9 j_mayer
    ALPHA_EV45_1 = 1, /* Pass 1 */
87 4c9649a9 j_mayer
    ALPHA_EV45_2 = 2, /* Pass 1.1 */
88 4c9649a9 j_mayer
    ALPHA_EV45_3 = 3, /* Pass 2 */
89 4c9649a9 j_mayer
};
90 4c9649a9 j_mayer
91 4c9649a9 j_mayer
/* EV56 minor type */
92 4c9649a9 j_mayer
enum {
93 4c9649a9 j_mayer
    ALPHA_EV56_1 = 1, /* Pass 1 */
94 4c9649a9 j_mayer
    ALPHA_EV56_2 = 2, /* Pass 2 */
95 4c9649a9 j_mayer
};
96 4c9649a9 j_mayer
97 4c9649a9 j_mayer
enum {
98 4c9649a9 j_mayer
    IMPLVER_2106x = 0, /* EV4, EV45 & LCA45 */
99 4c9649a9 j_mayer
    IMPLVER_21164 = 1, /* EV5, EV56 & PCA45 */
100 4c9649a9 j_mayer
    IMPLVER_21264 = 2, /* EV6, EV67 & EV68x */
101 4c9649a9 j_mayer
    IMPLVER_21364 = 3, /* EV7 & EV79 */
102 4c9649a9 j_mayer
};
103 4c9649a9 j_mayer
104 4c9649a9 j_mayer
enum {
105 4c9649a9 j_mayer
    AMASK_BWX      = 0x00000001,
106 4c9649a9 j_mayer
    AMASK_FIX      = 0x00000002,
107 4c9649a9 j_mayer
    AMASK_CIX      = 0x00000004,
108 4c9649a9 j_mayer
    AMASK_MVI      = 0x00000100,
109 4c9649a9 j_mayer
    AMASK_TRAP     = 0x00000200,
110 4c9649a9 j_mayer
    AMASK_PREFETCH = 0x00001000,
111 4c9649a9 j_mayer
};
112 4c9649a9 j_mayer
113 4c9649a9 j_mayer
enum {
114 4c9649a9 j_mayer
    VAX_ROUND_NORMAL = 0,
115 4c9649a9 j_mayer
    VAX_ROUND_CHOPPED,
116 4c9649a9 j_mayer
};
117 4c9649a9 j_mayer
118 4c9649a9 j_mayer
enum {
119 4c9649a9 j_mayer
    IEEE_ROUND_NORMAL = 0,
120 4c9649a9 j_mayer
    IEEE_ROUND_DYNAMIC,
121 4c9649a9 j_mayer
    IEEE_ROUND_PLUS,
122 4c9649a9 j_mayer
    IEEE_ROUND_MINUS,
123 4c9649a9 j_mayer
    IEEE_ROUND_CHOPPED,
124 4c9649a9 j_mayer
};
125 4c9649a9 j_mayer
126 4c9649a9 j_mayer
/* IEEE floating-point operations encoding */
127 4c9649a9 j_mayer
/* Trap mode */
128 4c9649a9 j_mayer
enum {
129 4c9649a9 j_mayer
    FP_TRAP_I   = 0x0,
130 4c9649a9 j_mayer
    FP_TRAP_U   = 0x1,
131 4c9649a9 j_mayer
    FP_TRAP_S  = 0x4,
132 4c9649a9 j_mayer
    FP_TRAP_SU  = 0x5,
133 4c9649a9 j_mayer
    FP_TRAP_SUI = 0x7,
134 4c9649a9 j_mayer
};
135 4c9649a9 j_mayer
136 4c9649a9 j_mayer
/* Rounding mode */
137 4c9649a9 j_mayer
enum {
138 4c9649a9 j_mayer
    FP_ROUND_CHOPPED = 0x0,
139 4c9649a9 j_mayer
    FP_ROUND_MINUS   = 0x1,
140 4c9649a9 j_mayer
    FP_ROUND_NORMAL  = 0x2,
141 4c9649a9 j_mayer
    FP_ROUND_DYNAMIC = 0x3,
142 4c9649a9 j_mayer
};
143 4c9649a9 j_mayer
144 ba0e276d Richard Henderson
/* FPCR bits */
145 ba0e276d Richard Henderson
#define FPCR_SUM                (1ULL << 63)
146 ba0e276d Richard Henderson
#define FPCR_INED                (1ULL << 62)
147 ba0e276d Richard Henderson
#define FPCR_UNFD                (1ULL << 61)
148 ba0e276d Richard Henderson
#define FPCR_UNDZ                (1ULL << 60)
149 ba0e276d Richard Henderson
#define FPCR_DYN_SHIFT                58
150 8443effb Richard Henderson
#define FPCR_DYN_CHOPPED        (0ULL << FPCR_DYN_SHIFT)
151 8443effb Richard Henderson
#define FPCR_DYN_MINUS                (1ULL << FPCR_DYN_SHIFT)
152 8443effb Richard Henderson
#define FPCR_DYN_NORMAL                (2ULL << FPCR_DYN_SHIFT)
153 8443effb Richard Henderson
#define FPCR_DYN_PLUS                (3ULL << FPCR_DYN_SHIFT)
154 ba0e276d Richard Henderson
#define FPCR_DYN_MASK                (3ULL << FPCR_DYN_SHIFT)
155 ba0e276d Richard Henderson
#define FPCR_IOV                (1ULL << 57)
156 ba0e276d Richard Henderson
#define FPCR_INE                (1ULL << 56)
157 ba0e276d Richard Henderson
#define FPCR_UNF                (1ULL << 55)
158 ba0e276d Richard Henderson
#define FPCR_OVF                (1ULL << 54)
159 ba0e276d Richard Henderson
#define FPCR_DZE                (1ULL << 53)
160 ba0e276d Richard Henderson
#define FPCR_INV                (1ULL << 52)
161 ba0e276d Richard Henderson
#define FPCR_OVFD                (1ULL << 51)
162 ba0e276d Richard Henderson
#define FPCR_DZED                (1ULL << 50)
163 ba0e276d Richard Henderson
#define FPCR_INVD                (1ULL << 49)
164 ba0e276d Richard Henderson
#define FPCR_DNZ                (1ULL << 48)
165 ba0e276d Richard Henderson
#define FPCR_DNOD                (1ULL << 47)
166 ba0e276d Richard Henderson
#define FPCR_STATUS_MASK        (FPCR_IOV | FPCR_INE | FPCR_UNF \
167 ba0e276d Richard Henderson
                                 | FPCR_OVF | FPCR_DZE | FPCR_INV)
168 ba0e276d Richard Henderson
169 ba0e276d Richard Henderson
/* The silly software trap enables implemented by the kernel emulation.
170 ba0e276d Richard Henderson
   These are more or less architecturally required, since the real hardware
171 ba0e276d Richard Henderson
   has read-as-zero bits in the FPCR when the features aren't implemented.
172 ba0e276d Richard Henderson
   For the purposes of QEMU, we pretend the FPCR can hold everything.  */
173 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_INV        (1ULL << 1)
174 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_DZE        (1ULL << 2)
175 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_OVF        (1ULL << 3)
176 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_UNF        (1ULL << 4)
177 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_INE        (1ULL << 5)
178 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_DNO        (1ULL << 6)
179 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_MASK        ((1ULL << 7) - (1ULL << 1))
180 ba0e276d Richard Henderson
181 ba0e276d Richard Henderson
#define SWCR_MAP_DMZ                (1ULL << 12)
182 ba0e276d Richard Henderson
#define SWCR_MAP_UMZ                (1ULL << 13)
183 ba0e276d Richard Henderson
#define SWCR_MAP_MASK                (SWCR_MAP_DMZ | SWCR_MAP_UMZ)
184 ba0e276d Richard Henderson
185 ba0e276d Richard Henderson
#define SWCR_STATUS_INV                (1ULL << 17)
186 ba0e276d Richard Henderson
#define SWCR_STATUS_DZE                (1ULL << 18)
187 ba0e276d Richard Henderson
#define SWCR_STATUS_OVF                (1ULL << 19)
188 ba0e276d Richard Henderson
#define SWCR_STATUS_UNF                (1ULL << 20)
189 ba0e276d Richard Henderson
#define SWCR_STATUS_INE                (1ULL << 21)
190 ba0e276d Richard Henderson
#define SWCR_STATUS_DNO                (1ULL << 22)
191 ba0e276d Richard Henderson
#define SWCR_STATUS_MASK        ((1ULL << 23) - (1ULL << 17))
192 ba0e276d Richard Henderson
193 ba0e276d Richard Henderson
#define SWCR_MASK  (SWCR_TRAP_ENABLE_MASK | SWCR_MAP_MASK | SWCR_STATUS_MASK)
194 ba0e276d Richard Henderson
195 8417845e Richard Henderson
/* MMU modes definitions */
196 8417845e Richard Henderson
197 8417845e Richard Henderson
/* Alpha has 5 MMU modes: PALcode, kernel, executive, supervisor, and user.
198 8417845e Richard Henderson
   The Unix PALcode only exposes the kernel and user modes; presumably
199 8417845e Richard Henderson
   executive and supervisor are used by VMS.
200 8417845e Richard Henderson

201 8417845e Richard Henderson
   PALcode itself uses physical mode for code and kernel mode for data;
202 8417845e Richard Henderson
   there are PALmode instructions that can access data via physical mode
203 8417845e Richard Henderson
   or via an os-installed "alternate mode", which is one of the 4 above.
204 8417845e Richard Henderson

205 8417845e Richard Henderson
   QEMU does not currently properly distinguish between code/data when
206 8417845e Richard Henderson
   looking up addresses.  To avoid having to address this issue, our
207 8417845e Richard Henderson
   emulated PALcode will cheat and use the KSEG mapping for its code+data
208 8417845e Richard Henderson
   rather than physical addresses.
209 8417845e Richard Henderson

210 8417845e Richard Henderson
   Moreover, we're only emulating Unix PALcode, and not attempting VMS.
211 8417845e Richard Henderson

212 8417845e Richard Henderson
   All of which allows us to drop all but kernel and user modes.
213 8417845e Richard Henderson
   Elide the unused MMU modes to save space.  */
214 4c9649a9 j_mayer
215 8417845e Richard Henderson
#define NB_MMU_MODES 2
216 8417845e Richard Henderson
217 8417845e Richard Henderson
#define MMU_MODE0_SUFFIX _kernel
218 8417845e Richard Henderson
#define MMU_MODE1_SUFFIX _user
219 8417845e Richard Henderson
#define MMU_KERNEL_IDX   0
220 8417845e Richard Henderson
#define MMU_USER_IDX     1
221 8417845e Richard Henderson
222 8417845e Richard Henderson
typedef struct CPUAlphaState CPUAlphaState;
223 6ebbf390 j_mayer
224 4c9649a9 j_mayer
struct CPUAlphaState {
225 4c9649a9 j_mayer
    uint64_t ir[31];
226 8443effb Richard Henderson
    float64 fir[31];
227 4c9649a9 j_mayer
    uint64_t pc;
228 4c9649a9 j_mayer
    uint64_t unique;
229 6910b8f6 Richard Henderson
    uint64_t lock_addr;
230 6910b8f6 Richard Henderson
    uint64_t lock_st_addr;
231 6910b8f6 Richard Henderson
    uint64_t lock_value;
232 8443effb Richard Henderson
    float_status fp_status;
233 8443effb Richard Henderson
    /* The following fields make up the FPCR, but in FP_STATUS format.  */
234 8443effb Richard Henderson
    uint8_t fpcr_exc_status;
235 8443effb Richard Henderson
    uint8_t fpcr_exc_mask;
236 8443effb Richard Henderson
    uint8_t fpcr_dyn_round;
237 8443effb Richard Henderson
    uint8_t fpcr_flush_to_zero;
238 8443effb Richard Henderson
    uint8_t fpcr_dnz;
239 8443effb Richard Henderson
    uint8_t fpcr_dnod;
240 8443effb Richard Henderson
    uint8_t fpcr_undz;
241 8443effb Richard Henderson
242 129d8aa5 Richard Henderson
    /* The Internal Processor Registers.  Some of these we assume always
243 129d8aa5 Richard Henderson
       exist for use in user-mode.  */
244 129d8aa5 Richard Henderson
    uint8_t ps;
245 8443effb Richard Henderson
    uint8_t intr_flag;
246 129d8aa5 Richard Henderson
    uint8_t pal_mode;
247 26b46094 Richard Henderson
    uint8_t fen;
248 26b46094 Richard Henderson
249 26b46094 Richard Henderson
    uint32_t pcc_ofs;
250 129d8aa5 Richard Henderson
251 129d8aa5 Richard Henderson
    /* These pass data from the exception logic in the translator and
252 129d8aa5 Richard Henderson
       helpers to the OS entry point.  This is used for both system
253 129d8aa5 Richard Henderson
       emulation and user-mode.  */
254 129d8aa5 Richard Henderson
    uint64_t trap_arg0;
255 129d8aa5 Richard Henderson
    uint64_t trap_arg1;
256 129d8aa5 Richard Henderson
    uint64_t trap_arg2;
257 4c9649a9 j_mayer
258 26b46094 Richard Henderson
#if !defined(CONFIG_USER_ONLY)
259 26b46094 Richard Henderson
    /* The internal data required by our emulation of the Unix PALcode.  */
260 26b46094 Richard Henderson
    uint64_t exc_addr;
261 26b46094 Richard Henderson
    uint64_t palbr;
262 26b46094 Richard Henderson
    uint64_t ptbr;
263 26b46094 Richard Henderson
    uint64_t vptptr;
264 26b46094 Richard Henderson
    uint64_t sysval;
265 26b46094 Richard Henderson
    uint64_t usp;
266 26b46094 Richard Henderson
    uint64_t shadow[8];
267 26b46094 Richard Henderson
    uint64_t scratch[24];
268 26b46094 Richard Henderson
#endif
269 26b46094 Richard Henderson
270 bf9525e9 j_mayer
#if TARGET_LONG_BITS > HOST_LONG_BITS
271 bf9525e9 j_mayer
    /* temporary fixed-point registers
272 bf9525e9 j_mayer
     * used to emulate 64 bits target on 32 bits hosts
273 5fafdf24 ths
     */
274 04acd307 aurel32
    target_ulong t0, t1;
275 bf9525e9 j_mayer
#endif
276 4c9649a9 j_mayer
277 4c9649a9 j_mayer
    /* Those resources are used only in Qemu core */
278 4c9649a9 j_mayer
    CPU_COMMON
279 4c9649a9 j_mayer
280 4c9649a9 j_mayer
    int error_code;
281 4c9649a9 j_mayer
282 4c9649a9 j_mayer
    uint32_t features;
283 4c9649a9 j_mayer
    uint32_t amask;
284 4c9649a9 j_mayer
    int implver;
285 4c9649a9 j_mayer
};
286 4c9649a9 j_mayer
287 9467d44c ths
#define cpu_init cpu_alpha_init
288 9467d44c ths
#define cpu_exec cpu_alpha_exec
289 9467d44c ths
#define cpu_gen_code cpu_alpha_gen_code
290 9467d44c ths
#define cpu_signal_handler cpu_alpha_signal_handler
291 9467d44c ths
292 4c9649a9 j_mayer
#include "cpu-all.h"
293 4c9649a9 j_mayer
294 4c9649a9 j_mayer
enum {
295 4c9649a9 j_mayer
    FEATURE_ASN    = 0x00000001,
296 4c9649a9 j_mayer
    FEATURE_SPS    = 0x00000002,
297 4c9649a9 j_mayer
    FEATURE_VIRBND = 0x00000004,
298 4c9649a9 j_mayer
    FEATURE_TBCHK  = 0x00000008,
299 4c9649a9 j_mayer
};
300 4c9649a9 j_mayer
301 4c9649a9 j_mayer
enum {
302 07b6c13b Richard Henderson
    EXCP_RESET,
303 07b6c13b Richard Henderson
    EXCP_MCHK,
304 07b6c13b Richard Henderson
    EXCP_SMP_INTERRUPT,
305 07b6c13b Richard Henderson
    EXCP_CLK_INTERRUPT,
306 07b6c13b Richard Henderson
    EXCP_DEV_INTERRUPT,
307 07b6c13b Richard Henderson
    EXCP_MMFAULT,
308 07b6c13b Richard Henderson
    EXCP_UNALIGN,
309 07b6c13b Richard Henderson
    EXCP_OPCDEC,
310 07b6c13b Richard Henderson
    EXCP_ARITH,
311 07b6c13b Richard Henderson
    EXCP_FEN,
312 07b6c13b Richard Henderson
    EXCP_CALL_PAL,
313 07b6c13b Richard Henderson
    /* For Usermode emulation.  */
314 07b6c13b Richard Henderson
    EXCP_STL_C,
315 07b6c13b Richard Henderson
    EXCP_STQ_C,
316 4c9649a9 j_mayer
};
317 4c9649a9 j_mayer
318 ea879fc7 Richard Henderson
/* Hardware interrupt (entInt) constants.  */
319 ea879fc7 Richard Henderson
enum {
320 ea879fc7 Richard Henderson
    INT_K_IP,
321 ea879fc7 Richard Henderson
    INT_K_CLK,
322 ea879fc7 Richard Henderson
    INT_K_MCHK,
323 ea879fc7 Richard Henderson
    INT_K_DEV,
324 ea879fc7 Richard Henderson
    INT_K_PERF,
325 ea879fc7 Richard Henderson
};
326 ea879fc7 Richard Henderson
327 ea879fc7 Richard Henderson
/* Memory management (entMM) constants.  */
328 ea879fc7 Richard Henderson
enum {
329 ea879fc7 Richard Henderson
    MM_K_TNV,
330 ea879fc7 Richard Henderson
    MM_K_ACV,
331 ea879fc7 Richard Henderson
    MM_K_FOR,
332 ea879fc7 Richard Henderson
    MM_K_FOE,
333 ea879fc7 Richard Henderson
    MM_K_FOW
334 ea879fc7 Richard Henderson
};
335 ea879fc7 Richard Henderson
336 ea879fc7 Richard Henderson
/* Arithmetic exception (entArith) constants.  */
337 ea879fc7 Richard Henderson
enum {
338 ea879fc7 Richard Henderson
    EXC_M_SWC = 1,      /* Software completion */
339 ea879fc7 Richard Henderson
    EXC_M_INV = 2,      /* Invalid operation */
340 ea879fc7 Richard Henderson
    EXC_M_DZE = 4,      /* Division by zero */
341 ea879fc7 Richard Henderson
    EXC_M_FOV = 8,      /* Overflow */
342 ea879fc7 Richard Henderson
    EXC_M_UNF = 16,     /* Underflow */
343 ea879fc7 Richard Henderson
    EXC_M_INE = 32,     /* Inexact result */
344 ea879fc7 Richard Henderson
    EXC_M_IOV = 64      /* Integer Overflow */
345 ea879fc7 Richard Henderson
};
346 ea879fc7 Richard Henderson
347 ea879fc7 Richard Henderson
/* Processor status constants.  */
348 ea879fc7 Richard Henderson
enum {
349 ea879fc7 Richard Henderson
    /* Low 3 bits are interrupt mask level.  */
350 ea879fc7 Richard Henderson
    PS_INT_MASK = 7,
351 ea879fc7 Richard Henderson
352 ea879fc7 Richard Henderson
    /* Bits 4 and 5 are the mmu mode.  The VMS PALcode uses all 4 modes;
353 ea879fc7 Richard Henderson
       The Unix PALcode only uses bit 4.  */
354 ea879fc7 Richard Henderson
    PS_USER_MODE = 8
355 ea879fc7 Richard Henderson
};
356 ea879fc7 Richard Henderson
357 ea879fc7 Richard Henderson
static inline int cpu_mmu_index(CPUState *env)
358 ea879fc7 Richard Henderson
{
359 bba9bdce Richard Henderson
    if (env->pal_mode) {
360 bba9bdce Richard Henderson
        return MMU_KERNEL_IDX;
361 bba9bdce Richard Henderson
    } else if (env->ps & PS_USER_MODE) {
362 bba9bdce Richard Henderson
        return MMU_USER_IDX;
363 bba9bdce Richard Henderson
    } else {
364 bba9bdce Richard Henderson
        return MMU_KERNEL_IDX;
365 bba9bdce Richard Henderson
    }
366 ea879fc7 Richard Henderson
}
367 4c9649a9 j_mayer
368 4c9649a9 j_mayer
enum {
369 4c9649a9 j_mayer
    IR_V0   = 0,
370 4c9649a9 j_mayer
    IR_T0   = 1,
371 4c9649a9 j_mayer
    IR_T1   = 2,
372 4c9649a9 j_mayer
    IR_T2   = 3,
373 4c9649a9 j_mayer
    IR_T3   = 4,
374 4c9649a9 j_mayer
    IR_T4   = 5,
375 4c9649a9 j_mayer
    IR_T5   = 6,
376 4c9649a9 j_mayer
    IR_T6   = 7,
377 4c9649a9 j_mayer
    IR_T7   = 8,
378 4c9649a9 j_mayer
    IR_S0   = 9,
379 4c9649a9 j_mayer
    IR_S1   = 10,
380 4c9649a9 j_mayer
    IR_S2   = 11,
381 4c9649a9 j_mayer
    IR_S3   = 12,
382 4c9649a9 j_mayer
    IR_S4   = 13,
383 4c9649a9 j_mayer
    IR_S5   = 14,
384 4c9649a9 j_mayer
    IR_S6   = 15,
385 a4b388ff Richard Henderson
    IR_FP   = IR_S6,
386 4c9649a9 j_mayer
    IR_A0   = 16,
387 4c9649a9 j_mayer
    IR_A1   = 17,
388 4c9649a9 j_mayer
    IR_A2   = 18,
389 4c9649a9 j_mayer
    IR_A3   = 19,
390 4c9649a9 j_mayer
    IR_A4   = 20,
391 4c9649a9 j_mayer
    IR_A5   = 21,
392 4c9649a9 j_mayer
    IR_T8   = 22,
393 4c9649a9 j_mayer
    IR_T9   = 23,
394 4c9649a9 j_mayer
    IR_T10  = 24,
395 4c9649a9 j_mayer
    IR_T11  = 25,
396 4c9649a9 j_mayer
    IR_RA   = 26,
397 4c9649a9 j_mayer
    IR_T12  = 27,
398 a4b388ff Richard Henderson
    IR_PV   = IR_T12,
399 4c9649a9 j_mayer
    IR_AT   = 28,
400 4c9649a9 j_mayer
    IR_GP   = 29,
401 4c9649a9 j_mayer
    IR_SP   = 30,
402 4c9649a9 j_mayer
    IR_ZERO = 31,
403 4c9649a9 j_mayer
};
404 4c9649a9 j_mayer
405 aaed909a bellard
CPUAlphaState * cpu_alpha_init (const char *cpu_model);
406 e96efcfc j_mayer
int cpu_alpha_exec(CPUAlphaState *s);
407 e96efcfc j_mayer
/* you can call this signal handler from your SIGBUS and SIGSEGV
408 e96efcfc j_mayer
   signal handlers to inform the virtual CPU of exceptions. non zero
409 e96efcfc j_mayer
   is returned if the signal was handled by the virtual CPU.  */
410 5fafdf24 ths
int cpu_alpha_signal_handler(int host_signum, void *pinfo,
411 e96efcfc j_mayer
                             void *puc);
412 95870356 aurel32
int cpu_alpha_handle_mmu_fault (CPUState *env, uint64_t address, int rw,
413 95870356 aurel32
                                int mmu_idx, int is_softmmu);
414 0b5c1ce8 Nathan Froyd
#define cpu_handle_mmu_fault cpu_alpha_handle_mmu_fault
415 95870356 aurel32
void do_interrupt (CPUState *env);
416 95870356 aurel32
417 ba0e276d Richard Henderson
uint64_t cpu_alpha_load_fpcr (CPUState *env);
418 ba0e276d Richard Henderson
void cpu_alpha_store_fpcr (CPUState *env, uint64_t val);
419 4c9649a9 j_mayer
420 6b917547 aliguori
static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc,
421 6b917547 aliguori
                                        target_ulong *cs_base, int *flags)
422 6b917547 aliguori
{
423 6b917547 aliguori
    *pc = env->pc;
424 6b917547 aliguori
    *cs_base = 0;
425 6b917547 aliguori
    *flags = env->ps;
426 6b917547 aliguori
}
427 6b917547 aliguori
428 a4b388ff Richard Henderson
#if defined(CONFIG_USER_ONLY)
429 a4b388ff Richard Henderson
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp)
430 a4b388ff Richard Henderson
{
431 a4b388ff Richard Henderson
    if (newsp) {
432 a4b388ff Richard Henderson
        env->ir[IR_SP] = newsp;
433 a4b388ff Richard Henderson
    }
434 a4b388ff Richard Henderson
    env->ir[IR_V0] = 0;
435 a4b388ff Richard Henderson
    env->ir[IR_A3] = 0;
436 a4b388ff Richard Henderson
}
437 a4b388ff Richard Henderson
438 a4b388ff Richard Henderson
static inline void cpu_set_tls(CPUState *env, target_ulong newtls)
439 a4b388ff Richard Henderson
{
440 a4b388ff Richard Henderson
    env->unique = newtls;
441 a4b388ff Richard Henderson
}
442 a4b388ff Richard Henderson
#endif
443 a4b388ff Richard Henderson
444 4c9649a9 j_mayer
#endif /* !defined (__CPU_ALPHA_H__) */