Revision 9ee6e8bb target-arm/cpu.h

b/target-arm/cpu.h
37 37
#define EXCP_IRQ             5
38 38
#define EXCP_FIQ             6
39 39
#define EXCP_BKPT            7
40
#define EXCP_EXCEPTION_EXIT  8   /* Return from v7M exception.  */
41

  
42
#define ARMV7M_EXCP_RESET   1
43
#define ARMV7M_EXCP_NMI     2
44
#define ARMV7M_EXCP_HARD    3
45
#define ARMV7M_EXCP_MEM     4
46
#define ARMV7M_EXCP_BUS     5
47
#define ARMV7M_EXCP_USAGE   6
48
#define ARMV7M_EXCP_SVC     11
49
#define ARMV7M_EXCP_DEBUG   12
50
#define ARMV7M_EXCP_PENDSV  14
51
#define ARMV7M_EXCP_SYSTICK 15
40 52

  
41 53
typedef void ARMWriteCPFunc(void *opaque, int cp_info,
42 54
                            int srcreg, int operand, uint32_t value);
......
76 88
    uint32_t VF; /* V is the bit 31. All other bits are undefined */
77 89
    uint32_t NZF; /* N is bit 31. Z is computed from NZF */
78 90
    uint32_t QF; /* 0 or 1 */
79

  
80
    int thumb; /* 0 = arm mode, 1 = thumb mode */
91
    uint32_t GE; /* cpsr[19:16] */
92
    int thumb; /* cprs[5]. 0 = arm mode, 1 = thumb mode. */
93
    uint32_t condexec_bits; /* IT bits.  cpsr[15:10,26:25].  */
81 94

  
82 95
    /* System control coprocessor (cp15) */
83 96
    struct {
84 97
        uint32_t c0_cpuid;
85 98
        uint32_t c0_cachetype;
99
        uint32_t c0_c1[8]; /* Feature registers.  */
100
        uint32_t c0_c2[8]; /* Instruction set registers.  */
86 101
        uint32_t c1_sys; /* System control register.  */
87 102
        uint32_t c1_coproc; /* Coprocessor access register.  */
88 103
        uint32_t c1_xscaleauxcr; /* XScale auxiliary control register.  */
89
        uint32_t c2_base; /* MMU translation table base.  */
104
        uint32_t c2_base0; /* MMU translation table base 0.  */
105
        uint32_t c2_base1; /* MMU translation table base 1.  */
106
        uint32_t c2_mask; /* MMU translation table base mask.  */
90 107
        uint32_t c2_data; /* MPU data cachable bits.  */
91 108
        uint32_t c2_insn; /* MPU instruction cachable bits.  */
92 109
        uint32_t c3; /* MMU domain access control register
......
100 117
        uint32_t c9_data;
101 118
        uint32_t c13_fcse; /* FCSE PID.  */
102 119
        uint32_t c13_context; /* Context ID.  */
120
        uint32_t c13_tls1; /* User RW Thread register.  */
121
        uint32_t c13_tls2; /* User RO Thread register.  */
122
        uint32_t c13_tls3; /* Privileged Thread register.  */
103 123
        uint32_t c15_cpar; /* XScale Coprocessor Access Register */
104 124
        uint32_t c15_ticonfig; /* TI925T configuration byte.  */
105 125
        uint32_t c15_i_max; /* Maximum D-cache dirty line index.  */
......
107 127
        uint32_t c15_threadid; /* TI debugger thread-ID.  */
108 128
    } cp15;
109 129

  
130
    struct {
131
        uint32_t other_sp;
132
        uint32_t vecbase;
133
        uint32_t basepri;
134
        uint32_t control;
135
        int current_sp;
136
        int exception;
137
        int pending_exception;
138
        void *nvic;
139
    } v7m;
140

  
110 141
    /* Coprocessor IO used by peripherals */
111 142
    struct {
112 143
        ARMReadCPFunc *cp_read;
......
117 148
    /* Internal CPU feature flags.  */
118 149
    uint32_t features;
119 150

  
151
    /* Callback for vectored interrupt controller.  */
152
    int (*get_irq_vector)(struct CPUARMState *);
153
    void *irq_opaque;
154

  
120 155
    /* exception/interrupt handling */
121 156
    jmp_buf jmp_env;
122 157
    int exception_index;
......
126 161

  
127 162
    /* VFP coprocessor state.  */
128 163
    struct {
129
        float64 regs[16];
164
        float64 regs[32];
130 165

  
131 166
        uint32_t xregs[16];
132 167
        /* We store these fpcsr fields separately for convenience.  */
......
136 171
        /* Temporary variables if we don't have spare fp regs.  */
137 172
        float32 tmp0s, tmp1s;
138 173
        float64 tmp0d, tmp1d;
174
        /* scratch space when Tn are not sufficient.  */
175
        uint32_t scratch[8];
139 176

  
140 177
        float_status fp_status;
141 178
    } vfp;
179
#if defined(CONFIG_USER_ONLY)
180
    struct mmon_state *mmon_entry;
181
#else
182
    uint32_t mmon_addr;
183
#endif
142 184

  
143 185
    /* iwMMXt coprocessor state.  */
144 186
    struct {
......
169 211
void cpu_arm_close(CPUARMState *s);
170 212
void do_interrupt(CPUARMState *);
171 213
void switch_mode(CPUARMState *, int);
214
uint32_t do_arm_semihosting(CPUARMState *env);
172 215

  
173 216
/* you can call this signal handler from your SIGBUS and SIGSEGV
174 217
   signal handlers to inform the virtual CPU of exceptions. non zero
......
176 219
int cpu_arm_signal_handler(int host_signum, void *pinfo,
177 220
                           void *puc);
178 221

  
222
void cpu_lock(void);
223
void cpu_unlock(void);
224

  
179 225
#define CPSR_M (0x1f)
180 226
#define CPSR_T (1 << 5)
181 227
#define CPSR_F (1 << 6)
......
183 229
#define CPSR_A (1 << 8)
184 230
#define CPSR_E (1 << 9)
185 231
#define CPSR_IT_2_7 (0xfc00)
186
/* Bits 20-23 reserved.  */
232
#define CPSR_GE (0xf << 16)
233
#define CPSR_RESERVED (0xf << 20)
187 234
#define CPSR_J (1 << 24)
188 235
#define CPSR_IT_0_1 (3 << 25)
189 236
#define CPSR_Q (1 << 27)
190
#define CPSR_NZCV (0xf << 28)
237
#define CPSR_V (1 << 28)
238
#define CPSR_C (1 << 29)
239
#define CPSR_Z (1 << 30)
240
#define CPSR_N (1 << 31)
241
#define CPSR_NZCV (CPSR_N | CPSR_Z | CPSR_C | CPSR_V)
242

  
243
#define CPSR_IT (CPSR_IT_0_1 | CPSR_IT_2_7)
244
#define CACHED_CPSR_BITS (CPSR_T | CPSR_GE | CPSR_IT | CPSR_Q | CPSR_NZCV)
245
/* Bits writable in user mode.  */
246
#define CPSR_USER (CPSR_NZCV | CPSR_Q | CPSR_GE)
247
/* Execution state bits.  MRS read as zero, MSR writes ignored.  */
248
#define CPSR_EXEC (CPSR_T | CPSR_IT | CPSR_J)
191 249

  
192
#define CACHED_CPSR_BITS (CPSR_T | CPSR_Q | CPSR_NZCV)
193 250
/* Return the current CPSR value.  */
194 251
static inline uint32_t cpsr_read(CPUARMState *env)
195 252
{
......
197 254
    ZF = (env->NZF == 0);
198 255
    return env->uncached_cpsr | (env->NZF & 0x80000000) | (ZF << 30) |
199 256
        (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27)
200
        | (env->thumb << 5);
257
        | (env->thumb << 5) | ((env->condexec_bits & 3) << 25)
258
        | ((env->condexec_bits & 0xfc) << 8)
259
        | (env->GE << 16);
260
}
261

  
262
/* Return the current xPSR value.  */
263
static inline uint32_t xpsr_read(CPUARMState *env)
264
{
265
    int ZF;
266
    ZF = (env->NZF == 0);
267
    return (env->NZF & 0x80000000) | (ZF << 30)
268
        | (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27)
269
        | (env->thumb << 24) | ((env->condexec_bits & 3) << 25)
270
        | ((env->condexec_bits & 0xfc) << 8)
271
        | env->v7m.exception;
201 272
}
202 273

  
203 274
/* Set the CPSR.  Note that some bits of mask must be all-set or all-clear.  */
......
213 284
        env->QF = ((val & CPSR_Q) != 0);
214 285
    if (mask & CPSR_T)
215 286
        env->thumb = ((val & CPSR_T) != 0);
287
    if (mask & CPSR_IT_0_1) {
288
        env->condexec_bits &= ~3;
289
        env->condexec_bits |= (val >> 25) & 3;
290
    }
291
    if (mask & CPSR_IT_2_7) {
292
        env->condexec_bits &= 3;
293
        env->condexec_bits |= (val >> 8) & 0xfc;
294
    }
295
    if (mask & CPSR_GE) {
296
        env->GE = (val >> 16) & 0xf;
297
    }
216 298

  
217 299
    if ((env->uncached_cpsr ^ val) & mask & CPSR_M) {
218 300
        switch_mode(env, val & CPSR_M);
......
221 303
    env->uncached_cpsr = (env->uncached_cpsr & ~mask) | (val & mask);
222 304
}
223 305

  
306
/* Set the xPSR.  Note that some bits of mask must be all-set or all-clear.  */
307
static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
308
{
309
    /* NOTE: N = 1 and Z = 1 cannot be stored currently */
310
    if (mask & CPSR_NZCV) {
311
        env->NZF = (val & 0xc0000000) ^ 0x40000000;
312
        env->CF = (val >> 29) & 1;
313
        env->VF = (val << 3) & 0x80000000;
314
    }
315
    if (mask & CPSR_Q)
316
        env->QF = ((val & CPSR_Q) != 0);
317
    if (mask & (1 << 24))
318
        env->thumb = ((val & (1 << 24)) != 0);
319
    if (mask & CPSR_IT_0_1) {
320
        env->condexec_bits &= ~3;
321
        env->condexec_bits |= (val >> 25) & 3;
322
    }
323
    if (mask & CPSR_IT_2_7) {
324
        env->condexec_bits &= 3;
325
        env->condexec_bits |= (val >> 8) & 0xfc;
326
    }
327
    if (mask & 0x1ff) {
328
        env->v7m.exception = val & 0x1ff;
329
    }
330
}
331

  
224 332
enum arm_cpu_mode {
225 333
  ARM_CPU_MODE_USR = 0x10,
226 334
  ARM_CPU_MODE_FIQ = 0x11,
......
234 342
/* VFP system registers.  */
235 343
#define ARM_VFP_FPSID   0
236 344
#define ARM_VFP_FPSCR   1
345
#define ARM_VFP_MVFR1   6
346
#define ARM_VFP_MVFR0   7
237 347
#define ARM_VFP_FPEXC   8
238 348
#define ARM_VFP_FPINST  9
239 349
#define ARM_VFP_FPINST2 10
......
253 363
    ARM_FEATURE_AUXCR,  /* ARM1026 Auxiliary control register.  */
254 364
    ARM_FEATURE_XSCALE, /* Intel XScale extensions.  */
255 365
    ARM_FEATURE_IWMMXT, /* Intel iwMMXt extension.  */
366
    ARM_FEATURE_V6,
367
    ARM_FEATURE_V6K,
368
    ARM_FEATURE_V7,
369
    ARM_FEATURE_THUMB2,
256 370
    ARM_FEATURE_MPU,    /* Only has Memory Protection Unit, not full MMU.  */
371
    ARM_FEATURE_VFP3,
372
    ARM_FEATURE_NEON,
373
    ARM_FEATURE_DIV,
374
    ARM_FEATURE_M, /* Microcontroller profile.  */
257 375
    ARM_FEATURE_OMAPCP  /* OMAP specific CP15 ops handling.  */
258 376
};
259 377

  
......
264 382

  
265 383
void arm_cpu_list(FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
266 384

  
385
/* Interface between CPU and Interrupt controller.  */
386
void armv7m_nvic_set_pending(void *opaque, int irq);
387
int armv7m_nvic_acknowledge_irq(void *opaque);
388
void armv7m_nvic_complete_irq(void *opaque, int irq);
389

  
267 390
void cpu_arm_set_cp_io(CPUARMState *env, int cpnum,
268 391
                       ARMReadCPFunc *cp_read, ARMWriteCPFunc *cp_write,
269 392
                       void *opaque);
270 393

  
271
#define ARM_CPUID_ARM1026   0x4106a262
272
#define ARM_CPUID_ARM926    0x41069265
273
#define ARM_CPUID_ARM946    0x41059461
274
#define ARM_CPUID_TI915T    0x54029152
275
#define ARM_CPUID_TI925T    0x54029252
276
#define ARM_CPUID_PXA250    0x69052100
277
#define ARM_CPUID_PXA255    0x69052d00
278
#define ARM_CPUID_PXA260    0x69052903
279
#define ARM_CPUID_PXA261    0x69052d05
280
#define ARM_CPUID_PXA262    0x69052d06
281
#define ARM_CPUID_PXA270    0x69054110
282
#define ARM_CPUID_PXA270_A0 0x69054110
283
#define ARM_CPUID_PXA270_A1 0x69054111
284
#define ARM_CPUID_PXA270_B0 0x69054112
285
#define ARM_CPUID_PXA270_B1 0x69054113
286
#define ARM_CPUID_PXA270_C0 0x69054114
287
#define ARM_CPUID_PXA270_C5 0x69054117
394
/* Does the core conform to the the "MicroController" profile. e.g. Cortex-M3.
395
   Note the M in older cores (eg. ARM7TDMI) stands for Multiply. These are
396
   conventional cores (ie. Application or Realtime profile).  */
397

  
398
#define IS_M(env) arm_feature(env, ARM_FEATURE_M)
399
#define ARM_CPUID(env) (env->cp15.c0_cpuid)
400

  
401
#define ARM_CPUID_ARM1026     0x4106a262
402
#define ARM_CPUID_ARM926      0x41069265
403
#define ARM_CPUID_ARM946      0x41059461
404
#define ARM_CPUID_TI915T      0x54029152
405
#define ARM_CPUID_TI925T      0x54029252
406
#define ARM_CPUID_PXA250      0x69052100
407
#define ARM_CPUID_PXA255      0x69052d00
408
#define ARM_CPUID_PXA260      0x69052903
409
#define ARM_CPUID_PXA261      0x69052d05
410
#define ARM_CPUID_PXA262      0x69052d06
411
#define ARM_CPUID_PXA270      0x69054110
412
#define ARM_CPUID_PXA270_A0   0x69054110
413
#define ARM_CPUID_PXA270_A1   0x69054111
414
#define ARM_CPUID_PXA270_B0   0x69054112
415
#define ARM_CPUID_PXA270_B1   0x69054113
416
#define ARM_CPUID_PXA270_C0   0x69054114
417
#define ARM_CPUID_PXA270_C5   0x69054117
418
#define ARM_CPUID_ARM1136     0x4117b363
419
#define ARM_CPUID_ARM11MPCORE 0x410fb022
420
#define ARM_CPUID_CORTEXA8    0x410fc080
421
#define ARM_CPUID_CORTEXM3    0x410fc231
422
#define ARM_CPUID_ANY         0xffffffff
288 423

  
289 424
#if defined(CONFIG_USER_ONLY)
290 425
#define TARGET_PAGE_BITS 12
......
302 437
#define cpu_signal_handler cpu_arm_signal_handler
303 438
#define cpu_list arm_cpu_list
304 439

  
440
#define ARM_CPU_SAVE_VERSION 1
441

  
305 442
/* MMU modes definitions */
306 443
#define MMU_MODE0_SUFFIX _kernel
307 444
#define MMU_MODE1_SUFFIX _user

Also available in: Unified diff