diff options
Diffstat (limited to 'target-m68k')
-rw-r--r-- | target-m68k/cpu.h | 11 | ||||
-rw-r--r-- | target-m68k/exec.h | 2 | ||||
-rw-r--r-- | target-m68k/helper.c | 6 | ||||
-rw-r--r-- | target-m68k/op_helper.c | 4 |
4 files changed, 17 insertions, 6 deletions
diff --git a/target-m68k/cpu.h b/target-m68k/cpu.h index a34c137344..5004a9168b 100644 --- a/target-m68k/cpu.h +++ b/target-m68k/cpu.h @@ -53,6 +53,8 @@ #define EXCP_RTE 0x100 #define EXCP_HALT_INSN 0x101 +#define NB_MMU_MODES 2 + typedef struct CPUM68KState { uint32_t dregs[8]; uint32_t aregs[8]; @@ -223,6 +225,15 @@ void register_m68k_insns (CPUM68KState *env); #define cpu_gen_code cpu_m68k_gen_code #define cpu_signal_handler cpu_m68k_signal_handler +/* MMU modes definitions */ +#define MMU_MODE0_SUFFIX _kernel +#define MMU_MODE1_SUFFIX _user +#define MMU_USER_IDX 1 +static inline int cpu_mmu_index (CPUState *env) +{ + return (env->sr & SR_S) == 0 ? 1 : 0; +} + #include "cpu-all.h" #endif diff --git a/target-m68k/exec.h b/target-m68k/exec.h index dc5bf5e605..b9e13ef04f 100644 --- a/target-m68k/exec.h +++ b/target-m68k/exec.h @@ -38,7 +38,7 @@ static inline void regs_to_env(void) } int cpu_m68k_handle_mmu_fault (CPUState *env, target_ulong address, int rw, - int is_user, int is_softmmu); + int mmu_idx, int is_softmmu); #if !defined(CONFIG_USER_ONLY) #include "softmmu_exec.h" diff --git a/target-m68k/helper.c b/target-m68k/helper.c index 423a0e00a9..f3c629979d 100644 --- a/target-m68k/helper.c +++ b/target-m68k/helper.c @@ -301,7 +301,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr) #if defined(CONFIG_USER_ONLY) int cpu_m68k_handle_mmu_fault (CPUState *env, target_ulong address, int rw, - int is_user, int is_softmmu) + int mmu_idx, int is_softmmu) { env->exception_index = EXCP_ACCESS; env->mmu.ar = address; @@ -311,13 +311,13 @@ int cpu_m68k_handle_mmu_fault (CPUState *env, target_ulong address, int rw, #else int cpu_m68k_handle_mmu_fault (CPUState *env, target_ulong address, int rw, - int is_user, int is_softmmu) + int mmu_idx, int is_softmmu) { int prot; address &= TARGET_PAGE_MASK; prot = PAGE_READ | PAGE_WRITE; - return tlb_set_page(env, address, address, prot, is_user, is_softmmu); + return tlb_set_page(env, address, address, prot, mmu_idx, is_softmmu); } /* Notify CPU of a pending interrupt. Prioritization and vectoring should diff --git a/target-m68k/op_helper.c b/target-m68k/op_helper.c index 70b7aec0e6..917ef52880 100644 --- a/target-m68k/op_helper.c +++ b/target-m68k/op_helper.c @@ -49,7 +49,7 @@ extern int semihosting_enabled; 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; @@ -60,7 +60,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_m68k_handle_mmu_fault(env, addr, is_write, is_user, 1); + ret = cpu_m68k_handle_mmu_fault(env, addr, is_write, mmu_idx, 1); if (__builtin_expect(ret, 0)) { if (retaddr) { /* now we have a real cpu fault */ |