diff options
Diffstat (limited to 'target-alpha')
-rw-r--r-- | target-alpha/cpu.h | 13 | ||||
-rw-r--r-- | target-alpha/exec.h | 2 | ||||
-rw-r--r-- | target-alpha/helper.c | 4 | ||||
-rw-r--r-- | target-alpha/op_helper.c | 24 |
4 files changed, 28 insertions, 15 deletions
diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h index 3f517e67b6..579ce613d3 100644 --- a/target-alpha/cpu.h +++ b/target-alpha/cpu.h @@ -256,6 +256,8 @@ struct pal_handler_t { void (*call_pal)(CPUAlphaState *env, uint32_t palcode); }; +#define NB_MMU_MODES 4 + struct CPUAlphaState { uint64_t ir[31]; float64 fir[31]; @@ -302,6 +304,17 @@ struct CPUAlphaState { #define cpu_gen_code cpu_alpha_gen_code #define cpu_signal_handler cpu_alpha_signal_handler +/* MMU modes definitions */ +#define MMU_MODE0_SUFFIX _kernel +#define MMU_MODE1_SUFFIX _executive +#define MMU_MODE2_SUFFIX _supervisor +#define MMU_MODE3_SUFFIX _user +#define MMU_USER_IDX 3 +static inline int cpu_mmu_index (CPUState *env) +{ + return (env->ps >> 3) & 3; +} + #include "cpu-all.h" enum { diff --git a/target-alpha/exec.h b/target-alpha/exec.h index 80f358ca36..62cd07dcf8 100644 --- a/target-alpha/exec.h +++ b/target-alpha/exec.h @@ -73,7 +73,7 @@ static inline void regs_to_env(void) } int cpu_alpha_handle_mmu_fault (CPUState *env, uint64_t address, int rw, - int is_user, int is_softmmu); + int mmu_idx, int is_softmmu); int cpu_alpha_mfpr (CPUState *env, int iprn, uint64_t *valp); int cpu_alpha_mtpr (CPUState *env, int iprn, uint64_t val, uint64_t *oldvalp); diff --git a/target-alpha/helper.c b/target-alpha/helper.c index 72cae49cf1..fd39f5f893 100644 --- a/target-alpha/helper.c +++ b/target-alpha/helper.c @@ -28,7 +28,7 @@ #if defined(CONFIG_USER_ONLY) int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw, - int is_user, int is_softmmu) + int mmu_idx, int is_softmmu) { if (rw == 2) env->exception_index = EXCP_ITB_MISS; @@ -57,7 +57,7 @@ target_phys_addr_t cpu_get_phys_page_debug (CPUState *env, target_ulong addr) } int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw, - int is_user, int is_softmmu) + int mmu_idx, int is_softmmu) { uint32_t opc; diff --git a/target-alpha/op_helper.c b/target-alpha/op_helper.c index deac6c2596..badb85d698 100644 --- a/target-alpha/op_helper.c +++ b/target-alpha/op_helper.c @@ -1164,20 +1164,20 @@ void helper_mtpr (int iprn) void helper_ld_phys_to_virt (void) { uint64_t tlb_addr, physaddr; - int index, is_user; + int index, mmu_idx; void *retaddr; - is_user = (env->ps >> 3) & 3; + mmu_idx = cpu_mmu_index(env); index = (T0 >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); redo: - tlb_addr = env->tlb_table[is_user][index].addr_read; + tlb_addr = env->tlb_table[mmu_idx][index].addr_read; if ((T0 & TARGET_PAGE_MASK) == (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) { - physaddr = T0 + env->tlb_table[is_user][index].addend; + physaddr = T0 + env->tlb_table[mmu_idx][index].addend; } else { /* the page is not in the TLB : fill it */ retaddr = GETPC(); - tlb_fill(T0, 0, is_user, retaddr); + tlb_fill(T0, 0, mmu_idx, retaddr); goto redo; } T0 = physaddr; @@ -1186,20 +1186,20 @@ void helper_ld_phys_to_virt (void) void helper_st_phys_to_virt (void) { uint64_t tlb_addr, physaddr; - int index, is_user; + int index, mmu_idx; void *retaddr; - is_user = (env->ps >> 3) & 3; + mmu_idx = cpu_mmu_index(env); index = (T0 >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); redo: - tlb_addr = env->tlb_table[is_user][index].addr_write; + tlb_addr = env->tlb_table[mmu_idx][index].addr_write; if ((T0 & TARGET_PAGE_MASK) == (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) { - physaddr = T0 + env->tlb_table[is_user][index].addend; + physaddr = T0 + env->tlb_table[mmu_idx][index].addend; } else { /* the page is not in the TLB : fill it */ retaddr = GETPC(); - tlb_fill(T0, 1, is_user, retaddr); + tlb_fill(T0, 1, mmu_idx, retaddr); goto redo; } T0 = physaddr; @@ -1223,7 +1223,7 @@ void helper_st_phys_to_virt (void) NULL, it means that the function was called in C code (i.e. not from generated code or from helper.c) */ /* XXX: fix it to restore all registers */ -void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr) +void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr) { TranslationBlock *tb; CPUState *saved_env; @@ -1234,7 +1234,7 @@ void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr) generated code */ saved_env = env; env = cpu_single_env; - ret = cpu_alpha_handle_mmu_fault(env, addr, is_write, is_user, 1); + ret = cpu_alpha_handle_mmu_fault(env, addr, is_write, mmu_idx, 1); if (!likely(ret == 0)) { if (likely(retaddr)) { /* now we have a real cpu fault */ |