diff options
Diffstat (limited to 'target-sh4')
-rw-r--r-- | target-sh4/cpu.h | 11 | ||||
-rw-r--r-- | target-sh4/exec.h | 2 | ||||
-rw-r--r-- | target-sh4/helper.c | 10 | ||||
-rw-r--r-- | target-sh4/op_helper.c | 4 |
4 files changed, 19 insertions, 8 deletions
diff --git a/target-sh4/cpu.h b/target-sh4/cpu.h index add6a47..edfda1f 100644 --- a/target-sh4/cpu.h +++ b/target-sh4/cpu.h @@ -77,6 +77,8 @@ typedef struct tlb_t { #define UTLB_SIZE 64 #define ITLB_SIZE 4 +#define NB_MMU_MODES 2 + typedef struct CPUSH4State { uint32_t flags; /* general execution flags */ uint32_t gregs[24]; /* general registers */ @@ -134,6 +136,15 @@ int cpu_sh4_signal_handler(int host_signum, void *pinfo, #define cpu_gen_code cpu_sh4_gen_code #define cpu_signal_handler cpu_sh4_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_MD) == 0 ? 1 : 0; +} + #include "cpu-all.h" /* Memory access type */ diff --git a/target-sh4/exec.h b/target-sh4/exec.h index a606fd1..6081799 100644 --- a/target-sh4/exec.h +++ b/target-sh4/exec.h @@ -63,7 +63,7 @@ static inline void env_to_regs(void) } int cpu_sh4_handle_mmu_fault(CPUState * env, target_ulong address, int rw, - int is_user, int is_softmmu); + int mmu_idx, int is_softmmu); int find_itlb_entry(CPUState * env, target_ulong address, int use_asid, int update); diff --git a/target-sh4/helper.c b/target-sh4/helper.c index a5af5ba..b8a05e1 100644 --- a/target-sh4/helper.c +++ b/target-sh4/helper.c @@ -36,7 +36,7 @@ void do_interrupt (CPUState *env) } int cpu_sh4_handle_mmu_fault(CPUState * env, target_ulong address, int rw, - int is_user, int is_softmmu) + int mmu_idx, int is_softmmu) { env->tea = address; switch (rw) { @@ -372,15 +372,15 @@ int get_physical_address(CPUState * env, target_ulong * physical, } int cpu_sh4_handle_mmu_fault(CPUState * env, target_ulong address, int rw, - int is_user, int is_softmmu) + int mmu_idx, int is_softmmu) { target_ulong physical, page_offset, page_size; int prot, ret, access_type; /* XXXXX */ #if 0 - fprintf(stderr, "%s pc %08x ad %08x rw %d is_user %d smmu %d\n", - __func__, env->pc, address, rw, is_user, is_softmmu); + fprintf(stderr, "%s pc %08x ad %08x rw %d mmu_idx %d smmu %d\n", + __func__, env->pc, address, rw, mmu_idx, is_softmmu); #endif access_type = ACCESS_INT; @@ -426,7 +426,7 @@ int cpu_sh4_handle_mmu_fault(CPUState * env, target_ulong address, int rw, address = (address & TARGET_PAGE_MASK) + page_offset; physical = (physical & TARGET_PAGE_MASK) + page_offset; - return tlb_set_page(env, address, physical, prot, is_user, is_softmmu); + return tlb_set_page(env, address, physical, prot, mmu_idx, is_softmmu); } target_phys_addr_t cpu_get_phys_page_debug(CPUState * env, target_ulong addr) diff --git a/target-sh4/op_helper.c b/target-sh4/op_helper.c index 292e9b3..2535b8d 100644 --- a/target-sh4/op_helper.c +++ b/target-sh4/op_helper.c @@ -42,7 +42,7 @@ void do_raise_exception(void) #define SHIFT 3 #include "softmmu_template.h" -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; @@ -53,7 +53,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_sh4_handle_mmu_fault(env, addr, is_write, is_user, 1); + ret = cpu_sh4_handle_mmu_fault(env, addr, is_write, mmu_idx, 1); if (ret) { if (retaddr) { /* now we have a real cpu fault */ |