X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=target-cris%2Fmmu.c;h=512e28b4813f4e4940d19e890ea4c158c38fc92d;hb=00b941e581b5c42645f836ef530705bb76a3e6bb;hp=07967dddb0bd1e58ef77675df82695ee2074c238;hpb=253248a3beb2440561bb28b48292ead9c2fd157f;p=qemu.git diff --git a/target-cris/mmu.c b/target-cris/mmu.c index 07967dddb..512e28b48 100644 --- a/target-cris/mmu.c +++ b/target-cris/mmu.c @@ -20,24 +20,18 @@ #ifndef CONFIG_USER_ONLY -#include -#include -#include - -#include "config.h" #include "cpu.h" #include "mmu.h" -#include "exec-all.h" #ifdef DEBUG #define D(x) x #define D_LOG(...) qemu_log(__VA_ARGS__) #else -#define D(x) +#define D(x) do { } while (0) #define D_LOG(...) do { } while (0) #endif -void cris_mmu_init(CPUState *env) +void cris_mmu_init(CPUCRISState *env) { env->mmu_rand_lfsr = 0xcccc; } @@ -55,7 +49,7 @@ static inline unsigned int compute_polynom(unsigned int sr) return f; } -static void cris_mmu_update_rand_lfsr(CPUState *env) +static void cris_mmu_update_rand_lfsr(CPUCRISState *env) { unsigned int f; @@ -76,7 +70,7 @@ static inline int cris_mmu_segmented_addr(int seg, uint32_t rw_mm_cfg) return (1 << seg) & rw_mm_cfg; } -static uint32_t cris_mmu_translate_seg(CPUState *env, int seg) +static uint32_t cris_mmu_translate_seg(CPUCRISState *env, int seg) { uint32_t base; int i; @@ -112,7 +106,7 @@ static inline void set_field(uint32_t *dst, unsigned int val, } #ifdef DEBUG -static void dump_tlb(CPUState *env, int mmu) +static void dump_tlb(CPUCRISState *env, int mmu) { int set; int idx; @@ -134,8 +128,8 @@ static void dump_tlb(CPUState *env, int mmu) /* rw 0 = read, 1 = write, 2 = exec. */ static int cris_mmu_translate_page(struct cris_mmu_result *res, - CPUState *env, uint32_t vaddr, - int rw, int usermode) + CPUCRISState *env, uint32_t vaddr, + int rw, int usermode, int debug) { unsigned int vpage; unsigned int idx; @@ -251,7 +245,7 @@ static int cris_mmu_translate_page(struct cris_mmu_result *res, res->prot |= PAGE_READ; if (tlb_w) res->prot |= PAGE_WRITE; - if (tlb_x) + if (mmu == 0 && (cfg_x || tlb_x)) res->prot |= PAGE_EXEC; } else @@ -261,7 +255,7 @@ static int cris_mmu_translate_page(struct cris_mmu_result *res, set = env->mmu_rand_lfsr & 3; } - if (!match) { + if (!match && !debug) { cris_mmu_update_rand_lfsr(env); /* Compute index. */ @@ -294,7 +288,7 @@ static int cris_mmu_translate_page(struct cris_mmu_result *res, return !match; } -void cris_mmu_flush_pid(CPUState *env, uint32_t pid) +void cris_mmu_flush_pid(CPUCRISState *env, uint32_t pid) { target_ulong vaddr; unsigned int idx; @@ -329,8 +323,8 @@ void cris_mmu_flush_pid(CPUState *env, uint32_t pid) } int cris_mmu_translate(struct cris_mmu_result *res, - CPUState *env, uint32_t vaddr, - int rw, int mmu_idx) + CPUCRISState *env, uint32_t vaddr, + int rw, int mmu_idx, int debug) { int seg; int miss = 0; @@ -357,9 +351,10 @@ int cris_mmu_translate(struct cris_mmu_result *res, base = cris_mmu_translate_seg(env, seg); res->phy = base | (0x0fffffff & vaddr); res->prot = PAGE_BITS; + } else { + miss = cris_mmu_translate_page(res, env, vaddr, rw, + is_user, debug); } - else - miss = cris_mmu_translate_page(res, env, vaddr, rw, is_user); done: env->pregs[PR_SRS] = old_srs; return miss;