Statistics
| Branch: | Revision:

root / target-alpha / cpu.h @ 7c9958b0

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

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

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

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

211 8417845e Richard Henderson
   All of which allows us to drop all but kernel and user modes.
212 8417845e Richard Henderson
   Elide the unused MMU modes to save space.  */
213 4c9649a9 j_mayer
214 8417845e Richard Henderson
#define NB_MMU_MODES 2
215 8417845e Richard Henderson
216 8417845e Richard Henderson
#define MMU_MODE0_SUFFIX _kernel
217 8417845e Richard Henderson
#define MMU_MODE1_SUFFIX _user
218 8417845e Richard Henderson
#define MMU_KERNEL_IDX   0
219 8417845e Richard Henderson
#define MMU_USER_IDX     1
220 8417845e Richard Henderson
221 8417845e Richard Henderson
typedef struct CPUAlphaState CPUAlphaState;
222 6ebbf390 j_mayer
223 4c9649a9 j_mayer
struct CPUAlphaState {
224 4c9649a9 j_mayer
    uint64_t ir[31];
225 8443effb Richard Henderson
    float64 fir[31];
226 4c9649a9 j_mayer
    uint64_t pc;
227 4c9649a9 j_mayer
    uint64_t unique;
228 6910b8f6 Richard Henderson
    uint64_t lock_addr;
229 6910b8f6 Richard Henderson
    uint64_t lock_st_addr;
230 6910b8f6 Richard Henderson
    uint64_t lock_value;
231 8443effb Richard Henderson
    float_status fp_status;
232 8443effb Richard Henderson
    /* The following fields make up the FPCR, but in FP_STATUS format.  */
233 8443effb Richard Henderson
    uint8_t fpcr_exc_status;
234 8443effb Richard Henderson
    uint8_t fpcr_exc_mask;
235 8443effb Richard Henderson
    uint8_t fpcr_dyn_round;
236 8443effb Richard Henderson
    uint8_t fpcr_flush_to_zero;
237 8443effb Richard Henderson
    uint8_t fpcr_dnod;
238 8443effb Richard Henderson
    uint8_t fpcr_undz;
239 8443effb Richard Henderson
240 129d8aa5 Richard Henderson
    /* The Internal Processor Registers.  Some of these we assume always
241 129d8aa5 Richard Henderson
       exist for use in user-mode.  */
242 129d8aa5 Richard Henderson
    uint8_t ps;
243 8443effb Richard Henderson
    uint8_t intr_flag;
244 129d8aa5 Richard Henderson
    uint8_t pal_mode;
245 26b46094 Richard Henderson
    uint8_t fen;
246 26b46094 Richard Henderson
247 26b46094 Richard Henderson
    uint32_t pcc_ofs;
248 129d8aa5 Richard Henderson
249 129d8aa5 Richard Henderson
    /* These pass data from the exception logic in the translator and
250 129d8aa5 Richard Henderson
       helpers to the OS entry point.  This is used for both system
251 129d8aa5 Richard Henderson
       emulation and user-mode.  */
252 129d8aa5 Richard Henderson
    uint64_t trap_arg0;
253 129d8aa5 Richard Henderson
    uint64_t trap_arg1;
254 129d8aa5 Richard Henderson
    uint64_t trap_arg2;
255 4c9649a9 j_mayer
256 26b46094 Richard Henderson
#if !defined(CONFIG_USER_ONLY)
257 26b46094 Richard Henderson
    /* The internal data required by our emulation of the Unix PALcode.  */
258 26b46094 Richard Henderson
    uint64_t exc_addr;
259 26b46094 Richard Henderson
    uint64_t palbr;
260 26b46094 Richard Henderson
    uint64_t ptbr;
261 26b46094 Richard Henderson
    uint64_t vptptr;
262 26b46094 Richard Henderson
    uint64_t sysval;
263 26b46094 Richard Henderson
    uint64_t usp;
264 26b46094 Richard Henderson
    uint64_t shadow[8];
265 26b46094 Richard Henderson
    uint64_t scratch[24];
266 26b46094 Richard Henderson
#endif
267 26b46094 Richard Henderson
268 c781cf96 Richard Henderson
    /* This alarm doesn't exist in real hardware; we wish it did.  */
269 c781cf96 Richard Henderson
    struct QEMUTimer *alarm_timer;
270 c781cf96 Richard Henderson
    uint64_t alarm_expire;
271 c781cf96 Richard Henderson
272 bf9525e9 j_mayer
#if TARGET_LONG_BITS > HOST_LONG_BITS
273 bf9525e9 j_mayer
    /* temporary fixed-point registers
274 bf9525e9 j_mayer
     * used to emulate 64 bits target on 32 bits hosts
275 5fafdf24 ths
     */
276 04acd307 aurel32
    target_ulong t0, t1;
277 bf9525e9 j_mayer
#endif
278 4c9649a9 j_mayer
279 5cbdb3a3 Stefan Weil
    /* Those resources are used only in QEMU core */
280 4c9649a9 j_mayer
    CPU_COMMON
281 4c9649a9 j_mayer
282 4c9649a9 j_mayer
    int error_code;
283 4c9649a9 j_mayer
284 4c9649a9 j_mayer
    uint32_t features;
285 4c9649a9 j_mayer
    uint32_t amask;
286 4c9649a9 j_mayer
    int implver;
287 4c9649a9 j_mayer
};
288 4c9649a9 j_mayer
289 9467d44c ths
#define cpu_init cpu_alpha_init
290 9467d44c ths
#define cpu_exec cpu_alpha_exec
291 9467d44c ths
#define cpu_gen_code cpu_alpha_gen_code
292 9467d44c ths
#define cpu_signal_handler cpu_alpha_signal_handler
293 9467d44c ths
294 4c9649a9 j_mayer
#include "cpu-all.h"
295 25ebd80f Andreas Färber
#include "cpu-qom.h"
296 4c9649a9 j_mayer
297 4c9649a9 j_mayer
enum {
298 4c9649a9 j_mayer
    FEATURE_ASN    = 0x00000001,
299 4c9649a9 j_mayer
    FEATURE_SPS    = 0x00000002,
300 4c9649a9 j_mayer
    FEATURE_VIRBND = 0x00000004,
301 4c9649a9 j_mayer
    FEATURE_TBCHK  = 0x00000008,
302 4c9649a9 j_mayer
};
303 4c9649a9 j_mayer
304 4c9649a9 j_mayer
enum {
305 07b6c13b Richard Henderson
    EXCP_RESET,
306 07b6c13b Richard Henderson
    EXCP_MCHK,
307 07b6c13b Richard Henderson
    EXCP_SMP_INTERRUPT,
308 07b6c13b Richard Henderson
    EXCP_CLK_INTERRUPT,
309 07b6c13b Richard Henderson
    EXCP_DEV_INTERRUPT,
310 07b6c13b Richard Henderson
    EXCP_MMFAULT,
311 07b6c13b Richard Henderson
    EXCP_UNALIGN,
312 07b6c13b Richard Henderson
    EXCP_OPCDEC,
313 07b6c13b Richard Henderson
    EXCP_ARITH,
314 07b6c13b Richard Henderson
    EXCP_FEN,
315 07b6c13b Richard Henderson
    EXCP_CALL_PAL,
316 07b6c13b Richard Henderson
    /* For Usermode emulation.  */
317 07b6c13b Richard Henderson
    EXCP_STL_C,
318 07b6c13b Richard Henderson
    EXCP_STQ_C,
319 4c9649a9 j_mayer
};
320 4c9649a9 j_mayer
321 6a80e088 Richard Henderson
/* Alpha-specific interrupt pending bits.  */
322 6a80e088 Richard Henderson
#define CPU_INTERRUPT_TIMER        CPU_INTERRUPT_TGT_EXT_0
323 6a80e088 Richard Henderson
#define CPU_INTERRUPT_SMP        CPU_INTERRUPT_TGT_EXT_1
324 6a80e088 Richard Henderson
#define CPU_INTERRUPT_MCHK        CPU_INTERRUPT_TGT_EXT_2
325 6a80e088 Richard Henderson
326 a3b9af16 Richard Henderson
/* OSF/1 Page table bits.  */
327 a3b9af16 Richard Henderson
enum {
328 a3b9af16 Richard Henderson
    PTE_VALID = 0x0001,
329 a3b9af16 Richard Henderson
    PTE_FOR   = 0x0002,  /* used for page protection (fault on read) */
330 a3b9af16 Richard Henderson
    PTE_FOW   = 0x0004,  /* used for page protection (fault on write) */
331 a3b9af16 Richard Henderson
    PTE_FOE   = 0x0008,  /* used for page protection (fault on exec) */
332 a3b9af16 Richard Henderson
    PTE_ASM   = 0x0010,
333 a3b9af16 Richard Henderson
    PTE_KRE   = 0x0100,
334 a3b9af16 Richard Henderson
    PTE_URE   = 0x0200,
335 a3b9af16 Richard Henderson
    PTE_KWE   = 0x1000,
336 a3b9af16 Richard Henderson
    PTE_UWE   = 0x2000
337 a3b9af16 Richard Henderson
};
338 a3b9af16 Richard Henderson
339 ea879fc7 Richard Henderson
/* Hardware interrupt (entInt) constants.  */
340 ea879fc7 Richard Henderson
enum {
341 ea879fc7 Richard Henderson
    INT_K_IP,
342 ea879fc7 Richard Henderson
    INT_K_CLK,
343 ea879fc7 Richard Henderson
    INT_K_MCHK,
344 ea879fc7 Richard Henderson
    INT_K_DEV,
345 ea879fc7 Richard Henderson
    INT_K_PERF,
346 ea879fc7 Richard Henderson
};
347 ea879fc7 Richard Henderson
348 ea879fc7 Richard Henderson
/* Memory management (entMM) constants.  */
349 ea879fc7 Richard Henderson
enum {
350 ea879fc7 Richard Henderson
    MM_K_TNV,
351 ea879fc7 Richard Henderson
    MM_K_ACV,
352 ea879fc7 Richard Henderson
    MM_K_FOR,
353 ea879fc7 Richard Henderson
    MM_K_FOE,
354 ea879fc7 Richard Henderson
    MM_K_FOW
355 ea879fc7 Richard Henderson
};
356 ea879fc7 Richard Henderson
357 ea879fc7 Richard Henderson
/* Arithmetic exception (entArith) constants.  */
358 ea879fc7 Richard Henderson
enum {
359 ea879fc7 Richard Henderson
    EXC_M_SWC = 1,      /* Software completion */
360 ea879fc7 Richard Henderson
    EXC_M_INV = 2,      /* Invalid operation */
361 ea879fc7 Richard Henderson
    EXC_M_DZE = 4,      /* Division by zero */
362 ea879fc7 Richard Henderson
    EXC_M_FOV = 8,      /* Overflow */
363 ea879fc7 Richard Henderson
    EXC_M_UNF = 16,     /* Underflow */
364 ea879fc7 Richard Henderson
    EXC_M_INE = 32,     /* Inexact result */
365 ea879fc7 Richard Henderson
    EXC_M_IOV = 64      /* Integer Overflow */
366 ea879fc7 Richard Henderson
};
367 ea879fc7 Richard Henderson
368 ea879fc7 Richard Henderson
/* Processor status constants.  */
369 ea879fc7 Richard Henderson
enum {
370 ea879fc7 Richard Henderson
    /* Low 3 bits are interrupt mask level.  */
371 ea879fc7 Richard Henderson
    PS_INT_MASK = 7,
372 ea879fc7 Richard Henderson
373 ea879fc7 Richard Henderson
    /* Bits 4 and 5 are the mmu mode.  The VMS PALcode uses all 4 modes;
374 ea879fc7 Richard Henderson
       The Unix PALcode only uses bit 4.  */
375 ea879fc7 Richard Henderson
    PS_USER_MODE = 8
376 ea879fc7 Richard Henderson
};
377 ea879fc7 Richard Henderson
378 4d5712f1 Andreas Färber
static inline int cpu_mmu_index(CPUAlphaState *env)
379 ea879fc7 Richard Henderson
{
380 bba9bdce Richard Henderson
    if (env->pal_mode) {
381 bba9bdce Richard Henderson
        return MMU_KERNEL_IDX;
382 bba9bdce Richard Henderson
    } else if (env->ps & PS_USER_MODE) {
383 bba9bdce Richard Henderson
        return MMU_USER_IDX;
384 bba9bdce Richard Henderson
    } else {
385 bba9bdce Richard Henderson
        return MMU_KERNEL_IDX;
386 bba9bdce Richard Henderson
    }
387 ea879fc7 Richard Henderson
}
388 4c9649a9 j_mayer
389 4c9649a9 j_mayer
enum {
390 4c9649a9 j_mayer
    IR_V0   = 0,
391 4c9649a9 j_mayer
    IR_T0   = 1,
392 4c9649a9 j_mayer
    IR_T1   = 2,
393 4c9649a9 j_mayer
    IR_T2   = 3,
394 4c9649a9 j_mayer
    IR_T3   = 4,
395 4c9649a9 j_mayer
    IR_T4   = 5,
396 4c9649a9 j_mayer
    IR_T5   = 6,
397 4c9649a9 j_mayer
    IR_T6   = 7,
398 4c9649a9 j_mayer
    IR_T7   = 8,
399 4c9649a9 j_mayer
    IR_S0   = 9,
400 4c9649a9 j_mayer
    IR_S1   = 10,
401 4c9649a9 j_mayer
    IR_S2   = 11,
402 4c9649a9 j_mayer
    IR_S3   = 12,
403 4c9649a9 j_mayer
    IR_S4   = 13,
404 4c9649a9 j_mayer
    IR_S5   = 14,
405 4c9649a9 j_mayer
    IR_S6   = 15,
406 a4b388ff Richard Henderson
    IR_FP   = IR_S6,
407 4c9649a9 j_mayer
    IR_A0   = 16,
408 4c9649a9 j_mayer
    IR_A1   = 17,
409 4c9649a9 j_mayer
    IR_A2   = 18,
410 4c9649a9 j_mayer
    IR_A3   = 19,
411 4c9649a9 j_mayer
    IR_A4   = 20,
412 4c9649a9 j_mayer
    IR_A5   = 21,
413 4c9649a9 j_mayer
    IR_T8   = 22,
414 4c9649a9 j_mayer
    IR_T9   = 23,
415 4c9649a9 j_mayer
    IR_T10  = 24,
416 4c9649a9 j_mayer
    IR_T11  = 25,
417 4c9649a9 j_mayer
    IR_RA   = 26,
418 4c9649a9 j_mayer
    IR_T12  = 27,
419 a4b388ff Richard Henderson
    IR_PV   = IR_T12,
420 4c9649a9 j_mayer
    IR_AT   = 28,
421 4c9649a9 j_mayer
    IR_GP   = 29,
422 4c9649a9 j_mayer
    IR_SP   = 30,
423 4c9649a9 j_mayer
    IR_ZERO = 31,
424 4c9649a9 j_mayer
};
425 4c9649a9 j_mayer
426 aaed909a bellard
CPUAlphaState * cpu_alpha_init (const char *cpu_model);
427 e96efcfc j_mayer
int cpu_alpha_exec(CPUAlphaState *s);
428 e96efcfc j_mayer
/* you can call this signal handler from your SIGBUS and SIGSEGV
429 e96efcfc j_mayer
   signal handlers to inform the virtual CPU of exceptions. non zero
430 e96efcfc j_mayer
   is returned if the signal was handled by the virtual CPU.  */
431 5fafdf24 ths
int cpu_alpha_signal_handler(int host_signum, void *pinfo,
432 e96efcfc j_mayer
                             void *puc);
433 4d5712f1 Andreas Färber
int cpu_alpha_handle_mmu_fault (CPUAlphaState *env, uint64_t address, int rw,
434 97b348e7 Blue Swirl
                                int mmu_idx);
435 0b5c1ce8 Nathan Froyd
#define cpu_handle_mmu_fault cpu_alpha_handle_mmu_fault
436 4d5712f1 Andreas Färber
void do_interrupt (CPUAlphaState *env);
437 20503968 Blue Swirl
void do_restore_state(CPUAlphaState *, uintptr_t retaddr);
438 20503968 Blue Swirl
void QEMU_NORETURN dynamic_excp(CPUAlphaState *, uintptr_t, int, int);
439 20503968 Blue Swirl
void QEMU_NORETURN arith_excp(CPUAlphaState *, uintptr_t, int, uint64_t);
440 95870356 aurel32
441 4d5712f1 Andreas Färber
uint64_t cpu_alpha_load_fpcr (CPUAlphaState *env);
442 4d5712f1 Andreas Färber
void cpu_alpha_store_fpcr (CPUAlphaState *env, uint64_t val);
443 5b450407 Richard Henderson
#ifndef CONFIG_USER_ONLY
444 4d5712f1 Andreas Färber
void swap_shadow_regs(CPUAlphaState *env);
445 4d5712f1 Andreas Färber
QEMU_NORETURN void cpu_unassigned_access(CPUAlphaState *env1,
446 b14ef7c9 Blue Swirl
                                         target_phys_addr_t addr, int is_write,
447 b14ef7c9 Blue Swirl
                                         int is_exec, int unused, int size);
448 5b450407 Richard Henderson
#endif
449 4c9649a9 j_mayer
450 a18ad893 Richard Henderson
/* Bits in TB->FLAGS that control how translation is processed.  */
451 a18ad893 Richard Henderson
enum {
452 a18ad893 Richard Henderson
    TB_FLAGS_PAL_MODE = 1,
453 a18ad893 Richard Henderson
    TB_FLAGS_FEN = 2,
454 a18ad893 Richard Henderson
    TB_FLAGS_USER_MODE = 8,
455 a18ad893 Richard Henderson
456 a18ad893 Richard Henderson
    TB_FLAGS_AMASK_SHIFT = 4,
457 a18ad893 Richard Henderson
    TB_FLAGS_AMASK_BWX = AMASK_BWX << TB_FLAGS_AMASK_SHIFT,
458 a18ad893 Richard Henderson
    TB_FLAGS_AMASK_FIX = AMASK_FIX << TB_FLAGS_AMASK_SHIFT,
459 a18ad893 Richard Henderson
    TB_FLAGS_AMASK_CIX = AMASK_CIX << TB_FLAGS_AMASK_SHIFT,
460 a18ad893 Richard Henderson
    TB_FLAGS_AMASK_MVI = AMASK_MVI << TB_FLAGS_AMASK_SHIFT,
461 a18ad893 Richard Henderson
    TB_FLAGS_AMASK_TRAP = AMASK_TRAP << TB_FLAGS_AMASK_SHIFT,
462 a18ad893 Richard Henderson
    TB_FLAGS_AMASK_PREFETCH = AMASK_PREFETCH << TB_FLAGS_AMASK_SHIFT,
463 a18ad893 Richard Henderson
};
464 a18ad893 Richard Henderson
465 4d5712f1 Andreas Färber
static inline void cpu_get_tb_cpu_state(CPUAlphaState *env, target_ulong *pc,
466 a18ad893 Richard Henderson
                                        target_ulong *cs_base, int *pflags)
467 6b917547 aliguori
{
468 a18ad893 Richard Henderson
    int flags = 0;
469 a18ad893 Richard Henderson
470 6b917547 aliguori
    *pc = env->pc;
471 6b917547 aliguori
    *cs_base = 0;
472 a18ad893 Richard Henderson
473 a18ad893 Richard Henderson
    if (env->pal_mode) {
474 a18ad893 Richard Henderson
        flags = TB_FLAGS_PAL_MODE;
475 a18ad893 Richard Henderson
    } else {
476 a18ad893 Richard Henderson
        flags = env->ps & PS_USER_MODE;
477 a18ad893 Richard Henderson
    }
478 a18ad893 Richard Henderson
    if (env->fen) {
479 a18ad893 Richard Henderson
        flags |= TB_FLAGS_FEN;
480 a18ad893 Richard Henderson
    }
481 a18ad893 Richard Henderson
    flags |= env->amask << TB_FLAGS_AMASK_SHIFT;
482 a18ad893 Richard Henderson
483 a18ad893 Richard Henderson
    *pflags = flags;
484 6b917547 aliguori
}
485 6b917547 aliguori
486 a4b388ff Richard Henderson
#if defined(CONFIG_USER_ONLY)
487 4d5712f1 Andreas Färber
static inline void cpu_clone_regs(CPUAlphaState *env, target_ulong newsp)
488 a4b388ff Richard Henderson
{
489 a4b388ff Richard Henderson
    if (newsp) {
490 a4b388ff Richard Henderson
        env->ir[IR_SP] = newsp;
491 a4b388ff Richard Henderson
    }
492 a4b388ff Richard Henderson
    env->ir[IR_V0] = 0;
493 a4b388ff Richard Henderson
    env->ir[IR_A3] = 0;
494 a4b388ff Richard Henderson
}
495 a4b388ff Richard Henderson
496 4d5712f1 Andreas Färber
static inline void cpu_set_tls(CPUAlphaState *env, target_ulong newtls)
497 a4b388ff Richard Henderson
{
498 a4b388ff Richard Henderson
    env->unique = newtls;
499 a4b388ff Richard Henderson
}
500 a4b388ff Richard Henderson
#endif
501 a4b388ff Richard Henderson
502 4d5712f1 Andreas Färber
static inline bool cpu_has_work(CPUAlphaState *env)
503 f081c76c Blue Swirl
{
504 f081c76c Blue Swirl
    /* Here we are checking to see if the CPU should wake up from HALT.
505 f081c76c Blue Swirl
       We will have gotten into this state only for WTINT from PALmode.  */
506 f081c76c Blue Swirl
    /* ??? I'm not sure how the IPL state works with WTINT to keep a CPU
507 f081c76c Blue Swirl
       asleep even if (some) interrupts have been asserted.  For now,
508 f081c76c Blue Swirl
       assume that if a CPU really wants to stay asleep, it will mask
509 f081c76c Blue Swirl
       interrupts at the chipset level, which will prevent these bits
510 f081c76c Blue Swirl
       from being set in the first place.  */
511 f081c76c Blue Swirl
    return env->interrupt_request & (CPU_INTERRUPT_HARD
512 f081c76c Blue Swirl
                                     | CPU_INTERRUPT_TIMER
513 f081c76c Blue Swirl
                                     | CPU_INTERRUPT_SMP
514 f081c76c Blue Swirl
                                     | CPU_INTERRUPT_MCHK);
515 f081c76c Blue Swirl
}
516 f081c76c Blue Swirl
517 f081c76c Blue Swirl
#include "exec-all.h"
518 f081c76c Blue Swirl
519 4d5712f1 Andreas Färber
static inline void cpu_pc_from_tb(CPUAlphaState *env, TranslationBlock *tb)
520 f081c76c Blue Swirl
{
521 f081c76c Blue Swirl
    env->pc = tb->pc;
522 f081c76c Blue Swirl
}
523 f081c76c Blue Swirl
524 4c9649a9 j_mayer
#endif /* !defined (__CPU_ALPHA_H__) */