Statistics
| Branch: | Revision:

root / target-arm / cpu.h @ 1273d9ca

History | View | Annotate | Download (26.4 kB)

1 2c0262af bellard
/*
2 2c0262af bellard
 * ARM virtual CPU header
3 5fafdf24 ths
 *
4 2c0262af bellard
 *  Copyright (c) 2003 Fabrice Bellard
5 2c0262af bellard
 *
6 2c0262af bellard
 * This library is free software; you can redistribute it and/or
7 2c0262af bellard
 * modify it under the terms of the GNU Lesser General Public
8 2c0262af bellard
 * License as published by the Free Software Foundation; either
9 2c0262af bellard
 * version 2 of the License, or (at your option) any later version.
10 2c0262af bellard
 *
11 2c0262af bellard
 * This library is distributed in the hope that it will be useful,
12 2c0262af bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 2c0262af bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 2c0262af bellard
 * Lesser General Public License for more details.
15 2c0262af bellard
 *
16 2c0262af bellard
 * 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 2c0262af bellard
 */
19 2c0262af bellard
#ifndef CPU_ARM_H
20 2c0262af bellard
#define CPU_ARM_H
21 2c0262af bellard
22 3cf1e035 bellard
#define TARGET_LONG_BITS 32
23 3cf1e035 bellard
24 9042c0e2 ths
#define ELF_MACHINE        EM_ARM
25 9042c0e2 ths
26 9349b4f9 Andreas Färber
#define CPUArchState struct CPUARMState
27 c2764719 pbrook
28 9a78eead Stefan Weil
#include "config.h"
29 9a78eead Stefan Weil
#include "qemu-common.h"
30 2c0262af bellard
#include "cpu-defs.h"
31 2c0262af bellard
32 53cd6637 bellard
#include "softfloat.h"
33 53cd6637 bellard
34 1fddef4b bellard
#define TARGET_HAS_ICE 1
35 1fddef4b bellard
36 b8a9e8f1 bellard
#define EXCP_UDEF            1   /* undefined instruction */
37 b8a9e8f1 bellard
#define EXCP_SWI             2   /* software interrupt */
38 b8a9e8f1 bellard
#define EXCP_PREFETCH_ABORT  3
39 b8a9e8f1 bellard
#define EXCP_DATA_ABORT      4
40 b5ff1b31 bellard
#define EXCP_IRQ             5
41 b5ff1b31 bellard
#define EXCP_FIQ             6
42 06c949e6 pbrook
#define EXCP_BKPT            7
43 9ee6e8bb pbrook
#define EXCP_EXCEPTION_EXIT  8   /* Return from v7M exception.  */
44 fbb4a2e3 pbrook
#define EXCP_KERNEL_TRAP     9   /* Jumped to kernel code page.  */
45 426f5abc Paul Brook
#define EXCP_STREX          10
46 9ee6e8bb pbrook
47 9ee6e8bb pbrook
#define ARMV7M_EXCP_RESET   1
48 9ee6e8bb pbrook
#define ARMV7M_EXCP_NMI     2
49 9ee6e8bb pbrook
#define ARMV7M_EXCP_HARD    3
50 9ee6e8bb pbrook
#define ARMV7M_EXCP_MEM     4
51 9ee6e8bb pbrook
#define ARMV7M_EXCP_BUS     5
52 9ee6e8bb pbrook
#define ARMV7M_EXCP_USAGE   6
53 9ee6e8bb pbrook
#define ARMV7M_EXCP_SVC     11
54 9ee6e8bb pbrook
#define ARMV7M_EXCP_DEBUG   12
55 9ee6e8bb pbrook
#define ARMV7M_EXCP_PENDSV  14
56 9ee6e8bb pbrook
#define ARMV7M_EXCP_SYSTICK 15
57 2c0262af bellard
58 403946c0 Richard Henderson
/* ARM-specific interrupt pending bits.  */
59 403946c0 Richard Henderson
#define CPU_INTERRUPT_FIQ   CPU_INTERRUPT_TGT_EXT_1
60 403946c0 Richard Henderson
61 403946c0 Richard Henderson
62 c1713132 balrog
typedef void ARMWriteCPFunc(void *opaque, int cp_info,
63 c1713132 balrog
                            int srcreg, int operand, uint32_t value);
64 c1713132 balrog
typedef uint32_t ARMReadCPFunc(void *opaque, int cp_info,
65 c1713132 balrog
                               int dstreg, int operand);
66 c1713132 balrog
67 f93eb9ff balrog
struct arm_boot_info;
68 f93eb9ff balrog
69 6ebbf390 j_mayer
#define NB_MMU_MODES 2
70 6ebbf390 j_mayer
71 b7bcbe95 bellard
/* We currently assume float and double are IEEE single and double
72 b7bcbe95 bellard
   precision respectively.
73 b7bcbe95 bellard
   Doing runtime conversions is tricky because VFP registers may contain
74 b7bcbe95 bellard
   integer values (eg. as the result of a FTOSI instruction).
75 8e96005d bellard
   s<2n> maps to the least significant half of d<n>
76 8e96005d bellard
   s<2n+1> maps to the most significant half of d<n>
77 8e96005d bellard
 */
78 b7bcbe95 bellard
79 2c0262af bellard
typedef struct CPUARMState {
80 b5ff1b31 bellard
    /* Regs for current mode.  */
81 2c0262af bellard
    uint32_t regs[16];
82 b90372ad Peter Maydell
    /* Frequently accessed CPSR bits are stored separately for efficiency.
83 d37aca66 pbrook
       This contains all the other bits.  Use cpsr_{read,write} to access
84 b5ff1b31 bellard
       the whole CPSR.  */
85 b5ff1b31 bellard
    uint32_t uncached_cpsr;
86 b5ff1b31 bellard
    uint32_t spsr;
87 b5ff1b31 bellard
88 b5ff1b31 bellard
    /* Banked registers.  */
89 b5ff1b31 bellard
    uint32_t banked_spsr[6];
90 b5ff1b31 bellard
    uint32_t banked_r13[6];
91 b5ff1b31 bellard
    uint32_t banked_r14[6];
92 3b46e624 ths
93 b5ff1b31 bellard
    /* These hold r8-r12.  */
94 b5ff1b31 bellard
    uint32_t usr_regs[5];
95 b5ff1b31 bellard
    uint32_t fiq_regs[5];
96 3b46e624 ths
97 2c0262af bellard
    /* cpsr flag cache for faster execution */
98 2c0262af bellard
    uint32_t CF; /* 0 or 1 */
99 2c0262af bellard
    uint32_t VF; /* V is the bit 31. All other bits are undefined */
100 6fbe23d5 pbrook
    uint32_t NF; /* N is bit 31. All other bits are undefined.  */
101 6fbe23d5 pbrook
    uint32_t ZF; /* Z set if zero.  */
102 99c475ab bellard
    uint32_t QF; /* 0 or 1 */
103 9ee6e8bb pbrook
    uint32_t GE; /* cpsr[19:16] */
104 b26eefb6 pbrook
    uint32_t thumb; /* cpsr[5]. 0 = arm mode, 1 = thumb mode. */
105 9ee6e8bb pbrook
    uint32_t condexec_bits; /* IT bits.  cpsr[15:10,26:25].  */
106 2c0262af bellard
107 b5ff1b31 bellard
    /* System control coprocessor (cp15) */
108 b5ff1b31 bellard
    struct {
109 40f137e1 pbrook
        uint32_t c0_cpuid;
110 a49ea279 pbrook
        uint32_t c0_cssel; /* Cache size selection.  */
111 b5ff1b31 bellard
        uint32_t c1_sys; /* System control register.  */
112 b5ff1b31 bellard
        uint32_t c1_coproc; /* Coprocessor access register.  */
113 610c3c8a balrog
        uint32_t c1_xscaleauxcr; /* XScale auxiliary control register.  */
114 2be27624 Rob Herring
        uint32_t c1_scr; /* secure config register.  */
115 9ee6e8bb pbrook
        uint32_t c2_base0; /* MMU translation table base 0.  */
116 891a2fe7 Peter Maydell
        uint32_t c2_base0_hi; /* MMU translation table base 0, high 32 bits */
117 891a2fe7 Peter Maydell
        uint32_t c2_base1; /* MMU translation table base 0.  */
118 891a2fe7 Peter Maydell
        uint32_t c2_base1_hi; /* MMU translation table base 1, high 32 bits */
119 b2fa1797 pbrook
        uint32_t c2_control; /* MMU translation table base control.  */
120 b2fa1797 pbrook
        uint32_t c2_mask; /* MMU translation table base selection mask.  */
121 b2fa1797 pbrook
        uint32_t c2_base_mask; /* MMU translation table base 0 mask. */
122 ce819861 pbrook
        uint32_t c2_data; /* MPU data cachable bits.  */
123 ce819861 pbrook
        uint32_t c2_insn; /* MPU instruction cachable bits.  */
124 ce819861 pbrook
        uint32_t c3; /* MMU domain access control register
125 ce819861 pbrook
                        MPU write buffer control.  */
126 b5ff1b31 bellard
        uint32_t c5_insn; /* Fault status registers.  */
127 b5ff1b31 bellard
        uint32_t c5_data;
128 ce819861 pbrook
        uint32_t c6_region[8]; /* MPU base/size registers.  */
129 b5ff1b31 bellard
        uint32_t c6_insn; /* Fault address registers.  */
130 b5ff1b31 bellard
        uint32_t c6_data;
131 f8bf8606 Adam Lackorzynski
        uint32_t c7_par;  /* Translation result. */
132 891a2fe7 Peter Maydell
        uint32_t c7_par_hi;  /* Translation result, high 32 bits */
133 b5ff1b31 bellard
        uint32_t c9_insn; /* Cache lockdown registers.  */
134 b5ff1b31 bellard
        uint32_t c9_data;
135 74594c9d Peter Maydell
        uint32_t c9_pmcr; /* performance monitor control register */
136 74594c9d Peter Maydell
        uint32_t c9_pmcnten; /* perf monitor counter enables */
137 74594c9d Peter Maydell
        uint32_t c9_pmovsr; /* perf monitor overflow status */
138 74594c9d Peter Maydell
        uint32_t c9_pmxevtyper; /* perf monitor event type */
139 74594c9d Peter Maydell
        uint32_t c9_pmuserenr; /* perf monitor user enable */
140 74594c9d Peter Maydell
        uint32_t c9_pminten; /* perf monitor interrupt enables */
141 b5ff1b31 bellard
        uint32_t c13_fcse; /* FCSE PID.  */
142 b5ff1b31 bellard
        uint32_t c13_context; /* Context ID.  */
143 9ee6e8bb pbrook
        uint32_t c13_tls1; /* User RW Thread register.  */
144 9ee6e8bb pbrook
        uint32_t c13_tls2; /* User RO Thread register.  */
145 9ee6e8bb pbrook
        uint32_t c13_tls3; /* Privileged Thread register.  */
146 c1713132 balrog
        uint32_t c15_cpar; /* XScale Coprocessor Access Register */
147 c3d2689d balrog
        uint32_t c15_ticonfig; /* TI925T configuration byte.  */
148 c3d2689d balrog
        uint32_t c15_i_max; /* Maximum D-cache dirty line index.  */
149 c3d2689d balrog
        uint32_t c15_i_min; /* Minimum D-cache dirty line index.  */
150 c3d2689d balrog
        uint32_t c15_threadid; /* TI debugger thread-ID.  */
151 7da362d0 Mark Langsdorf
        uint32_t c15_config_base_address; /* SCU base address.  */
152 7da362d0 Mark Langsdorf
        uint32_t c15_diagnostic; /* diagnostic register */
153 7da362d0 Mark Langsdorf
        uint32_t c15_power_diagnostic;
154 7da362d0 Mark Langsdorf
        uint32_t c15_power_control; /* power control */
155 b5ff1b31 bellard
    } cp15;
156 40f137e1 pbrook
157 9ee6e8bb pbrook
    struct {
158 9ee6e8bb pbrook
        uint32_t other_sp;
159 9ee6e8bb pbrook
        uint32_t vecbase;
160 9ee6e8bb pbrook
        uint32_t basepri;
161 9ee6e8bb pbrook
        uint32_t control;
162 9ee6e8bb pbrook
        int current_sp;
163 9ee6e8bb pbrook
        int exception;
164 9ee6e8bb pbrook
        int pending_exception;
165 9ee6e8bb pbrook
    } v7m;
166 9ee6e8bb pbrook
167 fe1479c3 pbrook
    /* Thumb-2 EE state.  */
168 fe1479c3 pbrook
    uint32_t teecr;
169 fe1479c3 pbrook
    uint32_t teehbr;
170 fe1479c3 pbrook
171 b7bcbe95 bellard
    /* VFP coprocessor state.  */
172 b7bcbe95 bellard
    struct {
173 9ee6e8bb pbrook
        float64 regs[32];
174 b7bcbe95 bellard
175 40f137e1 pbrook
        uint32_t xregs[16];
176 b7bcbe95 bellard
        /* We store these fpcsr fields separately for convenience.  */
177 b7bcbe95 bellard
        int vec_len;
178 b7bcbe95 bellard
        int vec_stride;
179 b7bcbe95 bellard
180 9ee6e8bb pbrook
        /* scratch space when Tn are not sufficient.  */
181 9ee6e8bb pbrook
        uint32_t scratch[8];
182 3b46e624 ths
183 3a492f3a Peter Maydell
        /* fp_status is the "normal" fp status. standard_fp_status retains
184 3a492f3a Peter Maydell
         * values corresponding to the ARM "Standard FPSCR Value", ie
185 3a492f3a Peter Maydell
         * default-NaN, flush-to-zero, round-to-nearest and is used by
186 3a492f3a Peter Maydell
         * any operations (generally Neon) which the architecture defines
187 3a492f3a Peter Maydell
         * as controlled by the standard FPSCR value rather than the FPSCR.
188 3a492f3a Peter Maydell
         *
189 3a492f3a Peter Maydell
         * To avoid having to transfer exception bits around, we simply
190 3a492f3a Peter Maydell
         * say that the FPSCR cumulative exception flags are the logical
191 3a492f3a Peter Maydell
         * OR of the flags in the two fp statuses. This relies on the
192 3a492f3a Peter Maydell
         * only thing which needs to read the exception flags being
193 3a492f3a Peter Maydell
         * an explicit FPSCR read.
194 3a492f3a Peter Maydell
         */
195 53cd6637 bellard
        float_status fp_status;
196 3a492f3a Peter Maydell
        float_status standard_fp_status;
197 b7bcbe95 bellard
    } vfp;
198 426f5abc Paul Brook
    uint32_t exclusive_addr;
199 426f5abc Paul Brook
    uint32_t exclusive_val;
200 426f5abc Paul Brook
    uint32_t exclusive_high;
201 9ee6e8bb pbrook
#if defined(CONFIG_USER_ONLY)
202 426f5abc Paul Brook
    uint32_t exclusive_test;
203 426f5abc Paul Brook
    uint32_t exclusive_info;
204 9ee6e8bb pbrook
#endif
205 b7bcbe95 bellard
206 18c9b560 balrog
    /* iwMMXt coprocessor state.  */
207 18c9b560 balrog
    struct {
208 18c9b560 balrog
        uint64_t regs[16];
209 18c9b560 balrog
        uint64_t val;
210 18c9b560 balrog
211 18c9b560 balrog
        uint32_t cregs[16];
212 18c9b560 balrog
    } iwmmxt;
213 18c9b560 balrog
214 d8fd2954 Paul Brook
    /* For mixed endian mode.  */
215 d8fd2954 Paul Brook
    bool bswap_code;
216 d8fd2954 Paul Brook
217 ce4defa0 pbrook
#if defined(CONFIG_USER_ONLY)
218 ce4defa0 pbrook
    /* For usermode syscall translation.  */
219 ce4defa0 pbrook
    int eabi;
220 ce4defa0 pbrook
#endif
221 ce4defa0 pbrook
222 a316d335 bellard
    CPU_COMMON
223 a316d335 bellard
224 9d551997 balrog
    /* These fields after the common ones so they are preserved on reset.  */
225 9ba8c3f4 Lars Munch
226 581be094 Peter Maydell
    /* Internal CPU feature flags.  */
227 918f5dca Peter Maydell
    uint64_t features;
228 581be094 Peter Maydell
229 983fe826 Paul Brook
    void *nvic;
230 462a8bc6 Stefan Weil
    const struct arm_boot_info *boot_info;
231 2c0262af bellard
} CPUARMState;
232 2c0262af bellard
233 778c3a06 Andreas Färber
#include "cpu-qom.h"
234 778c3a06 Andreas Färber
235 778c3a06 Andreas Färber
ARMCPU *cpu_arm_init(const char *cpu_model);
236 b26eefb6 pbrook
void arm_translate_init(void);
237 2c0262af bellard
int cpu_arm_exec(CPUARMState *s);
238 b5ff1b31 bellard
void do_interrupt(CPUARMState *);
239 b5ff1b31 bellard
void switch_mode(CPUARMState *, int);
240 9ee6e8bb pbrook
uint32_t do_arm_semihosting(CPUARMState *env);
241 b5ff1b31 bellard
242 2c0262af bellard
/* you can call this signal handler from your SIGBUS and SIGSEGV
243 2c0262af bellard
   signal handlers to inform the virtual CPU of exceptions. non zero
244 2c0262af bellard
   is returned if the signal was handled by the virtual CPU.  */
245 5fafdf24 ths
int cpu_arm_signal_handler(int host_signum, void *pinfo,
246 2c0262af bellard
                           void *puc);
247 84a031c6 aurel32
int cpu_arm_handle_mmu_fault (CPUARMState *env, target_ulong address, int rw,
248 97b348e7 Blue Swirl
                              int mmu_idx);
249 0b5c1ce8 Nathan Froyd
#define cpu_handle_mmu_fault cpu_arm_handle_mmu_fault
250 2c0262af bellard
251 fbb4a2e3 pbrook
static inline void cpu_set_tls(CPUARMState *env, target_ulong newtls)
252 fbb4a2e3 pbrook
{
253 fbb4a2e3 pbrook
  env->cp15.c13_tls2 = newtls;
254 fbb4a2e3 pbrook
}
255 9ee6e8bb pbrook
256 b5ff1b31 bellard
#define CPSR_M (0x1f)
257 b5ff1b31 bellard
#define CPSR_T (1 << 5)
258 b5ff1b31 bellard
#define CPSR_F (1 << 6)
259 b5ff1b31 bellard
#define CPSR_I (1 << 7)
260 b5ff1b31 bellard
#define CPSR_A (1 << 8)
261 b5ff1b31 bellard
#define CPSR_E (1 << 9)
262 b5ff1b31 bellard
#define CPSR_IT_2_7 (0xfc00)
263 9ee6e8bb pbrook
#define CPSR_GE (0xf << 16)
264 9ee6e8bb pbrook
#define CPSR_RESERVED (0xf << 20)
265 b5ff1b31 bellard
#define CPSR_J (1 << 24)
266 b5ff1b31 bellard
#define CPSR_IT_0_1 (3 << 25)
267 b5ff1b31 bellard
#define CPSR_Q (1 << 27)
268 9ee6e8bb pbrook
#define CPSR_V (1 << 28)
269 9ee6e8bb pbrook
#define CPSR_C (1 << 29)
270 9ee6e8bb pbrook
#define CPSR_Z (1 << 30)
271 9ee6e8bb pbrook
#define CPSR_N (1 << 31)
272 9ee6e8bb pbrook
#define CPSR_NZCV (CPSR_N | CPSR_Z | CPSR_C | CPSR_V)
273 9ee6e8bb pbrook
274 9ee6e8bb pbrook
#define CPSR_IT (CPSR_IT_0_1 | CPSR_IT_2_7)
275 9ee6e8bb pbrook
#define CACHED_CPSR_BITS (CPSR_T | CPSR_GE | CPSR_IT | CPSR_Q | CPSR_NZCV)
276 9ee6e8bb pbrook
/* Bits writable in user mode.  */
277 9ee6e8bb pbrook
#define CPSR_USER (CPSR_NZCV | CPSR_Q | CPSR_GE)
278 9ee6e8bb pbrook
/* Execution state bits.  MRS read as zero, MSR writes ignored.  */
279 9ee6e8bb pbrook
#define CPSR_EXEC (CPSR_T | CPSR_IT | CPSR_J)
280 b5ff1b31 bellard
281 b5ff1b31 bellard
/* Return the current CPSR value.  */
282 2f4a40e5 balrog
uint32_t cpsr_read(CPUARMState *env);
283 2f4a40e5 balrog
/* Set the CPSR.  Note that some bits of mask must be all-set or all-clear.  */
284 2f4a40e5 balrog
void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask);
285 9ee6e8bb pbrook
286 9ee6e8bb pbrook
/* Return the current xPSR value.  */
287 9ee6e8bb pbrook
static inline uint32_t xpsr_read(CPUARMState *env)
288 9ee6e8bb pbrook
{
289 9ee6e8bb pbrook
    int ZF;
290 6fbe23d5 pbrook
    ZF = (env->ZF == 0);
291 6fbe23d5 pbrook
    return (env->NF & 0x80000000) | (ZF << 30)
292 9ee6e8bb pbrook
        | (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27)
293 9ee6e8bb pbrook
        | (env->thumb << 24) | ((env->condexec_bits & 3) << 25)
294 9ee6e8bb pbrook
        | ((env->condexec_bits & 0xfc) << 8)
295 9ee6e8bb pbrook
        | env->v7m.exception;
296 b5ff1b31 bellard
}
297 b5ff1b31 bellard
298 9ee6e8bb pbrook
/* Set the xPSR.  Note that some bits of mask must be all-set or all-clear.  */
299 9ee6e8bb pbrook
static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
300 9ee6e8bb pbrook
{
301 9ee6e8bb pbrook
    if (mask & CPSR_NZCV) {
302 6fbe23d5 pbrook
        env->ZF = (~val) & CPSR_Z;
303 6fbe23d5 pbrook
        env->NF = val;
304 9ee6e8bb pbrook
        env->CF = (val >> 29) & 1;
305 9ee6e8bb pbrook
        env->VF = (val << 3) & 0x80000000;
306 9ee6e8bb pbrook
    }
307 9ee6e8bb pbrook
    if (mask & CPSR_Q)
308 9ee6e8bb pbrook
        env->QF = ((val & CPSR_Q) != 0);
309 9ee6e8bb pbrook
    if (mask & (1 << 24))
310 9ee6e8bb pbrook
        env->thumb = ((val & (1 << 24)) != 0);
311 9ee6e8bb pbrook
    if (mask & CPSR_IT_0_1) {
312 9ee6e8bb pbrook
        env->condexec_bits &= ~3;
313 9ee6e8bb pbrook
        env->condexec_bits |= (val >> 25) & 3;
314 9ee6e8bb pbrook
    }
315 9ee6e8bb pbrook
    if (mask & CPSR_IT_2_7) {
316 9ee6e8bb pbrook
        env->condexec_bits &= 3;
317 9ee6e8bb pbrook
        env->condexec_bits |= (val >> 8) & 0xfc;
318 9ee6e8bb pbrook
    }
319 9ee6e8bb pbrook
    if (mask & 0x1ff) {
320 9ee6e8bb pbrook
        env->v7m.exception = val & 0x1ff;
321 9ee6e8bb pbrook
    }
322 9ee6e8bb pbrook
}
323 9ee6e8bb pbrook
324 01653295 Peter Maydell
/* Return the current FPSCR value.  */
325 01653295 Peter Maydell
uint32_t vfp_get_fpscr(CPUARMState *env);
326 01653295 Peter Maydell
void vfp_set_fpscr(CPUARMState *env, uint32_t val);
327 01653295 Peter Maydell
328 b5ff1b31 bellard
enum arm_cpu_mode {
329 b5ff1b31 bellard
  ARM_CPU_MODE_USR = 0x10,
330 b5ff1b31 bellard
  ARM_CPU_MODE_FIQ = 0x11,
331 b5ff1b31 bellard
  ARM_CPU_MODE_IRQ = 0x12,
332 b5ff1b31 bellard
  ARM_CPU_MODE_SVC = 0x13,
333 b5ff1b31 bellard
  ARM_CPU_MODE_ABT = 0x17,
334 b5ff1b31 bellard
  ARM_CPU_MODE_UND = 0x1b,
335 b5ff1b31 bellard
  ARM_CPU_MODE_SYS = 0x1f
336 b5ff1b31 bellard
};
337 b5ff1b31 bellard
338 40f137e1 pbrook
/* VFP system registers.  */
339 40f137e1 pbrook
#define ARM_VFP_FPSID   0
340 40f137e1 pbrook
#define ARM_VFP_FPSCR   1
341 9ee6e8bb pbrook
#define ARM_VFP_MVFR1   6
342 9ee6e8bb pbrook
#define ARM_VFP_MVFR0   7
343 40f137e1 pbrook
#define ARM_VFP_FPEXC   8
344 40f137e1 pbrook
#define ARM_VFP_FPINST  9
345 40f137e1 pbrook
#define ARM_VFP_FPINST2 10
346 40f137e1 pbrook
347 18c9b560 balrog
/* iwMMXt coprocessor control registers.  */
348 18c9b560 balrog
#define ARM_IWMMXT_wCID                0
349 18c9b560 balrog
#define ARM_IWMMXT_wCon                1
350 18c9b560 balrog
#define ARM_IWMMXT_wCSSF        2
351 18c9b560 balrog
#define ARM_IWMMXT_wCASF        3
352 18c9b560 balrog
#define ARM_IWMMXT_wCGR0        8
353 18c9b560 balrog
#define ARM_IWMMXT_wCGR1        9
354 18c9b560 balrog
#define ARM_IWMMXT_wCGR2        10
355 18c9b560 balrog
#define ARM_IWMMXT_wCGR3        11
356 18c9b560 balrog
357 ce854d7c Benoit Canet
/* If adding a feature bit which corresponds to a Linux ELF
358 ce854d7c Benoit Canet
 * HWCAP bit, remember to update the feature-bit-to-hwcap
359 ce854d7c Benoit Canet
 * mapping in linux-user/elfload.c:get_elf_hwcap().
360 ce854d7c Benoit Canet
 */
361 40f137e1 pbrook
enum arm_features {
362 40f137e1 pbrook
    ARM_FEATURE_VFP,
363 c1713132 balrog
    ARM_FEATURE_AUXCR,  /* ARM1026 Auxiliary control register.  */
364 c1713132 balrog
    ARM_FEATURE_XSCALE, /* Intel XScale extensions.  */
365 ce819861 pbrook
    ARM_FEATURE_IWMMXT, /* Intel iwMMXt extension.  */
366 9ee6e8bb pbrook
    ARM_FEATURE_V6,
367 9ee6e8bb pbrook
    ARM_FEATURE_V6K,
368 9ee6e8bb pbrook
    ARM_FEATURE_V7,
369 9ee6e8bb pbrook
    ARM_FEATURE_THUMB2,
370 c3d2689d balrog
    ARM_FEATURE_MPU,    /* Only has Memory Protection Unit, not full MMU.  */
371 9ee6e8bb pbrook
    ARM_FEATURE_VFP3,
372 60011498 Paul Brook
    ARM_FEATURE_VFP_FP16,
373 9ee6e8bb pbrook
    ARM_FEATURE_NEON,
374 47789990 Peter Maydell
    ARM_FEATURE_THUMB_DIV, /* divide supported in Thumb encoding */
375 9ee6e8bb pbrook
    ARM_FEATURE_M, /* Microcontroller profile.  */
376 fe1479c3 pbrook
    ARM_FEATURE_OMAPCP, /* OMAP specific CP15 ops handling.  */
377 e1bbf446 Peter Maydell
    ARM_FEATURE_THUMB2EE,
378 be5e7a76 Dmitry Eremin-Solenikov
    ARM_FEATURE_V7MP,    /* v7 Multiprocessing Extensions */
379 be5e7a76 Dmitry Eremin-Solenikov
    ARM_FEATURE_V4T,
380 be5e7a76 Dmitry Eremin-Solenikov
    ARM_FEATURE_V5,
381 5bc95aa2 Dmitry Eremin-Solenikov
    ARM_FEATURE_STRONGARM,
382 906879a9 Peter Maydell
    ARM_FEATURE_VAPA, /* cp15 VA to PA lookups */
383 b8b8ea05 Peter Maydell
    ARM_FEATURE_ARM_DIV, /* divide supported in ARM encoding */
384 da97f52c Peter Maydell
    ARM_FEATURE_VFP4, /* VFPv4 (implies that NEON is v2) */
385 0383ac00 Peter Maydell
    ARM_FEATURE_GENERIC_TIMER,
386 06ed5d66 Andrew Towers
    ARM_FEATURE_MVFR, /* Media and VFP Feature Registers 0 and 1 */
387 1047b9d7 Peter Maydell
    ARM_FEATURE_DUMMY_C15_REGS, /* RAZ/WI all of cp15 crn=15 */
388 c4804214 Peter Maydell
    ARM_FEATURE_CACHE_TEST_CLEAN, /* 926/1026 style test-and-clean ops */
389 c4804214 Peter Maydell
    ARM_FEATURE_CACHE_DIRTY_REG, /* 1136/1176 cache dirty status register */
390 c4804214 Peter Maydell
    ARM_FEATURE_CACHE_BLOCK_OPS, /* v6 optional cache block operations */
391 81bdde9d Peter Maydell
    ARM_FEATURE_MPIDR, /* has cp15 MPIDR */
392 de9b05b8 Peter Maydell
    ARM_FEATURE_PXN, /* has Privileged Execute Never bit */
393 de9b05b8 Peter Maydell
    ARM_FEATURE_LPAE, /* has Large Physical Address Extension */
394 40f137e1 pbrook
};
395 40f137e1 pbrook
396 40f137e1 pbrook
static inline int arm_feature(CPUARMState *env, int feature)
397 40f137e1 pbrook
{
398 918f5dca Peter Maydell
    return (env->features & (1ULL << feature)) != 0;
399 40f137e1 pbrook
}
400 40f137e1 pbrook
401 9a78eead Stefan Weil
void arm_cpu_list(FILE *f, fprintf_function cpu_fprintf);
402 40f137e1 pbrook
403 9ee6e8bb pbrook
/* Interface between CPU and Interrupt controller.  */
404 9ee6e8bb pbrook
void armv7m_nvic_set_pending(void *opaque, int irq);
405 9ee6e8bb pbrook
int armv7m_nvic_acknowledge_irq(void *opaque);
406 9ee6e8bb pbrook
void armv7m_nvic_complete_irq(void *opaque, int irq);
407 9ee6e8bb pbrook
408 4b6a83fb Peter Maydell
/* Interface for defining coprocessor registers.
409 4b6a83fb Peter Maydell
 * Registers are defined in tables of arm_cp_reginfo structs
410 4b6a83fb Peter Maydell
 * which are passed to define_arm_cp_regs().
411 4b6a83fb Peter Maydell
 */
412 4b6a83fb Peter Maydell
413 4b6a83fb Peter Maydell
/* When looking up a coprocessor register we look for it
414 4b6a83fb Peter Maydell
 * via an integer which encodes all of:
415 4b6a83fb Peter Maydell
 *  coprocessor number
416 4b6a83fb Peter Maydell
 *  Crn, Crm, opc1, opc2 fields
417 4b6a83fb Peter Maydell
 *  32 or 64 bit register (ie is it accessed via MRC/MCR
418 4b6a83fb Peter Maydell
 *    or via MRRC/MCRR?)
419 4b6a83fb Peter Maydell
 * We allow 4 bits for opc1 because MRRC/MCRR have a 4 bit field.
420 4b6a83fb Peter Maydell
 * (In this case crn and opc2 should be zero.)
421 4b6a83fb Peter Maydell
 */
422 4b6a83fb Peter Maydell
#define ENCODE_CP_REG(cp, is64, crn, crm, opc1, opc2)   \
423 4b6a83fb Peter Maydell
    (((cp) << 16) | ((is64) << 15) | ((crn) << 11) |    \
424 4b6a83fb Peter Maydell
     ((crm) << 7) | ((opc1) << 3) | (opc2))
425 4b6a83fb Peter Maydell
426 4b6a83fb Peter Maydell
/* ARMCPRegInfo type field bits. If the SPECIAL bit is set this is a
427 4b6a83fb Peter Maydell
 * special-behaviour cp reg and bits [15..8] indicate what behaviour
428 4b6a83fb Peter Maydell
 * it has. Otherwise it is a simple cp reg, where CONST indicates that
429 4b6a83fb Peter Maydell
 * TCG can assume the value to be constant (ie load at translate time)
430 4b6a83fb Peter Maydell
 * and 64BIT indicates a 64 bit wide coprocessor register. SUPPRESS_TB_END
431 4b6a83fb Peter Maydell
 * indicates that the TB should not be ended after a write to this register
432 4b6a83fb Peter Maydell
 * (the default is that the TB ends after cp writes). OVERRIDE permits
433 4b6a83fb Peter Maydell
 * a register definition to override a previous definition for the
434 4b6a83fb Peter Maydell
 * same (cp, is64, crn, crm, opc1, opc2) tuple: either the new or the
435 4b6a83fb Peter Maydell
 * old must have the OVERRIDE bit set.
436 4b6a83fb Peter Maydell
 */
437 4b6a83fb Peter Maydell
#define ARM_CP_SPECIAL 1
438 4b6a83fb Peter Maydell
#define ARM_CP_CONST 2
439 4b6a83fb Peter Maydell
#define ARM_CP_64BIT 4
440 4b6a83fb Peter Maydell
#define ARM_CP_SUPPRESS_TB_END 8
441 4b6a83fb Peter Maydell
#define ARM_CP_OVERRIDE 16
442 4b6a83fb Peter Maydell
#define ARM_CP_NOP (ARM_CP_SPECIAL | (1 << 8))
443 4b6a83fb Peter Maydell
#define ARM_CP_WFI (ARM_CP_SPECIAL | (2 << 8))
444 4b6a83fb Peter Maydell
#define ARM_LAST_SPECIAL ARM_CP_WFI
445 4b6a83fb Peter Maydell
/* Used only as a terminator for ARMCPRegInfo lists */
446 4b6a83fb Peter Maydell
#define ARM_CP_SENTINEL 0xffff
447 4b6a83fb Peter Maydell
/* Mask of only the flag bits in a type field */
448 4b6a83fb Peter Maydell
#define ARM_CP_FLAG_MASK 0x1f
449 4b6a83fb Peter Maydell
450 4b6a83fb Peter Maydell
/* Return true if cptype is a valid type field. This is used to try to
451 4b6a83fb Peter Maydell
 * catch errors where the sentinel has been accidentally left off the end
452 4b6a83fb Peter Maydell
 * of a list of registers.
453 4b6a83fb Peter Maydell
 */
454 4b6a83fb Peter Maydell
static inline bool cptype_valid(int cptype)
455 4b6a83fb Peter Maydell
{
456 4b6a83fb Peter Maydell
    return ((cptype & ~ARM_CP_FLAG_MASK) == 0)
457 4b6a83fb Peter Maydell
        || ((cptype & ARM_CP_SPECIAL) &&
458 4b6a83fb Peter Maydell
            (cptype <= ARM_LAST_SPECIAL));
459 4b6a83fb Peter Maydell
}
460 4b6a83fb Peter Maydell
461 4b6a83fb Peter Maydell
/* Access rights:
462 4b6a83fb Peter Maydell
 * We define bits for Read and Write access for what rev C of the v7-AR ARM ARM
463 4b6a83fb Peter Maydell
 * defines as PL0 (user), PL1 (fiq/irq/svc/abt/und/sys, ie privileged), and
464 4b6a83fb Peter Maydell
 * PL2 (hyp). The other level which has Read and Write bits is Secure PL1
465 4b6a83fb Peter Maydell
 * (ie any of the privileged modes in Secure state, or Monitor mode).
466 4b6a83fb Peter Maydell
 * If a register is accessible in one privilege level it's always accessible
467 4b6a83fb Peter Maydell
 * in higher privilege levels too. Since "Secure PL1" also follows this rule
468 4b6a83fb Peter Maydell
 * (ie anything visible in PL2 is visible in S-PL1, some things are only
469 4b6a83fb Peter Maydell
 * visible in S-PL1) but "Secure PL1" is a bit of a mouthful, we bend the
470 4b6a83fb Peter Maydell
 * terminology a little and call this PL3.
471 4b6a83fb Peter Maydell
 *
472 4b6a83fb Peter Maydell
 * If access permissions for a register are more complex than can be
473 4b6a83fb Peter Maydell
 * described with these bits, then use a laxer set of restrictions, and
474 4b6a83fb Peter Maydell
 * do the more restrictive/complex check inside a helper function.
475 4b6a83fb Peter Maydell
 */
476 4b6a83fb Peter Maydell
#define PL3_R 0x80
477 4b6a83fb Peter Maydell
#define PL3_W 0x40
478 4b6a83fb Peter Maydell
#define PL2_R (0x20 | PL3_R)
479 4b6a83fb Peter Maydell
#define PL2_W (0x10 | PL3_W)
480 4b6a83fb Peter Maydell
#define PL1_R (0x08 | PL2_R)
481 4b6a83fb Peter Maydell
#define PL1_W (0x04 | PL2_W)
482 4b6a83fb Peter Maydell
#define PL0_R (0x02 | PL1_R)
483 4b6a83fb Peter Maydell
#define PL0_W (0x01 | PL1_W)
484 4b6a83fb Peter Maydell
485 4b6a83fb Peter Maydell
#define PL3_RW (PL3_R | PL3_W)
486 4b6a83fb Peter Maydell
#define PL2_RW (PL2_R | PL2_W)
487 4b6a83fb Peter Maydell
#define PL1_RW (PL1_R | PL1_W)
488 4b6a83fb Peter Maydell
#define PL0_RW (PL0_R | PL0_W)
489 4b6a83fb Peter Maydell
490 4b6a83fb Peter Maydell
static inline int arm_current_pl(CPUARMState *env)
491 4b6a83fb Peter Maydell
{
492 4b6a83fb Peter Maydell
    if ((env->uncached_cpsr & 0x1f) == ARM_CPU_MODE_USR) {
493 4b6a83fb Peter Maydell
        return 0;
494 4b6a83fb Peter Maydell
    }
495 4b6a83fb Peter Maydell
    /* We don't currently implement the Virtualization or TrustZone
496 4b6a83fb Peter Maydell
     * extensions, so PL2 and PL3 don't exist for us.
497 4b6a83fb Peter Maydell
     */
498 4b6a83fb Peter Maydell
    return 1;
499 4b6a83fb Peter Maydell
}
500 4b6a83fb Peter Maydell
501 4b6a83fb Peter Maydell
typedef struct ARMCPRegInfo ARMCPRegInfo;
502 4b6a83fb Peter Maydell
503 4b6a83fb Peter Maydell
/* Access functions for coprocessor registers. These should return
504 4b6a83fb Peter Maydell
 * 0 on success, or one of the EXCP_* constants if access should cause
505 4b6a83fb Peter Maydell
 * an exception (in which case *value is not written).
506 4b6a83fb Peter Maydell
 */
507 4b6a83fb Peter Maydell
typedef int CPReadFn(CPUARMState *env, const ARMCPRegInfo *opaque,
508 4b6a83fb Peter Maydell
                     uint64_t *value);
509 4b6a83fb Peter Maydell
typedef int CPWriteFn(CPUARMState *env, const ARMCPRegInfo *opaque,
510 4b6a83fb Peter Maydell
                      uint64_t value);
511 4b6a83fb Peter Maydell
/* Hook function for register reset */
512 4b6a83fb Peter Maydell
typedef void CPResetFn(CPUARMState *env, const ARMCPRegInfo *opaque);
513 4b6a83fb Peter Maydell
514 4b6a83fb Peter Maydell
#define CP_ANY 0xff
515 4b6a83fb Peter Maydell
516 4b6a83fb Peter Maydell
/* Definition of an ARM coprocessor register */
517 4b6a83fb Peter Maydell
struct ARMCPRegInfo {
518 4b6a83fb Peter Maydell
    /* Name of register (useful mainly for debugging, need not be unique) */
519 4b6a83fb Peter Maydell
    const char *name;
520 4b6a83fb Peter Maydell
    /* Location of register: coprocessor number and (crn,crm,opc1,opc2)
521 4b6a83fb Peter Maydell
     * tuple. Any of crm, opc1 and opc2 may be CP_ANY to indicate a
522 4b6a83fb Peter Maydell
     * 'wildcard' field -- any value of that field in the MRC/MCR insn
523 4b6a83fb Peter Maydell
     * will be decoded to this register. The register read and write
524 4b6a83fb Peter Maydell
     * callbacks will be passed an ARMCPRegInfo with the crn/crm/opc1/opc2
525 4b6a83fb Peter Maydell
     * used by the program, so it is possible to register a wildcard and
526 4b6a83fb Peter Maydell
     * then behave differently on read/write if necessary.
527 4b6a83fb Peter Maydell
     * For 64 bit registers, only crm and opc1 are relevant; crn and opc2
528 4b6a83fb Peter Maydell
     * must both be zero.
529 4b6a83fb Peter Maydell
     */
530 4b6a83fb Peter Maydell
    uint8_t cp;
531 4b6a83fb Peter Maydell
    uint8_t crn;
532 4b6a83fb Peter Maydell
    uint8_t crm;
533 4b6a83fb Peter Maydell
    uint8_t opc1;
534 4b6a83fb Peter Maydell
    uint8_t opc2;
535 4b6a83fb Peter Maydell
    /* Register type: ARM_CP_* bits/values */
536 4b6a83fb Peter Maydell
    int type;
537 4b6a83fb Peter Maydell
    /* Access rights: PL*_[RW] */
538 4b6a83fb Peter Maydell
    int access;
539 4b6a83fb Peter Maydell
    /* The opaque pointer passed to define_arm_cp_regs_with_opaque() when
540 4b6a83fb Peter Maydell
     * this register was defined: can be used to hand data through to the
541 4b6a83fb Peter Maydell
     * register read/write functions, since they are passed the ARMCPRegInfo*.
542 4b6a83fb Peter Maydell
     */
543 4b6a83fb Peter Maydell
    void *opaque;
544 4b6a83fb Peter Maydell
    /* Value of this register, if it is ARM_CP_CONST. Otherwise, if
545 4b6a83fb Peter Maydell
     * fieldoffset is non-zero, the reset value of the register.
546 4b6a83fb Peter Maydell
     */
547 4b6a83fb Peter Maydell
    uint64_t resetvalue;
548 4b6a83fb Peter Maydell
    /* Offset of the field in CPUARMState for this register. This is not
549 4b6a83fb Peter Maydell
     * needed if either:
550 4b6a83fb Peter Maydell
     *  1. type is ARM_CP_CONST or one of the ARM_CP_SPECIALs
551 4b6a83fb Peter Maydell
     *  2. both readfn and writefn are specified
552 4b6a83fb Peter Maydell
     */
553 4b6a83fb Peter Maydell
    ptrdiff_t fieldoffset; /* offsetof(CPUARMState, field) */
554 4b6a83fb Peter Maydell
    /* Function for handling reads of this register. If NULL, then reads
555 4b6a83fb Peter Maydell
     * will be done by loading from the offset into CPUARMState specified
556 4b6a83fb Peter Maydell
     * by fieldoffset.
557 4b6a83fb Peter Maydell
     */
558 4b6a83fb Peter Maydell
    CPReadFn *readfn;
559 4b6a83fb Peter Maydell
    /* Function for handling writes of this register. If NULL, then writes
560 4b6a83fb Peter Maydell
     * will be done by writing to the offset into CPUARMState specified
561 4b6a83fb Peter Maydell
     * by fieldoffset.
562 4b6a83fb Peter Maydell
     */
563 4b6a83fb Peter Maydell
    CPWriteFn *writefn;
564 4b6a83fb Peter Maydell
    /* Function for resetting the register. If NULL, then reset will be done
565 4b6a83fb Peter Maydell
     * by writing resetvalue to the field specified in fieldoffset. If
566 4b6a83fb Peter Maydell
     * fieldoffset is 0 then no reset will be done.
567 4b6a83fb Peter Maydell
     */
568 4b6a83fb Peter Maydell
    CPResetFn *resetfn;
569 4b6a83fb Peter Maydell
};
570 4b6a83fb Peter Maydell
571 4b6a83fb Peter Maydell
/* Macros which are lvalues for the field in CPUARMState for the
572 4b6a83fb Peter Maydell
 * ARMCPRegInfo *ri.
573 4b6a83fb Peter Maydell
 */
574 4b6a83fb Peter Maydell
#define CPREG_FIELD32(env, ri) \
575 4b6a83fb Peter Maydell
    (*(uint32_t *)((char *)(env) + (ri)->fieldoffset))
576 4b6a83fb Peter Maydell
#define CPREG_FIELD64(env, ri) \
577 4b6a83fb Peter Maydell
    (*(uint64_t *)((char *)(env) + (ri)->fieldoffset))
578 4b6a83fb Peter Maydell
579 4b6a83fb Peter Maydell
#define REGINFO_SENTINEL { .type = ARM_CP_SENTINEL }
580 4b6a83fb Peter Maydell
581 4b6a83fb Peter Maydell
void define_arm_cp_regs_with_opaque(ARMCPU *cpu,
582 4b6a83fb Peter Maydell
                                    const ARMCPRegInfo *regs, void *opaque);
583 4b6a83fb Peter Maydell
void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu,
584 4b6a83fb Peter Maydell
                                       const ARMCPRegInfo *regs, void *opaque);
585 4b6a83fb Peter Maydell
static inline void define_arm_cp_regs(ARMCPU *cpu, const ARMCPRegInfo *regs)
586 4b6a83fb Peter Maydell
{
587 4b6a83fb Peter Maydell
    define_arm_cp_regs_with_opaque(cpu, regs, 0);
588 4b6a83fb Peter Maydell
}
589 4b6a83fb Peter Maydell
static inline void define_one_arm_cp_reg(ARMCPU *cpu, const ARMCPRegInfo *regs)
590 4b6a83fb Peter Maydell
{
591 4b6a83fb Peter Maydell
    define_one_arm_cp_reg_with_opaque(cpu, regs, 0);
592 4b6a83fb Peter Maydell
}
593 4b6a83fb Peter Maydell
const ARMCPRegInfo *get_arm_cp_reginfo(ARMCPU *cpu, uint32_t encoded_cp);
594 4b6a83fb Peter Maydell
595 4b6a83fb Peter Maydell
/* CPWriteFn that can be used to implement writes-ignored behaviour */
596 4b6a83fb Peter Maydell
int arm_cp_write_ignore(CPUARMState *env, const ARMCPRegInfo *ri,
597 4b6a83fb Peter Maydell
                        uint64_t value);
598 4b6a83fb Peter Maydell
/* CPReadFn that can be used for read-as-zero behaviour */
599 4b6a83fb Peter Maydell
int arm_cp_read_zero(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t *value);
600 4b6a83fb Peter Maydell
601 4b6a83fb Peter Maydell
static inline bool cp_access_ok(CPUARMState *env,
602 4b6a83fb Peter Maydell
                                const ARMCPRegInfo *ri, int isread)
603 4b6a83fb Peter Maydell
{
604 4b6a83fb Peter Maydell
    return (ri->access >> ((arm_current_pl(env) * 2) + isread)) & 1;
605 4b6a83fb Peter Maydell
}
606 4b6a83fb Peter Maydell
607 9ee6e8bb pbrook
/* Does the core conform to the the "MicroController" profile. e.g. Cortex-M3.
608 9ee6e8bb pbrook
   Note the M in older cores (eg. ARM7TDMI) stands for Multiply. These are
609 9ee6e8bb pbrook
   conventional cores (ie. Application or Realtime profile).  */
610 9ee6e8bb pbrook
611 9ee6e8bb pbrook
#define IS_M(env) arm_feature(env, ARM_FEATURE_M)
612 9ee6e8bb pbrook
613 9ee6e8bb pbrook
#define ARM_CPUID_TI915T      0x54029152
614 9ee6e8bb pbrook
#define ARM_CPUID_TI925T      0x54029252
615 40f137e1 pbrook
616 b5ff1b31 bellard
#if defined(CONFIG_USER_ONLY)
617 2c0262af bellard
#define TARGET_PAGE_BITS 12
618 b5ff1b31 bellard
#else
619 b5ff1b31 bellard
/* The ARM MMU allows 1k pages.  */
620 b5ff1b31 bellard
/* ??? Linux doesn't actually use these, and they're deprecated in recent
621 82d17978 balrog
   architecture revisions.  Maybe a configure option to disable them.  */
622 b5ff1b31 bellard
#define TARGET_PAGE_BITS 10
623 b5ff1b31 bellard
#endif
624 9467d44c ths
625 3cc0cd61 Peter Maydell
#define TARGET_PHYS_ADDR_SPACE_BITS 40
626 52705890 Richard Henderson
#define TARGET_VIRT_ADDR_SPACE_BITS 32
627 52705890 Richard Henderson
628 ad37ad5b Peter Maydell
static inline CPUARMState *cpu_init(const char *cpu_model)
629 ad37ad5b Peter Maydell
{
630 ad37ad5b Peter Maydell
    ARMCPU *cpu = cpu_arm_init(cpu_model);
631 ad37ad5b Peter Maydell
    if (cpu) {
632 ad37ad5b Peter Maydell
        return &cpu->env;
633 ad37ad5b Peter Maydell
    }
634 ad37ad5b Peter Maydell
    return NULL;
635 ad37ad5b Peter Maydell
}
636 ad37ad5b Peter Maydell
637 9467d44c ths
#define cpu_exec cpu_arm_exec
638 9467d44c ths
#define cpu_gen_code cpu_arm_gen_code
639 9467d44c ths
#define cpu_signal_handler cpu_arm_signal_handler
640 c732abe2 j_mayer
#define cpu_list arm_cpu_list
641 9467d44c ths
642 891a2fe7 Peter Maydell
#define CPU_SAVE_VERSION 9
643 9ee6e8bb pbrook
644 6ebbf390 j_mayer
/* MMU modes definitions */
645 6ebbf390 j_mayer
#define MMU_MODE0_SUFFIX _kernel
646 6ebbf390 j_mayer
#define MMU_MODE1_SUFFIX _user
647 6ebbf390 j_mayer
#define MMU_USER_IDX 1
648 0ecb72a5 Andreas Färber
static inline int cpu_mmu_index (CPUARMState *env)
649 6ebbf390 j_mayer
{
650 6ebbf390 j_mayer
    return (env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR ? 1 : 0;
651 6ebbf390 j_mayer
}
652 6ebbf390 j_mayer
653 6e68e076 pbrook
#if defined(CONFIG_USER_ONLY)
654 0ecb72a5 Andreas Färber
static inline void cpu_clone_regs(CPUARMState *env, target_ulong newsp)
655 6e68e076 pbrook
{
656 f8ed7070 pbrook
    if (newsp)
657 6e68e076 pbrook
        env->regs[13] = newsp;
658 6e68e076 pbrook
    env->regs[0] = 0;
659 6e68e076 pbrook
}
660 6e68e076 pbrook
#endif
661 6e68e076 pbrook
662 2c0262af bellard
#include "cpu-all.h"
663 622ed360 aliguori
664 a1705768 Peter Maydell
/* Bit usage in the TB flags field: */
665 a1705768 Peter Maydell
#define ARM_TBFLAG_THUMB_SHIFT      0
666 a1705768 Peter Maydell
#define ARM_TBFLAG_THUMB_MASK       (1 << ARM_TBFLAG_THUMB_SHIFT)
667 a1705768 Peter Maydell
#define ARM_TBFLAG_VECLEN_SHIFT     1
668 a1705768 Peter Maydell
#define ARM_TBFLAG_VECLEN_MASK      (0x7 << ARM_TBFLAG_VECLEN_SHIFT)
669 a1705768 Peter Maydell
#define ARM_TBFLAG_VECSTRIDE_SHIFT  4
670 a1705768 Peter Maydell
#define ARM_TBFLAG_VECSTRIDE_MASK   (0x3 << ARM_TBFLAG_VECSTRIDE_SHIFT)
671 a1705768 Peter Maydell
#define ARM_TBFLAG_PRIV_SHIFT       6
672 a1705768 Peter Maydell
#define ARM_TBFLAG_PRIV_MASK        (1 << ARM_TBFLAG_PRIV_SHIFT)
673 a1705768 Peter Maydell
#define ARM_TBFLAG_VFPEN_SHIFT      7
674 a1705768 Peter Maydell
#define ARM_TBFLAG_VFPEN_MASK       (1 << ARM_TBFLAG_VFPEN_SHIFT)
675 a1705768 Peter Maydell
#define ARM_TBFLAG_CONDEXEC_SHIFT   8
676 a1705768 Peter Maydell
#define ARM_TBFLAG_CONDEXEC_MASK    (0xff << ARM_TBFLAG_CONDEXEC_SHIFT)
677 d8fd2954 Paul Brook
#define ARM_TBFLAG_BSWAP_CODE_SHIFT 16
678 d8fd2954 Paul Brook
#define ARM_TBFLAG_BSWAP_CODE_MASK  (1 << ARM_TBFLAG_BSWAP_CODE_SHIFT)
679 d8fd2954 Paul Brook
/* Bits 31..17 are currently unused. */
680 a1705768 Peter Maydell
681 a1705768 Peter Maydell
/* some convenience accessor macros */
682 a1705768 Peter Maydell
#define ARM_TBFLAG_THUMB(F) \
683 a1705768 Peter Maydell
    (((F) & ARM_TBFLAG_THUMB_MASK) >> ARM_TBFLAG_THUMB_SHIFT)
684 a1705768 Peter Maydell
#define ARM_TBFLAG_VECLEN(F) \
685 a1705768 Peter Maydell
    (((F) & ARM_TBFLAG_VECLEN_MASK) >> ARM_TBFLAG_VECLEN_SHIFT)
686 a1705768 Peter Maydell
#define ARM_TBFLAG_VECSTRIDE(F) \
687 a1705768 Peter Maydell
    (((F) & ARM_TBFLAG_VECSTRIDE_MASK) >> ARM_TBFLAG_VECSTRIDE_SHIFT)
688 a1705768 Peter Maydell
#define ARM_TBFLAG_PRIV(F) \
689 a1705768 Peter Maydell
    (((F) & ARM_TBFLAG_PRIV_MASK) >> ARM_TBFLAG_PRIV_SHIFT)
690 a1705768 Peter Maydell
#define ARM_TBFLAG_VFPEN(F) \
691 a1705768 Peter Maydell
    (((F) & ARM_TBFLAG_VFPEN_MASK) >> ARM_TBFLAG_VFPEN_SHIFT)
692 a1705768 Peter Maydell
#define ARM_TBFLAG_CONDEXEC(F) \
693 a1705768 Peter Maydell
    (((F) & ARM_TBFLAG_CONDEXEC_MASK) >> ARM_TBFLAG_CONDEXEC_SHIFT)
694 d8fd2954 Paul Brook
#define ARM_TBFLAG_BSWAP_CODE(F) \
695 d8fd2954 Paul Brook
    (((F) & ARM_TBFLAG_BSWAP_CODE_MASK) >> ARM_TBFLAG_BSWAP_CODE_SHIFT)
696 a1705768 Peter Maydell
697 0ecb72a5 Andreas Färber
static inline void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
698 6b917547 aliguori
                                        target_ulong *cs_base, int *flags)
699 6b917547 aliguori
{
700 05ed9a99 Peter Maydell
    int privmode;
701 6b917547 aliguori
    *pc = env->regs[15];
702 6b917547 aliguori
    *cs_base = 0;
703 a1705768 Peter Maydell
    *flags = (env->thumb << ARM_TBFLAG_THUMB_SHIFT)
704 a1705768 Peter Maydell
        | (env->vfp.vec_len << ARM_TBFLAG_VECLEN_SHIFT)
705 a1705768 Peter Maydell
        | (env->vfp.vec_stride << ARM_TBFLAG_VECSTRIDE_SHIFT)
706 d8fd2954 Paul Brook
        | (env->condexec_bits << ARM_TBFLAG_CONDEXEC_SHIFT)
707 d8fd2954 Paul Brook
        | (env->bswap_code << ARM_TBFLAG_BSWAP_CODE_SHIFT);
708 05ed9a99 Peter Maydell
    if (arm_feature(env, ARM_FEATURE_M)) {
709 05ed9a99 Peter Maydell
        privmode = !((env->v7m.exception == 0) && (env->v7m.control & 1));
710 05ed9a99 Peter Maydell
    } else {
711 05ed9a99 Peter Maydell
        privmode = (env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR;
712 05ed9a99 Peter Maydell
    }
713 05ed9a99 Peter Maydell
    if (privmode) {
714 a1705768 Peter Maydell
        *flags |= ARM_TBFLAG_PRIV_MASK;
715 a1705768 Peter Maydell
    }
716 a1705768 Peter Maydell
    if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30)) {
717 a1705768 Peter Maydell
        *flags |= ARM_TBFLAG_VFPEN_MASK;
718 a1705768 Peter Maydell
    }
719 6b917547 aliguori
}
720 6b917547 aliguori
721 0ecb72a5 Andreas Färber
static inline bool cpu_has_work(CPUARMState *env)
722 f081c76c Blue Swirl
{
723 f081c76c Blue Swirl
    return env->interrupt_request &
724 f081c76c Blue Swirl
        (CPU_INTERRUPT_FIQ | CPU_INTERRUPT_HARD | CPU_INTERRUPT_EXITTB);
725 f081c76c Blue Swirl
}
726 f081c76c Blue Swirl
727 f081c76c Blue Swirl
#include "exec-all.h"
728 f081c76c Blue Swirl
729 0ecb72a5 Andreas Färber
static inline void cpu_pc_from_tb(CPUARMState *env, TranslationBlock *tb)
730 f081c76c Blue Swirl
{
731 f081c76c Blue Swirl
    env->regs[15] = tb->pc;
732 f081c76c Blue Swirl
}
733 f081c76c Blue Swirl
734 d8fd2954 Paul Brook
/* Load an instruction and return it in the standard little-endian order */
735 d31dd73e Blue Swirl
static inline uint32_t arm_ldl_code(CPUARMState *env, uint32_t addr,
736 d31dd73e Blue Swirl
                                    bool do_swap)
737 d8fd2954 Paul Brook
{
738 d31dd73e Blue Swirl
    uint32_t insn = cpu_ldl_code(env, addr);
739 d8fd2954 Paul Brook
    if (do_swap) {
740 d8fd2954 Paul Brook
        return bswap32(insn);
741 d8fd2954 Paul Brook
    }
742 d8fd2954 Paul Brook
    return insn;
743 d8fd2954 Paul Brook
}
744 d8fd2954 Paul Brook
745 d8fd2954 Paul Brook
/* Ditto, for a halfword (Thumb) instruction */
746 d31dd73e Blue Swirl
static inline uint16_t arm_lduw_code(CPUARMState *env, uint32_t addr,
747 d31dd73e Blue Swirl
                                     bool do_swap)
748 d8fd2954 Paul Brook
{
749 d31dd73e Blue Swirl
    uint16_t insn = cpu_lduw_code(env, addr);
750 d8fd2954 Paul Brook
    if (do_swap) {
751 d8fd2954 Paul Brook
        return bswap16(insn);
752 d8fd2954 Paul Brook
    }
753 d8fd2954 Paul Brook
    return insn;
754 d8fd2954 Paul Brook
}
755 d8fd2954 Paul Brook
756 2c0262af bellard
#endif