Statistics
| Branch: | Revision:

root / target-arm / helper.c @ 1497c961

History | View | Annotate | Download (52.5 kB)

1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4

    
5
#include "cpu.h"
6
#include "exec-all.h"
7
#include "gdbstub.h"
8
#include "helpers.h"
9

    
10
static uint32_t cortexa8_cp15_c0_c1[8] =
11
{ 0x1031, 0x11, 0x400, 0, 0x31100003, 0x20000000, 0x01202000, 0x11 };
12

    
13
static uint32_t cortexa8_cp15_c0_c2[8] =
14
{ 0x00101111, 0x12112111, 0x21232031, 0x11112131, 0x00111142, 0, 0, 0 };
15

    
16
static uint32_t mpcore_cp15_c0_c1[8] =
17
{ 0x111, 0x1, 0, 0x2, 0x01100103, 0x10020302, 0x01222000, 0 };
18

    
19
static uint32_t mpcore_cp15_c0_c2[8] =
20
{ 0x00100011, 0x12002111, 0x11221011, 0x01102131, 0x141, 0, 0, 0 };
21

    
22
static uint32_t arm1136_cp15_c0_c1[8] =
23
{ 0x111, 0x1, 0x2, 0x3, 0x01130003, 0x10030302, 0x01222110, 0 };
24

    
25
static uint32_t arm1136_cp15_c0_c2[8] =
26
{ 0x00140011, 0x12002111, 0x11231111, 0x01102131, 0x141, 0, 0, 0 };
27

    
28
static uint32_t cpu_arm_find_by_name(const char *name);
29

    
30
static inline void set_feature(CPUARMState *env, int feature)
31
{
32
    env->features |= 1u << feature;
33
}
34

    
35
static void cpu_reset_model_id(CPUARMState *env, uint32_t id)
36
{
37
    env->cp15.c0_cpuid = id;
38
    switch (id) {
39
    case ARM_CPUID_ARM926:
40
        set_feature(env, ARM_FEATURE_VFP);
41
        env->vfp.xregs[ARM_VFP_FPSID] = 0x41011090;
42
        env->cp15.c0_cachetype = 0x1dd20d2;
43
        env->cp15.c1_sys = 0x00090078;
44
        break;
45
    case ARM_CPUID_ARM946:
46
        set_feature(env, ARM_FEATURE_MPU);
47
        env->cp15.c0_cachetype = 0x0f004006;
48
        env->cp15.c1_sys = 0x00000078;
49
        break;
50
    case ARM_CPUID_ARM1026:
51
        set_feature(env, ARM_FEATURE_VFP);
52
        set_feature(env, ARM_FEATURE_AUXCR);
53
        env->vfp.xregs[ARM_VFP_FPSID] = 0x410110a0;
54
        env->cp15.c0_cachetype = 0x1dd20d2;
55
        env->cp15.c1_sys = 0x00090078;
56
        break;
57
    case ARM_CPUID_ARM1136:
58
        set_feature(env, ARM_FEATURE_V6);
59
        set_feature(env, ARM_FEATURE_VFP);
60
        set_feature(env, ARM_FEATURE_AUXCR);
61
        env->vfp.xregs[ARM_VFP_FPSID] = 0x410120b4;
62
        env->vfp.xregs[ARM_VFP_MVFR0] = 0x11111111;
63
        env->vfp.xregs[ARM_VFP_MVFR1] = 0x00000000;
64
        memcpy(env->cp15.c0_c1, arm1136_cp15_c0_c1, 8 * sizeof(uint32_t));
65
        memcpy(env->cp15.c0_c1, arm1136_cp15_c0_c2, 8 * sizeof(uint32_t));
66
        env->cp15.c0_cachetype = 0x1dd20d2;
67
        break;
68
    case ARM_CPUID_ARM11MPCORE:
69
        set_feature(env, ARM_FEATURE_V6);
70
        set_feature(env, ARM_FEATURE_V6K);
71
        set_feature(env, ARM_FEATURE_VFP);
72
        set_feature(env, ARM_FEATURE_AUXCR);
73
        env->vfp.xregs[ARM_VFP_FPSID] = 0x410120b4;
74
        env->vfp.xregs[ARM_VFP_MVFR0] = 0x11111111;
75
        env->vfp.xregs[ARM_VFP_MVFR1] = 0x00000000;
76
        memcpy(env->cp15.c0_c1, mpcore_cp15_c0_c1, 8 * sizeof(uint32_t));
77
        memcpy(env->cp15.c0_c1, mpcore_cp15_c0_c2, 8 * sizeof(uint32_t));
78
        env->cp15.c0_cachetype = 0x1dd20d2;
79
        break;
80
    case ARM_CPUID_CORTEXA8:
81
        set_feature(env, ARM_FEATURE_V6);
82
        set_feature(env, ARM_FEATURE_V6K);
83
        set_feature(env, ARM_FEATURE_V7);
84
        set_feature(env, ARM_FEATURE_AUXCR);
85
        set_feature(env, ARM_FEATURE_THUMB2);
86
        set_feature(env, ARM_FEATURE_VFP);
87
        set_feature(env, ARM_FEATURE_VFP3);
88
        set_feature(env, ARM_FEATURE_NEON);
89
        env->vfp.xregs[ARM_VFP_FPSID] = 0x410330c0;
90
        env->vfp.xregs[ARM_VFP_MVFR0] = 0x11110222;
91
        env->vfp.xregs[ARM_VFP_MVFR1] = 0x00011100;
92
        memcpy(env->cp15.c0_c1, cortexa8_cp15_c0_c1, 8 * sizeof(uint32_t));
93
        memcpy(env->cp15.c0_c1, cortexa8_cp15_c0_c2, 8 * sizeof(uint32_t));
94
        env->cp15.c0_cachetype = 0x1dd20d2;
95
        break;
96
    case ARM_CPUID_CORTEXM3:
97
        set_feature(env, ARM_FEATURE_V6);
98
        set_feature(env, ARM_FEATURE_THUMB2);
99
        set_feature(env, ARM_FEATURE_V7);
100
        set_feature(env, ARM_FEATURE_M);
101
        set_feature(env, ARM_FEATURE_DIV);
102
        break;
103
    case ARM_CPUID_ANY: /* For userspace emulation.  */
104
        set_feature(env, ARM_FEATURE_V6);
105
        set_feature(env, ARM_FEATURE_V6K);
106
        set_feature(env, ARM_FEATURE_V7);
107
        set_feature(env, ARM_FEATURE_THUMB2);
108
        set_feature(env, ARM_FEATURE_VFP);
109
        set_feature(env, ARM_FEATURE_VFP3);
110
        set_feature(env, ARM_FEATURE_NEON);
111
        set_feature(env, ARM_FEATURE_DIV);
112
        break;
113
    case ARM_CPUID_TI915T:
114
    case ARM_CPUID_TI925T:
115
        set_feature(env, ARM_FEATURE_OMAPCP);
116
        env->cp15.c0_cpuid = ARM_CPUID_TI925T; /* Depends on wiring.  */
117
        env->cp15.c0_cachetype = 0x5109149;
118
        env->cp15.c1_sys = 0x00000070;
119
        env->cp15.c15_i_max = 0x000;
120
        env->cp15.c15_i_min = 0xff0;
121
        break;
122
    case ARM_CPUID_PXA250:
123
    case ARM_CPUID_PXA255:
124
    case ARM_CPUID_PXA260:
125
    case ARM_CPUID_PXA261:
126
    case ARM_CPUID_PXA262:
127
        set_feature(env, ARM_FEATURE_XSCALE);
128
        /* JTAG_ID is ((id << 28) | 0x09265013) */
129
        env->cp15.c0_cachetype = 0xd172172;
130
        env->cp15.c1_sys = 0x00000078;
131
        break;
132
    case ARM_CPUID_PXA270_A0:
133
    case ARM_CPUID_PXA270_A1:
134
    case ARM_CPUID_PXA270_B0:
135
    case ARM_CPUID_PXA270_B1:
136
    case ARM_CPUID_PXA270_C0:
137
    case ARM_CPUID_PXA270_C5:
138
        set_feature(env, ARM_FEATURE_XSCALE);
139
        /* JTAG_ID is ((id << 28) | 0x09265013) */
140
        set_feature(env, ARM_FEATURE_IWMMXT);
141
        env->iwmmxt.cregs[ARM_IWMMXT_wCID] = 0x69051000 | 'Q';
142
        env->cp15.c0_cachetype = 0xd172172;
143
        env->cp15.c1_sys = 0x00000078;
144
        break;
145
    default:
146
        cpu_abort(env, "Bad CPU ID: %x\n", id);
147
        break;
148
    }
149
}
150

    
151
void cpu_reset(CPUARMState *env)
152
{
153
    uint32_t id;
154
    id = env->cp15.c0_cpuid;
155
    memset(env, 0, offsetof(CPUARMState, breakpoints));
156
    if (id)
157
        cpu_reset_model_id(env, id);
158
#if defined (CONFIG_USER_ONLY)
159
    env->uncached_cpsr = ARM_CPU_MODE_USR;
160
    env->vfp.xregs[ARM_VFP_FPEXC] = 1 << 30;
161
#else
162
    /* SVC mode with interrupts disabled.  */
163
    env->uncached_cpsr = ARM_CPU_MODE_SVC | CPSR_A | CPSR_F | CPSR_I;
164
    /* On ARMv7-M the CPSR_I is the value of the PRIMASK register, and is
165
       clear at reset.  */
166
    if (IS_M(env))
167
        env->uncached_cpsr &= ~CPSR_I;
168
    env->vfp.xregs[ARM_VFP_FPEXC] = 0;
169
#endif
170
    env->regs[15] = 0;
171
    tlb_flush(env, 1);
172
}
173

    
174
CPUARMState *cpu_arm_init(const char *cpu_model)
175
{
176
    CPUARMState *env;
177
    uint32_t id;
178
    static int inited = 0;
179

    
180
    id = cpu_arm_find_by_name(cpu_model);
181
    if (id == 0)
182
        return NULL;
183
    env = qemu_mallocz(sizeof(CPUARMState));
184
    if (!env)
185
        return NULL;
186
    cpu_exec_init(env);
187
    if (!inited) {
188
        inited = 1;
189
        arm_translate_init();
190
    }
191

    
192
    env->cpu_model_str = cpu_model;
193
    env->cp15.c0_cpuid = id;
194
    cpu_reset(env);
195
    return env;
196
}
197

    
198
struct arm_cpu_t {
199
    uint32_t id;
200
    const char *name;
201
};
202

    
203
static const struct arm_cpu_t arm_cpu_names[] = {
204
    { ARM_CPUID_ARM926, "arm926"},
205
    { ARM_CPUID_ARM946, "arm946"},
206
    { ARM_CPUID_ARM1026, "arm1026"},
207
    { ARM_CPUID_ARM1136, "arm1136"},
208
    { ARM_CPUID_ARM11MPCORE, "arm11mpcore"},
209
    { ARM_CPUID_CORTEXM3, "cortex-m3"},
210
    { ARM_CPUID_CORTEXA8, "cortex-a8"},
211
    { ARM_CPUID_TI925T, "ti925t" },
212
    { ARM_CPUID_PXA250, "pxa250" },
213
    { ARM_CPUID_PXA255, "pxa255" },
214
    { ARM_CPUID_PXA260, "pxa260" },
215
    { ARM_CPUID_PXA261, "pxa261" },
216
    { ARM_CPUID_PXA262, "pxa262" },
217
    { ARM_CPUID_PXA270, "pxa270" },
218
    { ARM_CPUID_PXA270_A0, "pxa270-a0" },
219
    { ARM_CPUID_PXA270_A1, "pxa270-a1" },
220
    { ARM_CPUID_PXA270_B0, "pxa270-b0" },
221
    { ARM_CPUID_PXA270_B1, "pxa270-b1" },
222
    { ARM_CPUID_PXA270_C0, "pxa270-c0" },
223
    { ARM_CPUID_PXA270_C5, "pxa270-c5" },
224
    { ARM_CPUID_ANY, "any"},
225
    { 0, NULL}
226
};
227

    
228
void arm_cpu_list(FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
229
{
230
    int i;
231

    
232
    (*cpu_fprintf)(f, "Available CPUs:\n");
233
    for (i = 0; arm_cpu_names[i].name; i++) {
234
        (*cpu_fprintf)(f, "  %s\n", arm_cpu_names[i].name);
235
    }
236
}
237

    
238
/* return 0 if not found */
239
static uint32_t cpu_arm_find_by_name(const char *name)
240
{
241
    int i;
242
    uint32_t id;
243

    
244
    id = 0;
245
    for (i = 0; arm_cpu_names[i].name; i++) {
246
        if (strcmp(name, arm_cpu_names[i].name) == 0) {
247
            id = arm_cpu_names[i].id;
248
            break;
249
        }
250
    }
251
    return id;
252
}
253

    
254
void cpu_arm_close(CPUARMState *env)
255
{
256
    free(env);
257
}
258

    
259
/* Polynomial multiplication is like integer multiplcation except the
260
   partial products are XORed, not added.  */
261
uint32_t helper_neon_mul_p8(uint32_t op1, uint32_t op2)
262
{
263
    uint32_t mask;
264
    uint32_t result;
265
    result = 0;
266
    while (op1) {
267
        mask = 0;
268
        if (op1 & 1)
269
            mask |= 0xff;
270
        if (op1 & (1 << 8))
271
            mask |= (0xff << 8);
272
        if (op1 & (1 << 16))
273
            mask |= (0xff << 16);
274
        if (op1 & (1 << 24))
275
            mask |= (0xff << 24);
276
        result ^= op2 & mask;
277
        op1 = (op1 >> 1) & 0x7f7f7f7f;
278
        op2 = (op2 << 1) & 0xfefefefe;
279
    }
280
    return result;
281
}
282

    
283
uint32_t cpsr_read(CPUARMState *env)
284
{
285
    int ZF;
286
    ZF = (env->NZF == 0);
287
    return env->uncached_cpsr | (env->NZF & 0x80000000) | (ZF << 30) |
288
        (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27)
289
        | (env->thumb << 5) | ((env->condexec_bits & 3) << 25)
290
        | ((env->condexec_bits & 0xfc) << 8)
291
        | (env->GE << 16);
292
}
293

    
294
void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
295
{
296
    /* NOTE: N = 1 and Z = 1 cannot be stored currently */
297
    if (mask & CPSR_NZCV) {
298
        env->NZF = (val & 0xc0000000) ^ 0x40000000;
299
        env->CF = (val >> 29) & 1;
300
        env->VF = (val << 3) & 0x80000000;
301
    }
302
    if (mask & CPSR_Q)
303
        env->QF = ((val & CPSR_Q) != 0);
304
    if (mask & CPSR_T)
305
        env->thumb = ((val & CPSR_T) != 0);
306
    if (mask & CPSR_IT_0_1) {
307
        env->condexec_bits &= ~3;
308
        env->condexec_bits |= (val >> 25) & 3;
309
    }
310
    if (mask & CPSR_IT_2_7) {
311
        env->condexec_bits &= 3;
312
        env->condexec_bits |= (val >> 8) & 0xfc;
313
    }
314
    if (mask & CPSR_GE) {
315
        env->GE = (val >> 16) & 0xf;
316
    }
317

    
318
    if ((env->uncached_cpsr ^ val) & mask & CPSR_M) {
319
        switch_mode(env, val & CPSR_M);
320
    }
321
    mask &= ~CACHED_CPSR_BITS;
322
    env->uncached_cpsr = (env->uncached_cpsr & ~mask) | (val & mask);
323
}
324

    
325
/* Sign/zero extend */
326
uint32_t HELPER(sxtb16)(uint32_t x)
327
{
328
    uint32_t res;
329
    res = (uint16_t)(int8_t)x;
330
    res |= (uint32_t)(int8_t)(x >> 16) << 16;
331
    return res;
332
}
333

    
334
uint32_t HELPER(uxtb16)(uint32_t x)
335
{
336
    uint32_t res;
337
    res = (uint16_t)(uint8_t)x;
338
    res |= (uint32_t)(uint8_t)(x >> 16) << 16;
339
    return res;
340
}
341

    
342
uint32_t HELPER(clz)(uint32_t x)
343
{
344
    int count;
345
    for (count = 32; x; count--)
346
        x >>= 1;
347
    return count;
348
}
349

    
350
#if defined(CONFIG_USER_ONLY)
351

    
352
void do_interrupt (CPUState *env)
353
{
354
    env->exception_index = -1;
355
}
356

    
357
/* Structure used to record exclusive memory locations.  */
358
typedef struct mmon_state {
359
    struct mmon_state *next;
360
    CPUARMState *cpu_env;
361
    uint32_t addr;
362
} mmon_state;
363

    
364
/* Chain of current locks.  */
365
static mmon_state* mmon_head = NULL;
366

    
367
int cpu_arm_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
368
                              int mmu_idx, int is_softmmu)
369
{
370
    if (rw == 2) {
371
        env->exception_index = EXCP_PREFETCH_ABORT;
372
        env->cp15.c6_insn = address;
373
    } else {
374
        env->exception_index = EXCP_DATA_ABORT;
375
        env->cp15.c6_data = address;
376
    }
377
    return 1;
378
}
379

    
380
static void allocate_mmon_state(CPUState *env)
381
{
382
    env->mmon_entry = malloc(sizeof (mmon_state));
383
    if (!env->mmon_entry)
384
        abort();
385
    memset (env->mmon_entry, 0, sizeof (mmon_state));
386
    env->mmon_entry->cpu_env = env;
387
    mmon_head = env->mmon_entry;
388
}
389

    
390
/* Flush any monitor locks for the specified address.  */
391
static void flush_mmon(uint32_t addr)
392
{
393
    mmon_state *mon;
394

    
395
    for (mon = mmon_head; mon; mon = mon->next)
396
      {
397
        if (mon->addr != addr)
398
          continue;
399

    
400
        mon->addr = 0;
401
        break;
402
      }
403
}
404

    
405
/* Mark an address for exclusive access.  */
406
void helper_mark_exclusive(CPUState *env, uint32_t addr)
407
{
408
    if (!env->mmon_entry)
409
        allocate_mmon_state(env);
410
    /* Clear any previous locks.  */
411
    flush_mmon(addr);
412
    env->mmon_entry->addr = addr;
413
}
414

    
415
/* Test if an exclusive address is still exclusive.  Returns zero
416
   if the address is still exclusive.   */
417
int helper_test_exclusive(CPUState *env, uint32_t addr)
418
{
419
    int res;
420

    
421
    if (!env->mmon_entry)
422
        return 1;
423
    if (env->mmon_entry->addr == addr)
424
        res = 0;
425
    else
426
        res = 1;
427
    flush_mmon(addr);
428
    return res;
429
}
430

    
431
void helper_clrex(CPUState *env)
432
{
433
    if (!(env->mmon_entry && env->mmon_entry->addr))
434
        return;
435
    flush_mmon(env->mmon_entry->addr);
436
}
437

    
438
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
439
{
440
    return addr;
441
}
442

    
443
/* These should probably raise undefined insn exceptions.  */
444
void helper_set_cp(CPUState *env, uint32_t insn, uint32_t val)
445
{
446
    int op1 = (insn >> 8) & 0xf;
447
    cpu_abort(env, "cp%i insn %08x\n", op1, insn);
448
    return;
449
}
450

    
451
uint32_t helper_get_cp(CPUState *env, uint32_t insn)
452
{
453
    int op1 = (insn >> 8) & 0xf;
454
    cpu_abort(env, "cp%i insn %08x\n", op1, insn);
455
    return 0;
456
}
457

    
458
void helper_set_cp15(CPUState *env, uint32_t insn, uint32_t val)
459
{
460
    cpu_abort(env, "cp15 insn %08x\n", insn);
461
}
462

    
463
uint32_t helper_get_cp15(CPUState *env, uint32_t insn)
464
{
465
    cpu_abort(env, "cp15 insn %08x\n", insn);
466
    return 0;
467
}
468

    
469
/* These should probably raise undefined insn exceptions.  */
470
void helper_v7m_msr(CPUState *env, int reg, uint32_t val)
471
{
472
    cpu_abort(env, "v7m_mrs %d\n", reg);
473
}
474

    
475
uint32_t helper_v7m_mrs(CPUState *env, int reg)
476
{
477
    cpu_abort(env, "v7m_mrs %d\n", reg);
478
    return 0;
479
}
480

    
481
void switch_mode(CPUState *env, int mode)
482
{
483
    if (mode != ARM_CPU_MODE_USR)
484
        cpu_abort(env, "Tried to switch out of user mode\n");
485
}
486

    
487
void helper_set_r13_banked(CPUState *env, int mode, uint32_t val)
488
{
489
    cpu_abort(env, "banked r13 write\n");
490
}
491

    
492
uint32_t helper_get_r13_banked(CPUState *env, int mode)
493
{
494
    cpu_abort(env, "banked r13 read\n");
495
    return 0;
496
}
497

    
498
#else
499

    
500
extern int semihosting_enabled;
501

    
502
/* Map CPU modes onto saved register banks.  */
503
static inline int bank_number (int mode)
504
{
505
    switch (mode) {
506
    case ARM_CPU_MODE_USR:
507
    case ARM_CPU_MODE_SYS:
508
        return 0;
509
    case ARM_CPU_MODE_SVC:
510
        return 1;
511
    case ARM_CPU_MODE_ABT:
512
        return 2;
513
    case ARM_CPU_MODE_UND:
514
        return 3;
515
    case ARM_CPU_MODE_IRQ:
516
        return 4;
517
    case ARM_CPU_MODE_FIQ:
518
        return 5;
519
    }
520
    cpu_abort(cpu_single_env, "Bad mode %x\n", mode);
521
    return -1;
522
}
523

    
524
void switch_mode(CPUState *env, int mode)
525
{
526
    int old_mode;
527
    int i;
528

    
529
    old_mode = env->uncached_cpsr & CPSR_M;
530
    if (mode == old_mode)
531
        return;
532

    
533
    if (old_mode == ARM_CPU_MODE_FIQ) {
534
        memcpy (env->fiq_regs, env->regs + 8, 5 * sizeof(uint32_t));
535
        memcpy (env->regs + 8, env->usr_regs, 5 * sizeof(uint32_t));
536
    } else if (mode == ARM_CPU_MODE_FIQ) {
537
        memcpy (env->usr_regs, env->regs + 8, 5 * sizeof(uint32_t));
538
        memcpy (env->regs + 8, env->fiq_regs, 5 * sizeof(uint32_t));
539
    }
540

    
541
    i = bank_number(old_mode);
542
    env->banked_r13[i] = env->regs[13];
543
    env->banked_r14[i] = env->regs[14];
544
    env->banked_spsr[i] = env->spsr;
545

    
546
    i = bank_number(mode);
547
    env->regs[13] = env->banked_r13[i];
548
    env->regs[14] = env->banked_r14[i];
549
    env->spsr = env->banked_spsr[i];
550
}
551

    
552
static void v7m_push(CPUARMState *env, uint32_t val)
553
{
554
    env->regs[13] -= 4;
555
    stl_phys(env->regs[13], val);
556
}
557

    
558
static uint32_t v7m_pop(CPUARMState *env)
559
{
560
    uint32_t val;
561
    val = ldl_phys(env->regs[13]);
562
    env->regs[13] += 4;
563
    return val;
564
}
565

    
566
/* Switch to V7M main or process stack pointer.  */
567
static void switch_v7m_sp(CPUARMState *env, int process)
568
{
569
    uint32_t tmp;
570
    if (env->v7m.current_sp != process) {
571
        tmp = env->v7m.other_sp;
572
        env->v7m.other_sp = env->regs[13];
573
        env->regs[13] = tmp;
574
        env->v7m.current_sp = process;
575
    }
576
}
577

    
578
static void do_v7m_exception_exit(CPUARMState *env)
579
{
580
    uint32_t type;
581
    uint32_t xpsr;
582

    
583
    type = env->regs[15];
584
    if (env->v7m.exception != 0)
585
        armv7m_nvic_complete_irq(env->v7m.nvic, env->v7m.exception);
586

    
587
    /* Switch to the target stack.  */
588
    switch_v7m_sp(env, (type & 4) != 0);
589
    /* Pop registers.  */
590
    env->regs[0] = v7m_pop(env);
591
    env->regs[1] = v7m_pop(env);
592
    env->regs[2] = v7m_pop(env);
593
    env->regs[3] = v7m_pop(env);
594
    env->regs[12] = v7m_pop(env);
595
    env->regs[14] = v7m_pop(env);
596
    env->regs[15] = v7m_pop(env);
597
    xpsr = v7m_pop(env);
598
    xpsr_write(env, xpsr, 0xfffffdff);
599
    /* Undo stack alignment.  */
600
    if (xpsr & 0x200)
601
        env->regs[13] |= 4;
602
    /* ??? The exception return type specifies Thread/Handler mode.  However
603
       this is also implied by the xPSR value. Not sure what to do
604
       if there is a mismatch.  */
605
    /* ??? Likewise for mismatches between the CONTROL register and the stack
606
       pointer.  */
607
}
608

    
609
void do_interrupt_v7m(CPUARMState *env)
610
{
611
    uint32_t xpsr = xpsr_read(env);
612
    uint32_t lr;
613
    uint32_t addr;
614

    
615
    lr = 0xfffffff1;
616
    if (env->v7m.current_sp)
617
        lr |= 4;
618
    if (env->v7m.exception == 0)
619
        lr |= 8;
620

    
621
    /* For exceptions we just mark as pending on the NVIC, and let that
622
       handle it.  */
623
    /* TODO: Need to escalate if the current priority is higher than the
624
       one we're raising.  */
625
    switch (env->exception_index) {
626
    case EXCP_UDEF:
627
        armv7m_nvic_set_pending(env->v7m.nvic, ARMV7M_EXCP_USAGE);
628
        return;
629
    case EXCP_SWI:
630
        env->regs[15] += 2;
631
        armv7m_nvic_set_pending(env->v7m.nvic, ARMV7M_EXCP_SVC);
632
        return;
633
    case EXCP_PREFETCH_ABORT:
634
    case EXCP_DATA_ABORT:
635
        armv7m_nvic_set_pending(env->v7m.nvic, ARMV7M_EXCP_MEM);
636
        return;
637
    case EXCP_BKPT:
638
        if (semihosting_enabled) {
639
            int nr;
640
            nr = lduw_code(env->regs[15]) & 0xff;
641
            if (nr == 0xab) {
642
                env->regs[15] += 2;
643
                env->regs[0] = do_arm_semihosting(env);
644
                return;
645
            }
646
        }
647
        armv7m_nvic_set_pending(env->v7m.nvic, ARMV7M_EXCP_DEBUG);
648
        return;
649
    case EXCP_IRQ:
650
        env->v7m.exception = armv7m_nvic_acknowledge_irq(env->v7m.nvic);
651
        break;
652
    case EXCP_EXCEPTION_EXIT:
653
        do_v7m_exception_exit(env);
654
        return;
655
    default:
656
        cpu_abort(env, "Unhandled exception 0x%x\n", env->exception_index);
657
        return; /* Never happens.  Keep compiler happy.  */
658
    }
659

    
660
    /* Align stack pointer.  */
661
    /* ??? Should only do this if Configuration Control Register
662
       STACKALIGN bit is set.  */
663
    if (env->regs[13] & 4) {
664
        env->regs[13] += 4;
665
        xpsr |= 0x200;
666
    }
667
    /* Switch to the hander mode.  */
668
    v7m_push(env, xpsr);
669
    v7m_push(env, env->regs[15]);
670
    v7m_push(env, env->regs[14]);
671
    v7m_push(env, env->regs[12]);
672
    v7m_push(env, env->regs[3]);
673
    v7m_push(env, env->regs[2]);
674
    v7m_push(env, env->regs[1]);
675
    v7m_push(env, env->regs[0]);
676
    switch_v7m_sp(env, 0);
677
    env->uncached_cpsr &= ~CPSR_IT;
678
    env->regs[14] = lr;
679
    addr = ldl_phys(env->v7m.vecbase + env->v7m.exception * 4);
680
    env->regs[15] = addr & 0xfffffffe;
681
    env->thumb = addr & 1;
682
}
683

    
684
/* Handle a CPU exception.  */
685
void do_interrupt(CPUARMState *env)
686
{
687
    uint32_t addr;
688
    uint32_t mask;
689
    int new_mode;
690
    uint32_t offset;
691

    
692
    if (IS_M(env)) {
693
        do_interrupt_v7m(env);
694
        return;
695
    }
696
    /* TODO: Vectored interrupt controller.  */
697
    switch (env->exception_index) {
698
    case EXCP_UDEF:
699
        new_mode = ARM_CPU_MODE_UND;
700
        addr = 0x04;
701
        mask = CPSR_I;
702
        if (env->thumb)
703
            offset = 2;
704
        else
705
            offset = 4;
706
        break;
707
    case EXCP_SWI:
708
        if (semihosting_enabled) {
709
            /* Check for semihosting interrupt.  */
710
            if (env->thumb) {
711
                mask = lduw_code(env->regs[15] - 2) & 0xff;
712
            } else {
713
                mask = ldl_code(env->regs[15] - 4) & 0xffffff;
714
            }
715
            /* Only intercept calls from privileged modes, to provide some
716
               semblance of security.  */
717
            if (((mask == 0x123456 && !env->thumb)
718
                    || (mask == 0xab && env->thumb))
719
                  && (env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR) {
720
                env->regs[0] = do_arm_semihosting(env);
721
                return;
722
            }
723
        }
724
        new_mode = ARM_CPU_MODE_SVC;
725
        addr = 0x08;
726
        mask = CPSR_I;
727
        /* The PC already points to the next instructon.  */
728
        offset = 0;
729
        break;
730
    case EXCP_BKPT:
731
        /* See if this is a semihosting syscall.  */
732
        if (env->thumb && semihosting_enabled) {
733
            mask = lduw_code(env->regs[15]) & 0xff;
734
            if (mask == 0xab
735
                  && (env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR) {
736
                env->regs[15] += 2;
737
                env->regs[0] = do_arm_semihosting(env);
738
                return;
739
            }
740
        }
741
        /* Fall through to prefetch abort.  */
742
    case EXCP_PREFETCH_ABORT:
743
        new_mode = ARM_CPU_MODE_ABT;
744
        addr = 0x0c;
745
        mask = CPSR_A | CPSR_I;
746
        offset = 4;
747
        break;
748
    case EXCP_DATA_ABORT:
749
        new_mode = ARM_CPU_MODE_ABT;
750
        addr = 0x10;
751
        mask = CPSR_A | CPSR_I;
752
        offset = 8;
753
        break;
754
    case EXCP_IRQ:
755
        new_mode = ARM_CPU_MODE_IRQ;
756
        addr = 0x18;
757
        /* Disable IRQ and imprecise data aborts.  */
758
        mask = CPSR_A | CPSR_I;
759
        offset = 4;
760
        break;
761
    case EXCP_FIQ:
762
        new_mode = ARM_CPU_MODE_FIQ;
763
        addr = 0x1c;
764
        /* Disable FIQ, IRQ and imprecise data aborts.  */
765
        mask = CPSR_A | CPSR_I | CPSR_F;
766
        offset = 4;
767
        break;
768
    default:
769
        cpu_abort(env, "Unhandled exception 0x%x\n", env->exception_index);
770
        return; /* Never happens.  Keep compiler happy.  */
771
    }
772
    /* High vectors.  */
773
    if (env->cp15.c1_sys & (1 << 13)) {
774
        addr += 0xffff0000;
775
    }
776
    switch_mode (env, new_mode);
777
    env->spsr = cpsr_read(env);
778
    /* Clear IT bits.  */
779
    env->condexec_bits = 0;
780
    /* Switch to the new mode, and switch to Arm mode.  */
781
    /* ??? Thumb interrupt handlers not implemented.  */
782
    env->uncached_cpsr = (env->uncached_cpsr & ~CPSR_M) | new_mode;
783
    env->uncached_cpsr |= mask;
784
    env->thumb = 0;
785
    env->regs[14] = env->regs[15] + offset;
786
    env->regs[15] = addr;
787
    env->interrupt_request |= CPU_INTERRUPT_EXITTB;
788
}
789

    
790
/* Check section/page access permissions.
791
   Returns the page protection flags, or zero if the access is not
792
   permitted.  */
793
static inline int check_ap(CPUState *env, int ap, int domain, int access_type,
794
                           int is_user)
795
{
796
  int prot_ro;
797

    
798
  if (domain == 3)
799
    return PAGE_READ | PAGE_WRITE;
800

    
801
  if (access_type == 1)
802
      prot_ro = 0;
803
  else
804
      prot_ro = PAGE_READ;
805

    
806
  switch (ap) {
807
  case 0:
808
      if (access_type == 1)
809
          return 0;
810
      switch ((env->cp15.c1_sys >> 8) & 3) {
811
      case 1:
812
          return is_user ? 0 : PAGE_READ;
813
      case 2:
814
          return PAGE_READ;
815
      default:
816
          return 0;
817
      }
818
  case 1:
819
      return is_user ? 0 : PAGE_READ | PAGE_WRITE;
820
  case 2:
821
      if (is_user)
822
          return prot_ro;
823
      else
824
          return PAGE_READ | PAGE_WRITE;
825
  case 3:
826
      return PAGE_READ | PAGE_WRITE;
827
  case 4: case 7: /* Reserved.  */
828
      return 0;
829
  case 5:
830
      return is_user ? 0 : prot_ro;
831
  case 6:
832
      return prot_ro;
833
  default:
834
      abort();
835
  }
836
}
837

    
838
static int get_phys_addr_v5(CPUState *env, uint32_t address, int access_type,
839
                            int is_user, uint32_t *phys_ptr, int *prot)
840
{
841
    int code;
842
    uint32_t table;
843
    uint32_t desc;
844
    int type;
845
    int ap;
846
    int domain;
847
    uint32_t phys_addr;
848

    
849
    /* Pagetable walk.  */
850
    /* Lookup l1 descriptor.  */
851
    if (address & env->cp15.c2_mask)
852
        table = env->cp15.c2_base1;
853
    else
854
        table = env->cp15.c2_base0;
855
    table = (table & 0xffffc000) | ((address >> 18) & 0x3ffc);
856
    desc = ldl_phys(table);
857
    type = (desc & 3);
858
    domain = (env->cp15.c3 >> ((desc >> 4) & 0x1e)) & 3;
859
    if (type == 0) {
860
        /* Secton translation fault.  */
861
        code = 5;
862
        goto do_fault;
863
    }
864
    if (domain == 0 || domain == 2) {
865
        if (type == 2)
866
            code = 9; /* Section domain fault.  */
867
        else
868
            code = 11; /* Page domain fault.  */
869
        goto do_fault;
870
    }
871
    if (type == 2) {
872
        /* 1Mb section.  */
873
        phys_addr = (desc & 0xfff00000) | (address & 0x000fffff);
874
        ap = (desc >> 10) & 3;
875
        code = 13;
876
    } else {
877
        /* Lookup l2 entry.  */
878
        if (type == 1) {
879
            /* Coarse pagetable.  */
880
            table = (desc & 0xfffffc00) | ((address >> 10) & 0x3fc);
881
        } else {
882
            /* Fine pagetable.  */
883
            table = (desc & 0xfffff000) | ((address >> 8) & 0xffc);
884
        }
885
        desc = ldl_phys(table);
886
        switch (desc & 3) {
887
        case 0: /* Page translation fault.  */
888
            code = 7;
889
            goto do_fault;
890
        case 1: /* 64k page.  */
891
            phys_addr = (desc & 0xffff0000) | (address & 0xffff);
892
            ap = (desc >> (4 + ((address >> 13) & 6))) & 3;
893
            break;
894
        case 2: /* 4k page.  */
895
            phys_addr = (desc & 0xfffff000) | (address & 0xfff);
896
            ap = (desc >> (4 + ((address >> 13) & 6))) & 3;
897
            break;
898
        case 3: /* 1k page.  */
899
            if (type == 1) {
900
                if (arm_feature(env, ARM_FEATURE_XSCALE)) {
901
                    phys_addr = (desc & 0xfffff000) | (address & 0xfff);
902
                } else {
903
                    /* Page translation fault.  */
904
                    code = 7;
905
                    goto do_fault;
906
                }
907
            } else {
908
                phys_addr = (desc & 0xfffffc00) | (address & 0x3ff);
909
            }
910
            ap = (desc >> 4) & 3;
911
            break;
912
        default:
913
            /* Never happens, but compiler isn't smart enough to tell.  */
914
            abort();
915
        }
916
        code = 15;
917
    }
918
    *prot = check_ap(env, ap, domain, access_type, is_user);
919
    if (!*prot) {
920
        /* Access permission fault.  */
921
        goto do_fault;
922
    }
923
    *phys_ptr = phys_addr;
924
    return 0;
925
do_fault:
926
    return code | (domain << 4);
927
}
928

    
929
static int get_phys_addr_v6(CPUState *env, uint32_t address, int access_type,
930
                            int is_user, uint32_t *phys_ptr, int *prot)
931
{
932
    int code;
933
    uint32_t table;
934
    uint32_t desc;
935
    uint32_t xn;
936
    int type;
937
    int ap;
938
    int domain;
939
    uint32_t phys_addr;
940

    
941
    /* Pagetable walk.  */
942
    /* Lookup l1 descriptor.  */
943
    if (address & env->cp15.c2_mask)
944
        table = env->cp15.c2_base1;
945
    else
946
        table = env->cp15.c2_base0;
947
    table = (table & 0xffffc000) | ((address >> 18) & 0x3ffc);
948
    desc = ldl_phys(table);
949
    type = (desc & 3);
950
    if (type == 0) {
951
        /* Secton translation fault.  */
952
        code = 5;
953
        domain = 0;
954
        goto do_fault;
955
    } else if (type == 2 && (desc & (1 << 18))) {
956
        /* Supersection.  */
957
        domain = 0;
958
    } else {
959
        /* Section or page.  */
960
        domain = (desc >> 4) & 0x1e;
961
    }
962
    domain = (env->cp15.c3 >> domain) & 3;
963
    if (domain == 0 || domain == 2) {
964
        if (type == 2)
965
            code = 9; /* Section domain fault.  */
966
        else
967
            code = 11; /* Page domain fault.  */
968
        goto do_fault;
969
    }
970
    if (type == 2) {
971
        if (desc & (1 << 18)) {
972
            /* Supersection.  */
973
            phys_addr = (desc & 0xff000000) | (address & 0x00ffffff);
974
        } else {
975
            /* Section.  */
976
            phys_addr = (desc & 0xfff00000) | (address & 0x000fffff);
977
        }
978
        ap = ((desc >> 10) & 3) | ((desc >> 13) & 4);
979
        xn = desc & (1 << 4);
980
        code = 13;
981
    } else {
982
        /* Lookup l2 entry.  */
983
        table = (desc & 0xfffffc00) | ((address >> 10) & 0x3fc);
984
        desc = ldl_phys(table);
985
        ap = ((desc >> 4) & 3) | ((desc >> 7) & 4);
986
        switch (desc & 3) {
987
        case 0: /* Page translation fault.  */
988
            code = 7;
989
            goto do_fault;
990
        case 1: /* 64k page.  */
991
            phys_addr = (desc & 0xffff0000) | (address & 0xffff);
992
            xn = desc & (1 << 15);
993
            break;
994
        case 2: case 3: /* 4k page.  */
995
            phys_addr = (desc & 0xfffff000) | (address & 0xfff);
996
            xn = desc & 1;
997
            break;
998
        default:
999
            /* Never happens, but compiler isn't smart enough to tell.  */
1000
            abort();
1001
        }
1002
        code = 15;
1003
    }
1004
    if (xn && access_type == 2)
1005
        goto do_fault;
1006

    
1007
    *prot = check_ap(env, ap, domain, access_type, is_user);
1008
    if (!*prot) {
1009
        /* Access permission fault.  */
1010
        goto do_fault;
1011
    }
1012
    *phys_ptr = phys_addr;
1013
    return 0;
1014
do_fault:
1015
    return code | (domain << 4);
1016
}
1017

    
1018
static int get_phys_addr_mpu(CPUState *env, uint32_t address, int access_type,
1019
                             int is_user, uint32_t *phys_ptr, int *prot)
1020
{
1021
    int n;
1022
    uint32_t mask;
1023
    uint32_t base;
1024

    
1025
    *phys_ptr = address;
1026
    for (n = 7; n >= 0; n--) {
1027
        base = env->cp15.c6_region[n];
1028
        if ((base & 1) == 0)
1029
            continue;
1030
        mask = 1 << ((base >> 1) & 0x1f);
1031
        /* Keep this shift separate from the above to avoid an
1032
           (undefined) << 32.  */
1033
        mask = (mask << 1) - 1;
1034
        if (((base ^ address) & ~mask) == 0)
1035
            break;
1036
    }
1037
    if (n < 0)
1038
        return 2;
1039

    
1040
    if (access_type == 2) {
1041
        mask = env->cp15.c5_insn;
1042
    } else {
1043
        mask = env->cp15.c5_data;
1044
    }
1045
    mask = (mask >> (n * 4)) & 0xf;
1046
    switch (mask) {
1047
    case 0:
1048
        return 1;
1049
    case 1:
1050
        if (is_user)
1051
          return 1;
1052
        *prot = PAGE_READ | PAGE_WRITE;
1053
        break;
1054
    case 2:
1055
        *prot = PAGE_READ;
1056
        if (!is_user)
1057
            *prot |= PAGE_WRITE;
1058
        break;
1059
    case 3:
1060
        *prot = PAGE_READ | PAGE_WRITE;
1061
        break;
1062
    case 5:
1063
        if (is_user)
1064
            return 1;
1065
        *prot = PAGE_READ;
1066
        break;
1067
    case 6:
1068
        *prot = PAGE_READ;
1069
        break;
1070
    default:
1071
        /* Bad permission.  */
1072
        return 1;
1073
    }
1074
    return 0;
1075
}
1076

    
1077
static inline int get_phys_addr(CPUState *env, uint32_t address,
1078
                                int access_type, int is_user,
1079
                                uint32_t *phys_ptr, int *prot)
1080
{
1081
    /* Fast Context Switch Extension.  */
1082
    if (address < 0x02000000)
1083
        address += env->cp15.c13_fcse;
1084

    
1085
    if ((env->cp15.c1_sys & 1) == 0) {
1086
        /* MMU/MPU disabled.  */
1087
        *phys_ptr = address;
1088
        *prot = PAGE_READ | PAGE_WRITE;
1089
        return 0;
1090
    } else if (arm_feature(env, ARM_FEATURE_MPU)) {
1091
        return get_phys_addr_mpu(env, address, access_type, is_user, phys_ptr,
1092
                                 prot);
1093
    } else if (env->cp15.c1_sys & (1 << 23)) {
1094
        return get_phys_addr_v6(env, address, access_type, is_user, phys_ptr,
1095
                                prot);
1096
    } else {
1097
        return get_phys_addr_v5(env, address, access_type, is_user, phys_ptr,
1098
                                prot);
1099
    }
1100
}
1101

    
1102
int cpu_arm_handle_mmu_fault (CPUState *env, target_ulong address,
1103
                              int access_type, int mmu_idx, int is_softmmu)
1104
{
1105
    uint32_t phys_addr;
1106
    int prot;
1107
    int ret, is_user;
1108

    
1109
    is_user = mmu_idx == MMU_USER_IDX;
1110
    ret = get_phys_addr(env, address, access_type, is_user, &phys_addr, &prot);
1111
    if (ret == 0) {
1112
        /* Map a single [sub]page.  */
1113
        phys_addr &= ~(uint32_t)0x3ff;
1114
        address &= ~(uint32_t)0x3ff;
1115
        return tlb_set_page (env, address, phys_addr, prot, mmu_idx,
1116
                             is_softmmu);
1117
    }
1118

    
1119
    if (access_type == 2) {
1120
        env->cp15.c5_insn = ret;
1121
        env->cp15.c6_insn = address;
1122
        env->exception_index = EXCP_PREFETCH_ABORT;
1123
    } else {
1124
        env->cp15.c5_data = ret;
1125
        if (access_type == 1 && arm_feature(env, ARM_FEATURE_V6))
1126
            env->cp15.c5_data |= (1 << 11);
1127
        env->cp15.c6_data = address;
1128
        env->exception_index = EXCP_DATA_ABORT;
1129
    }
1130
    return 1;
1131
}
1132

    
1133
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
1134
{
1135
    uint32_t phys_addr;
1136
    int prot;
1137
    int ret;
1138

    
1139
    ret = get_phys_addr(env, addr, 0, 0, &phys_addr, &prot);
1140

    
1141
    if (ret != 0)
1142
        return -1;
1143

    
1144
    return phys_addr;
1145
}
1146

    
1147
/* Not really implemented.  Need to figure out a sane way of doing this.
1148
   Maybe add generic watchpoint support and use that.  */
1149

    
1150
void helper_mark_exclusive(CPUState *env, uint32_t addr)
1151
{
1152
    env->mmon_addr = addr;
1153
}
1154

    
1155
int helper_test_exclusive(CPUState *env, uint32_t addr)
1156
{
1157
    return (env->mmon_addr != addr);
1158
}
1159

    
1160
void helper_clrex(CPUState *env)
1161
{
1162
    env->mmon_addr = -1;
1163
}
1164

    
1165
void helper_set_cp(CPUState *env, uint32_t insn, uint32_t val)
1166
{
1167
    int cp_num = (insn >> 8) & 0xf;
1168
    int cp_info = (insn >> 5) & 7;
1169
    int src = (insn >> 16) & 0xf;
1170
    int operand = insn & 0xf;
1171

    
1172
    if (env->cp[cp_num].cp_write)
1173
        env->cp[cp_num].cp_write(env->cp[cp_num].opaque,
1174
                                 cp_info, src, operand, val);
1175
}
1176

    
1177
uint32_t helper_get_cp(CPUState *env, uint32_t insn)
1178
{
1179
    int cp_num = (insn >> 8) & 0xf;
1180
    int cp_info = (insn >> 5) & 7;
1181
    int dest = (insn >> 16) & 0xf;
1182
    int operand = insn & 0xf;
1183

    
1184
    if (env->cp[cp_num].cp_read)
1185
        return env->cp[cp_num].cp_read(env->cp[cp_num].opaque,
1186
                                       cp_info, dest, operand);
1187
    return 0;
1188
}
1189

    
1190
/* Return basic MPU access permission bits.  */
1191
static uint32_t simple_mpu_ap_bits(uint32_t val)
1192
{
1193
    uint32_t ret;
1194
    uint32_t mask;
1195
    int i;
1196
    ret = 0;
1197
    mask = 3;
1198
    for (i = 0; i < 16; i += 2) {
1199
        ret |= (val >> i) & mask;
1200
        mask <<= 2;
1201
    }
1202
    return ret;
1203
}
1204

    
1205
/* Pad basic MPU access permission bits to extended format.  */
1206
static uint32_t extended_mpu_ap_bits(uint32_t val)
1207
{
1208
    uint32_t ret;
1209
    uint32_t mask;
1210
    int i;
1211
    ret = 0;
1212
    mask = 3;
1213
    for (i = 0; i < 16; i += 2) {
1214
        ret |= (val & mask) << i;
1215
        mask <<= 2;
1216
    }
1217
    return ret;
1218
}
1219

    
1220
void helper_set_cp15(CPUState *env, uint32_t insn, uint32_t val)
1221
{
1222
    int op1;
1223
    int op2;
1224
    int crm;
1225

    
1226
    op1 = (insn >> 21) & 7;
1227
    op2 = (insn >> 5) & 7;
1228
    crm = insn & 0xf;
1229
    switch ((insn >> 16) & 0xf) {
1230
    case 0:
1231
        if (((insn >> 21) & 7) == 2) {
1232
            /* ??? Select cache level.  Ignore.  */
1233
            return;
1234
        }
1235
        /* ID codes.  */
1236
        if (arm_feature(env, ARM_FEATURE_XSCALE))
1237
            break;
1238
        if (arm_feature(env, ARM_FEATURE_OMAPCP))
1239
            break;
1240
        goto bad_reg;
1241
    case 1: /* System configuration.  */
1242
        if (arm_feature(env, ARM_FEATURE_OMAPCP))
1243
            op2 = 0;
1244
        switch (op2) {
1245
        case 0:
1246
            if (!arm_feature(env, ARM_FEATURE_XSCALE) || crm == 0)
1247
                env->cp15.c1_sys = val;
1248
            /* ??? Lots of these bits are not implemented.  */
1249
            /* This may enable/disable the MMU, so do a TLB flush.  */
1250
            tlb_flush(env, 1);
1251
            break;
1252
        case 1: /* Auxiliary cotrol register.  */
1253
            if (arm_feature(env, ARM_FEATURE_XSCALE)) {
1254
                env->cp15.c1_xscaleauxcr = val;
1255
                break;
1256
            }
1257
            /* Not implemented.  */
1258
            break;
1259
        case 2:
1260
            if (arm_feature(env, ARM_FEATURE_XSCALE))
1261
                goto bad_reg;
1262
            env->cp15.c1_coproc = val;
1263
            /* ??? Is this safe when called from within a TB?  */
1264
            tb_flush(env);
1265
            break;
1266
        default:
1267
            goto bad_reg;
1268
        }
1269
        break;
1270
    case 2: /* MMU Page table control / MPU cache control.  */
1271
        if (arm_feature(env, ARM_FEATURE_MPU)) {
1272
            switch (op2) {
1273
            case 0:
1274
                env->cp15.c2_data = val;
1275
                break;
1276
            case 1:
1277
                env->cp15.c2_insn = val;
1278
                break;
1279
            default:
1280
                goto bad_reg;
1281
            }
1282
        } else {
1283
            switch (op2) {
1284
            case 0:
1285
                env->cp15.c2_base0 = val;
1286
                break;
1287
            case 1:
1288
                env->cp15.c2_base1 = val;
1289
                break;
1290
            case 2:
1291
                env->cp15.c2_mask = ~(((uint32_t)0xffffffffu) >> val);
1292
                break;
1293
            default:
1294
                goto bad_reg;
1295
            }
1296
        }
1297
        break;
1298
    case 3: /* MMU Domain access control / MPU write buffer control.  */
1299
        env->cp15.c3 = val;
1300
        tlb_flush(env, 1); /* Flush TLB as domain not tracked in TLB */
1301
        break;
1302
    case 4: /* Reserved.  */
1303
        goto bad_reg;
1304
    case 5: /* MMU Fault status / MPU access permission.  */
1305
        if (arm_feature(env, ARM_FEATURE_OMAPCP))
1306
            op2 = 0;
1307
        switch (op2) {
1308
        case 0:
1309
            if (arm_feature(env, ARM_FEATURE_MPU))
1310
                val = extended_mpu_ap_bits(val);
1311
            env->cp15.c5_data = val;
1312
            break;
1313
        case 1:
1314
            if (arm_feature(env, ARM_FEATURE_MPU))
1315
                val = extended_mpu_ap_bits(val);
1316
            env->cp15.c5_insn = val;
1317
            break;
1318
        case 2:
1319
            if (!arm_feature(env, ARM_FEATURE_MPU))
1320
                goto bad_reg;
1321
            env->cp15.c5_data = val;
1322
            break;
1323
        case 3:
1324
            if (!arm_feature(env, ARM_FEATURE_MPU))
1325
                goto bad_reg;
1326
            env->cp15.c5_insn = val;
1327
            break;
1328
        default:
1329
            goto bad_reg;
1330
        }
1331
        break;
1332
    case 6: /* MMU Fault address / MPU base/size.  */
1333
        if (arm_feature(env, ARM_FEATURE_MPU)) {
1334
            if (crm >= 8)
1335
                goto bad_reg;
1336
            env->cp15.c6_region[crm] = val;
1337
        } else {
1338
            if (arm_feature(env, ARM_FEATURE_OMAPCP))
1339
                op2 = 0;
1340
            switch (op2) {
1341
            case 0:
1342
                env->cp15.c6_data = val;
1343
                break;
1344
            case 1: /* ??? This is WFAR on armv6 */
1345
            case 2:
1346
                env->cp15.c6_insn = val;
1347
                break;
1348
            default:
1349
                goto bad_reg;
1350
            }
1351
        }
1352
        break;
1353
    case 7: /* Cache control.  */
1354
        env->cp15.c15_i_max = 0x000;
1355
        env->cp15.c15_i_min = 0xff0;
1356
        /* No cache, so nothing to do.  */
1357
        /* ??? MPCore has VA to PA translation functions.  */
1358
        break;
1359
    case 8: /* MMU TLB control.  */
1360
        switch (op2) {
1361
        case 0: /* Invalidate all.  */
1362
            tlb_flush(env, 0);
1363
            break;
1364
        case 1: /* Invalidate single TLB entry.  */
1365
#if 0
1366
            /* ??? This is wrong for large pages and sections.  */
1367
            /* As an ugly hack to make linux work we always flush a 4K
1368
               pages.  */
1369
            val &= 0xfffff000;
1370
            tlb_flush_page(env, val);
1371
            tlb_flush_page(env, val + 0x400);
1372
            tlb_flush_page(env, val + 0x800);
1373
            tlb_flush_page(env, val + 0xc00);
1374
#else
1375
            tlb_flush(env, 1);
1376
#endif
1377
            break;
1378
        case 2: /* Invalidate on ASID.  */
1379
            tlb_flush(env, val == 0);
1380
            break;
1381
        case 3: /* Invalidate single entry on MVA.  */
1382
            /* ??? This is like case 1, but ignores ASID.  */
1383
            tlb_flush(env, 1);
1384
            break;
1385
        default:
1386
            goto bad_reg;
1387
        }
1388
        break;
1389
    case 9:
1390
        if (arm_feature(env, ARM_FEATURE_OMAPCP))
1391
            break;
1392
        switch (crm) {
1393
        case 0: /* Cache lockdown.  */
1394
            switch (op1) {
1395
            case 0: /* L1 cache.  */
1396
                switch (op2) {
1397
                case 0:
1398
                    env->cp15.c9_data = val;
1399
                    break;
1400
                case 1:
1401
                    env->cp15.c9_insn = val;
1402
                    break;
1403
                default:
1404
                    goto bad_reg;
1405
                }
1406
                break;
1407
            case 1: /* L2 cache.  */
1408
                /* Ignore writes to L2 lockdown/auxiliary registers.  */
1409
                break;
1410
            default:
1411
                goto bad_reg;
1412
            }
1413
            break;
1414
        case 1: /* TCM memory region registers.  */
1415
            /* Not implemented.  */
1416
            goto bad_reg;
1417
        default:
1418
            goto bad_reg;
1419
        }
1420
        break;
1421
    case 10: /* MMU TLB lockdown.  */
1422
        /* ??? TLB lockdown not implemented.  */
1423
        break;
1424
    case 12: /* Reserved.  */
1425
        goto bad_reg;
1426
    case 13: /* Process ID.  */
1427
        switch (op2) {
1428
        case 0:
1429
            /* Unlike real hardware the qemu TLB uses virtual addresses,
1430
               not modified virtual addresses, so this causes a TLB flush.
1431
             */
1432
            if (env->cp15.c13_fcse != val)
1433
              tlb_flush(env, 1);
1434
            env->cp15.c13_fcse = val;
1435
            break;
1436
        case 1:
1437
            /* This changes the ASID, so do a TLB flush.  */
1438
            if (env->cp15.c13_context != val
1439
                && !arm_feature(env, ARM_FEATURE_MPU))
1440
              tlb_flush(env, 0);
1441
            env->cp15.c13_context = val;
1442
            break;
1443
        case 2:
1444
            env->cp15.c13_tls1 = val;
1445
            break;
1446
        case 3:
1447
            env->cp15.c13_tls2 = val;
1448
            break;
1449
        case 4:
1450
            env->cp15.c13_tls3 = val;
1451
            break;
1452
        default:
1453
            goto bad_reg;
1454
        }
1455
        break;
1456
    case 14: /* Reserved.  */
1457
        goto bad_reg;
1458
    case 15: /* Implementation specific.  */
1459
        if (arm_feature(env, ARM_FEATURE_XSCALE)) {
1460
            if (op2 == 0 && crm == 1) {
1461
                if (env->cp15.c15_cpar != (val & 0x3fff)) {
1462
                    /* Changes cp0 to cp13 behavior, so needs a TB flush.  */
1463
                    tb_flush(env);
1464
                    env->cp15.c15_cpar = val & 0x3fff;
1465
                }
1466
                break;
1467
            }
1468
            goto bad_reg;
1469
        }
1470
        if (arm_feature(env, ARM_FEATURE_OMAPCP)) {
1471
            switch (crm) {
1472
            case 0:
1473
                break;
1474
            case 1: /* Set TI925T configuration.  */
1475
                env->cp15.c15_ticonfig = val & 0xe7;
1476
                env->cp15.c0_cpuid = (val & (1 << 5)) ? /* OS_TYPE bit */
1477
                        ARM_CPUID_TI915T : ARM_CPUID_TI925T;
1478
                break;
1479
            case 2: /* Set I_max.  */
1480
                env->cp15.c15_i_max = val;
1481
                break;
1482
            case 3: /* Set I_min.  */
1483
                env->cp15.c15_i_min = val;
1484
                break;
1485
            case 4: /* Set thread-ID.  */
1486
                env->cp15.c15_threadid = val & 0xffff;
1487
                break;
1488
            case 8: /* Wait-for-interrupt (deprecated).  */
1489
                cpu_interrupt(env, CPU_INTERRUPT_HALT);
1490
                break;
1491
            default:
1492
                goto bad_reg;
1493
            }
1494
        }
1495
        break;
1496
    }
1497
    return;
1498
bad_reg:
1499
    /* ??? For debugging only.  Should raise illegal instruction exception.  */
1500
    cpu_abort(env, "Unimplemented cp15 register write (c%d, c%d, {%d, %d})\n",
1501
              (insn >> 16) & 0xf, crm, op1, op2);
1502
}
1503

    
1504
uint32_t helper_get_cp15(CPUState *env, uint32_t insn)
1505
{
1506
    int op1;
1507
    int op2;
1508
    int crm;
1509

    
1510
    op1 = (insn >> 21) & 7;
1511
    op2 = (insn >> 5) & 7;
1512
    crm = insn & 0xf;
1513
    switch ((insn >> 16) & 0xf) {
1514
    case 0: /* ID codes.  */
1515
        switch (op1) {
1516
        case 0:
1517
            switch (crm) {
1518
            case 0:
1519
                switch (op2) {
1520
                case 0: /* Device ID.  */
1521
                    return env->cp15.c0_cpuid;
1522
                case 1: /* Cache Type.  */
1523
                    return env->cp15.c0_cachetype;
1524
                case 2: /* TCM status.  */
1525
                    return 0;
1526
                case 3: /* TLB type register.  */
1527
                    return 0; /* No lockable TLB entries.  */
1528
                case 5: /* CPU ID */
1529
                    return env->cpu_index;
1530
                default:
1531
                    goto bad_reg;
1532
                }
1533
            case 1:
1534
                if (!arm_feature(env, ARM_FEATURE_V6))
1535
                    goto bad_reg;
1536
                return env->cp15.c0_c1[op2];
1537
            case 2:
1538
                if (!arm_feature(env, ARM_FEATURE_V6))
1539
                    goto bad_reg;
1540
                return env->cp15.c0_c2[op2];
1541
            case 3: case 4: case 5: case 6: case 7:
1542
                return 0;
1543
            default:
1544
                goto bad_reg;
1545
            }
1546
        case 1:
1547
            /* These registers aren't documented on arm11 cores.  However
1548
               Linux looks at them anyway.  */
1549
            if (!arm_feature(env, ARM_FEATURE_V6))
1550
                goto bad_reg;
1551
            if (crm != 0)
1552
                goto bad_reg;
1553
            if (arm_feature(env, ARM_FEATURE_XSCALE))
1554
                goto bad_reg;
1555
            return 0;
1556
        default:
1557
            goto bad_reg;
1558
        }
1559
    case 1: /* System configuration.  */
1560
        if (arm_feature(env, ARM_FEATURE_OMAPCP))
1561
            op2 = 0;
1562
        switch (op2) {
1563
        case 0: /* Control register.  */
1564
            return env->cp15.c1_sys;
1565
        case 1: /* Auxiliary control register.  */
1566
            if (arm_feature(env, ARM_FEATURE_XSCALE))
1567
                return env->cp15.c1_xscaleauxcr;
1568
            if (!arm_feature(env, ARM_FEATURE_AUXCR))
1569
                goto bad_reg;
1570
            switch (ARM_CPUID(env)) {
1571
            case ARM_CPUID_ARM1026:
1572
                return 1;
1573
            case ARM_CPUID_ARM1136:
1574
                return 7;
1575
            case ARM_CPUID_ARM11MPCORE:
1576
                return 1;
1577
            case ARM_CPUID_CORTEXA8:
1578
                return 0;
1579
            default:
1580
                goto bad_reg;
1581
            }
1582
        case 2: /* Coprocessor access register.  */
1583
            if (arm_feature(env, ARM_FEATURE_XSCALE))
1584
                goto bad_reg;
1585
            return env->cp15.c1_coproc;
1586
        default:
1587
            goto bad_reg;
1588
        }
1589
    case 2: /* MMU Page table control / MPU cache control.  */
1590
        if (arm_feature(env, ARM_FEATURE_MPU)) {
1591
            switch (op2) {
1592
            case 0:
1593
                return env->cp15.c2_data;
1594
                break;
1595
            case 1:
1596
                return env->cp15.c2_insn;
1597
                break;
1598
            default:
1599
                goto bad_reg;
1600
            }
1601
        } else {
1602
            switch (op2) {
1603
            case 0:
1604
                return env->cp15.c2_base0;
1605
            case 1:
1606
                return env->cp15.c2_base1;
1607
            case 2:
1608
                {
1609
                    int n;
1610
                    uint32_t mask;
1611
                    n = 0;
1612
                    mask = env->cp15.c2_mask;
1613
                    while (mask) {
1614
                        n++;
1615
                        mask <<= 1;
1616
                    }
1617
                    return n;
1618
                }
1619
            default:
1620
                goto bad_reg;
1621
            }
1622
        }
1623
    case 3: /* MMU Domain access control / MPU write buffer control.  */
1624
        return env->cp15.c3;
1625
    case 4: /* Reserved.  */
1626
        goto bad_reg;
1627
    case 5: /* MMU Fault status / MPU access permission.  */
1628
        if (arm_feature(env, ARM_FEATURE_OMAPCP))
1629
            op2 = 0;
1630
        switch (op2) {
1631
        case 0:
1632
            if (arm_feature(env, ARM_FEATURE_MPU))
1633
                return simple_mpu_ap_bits(env->cp15.c5_data);
1634
            return env->cp15.c5_data;
1635
        case 1:
1636
            if (arm_feature(env, ARM_FEATURE_MPU))
1637
                return simple_mpu_ap_bits(env->cp15.c5_data);
1638
            return env->cp15.c5_insn;
1639
        case 2:
1640
            if (!arm_feature(env, ARM_FEATURE_MPU))
1641
                goto bad_reg;
1642
            return env->cp15.c5_data;
1643
        case 3:
1644
            if (!arm_feature(env, ARM_FEATURE_MPU))
1645
                goto bad_reg;
1646
            return env->cp15.c5_insn;
1647
        default:
1648
            goto bad_reg;
1649
        }
1650
    case 6: /* MMU Fault address.  */
1651
        if (arm_feature(env, ARM_FEATURE_MPU)) {
1652
            if (crm >= 8)
1653
                goto bad_reg;
1654
            return env->cp15.c6_region[crm];
1655
        } else {
1656
            if (arm_feature(env, ARM_FEATURE_OMAPCP))
1657
                op2 = 0;
1658
            switch (op2) {
1659
            case 0:
1660
                return env->cp15.c6_data;
1661
            case 1:
1662
                if (arm_feature(env, ARM_FEATURE_V6)) {
1663
                    /* Watchpoint Fault Adrress.  */
1664
                    return 0; /* Not implemented.  */
1665
                } else {
1666
                    /* Instruction Fault Adrress.  */
1667
                    /* Arm9 doesn't have an IFAR, but implementing it anyway
1668
                       shouldn't do any harm.  */
1669
                    return env->cp15.c6_insn;
1670
                }
1671
            case 2:
1672
                if (arm_feature(env, ARM_FEATURE_V6)) {
1673
                    /* Instruction Fault Adrress.  */
1674
                    return env->cp15.c6_insn;
1675
                } else {
1676
                    goto bad_reg;
1677
                }
1678
            default:
1679
                goto bad_reg;
1680
            }
1681
        }
1682
    case 7: /* Cache control.  */
1683
        /* ??? This is for test, clean and invaidate operations that set the
1684
           Z flag.  We can't represent N = Z = 1, so it also clears
1685
           the N flag.  Oh well.  */
1686
        env->NZF = 0;
1687
        return 0;
1688
    case 8: /* MMU TLB control.  */
1689
        goto bad_reg;
1690
    case 9: /* Cache lockdown.  */
1691
        switch (op1) {
1692
        case 0: /* L1 cache.  */
1693
            if (arm_feature(env, ARM_FEATURE_OMAPCP))
1694
                return 0;
1695
            switch (op2) {
1696
            case 0:
1697
                return env->cp15.c9_data;
1698
            case 1:
1699
                return env->cp15.c9_insn;
1700
            default:
1701
                goto bad_reg;
1702
            }
1703
        case 1: /* L2 cache */
1704
            if (crm != 0)
1705
                goto bad_reg;
1706
            /* L2 Lockdown and Auxiliary control.  */
1707
            return 0;
1708
        default:
1709
            goto bad_reg;
1710
        }
1711
    case 10: /* MMU TLB lockdown.  */
1712
        /* ??? TLB lockdown not implemented.  */
1713
        return 0;
1714
    case 11: /* TCM DMA control.  */
1715
    case 12: /* Reserved.  */
1716
        goto bad_reg;
1717
    case 13: /* Process ID.  */
1718
        switch (op2) {
1719
        case 0:
1720
            return env->cp15.c13_fcse;
1721
        case 1:
1722
            return env->cp15.c13_context;
1723
        case 2:
1724
            return env->cp15.c13_tls1;
1725
        case 3:
1726
            return env->cp15.c13_tls2;
1727
        case 4:
1728
            return env->cp15.c13_tls3;
1729
        default:
1730
            goto bad_reg;
1731
        }
1732
    case 14: /* Reserved.  */
1733
        goto bad_reg;
1734
    case 15: /* Implementation specific.  */
1735
        if (arm_feature(env, ARM_FEATURE_XSCALE)) {
1736
            if (op2 == 0 && crm == 1)
1737
                return env->cp15.c15_cpar;
1738

    
1739
            goto bad_reg;
1740
        }
1741
        if (arm_feature(env, ARM_FEATURE_OMAPCP)) {
1742
            switch (crm) {
1743
            case 0:
1744
                return 0;
1745
            case 1: /* Read TI925T configuration.  */
1746
                return env->cp15.c15_ticonfig;
1747
            case 2: /* Read I_max.  */
1748
                return env->cp15.c15_i_max;
1749
            case 3: /* Read I_min.  */
1750
                return env->cp15.c15_i_min;
1751
            case 4: /* Read thread-ID.  */
1752
                return env->cp15.c15_threadid;
1753
            case 8: /* TI925T_status */
1754
                return 0;
1755
            }
1756
            goto bad_reg;
1757
        }
1758
        return 0;
1759
    }
1760
bad_reg:
1761
    /* ??? For debugging only.  Should raise illegal instruction exception.  */
1762
    cpu_abort(env, "Unimplemented cp15 register read (c%d, c%d, {%d, %d})\n",
1763
              (insn >> 16) & 0xf, crm, op1, op2);
1764
    return 0;
1765
}
1766

    
1767
void helper_set_r13_banked(CPUState *env, int mode, uint32_t val)
1768
{
1769
    env->banked_r13[bank_number(mode)] = val;
1770
}
1771

    
1772
uint32_t helper_get_r13_banked(CPUState *env, int mode)
1773
{
1774
    return env->banked_r13[bank_number(mode)];
1775
}
1776

    
1777
uint32_t helper_v7m_mrs(CPUState *env, int reg)
1778
{
1779
    switch (reg) {
1780
    case 0: /* APSR */
1781
        return xpsr_read(env) & 0xf8000000;
1782
    case 1: /* IAPSR */
1783
        return xpsr_read(env) & 0xf80001ff;
1784
    case 2: /* EAPSR */
1785
        return xpsr_read(env) & 0xff00fc00;
1786
    case 3: /* xPSR */
1787
        return xpsr_read(env) & 0xff00fdff;
1788
    case 5: /* IPSR */
1789
        return xpsr_read(env) & 0x000001ff;
1790
    case 6: /* EPSR */
1791
        return xpsr_read(env) & 0x0700fc00;
1792
    case 7: /* IEPSR */
1793
        return xpsr_read(env) & 0x0700edff;
1794
    case 8: /* MSP */
1795
        return env->v7m.current_sp ? env->v7m.other_sp : env->regs[13];
1796
    case 9: /* PSP */
1797
        return env->v7m.current_sp ? env->regs[13] : env->v7m.other_sp;
1798
    case 16: /* PRIMASK */
1799
        return (env->uncached_cpsr & CPSR_I) != 0;
1800
    case 17: /* FAULTMASK */
1801
        return (env->uncached_cpsr & CPSR_F) != 0;
1802
    case 18: /* BASEPRI */
1803
    case 19: /* BASEPRI_MAX */
1804
        return env->v7m.basepri;
1805
    case 20: /* CONTROL */
1806
        return env->v7m.control;
1807
    default:
1808
        /* ??? For debugging only.  */
1809
        cpu_abort(env, "Unimplemented system register read (%d)\n", reg);
1810
        return 0;
1811
    }
1812
}
1813

    
1814
void helper_v7m_msr(CPUState *env, int reg, uint32_t val)
1815
{
1816
    switch (reg) {
1817
    case 0: /* APSR */
1818
        xpsr_write(env, val, 0xf8000000);
1819
        break;
1820
    case 1: /* IAPSR */
1821
        xpsr_write(env, val, 0xf8000000);
1822
        break;
1823
    case 2: /* EAPSR */
1824
        xpsr_write(env, val, 0xfe00fc00);
1825
        break;
1826
    case 3: /* xPSR */
1827
        xpsr_write(env, val, 0xfe00fc00);
1828
        break;
1829
    case 5: /* IPSR */
1830
        /* IPSR bits are readonly.  */
1831
        break;
1832
    case 6: /* EPSR */
1833
        xpsr_write(env, val, 0x0600fc00);
1834
        break;
1835
    case 7: /* IEPSR */
1836
        xpsr_write(env, val, 0x0600fc00);
1837
        break;
1838
    case 8: /* MSP */
1839
        if (env->v7m.current_sp)
1840
            env->v7m.other_sp = val;
1841
        else
1842
            env->regs[13] = val;
1843
        break;
1844
    case 9: /* PSP */
1845
        if (env->v7m.current_sp)
1846
            env->regs[13] = val;
1847
        else
1848
            env->v7m.other_sp = val;
1849
        break;
1850
    case 16: /* PRIMASK */
1851
        if (val & 1)
1852
            env->uncached_cpsr |= CPSR_I;
1853
        else
1854
            env->uncached_cpsr &= ~CPSR_I;
1855
        break;
1856
    case 17: /* FAULTMASK */
1857
        if (val & 1)
1858
            env->uncached_cpsr |= CPSR_F;
1859
        else
1860
            env->uncached_cpsr &= ~CPSR_F;
1861
        break;
1862
    case 18: /* BASEPRI */
1863
        env->v7m.basepri = val & 0xff;
1864
        break;
1865
    case 19: /* BASEPRI_MAX */
1866
        val &= 0xff;
1867
        if (val != 0 && (val < env->v7m.basepri || env->v7m.basepri == 0))
1868
            env->v7m.basepri = val;
1869
        break;
1870
    case 20: /* CONTROL */
1871
        env->v7m.control = val & 3;
1872
        switch_v7m_sp(env, (val & 2) != 0);
1873
        break;
1874
    default:
1875
        /* ??? For debugging only.  */
1876
        cpu_abort(env, "Unimplemented system register write (%d)\n", reg);
1877
        return;
1878
    }
1879
}
1880

    
1881
void cpu_arm_set_cp_io(CPUARMState *env, int cpnum,
1882
                ARMReadCPFunc *cp_read, ARMWriteCPFunc *cp_write,
1883
                void *opaque)
1884
{
1885
    if (cpnum < 0 || cpnum > 14) {
1886
        cpu_abort(env, "Bad coprocessor number: %i\n", cpnum);
1887
        return;
1888
    }
1889

    
1890
    env->cp[cpnum].cp_read = cp_read;
1891
    env->cp[cpnum].cp_write = cp_write;
1892
    env->cp[cpnum].opaque = opaque;
1893
}
1894

    
1895
#endif