Statistics
| Branch: | Revision:

root / target-alpha / cpu.h @ ba0e276d

History | View | Annotate | Download (13.8 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 4c9649a9 j_mayer
#define VA_BITS 43
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 ba0e276d Richard Henderson
#define FPCR_DYN_MASK                (3ULL << FPCR_DYN_SHIFT)
149 ba0e276d Richard Henderson
#define FPCR_IOV                (1ULL << 57)
150 ba0e276d Richard Henderson
#define FPCR_INE                (1ULL << 56)
151 ba0e276d Richard Henderson
#define FPCR_UNF                (1ULL << 55)
152 ba0e276d Richard Henderson
#define FPCR_OVF                (1ULL << 54)
153 ba0e276d Richard Henderson
#define FPCR_DZE                (1ULL << 53)
154 ba0e276d Richard Henderson
#define FPCR_INV                (1ULL << 52)
155 ba0e276d Richard Henderson
#define FPCR_OVFD                (1ULL << 51)
156 ba0e276d Richard Henderson
#define FPCR_DZED                (1ULL << 50)
157 ba0e276d Richard Henderson
#define FPCR_INVD                (1ULL << 49)
158 ba0e276d Richard Henderson
#define FPCR_DNZ                (1ULL << 48)
159 ba0e276d Richard Henderson
#define FPCR_DNOD                (1ULL << 47)
160 ba0e276d Richard Henderson
#define FPCR_STATUS_MASK        (FPCR_IOV | FPCR_INE | FPCR_UNF \
161 ba0e276d Richard Henderson
                                 | FPCR_OVF | FPCR_DZE | FPCR_INV)
162 ba0e276d Richard Henderson
163 ba0e276d Richard Henderson
/* The silly software trap enables implemented by the kernel emulation.
164 ba0e276d Richard Henderson
   These are more or less architecturally required, since the real hardware
165 ba0e276d Richard Henderson
   has read-as-zero bits in the FPCR when the features aren't implemented.
166 ba0e276d Richard Henderson
   For the purposes of QEMU, we pretend the FPCR can hold everything.  */
167 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_INV        (1ULL << 1)
168 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_DZE        (1ULL << 2)
169 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_OVF        (1ULL << 3)
170 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_UNF        (1ULL << 4)
171 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_INE        (1ULL << 5)
172 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_DNO        (1ULL << 6)
173 ba0e276d Richard Henderson
#define SWCR_TRAP_ENABLE_MASK        ((1ULL << 7) - (1ULL << 1))
174 ba0e276d Richard Henderson
175 ba0e276d Richard Henderson
#define SWCR_MAP_DMZ                (1ULL << 12)
176 ba0e276d Richard Henderson
#define SWCR_MAP_UMZ                (1ULL << 13)
177 ba0e276d Richard Henderson
#define SWCR_MAP_MASK                (SWCR_MAP_DMZ | SWCR_MAP_UMZ)
178 ba0e276d Richard Henderson
179 ba0e276d Richard Henderson
#define SWCR_STATUS_INV                (1ULL << 17)
180 ba0e276d Richard Henderson
#define SWCR_STATUS_DZE                (1ULL << 18)
181 ba0e276d Richard Henderson
#define SWCR_STATUS_OVF                (1ULL << 19)
182 ba0e276d Richard Henderson
#define SWCR_STATUS_UNF                (1ULL << 20)
183 ba0e276d Richard Henderson
#define SWCR_STATUS_INE                (1ULL << 21)
184 ba0e276d Richard Henderson
#define SWCR_STATUS_DNO                (1ULL << 22)
185 ba0e276d Richard Henderson
#define SWCR_STATUS_MASK        ((1ULL << 23) - (1ULL << 17))
186 ba0e276d Richard Henderson
187 ba0e276d Richard Henderson
#define SWCR_MASK  (SWCR_TRAP_ENABLE_MASK | SWCR_MAP_MASK | SWCR_STATUS_MASK)
188 ba0e276d Richard Henderson
189 4c9649a9 j_mayer
/* Internal processor registers */
190 4c9649a9 j_mayer
/* XXX: TOFIX: most of those registers are implementation dependant */
191 4c9649a9 j_mayer
enum {
192 4c9649a9 j_mayer
    /* Ebox IPRs */
193 f8cc8534 aurel32
    IPR_CC           = 0xC0,            /* 21264 */
194 f8cc8534 aurel32
    IPR_CC_CTL       = 0xC1,            /* 21264 */
195 f8cc8534 aurel32
#define IPR_CC_CTL_ENA_SHIFT 32
196 f8cc8534 aurel32
#define IPR_CC_CTL_COUNTER_MASK 0xfffffff0UL
197 f8cc8534 aurel32
    IPR_VA           = 0xC2,            /* 21264 */
198 f8cc8534 aurel32
    IPR_VA_CTL       = 0xC4,            /* 21264 */
199 f8cc8534 aurel32
#define IPR_VA_CTL_VA_48_SHIFT 1
200 f8cc8534 aurel32
#define IPR_VA_CTL_VPTB_SHIFT 30
201 f8cc8534 aurel32
    IPR_VA_FORM      = 0xC3,            /* 21264 */
202 4c9649a9 j_mayer
    /* Ibox IPRs */
203 f8cc8534 aurel32
    IPR_ITB_TAG      = 0x00,            /* 21264 */
204 f8cc8534 aurel32
    IPR_ITB_PTE      = 0x01,            /* 21264 */
205 f8cc8534 aurel32
    IPR_ITB_IAP      = 0x02,
206 f8cc8534 aurel32
    IPR_ITB_IA       = 0x03,            /* 21264 */
207 2642cdb3 aurel32
    IPR_ITB_IS       = 0x04,            /* 21264 */
208 4c9649a9 j_mayer
    IPR_PMPC         = 0x05,
209 f8cc8534 aurel32
    IPR_EXC_ADDR     = 0x06,            /* 21264 */
210 f8cc8534 aurel32
    IPR_IVA_FORM     = 0x07,            /* 21264 */
211 f8cc8534 aurel32
    IPR_CM           = 0x09,            /* 21264 */
212 f8cc8534 aurel32
#define IPR_CM_SHIFT 3
213 f8cc8534 aurel32
#define IPR_CM_MASK (3ULL << IPR_CM_SHIFT)      /* 21264 */
214 f8cc8534 aurel32
    IPR_IER          = 0x0A,            /* 21264 */
215 f8cc8534 aurel32
#define IPR_IER_MASK 0x0000007fffffe000ULL
216 f8cc8534 aurel32
    IPR_IER_CM       = 0x0B,            /* 21264: = CM | IER */
217 f8cc8534 aurel32
    IPR_SIRR         = 0x0C,            /* 21264 */
218 f8cc8534 aurel32
#define IPR_SIRR_SHIFT 14
219 f8cc8534 aurel32
#define IPR_SIRR_MASK 0x7fff
220 f8cc8534 aurel32
    IPR_ISUM         = 0x0D,            /* 21264 */
221 f8cc8534 aurel32
    IPR_HW_INT_CLR   = 0x0E,            /* 21264 */
222 4c9649a9 j_mayer
    IPR_EXC_SUM      = 0x0F,
223 4c9649a9 j_mayer
    IPR_PAL_BASE     = 0x10,
224 4c9649a9 j_mayer
    IPR_I_CTL        = 0x11,
225 f8cc8534 aurel32
#define IPR_I_CTL_CHIP_ID_SHIFT 24      /* 21264 */
226 f8cc8534 aurel32
#define IPR_I_CTL_BIST_FAIL (1 << 23)   /* 21264 */
227 f8cc8534 aurel32
#define IPR_I_CTL_IC_EN_SHIFT 2         /* 21264 */
228 f8cc8534 aurel32
#define IPR_I_CTL_SDE1_SHIFT 7          /* 21264 */
229 f8cc8534 aurel32
#define IPR_I_CTL_HWE_SHIFT 12          /* 21264 */
230 f8cc8534 aurel32
#define IPR_I_CTL_VA_48_SHIFT 15        /* 21264 */
231 f8cc8534 aurel32
#define IPR_I_CTL_SPE_SHIFT 3           /* 21264 */
232 f8cc8534 aurel32
#define IPR_I_CTL_CALL_PAL_R23_SHIFT 20 /* 21264 */
233 f8cc8534 aurel32
    IPR_I_STAT       = 0x16,            /* 21264 */
234 f8cc8534 aurel32
    IPR_IC_FLUSH     = 0x13,            /* 21264 */
235 f8cc8534 aurel32
    IPR_IC_FLUSH_ASM = 0x12,            /* 21264 */
236 4c9649a9 j_mayer
    IPR_CLR_MAP      = 0x15,
237 4c9649a9 j_mayer
    IPR_SLEEP        = 0x17,
238 4c9649a9 j_mayer
    IPR_PCTX         = 0x40,
239 f8cc8534 aurel32
    IPR_PCTX_ASN       = 0x01,  /* field */
240 f8cc8534 aurel32
#define IPR_PCTX_ASN_SHIFT 39
241 f8cc8534 aurel32
    IPR_PCTX_ASTER     = 0x02,  /* field */
242 f8cc8534 aurel32
#define IPR_PCTX_ASTER_SHIFT 5
243 f8cc8534 aurel32
    IPR_PCTX_ASTRR     = 0x04,  /* field */
244 f8cc8534 aurel32
#define IPR_PCTX_ASTRR_SHIFT 9
245 f8cc8534 aurel32
    IPR_PCTX_PPCE      = 0x08,  /* field */
246 f8cc8534 aurel32
#define IPR_PCTX_PPCE_SHIFT 1
247 f8cc8534 aurel32
    IPR_PCTX_FPE       = 0x10,  /* field */
248 f8cc8534 aurel32
#define IPR_PCTX_FPE_SHIFT 2
249 f8cc8534 aurel32
    IPR_PCTX_ALL       = 0x5f,  /* all fields */
250 f8cc8534 aurel32
    IPR_PCTR_CTL     = 0x14,            /* 21264 */
251 4c9649a9 j_mayer
    /* Mbox IPRs */
252 f8cc8534 aurel32
    IPR_DTB_TAG0     = 0x20,            /* 21264 */
253 f8cc8534 aurel32
    IPR_DTB_TAG1     = 0xA0,            /* 21264 */
254 f8cc8534 aurel32
    IPR_DTB_PTE0     = 0x21,            /* 21264 */
255 f8cc8534 aurel32
    IPR_DTB_PTE1     = 0xA1,            /* 21264 */
256 4c9649a9 j_mayer
    IPR_DTB_ALTMODE  = 0xA6,
257 f8cc8534 aurel32
    IPR_DTB_ALTMODE0 = 0x26,            /* 21264 */
258 f8cc8534 aurel32
#define IPR_DTB_ALTMODE_MASK 3
259 4c9649a9 j_mayer
    IPR_DTB_IAP      = 0xA2,
260 f8cc8534 aurel32
    IPR_DTB_IA       = 0xA3,            /* 21264 */
261 4c9649a9 j_mayer
    IPR_DTB_IS0      = 0x24,
262 4c9649a9 j_mayer
    IPR_DTB_IS1      = 0xA4,
263 f8cc8534 aurel32
    IPR_DTB_ASN0     = 0x25,            /* 21264 */
264 f8cc8534 aurel32
    IPR_DTB_ASN1     = 0xA5,            /* 21264 */
265 f8cc8534 aurel32
#define IPR_DTB_ASN_SHIFT 56
266 f8cc8534 aurel32
    IPR_MM_STAT      = 0x27,            /* 21264 */
267 f8cc8534 aurel32
    IPR_M_CTL        = 0x28,            /* 21264 */
268 f8cc8534 aurel32
#define IPR_M_CTL_SPE_SHIFT 1
269 f8cc8534 aurel32
#define IPR_M_CTL_SPE_MASK 7
270 2642cdb3 aurel32
    IPR_DC_CTL       = 0x29,            /* 21264 */
271 f8cc8534 aurel32
    IPR_DC_STAT      = 0x2A,            /* 21264 */
272 4c9649a9 j_mayer
    /* Cbox IPRs */
273 4c9649a9 j_mayer
    IPR_C_DATA       = 0x2B,
274 4c9649a9 j_mayer
    IPR_C_SHIFT      = 0x2C,
275 4c9649a9 j_mayer
276 4c9649a9 j_mayer
    IPR_ASN,
277 4c9649a9 j_mayer
    IPR_ASTEN,
278 4c9649a9 j_mayer
    IPR_ASTSR,
279 4c9649a9 j_mayer
    IPR_DATFX,
280 4c9649a9 j_mayer
    IPR_ESP,
281 4c9649a9 j_mayer
    IPR_FEN,
282 4c9649a9 j_mayer
    IPR_IPIR,
283 4c9649a9 j_mayer
    IPR_IPL,
284 4c9649a9 j_mayer
    IPR_KSP,
285 4c9649a9 j_mayer
    IPR_MCES,
286 4c9649a9 j_mayer
    IPR_PERFMON,
287 4c9649a9 j_mayer
    IPR_PCBB,
288 4c9649a9 j_mayer
    IPR_PRBR,
289 4c9649a9 j_mayer
    IPR_PTBR,
290 4c9649a9 j_mayer
    IPR_SCBB,
291 4c9649a9 j_mayer
    IPR_SISR,
292 4c9649a9 j_mayer
    IPR_SSP,
293 4c9649a9 j_mayer
    IPR_SYSPTBR,
294 4c9649a9 j_mayer
    IPR_TBCHK,
295 4c9649a9 j_mayer
    IPR_TBIA,
296 4c9649a9 j_mayer
    IPR_TBIAP,
297 4c9649a9 j_mayer
    IPR_TBIS,
298 4c9649a9 j_mayer
    IPR_TBISD,
299 4c9649a9 j_mayer
    IPR_TBISI,
300 4c9649a9 j_mayer
    IPR_USP,
301 4c9649a9 j_mayer
    IPR_VIRBND,
302 4c9649a9 j_mayer
    IPR_VPTB,
303 4c9649a9 j_mayer
    IPR_WHAMI,
304 4c9649a9 j_mayer
    IPR_ALT_MODE,
305 4c9649a9 j_mayer
    IPR_LAST,
306 4c9649a9 j_mayer
};
307 4c9649a9 j_mayer
308 4c9649a9 j_mayer
typedef struct CPUAlphaState CPUAlphaState;
309 4c9649a9 j_mayer
310 c227f099 Anthony Liguori
typedef struct pal_handler_t pal_handler_t;
311 c227f099 Anthony Liguori
struct pal_handler_t {
312 4c9649a9 j_mayer
    /* Reset */
313 4c9649a9 j_mayer
    void (*reset)(CPUAlphaState *env);
314 4c9649a9 j_mayer
    /* Uncorrectable hardware error */
315 4c9649a9 j_mayer
    void (*machine_check)(CPUAlphaState *env);
316 4c9649a9 j_mayer
    /* Arithmetic exception */
317 4c9649a9 j_mayer
    void (*arithmetic)(CPUAlphaState *env);
318 4c9649a9 j_mayer
    /* Interrupt / correctable hardware error */
319 4c9649a9 j_mayer
    void (*interrupt)(CPUAlphaState *env);
320 4c9649a9 j_mayer
    /* Data fault */
321 4c9649a9 j_mayer
    void (*dfault)(CPUAlphaState *env);
322 4c9649a9 j_mayer
    /* DTB miss pal */
323 4c9649a9 j_mayer
    void (*dtb_miss_pal)(CPUAlphaState *env);
324 4c9649a9 j_mayer
    /* DTB miss native */
325 4c9649a9 j_mayer
    void (*dtb_miss_native)(CPUAlphaState *env);
326 4c9649a9 j_mayer
    /* Unaligned access */
327 4c9649a9 j_mayer
    void (*unalign)(CPUAlphaState *env);
328 4c9649a9 j_mayer
    /* ITB miss */
329 4c9649a9 j_mayer
    void (*itb_miss)(CPUAlphaState *env);
330 4c9649a9 j_mayer
    /* Instruction stream access violation */
331 4c9649a9 j_mayer
    void (*itb_acv)(CPUAlphaState *env);
332 4c9649a9 j_mayer
    /* Reserved or privileged opcode */
333 4c9649a9 j_mayer
    void (*opcdec)(CPUAlphaState *env);
334 4c9649a9 j_mayer
    /* Floating point exception */
335 4c9649a9 j_mayer
    void (*fen)(CPUAlphaState *env);
336 4c9649a9 j_mayer
    /* Call pal instruction */
337 4c9649a9 j_mayer
    void (*call_pal)(CPUAlphaState *env, uint32_t palcode);
338 4c9649a9 j_mayer
};
339 4c9649a9 j_mayer
340 6ebbf390 j_mayer
#define NB_MMU_MODES 4
341 6ebbf390 j_mayer
342 4c9649a9 j_mayer
struct CPUAlphaState {
343 4c9649a9 j_mayer
    uint64_t ir[31];
344 4c9649a9 j_mayer
    float64  fir[31];
345 4c9649a9 j_mayer
    float_status fp_status;
346 4c9649a9 j_mayer
    uint64_t fpcr;
347 4c9649a9 j_mayer
    uint64_t pc;
348 4c9649a9 j_mayer
    uint64_t lock;
349 4c9649a9 j_mayer
    uint32_t pcc[2];
350 4c9649a9 j_mayer
    uint64_t ipr[IPR_LAST];
351 4c9649a9 j_mayer
    uint64_t ps;
352 4c9649a9 j_mayer
    uint64_t unique;
353 4c9649a9 j_mayer
    int saved_mode; /* Used for HW_LD / HW_ST */
354 6ad02592 aurel32
    int intr_flag; /* For RC and RS */
355 4c9649a9 j_mayer
356 bf9525e9 j_mayer
#if TARGET_LONG_BITS > HOST_LONG_BITS
357 bf9525e9 j_mayer
    /* temporary fixed-point registers
358 bf9525e9 j_mayer
     * used to emulate 64 bits target on 32 bits hosts
359 5fafdf24 ths
     */
360 04acd307 aurel32
    target_ulong t0, t1;
361 bf9525e9 j_mayer
#endif
362 4c9649a9 j_mayer
363 4c9649a9 j_mayer
    /* Those resources are used only in Qemu core */
364 4c9649a9 j_mayer
    CPU_COMMON
365 4c9649a9 j_mayer
366 4c9649a9 j_mayer
    uint32_t hflags;
367 4c9649a9 j_mayer
368 4c9649a9 j_mayer
    int error_code;
369 4c9649a9 j_mayer
370 4c9649a9 j_mayer
    uint32_t features;
371 4c9649a9 j_mayer
    uint32_t amask;
372 4c9649a9 j_mayer
    int implver;
373 c227f099 Anthony Liguori
    pal_handler_t *pal_handler;
374 4c9649a9 j_mayer
};
375 4c9649a9 j_mayer
376 9467d44c ths
#define cpu_init cpu_alpha_init
377 9467d44c ths
#define cpu_exec cpu_alpha_exec
378 9467d44c ths
#define cpu_gen_code cpu_alpha_gen_code
379 9467d44c ths
#define cpu_signal_handler cpu_alpha_signal_handler
380 9467d44c ths
381 6ebbf390 j_mayer
/* MMU modes definitions */
382 6ebbf390 j_mayer
#define MMU_MODE0_SUFFIX _kernel
383 6ebbf390 j_mayer
#define MMU_MODE1_SUFFIX _executive
384 6ebbf390 j_mayer
#define MMU_MODE2_SUFFIX _supervisor
385 6ebbf390 j_mayer
#define MMU_MODE3_SUFFIX _user
386 6ebbf390 j_mayer
#define MMU_USER_IDX 3
387 6ebbf390 j_mayer
static inline int cpu_mmu_index (CPUState *env)
388 6ebbf390 j_mayer
{
389 6ebbf390 j_mayer
    return (env->ps >> 3) & 3;
390 6ebbf390 j_mayer
}
391 6ebbf390 j_mayer
392 6e68e076 pbrook
#if defined(CONFIG_USER_ONLY)
393 6e68e076 pbrook
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp)
394 6e68e076 pbrook
{
395 f8ed7070 pbrook
    if (newsp)
396 6e68e076 pbrook
        env->ir[30] = newsp;
397 6e68e076 pbrook
    /* FIXME: Zero syscall return value.  */
398 6e68e076 pbrook
}
399 6e68e076 pbrook
#endif
400 6e68e076 pbrook
401 4c9649a9 j_mayer
#include "cpu-all.h"
402 622ed360 aliguori
#include "exec-all.h"
403 4c9649a9 j_mayer
404 4c9649a9 j_mayer
enum {
405 4c9649a9 j_mayer
    FEATURE_ASN    = 0x00000001,
406 4c9649a9 j_mayer
    FEATURE_SPS    = 0x00000002,
407 4c9649a9 j_mayer
    FEATURE_VIRBND = 0x00000004,
408 4c9649a9 j_mayer
    FEATURE_TBCHK  = 0x00000008,
409 4c9649a9 j_mayer
};
410 4c9649a9 j_mayer
411 4c9649a9 j_mayer
enum {
412 4c9649a9 j_mayer
    EXCP_RESET            = 0x0000,
413 4c9649a9 j_mayer
    EXCP_MCHK             = 0x0020,
414 4c9649a9 j_mayer
    EXCP_ARITH            = 0x0060,
415 4c9649a9 j_mayer
    EXCP_HW_INTERRUPT     = 0x00E0,
416 4c9649a9 j_mayer
    EXCP_DFAULT           = 0x01E0,
417 4c9649a9 j_mayer
    EXCP_DTB_MISS_PAL     = 0x09E0,
418 4c9649a9 j_mayer
    EXCP_ITB_MISS         = 0x03E0,
419 4c9649a9 j_mayer
    EXCP_ITB_ACV          = 0x07E0,
420 4c9649a9 j_mayer
    EXCP_DTB_MISS_NATIVE  = 0x08E0,
421 4c9649a9 j_mayer
    EXCP_UNALIGN          = 0x11E0,
422 4c9649a9 j_mayer
    EXCP_OPCDEC           = 0x13E0,
423 4c9649a9 j_mayer
    EXCP_FEN              = 0x17E0,
424 4c9649a9 j_mayer
    EXCP_CALL_PAL         = 0x2000,
425 4c9649a9 j_mayer
    EXCP_CALL_PALP        = 0x3000,
426 4c9649a9 j_mayer
    EXCP_CALL_PALE        = 0x4000,
427 4c9649a9 j_mayer
    /* Pseudo exception for console */
428 4c9649a9 j_mayer
    EXCP_CONSOLE_DISPATCH = 0x4001,
429 4c9649a9 j_mayer
    EXCP_CONSOLE_FIXUP    = 0x4002,
430 4c9649a9 j_mayer
};
431 4c9649a9 j_mayer
432 4c9649a9 j_mayer
/* Arithmetic exception */
433 4c9649a9 j_mayer
enum {
434 4c9649a9 j_mayer
    EXCP_ARITH_OVERFLOW,
435 4c9649a9 j_mayer
};
436 4c9649a9 j_mayer
437 4c9649a9 j_mayer
enum {
438 4c9649a9 j_mayer
    IR_V0   = 0,
439 4c9649a9 j_mayer
    IR_T0   = 1,
440 4c9649a9 j_mayer
    IR_T1   = 2,
441 4c9649a9 j_mayer
    IR_T2   = 3,
442 4c9649a9 j_mayer
    IR_T3   = 4,
443 4c9649a9 j_mayer
    IR_T4   = 5,
444 4c9649a9 j_mayer
    IR_T5   = 6,
445 4c9649a9 j_mayer
    IR_T6   = 7,
446 4c9649a9 j_mayer
    IR_T7   = 8,
447 4c9649a9 j_mayer
    IR_S0   = 9,
448 4c9649a9 j_mayer
    IR_S1   = 10,
449 4c9649a9 j_mayer
    IR_S2   = 11,
450 4c9649a9 j_mayer
    IR_S3   = 12,
451 4c9649a9 j_mayer
    IR_S4   = 13,
452 4c9649a9 j_mayer
    IR_S5   = 14,
453 4c9649a9 j_mayer
    IR_S6   = 15,
454 4c9649a9 j_mayer
#define IR_FP IR_S6
455 4c9649a9 j_mayer
    IR_A0   = 16,
456 4c9649a9 j_mayer
    IR_A1   = 17,
457 4c9649a9 j_mayer
    IR_A2   = 18,
458 4c9649a9 j_mayer
    IR_A3   = 19,
459 4c9649a9 j_mayer
    IR_A4   = 20,
460 4c9649a9 j_mayer
    IR_A5   = 21,
461 4c9649a9 j_mayer
    IR_T8   = 22,
462 4c9649a9 j_mayer
    IR_T9   = 23,
463 4c9649a9 j_mayer
    IR_T10  = 24,
464 4c9649a9 j_mayer
    IR_T11  = 25,
465 4c9649a9 j_mayer
    IR_RA   = 26,
466 4c9649a9 j_mayer
    IR_T12  = 27,
467 4c9649a9 j_mayer
#define IR_PV IR_T12
468 4c9649a9 j_mayer
    IR_AT   = 28,
469 4c9649a9 j_mayer
    IR_GP   = 29,
470 4c9649a9 j_mayer
    IR_SP   = 30,
471 4c9649a9 j_mayer
    IR_ZERO = 31,
472 4c9649a9 j_mayer
};
473 4c9649a9 j_mayer
474 aaed909a bellard
CPUAlphaState * cpu_alpha_init (const char *cpu_model);
475 e96efcfc j_mayer
int cpu_alpha_exec(CPUAlphaState *s);
476 e96efcfc j_mayer
/* you can call this signal handler from your SIGBUS and SIGSEGV
477 e96efcfc j_mayer
   signal handlers to inform the virtual CPU of exceptions. non zero
478 e96efcfc j_mayer
   is returned if the signal was handled by the virtual CPU.  */
479 5fafdf24 ths
int cpu_alpha_signal_handler(int host_signum, void *pinfo,
480 e96efcfc j_mayer
                             void *puc);
481 95870356 aurel32
int cpu_alpha_handle_mmu_fault (CPUState *env, uint64_t address, int rw,
482 95870356 aurel32
                                int mmu_idx, int is_softmmu);
483 0b5c1ce8 Nathan Froyd
#define cpu_handle_mmu_fault cpu_alpha_handle_mmu_fault
484 95870356 aurel32
void do_interrupt (CPUState *env);
485 95870356 aurel32
486 ba0e276d Richard Henderson
uint64_t cpu_alpha_load_fpcr (CPUState *env);
487 ba0e276d Richard Henderson
void cpu_alpha_store_fpcr (CPUState *env, uint64_t val);
488 4c9649a9 j_mayer
int cpu_alpha_mfpr (CPUState *env, int iprn, uint64_t *valp);
489 4c9649a9 j_mayer
int cpu_alpha_mtpr (CPUState *env, int iprn, uint64_t val, uint64_t *oldvalp);
490 4c9649a9 j_mayer
void pal_init (CPUState *env);
491 7c9bde45 aurel32
#if !defined (CONFIG_USER_ONLY)
492 7c9bde45 aurel32
void call_pal (CPUState *env);
493 7c9bde45 aurel32
#else
494 4c9649a9 j_mayer
void call_pal (CPUState *env, int palcode);
495 7c9bde45 aurel32
#endif
496 4c9649a9 j_mayer
497 622ed360 aliguori
static inline void cpu_pc_from_tb(CPUState *env, TranslationBlock *tb)
498 622ed360 aliguori
{
499 622ed360 aliguori
    env->pc = tb->pc;
500 622ed360 aliguori
}
501 2e70f6ef pbrook
502 6b917547 aliguori
static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc,
503 6b917547 aliguori
                                        target_ulong *cs_base, int *flags)
504 6b917547 aliguori
{
505 6b917547 aliguori
    *pc = env->pc;
506 6b917547 aliguori
    *cs_base = 0;
507 6b917547 aliguori
    *flags = env->ps;
508 6b917547 aliguori
}
509 6b917547 aliguori
510 4c9649a9 j_mayer
#endif /* !defined (__CPU_ALPHA_H__) */