diff options
Diffstat (limited to 'target-cris')
-rw-r--r-- | target-cris/cpu.h | 12 | ||||
-rw-r--r-- | target-cris/exec.h | 4 | ||||
-rw-r--r-- | target-cris/helper.c | 8 | ||||
-rw-r--r-- | target-cris/mmu.c | 3 | ||||
-rw-r--r-- | target-cris/mmu.h | 2 | ||||
-rw-r--r-- | target-cris/op_helper.c | 4 |
6 files changed, 23 insertions, 10 deletions
diff --git a/target-cris/cpu.h b/target-cris/cpu.h index 11652c50fb..ef0953b263 100644 --- a/target-cris/cpu.h +++ b/target-cris/cpu.h @@ -74,6 +74,8 @@ /* Internal flags for the implementation. */ #define F_DELAYSLOT 1 +#define NB_MMU_MODES 2 + typedef struct CPUCRISState { uint32_t debug1; uint32_t debug2; @@ -229,6 +231,16 @@ void register_cris_insns (CPUCRISState *env); #define cpu_gen_code cpu_cris_gen_code #define cpu_signal_handler cpu_cris_signal_handler +/* MMU modes definitions */ +#define MMU_MODE0_SUFFIX _kernel +#define MMU_MODE1_SUFFIX _user +#define MMU_USER_IDX 1 +/* CRIS FIXME: I guess we want to validate supervisor mode acceses here. */ +static inline int cpu_mmu_index (CPUState *env) +{ + return 0; +} + #include "cpu-all.h" /* Register aliases. */ diff --git a/target-cris/exec.h b/target-cris/exec.h index a4f555eb28..fe63f16986 100644 --- a/target-cris/exec.h +++ b/target-cris/exec.h @@ -45,8 +45,8 @@ static inline void regs_to_env(void) } int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw, - int is_user, int is_softmmu); -void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr); + int mmu_idx, int is_softmmu); +void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr); #if !defined(CONFIG_USER_ONLY) #include "softmmu_exec.h" diff --git a/target-cris/helper.c b/target-cris/helper.c index 3db3bea08d..98305605a1 100644 --- a/target-cris/helper.c +++ b/target-cris/helper.c @@ -35,7 +35,7 @@ void do_interrupt (CPUState *env) } int cpu_cris_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 = 0xaa; env->debug1 = address; @@ -52,7 +52,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState * env, target_ulong addr) #else /* !CONFIG_USER_ONLY */ int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw, - int is_user, int is_softmmu) + int mmu_idx, int is_softmmu) { struct cris_mmu_result_t res; int prot, miss; @@ -61,7 +61,7 @@ int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw, address &= TARGET_PAGE_MASK; prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; // printf ("%s pc=%x %x w=%d smmu=%d\n", __func__, env->pc, address, rw, is_softmmu); - miss = cris_mmu_translate(&res, env, address, rw, is_user); + miss = cris_mmu_translate(&res, env, address, rw, mmu_idx); if (miss) { /* handle the miss. */ @@ -73,7 +73,7 @@ int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw, phy = res.phy; } // printf ("a=%x phy=%x\n", address, phy); - return tlb_set_page(env, address, phy, prot, is_user, is_softmmu); + return tlb_set_page(env, address, phy, prot, mmu_idx, is_softmmu); } diff --git a/target-cris/mmu.c b/target-cris/mmu.c index 56299b7dd1..2be4eb8f71 100644 --- a/target-cris/mmu.c +++ b/target-cris/mmu.c @@ -111,11 +111,12 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, int cris_mmu_translate(struct cris_mmu_result_t *res, CPUState *env, uint32_t vaddr, - int rw, int is_user) + int rw, int mmu_idx) { uint32_t phy = vaddr; int seg; int miss = 0; + int is_user = mmu_idx == MMU_USER_IDX; if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) { res->phy = vaddr; diff --git a/target-cris/mmu.h b/target-cris/mmu.h index adbc1fc5df..519c0fc819 100644 --- a/target-cris/mmu.h +++ b/target-cris/mmu.h @@ -17,4 +17,4 @@ struct cris_mmu_result_t int cris_mmu_translate(struct cris_mmu_result_t *res, CPUState *env, uint32_t vaddr, - int rw, int is_user); + int rw, int mmu_idx); diff --git a/target-cris/op_helper.c b/target-cris/op_helper.c index f84ceb9da0..4f0f07cd4d 100644 --- a/target-cris/op_helper.c +++ b/target-cris/op_helper.c @@ -41,7 +41,7 @@ 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; @@ -52,7 +52,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_cris_handle_mmu_fault(env, addr, is_write, is_user, 1); + ret = cpu_cris_handle_mmu_fault(env, addr, is_write, mmu_idx, 1); if (__builtin_expect(ret, 0)) { if (retaddr) { /* now we have a real cpu fault */ |