Commit 1b1a38b0aaf3a24b9b8162d8aef9e700a42f8d43
1 parent
5bf8f1ab
CRIS: Emulate NMIs.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4719 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
28 additions
and
16 deletions
cpu-exec.c
... | ... | @@ -501,7 +501,15 @@ int cpu_exec(CPUState *env1) |
501 | 501 | next_tb = 0; |
502 | 502 | } |
503 | 503 | #elif defined(TARGET_CRIS) |
504 | - if (interrupt_request & CPU_INTERRUPT_HARD) { | |
504 | + if (interrupt_request & CPU_INTERRUPT_HARD | |
505 | + && (env->pregs[PR_CCS] & I_FLAG)) { | |
506 | + env->exception_index = EXCP_IRQ; | |
507 | + do_interrupt(env); | |
508 | + next_tb = 0; | |
509 | + } | |
510 | + if (interrupt_request & CPU_INTERRUPT_NMI | |
511 | + && (env->pregs[PR_CCS] & M_FLAG)) { | |
512 | + env->exception_index = EXCP_NMI; | |
505 | 513 | do_interrupt(env); |
506 | 514 | next_tb = 0; |
507 | 515 | } | ... | ... |
target-cris/cpu.h
... | ... | @@ -29,12 +29,11 @@ |
29 | 29 | |
30 | 30 | #define ELF_MACHINE EM_CRIS |
31 | 31 | |
32 | -#define EXCP_MMU_EXEC 0 | |
33 | -#define EXCP_MMU_READ 1 | |
34 | -#define EXCP_MMU_WRITE 2 | |
35 | -#define EXCP_MMU_FLUSH 3 | |
36 | -#define EXCP_MMU_FAULT 4 | |
37 | -#define EXCP_BREAK 16 /* trap. */ | |
32 | +#define EXCP_NMI 1 | |
33 | +#define EXCP_GURU 2 | |
34 | +#define EXCP_BUSFAULT 3 | |
35 | +#define EXCP_IRQ 4 | |
36 | +#define EXCP_BREAK 5 | |
38 | 37 | |
39 | 38 | /* Register aliases. R0 - R15 */ |
40 | 39 | #define R_FP 8 |
... | ... | @@ -54,11 +53,14 @@ |
54 | 53 | #define PR_EBP 9 |
55 | 54 | #define PR_ERP 10 |
56 | 55 | #define PR_SRP 11 |
56 | +#define PR_NRP 12 | |
57 | 57 | #define PR_CCS 13 |
58 | 58 | #define PR_USP 14 |
59 | 59 | #define PR_SPC 15 |
60 | 60 | |
61 | 61 | /* CPU flags. */ |
62 | +#define Q_FLAG 0x80000000 | |
63 | +#define M_FLAG 0x40000000 | |
62 | 64 | #define S_FLAG 0x200 |
63 | 65 | #define R_FLAG 0x100 |
64 | 66 | #define P_FLAG 0x80 |
... | ... | @@ -154,7 +156,6 @@ typedef struct CPUCRISState { |
154 | 156 | uint32_t lo; |
155 | 157 | } tlbsets[2][4][16]; |
156 | 158 | |
157 | - int features; | |
158 | 159 | int user_mode_only; |
159 | 160 | |
160 | 161 | CPU_COMMON | ... | ... |
target-cris/helper.c
... | ... | @@ -78,13 +78,13 @@ int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw, |
78 | 78 | miss = cris_mmu_translate(&res, env, address, rw, mmu_idx); |
79 | 79 | if (miss) |
80 | 80 | { |
81 | - if (env->exception_index == EXCP_MMU_FAULT) | |
81 | + if (env->exception_index == EXCP_BUSFAULT) | |
82 | 82 | cpu_abort(env, |
83 | 83 | "CRIS: Illegal recursive bus fault." |
84 | 84 | "addr=%x rw=%d\n", |
85 | 85 | address, rw); |
86 | 86 | |
87 | - env->exception_index = EXCP_MMU_FAULT; | |
87 | + env->exception_index = EXCP_BUSFAULT; | |
88 | 88 | env->fault_vector = res.bf_vec; |
89 | 89 | r = 1; |
90 | 90 | } |
... | ... | @@ -120,17 +120,20 @@ void do_interrupt(CPUState *env) |
120 | 120 | env->pregs[PR_ERP] = env->pc + 2; |
121 | 121 | break; |
122 | 122 | |
123 | - case EXCP_MMU_FAULT: | |
123 | + case EXCP_NMI: | |
124 | + /* NMI is hardwired to vector zero. */ | |
125 | + ex_vec = 0; | |
126 | + env->pregs[PR_CCS] &= ~M_FLAG; | |
127 | + env->pregs[PR_NRP] = env->pc; | |
128 | + break; | |
129 | + | |
130 | + case EXCP_BUSFAULT: | |
124 | 131 | ex_vec = env->fault_vector; |
125 | 132 | env->pregs[PR_ERP] = env->pc; |
126 | 133 | break; |
127 | 134 | |
128 | 135 | default: |
129 | - /* Is the core accepting interrupts? */ | |
130 | - if (!(env->pregs[PR_CCS] & I_FLAG)) | |
131 | - return; | |
132 | - /* The interrupt controller gives us the | |
133 | - vector. */ | |
136 | + /* The interrupt controller gives us the vector. */ | |
134 | 137 | ex_vec = env->interrupt_vector; |
135 | 138 | /* Normal interrupts are taken between |
136 | 139 | TB's. env->pc is valid here. */ | ... | ... |