Statistics
| Branch: | Revision:

root / target-arm / cpu.h @ 4b6a83fb

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