Statistics
| Branch: | Revision:

root / target-alpha / cpu.h @ f5fc40bb

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

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

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

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

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