Signed-off-by: Edgar E. Iglesias <edgar.iglesias@axis.com>
D(printf ("%s addr=%x pc=%x rw=%x\n", __func__, address, env->pc, rw));
miss = cris_mmu_translate(&res, env, address & TARGET_PAGE_MASK,
D(printf ("%s addr=%x pc=%x rw=%x\n", __func__, address, env->pc, rw));
miss = cris_mmu_translate(&res, env, address & TARGET_PAGE_MASK,
if (miss)
{
if (env->exception_index == EXCP_BUSFAULT)
if (miss)
{
if (env->exception_index == EXCP_BUSFAULT)
target_phys_addr_t cpu_get_phys_page_debug(CPUState * env, target_ulong addr)
{
uint32_t phy = addr;
target_phys_addr_t cpu_get_phys_page_debug(CPUState * env, target_ulong addr)
{
uint32_t phy = addr;
- uint32_t r_cause, r_tlb_sel, rand_lfsr;
struct cris_mmu_result res;
int miss;
struct cris_mmu_result res;
int miss;
- /* Save MMU state. */
- r_tlb_sel = env->sregs[SFR_RW_MM_TLB_SEL];
- r_cause = env->sregs[SFR_R_MM_CAUSE];
- rand_lfsr = env->mmu_rand_lfsr;
-
- miss = cris_mmu_translate(&res, env, addr, 0, 0);
+ miss = cris_mmu_translate(&res, env, addr, 0, 0, 1);
/* If D TLB misses, try I TLB. */
if (miss) {
/* If D TLB misses, try I TLB. */
if (miss) {
- miss = cris_mmu_translate(&res, env, addr, 2, 0);
+ miss = cris_mmu_translate(&res, env, addr, 2, 0, 1);
- /* Restore MMU state. */
- env->sregs[SFR_RW_MM_TLB_SEL] = r_tlb_sel;
- env->sregs[SFR_R_MM_CAUSE] = r_cause;
- env->mmu_rand_lfsr = rand_lfsr;
-
if (!miss)
phy = res.phy;
D(fprintf(stderr, "%s %x -> %x\n", __func__, addr, phy));
if (!miss)
phy = res.phy;
D(fprintf(stderr, "%s %x -> %x\n", __func__, addr, phy));
/* rw 0 = read, 1 = write, 2 = exec. */
static int cris_mmu_translate_page(struct cris_mmu_result *res,
CPUState *env, uint32_t vaddr,
/* 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, int debug)
{
unsigned int vpage;
unsigned int idx;
{
unsigned int vpage;
unsigned int idx;
set = env->mmu_rand_lfsr & 3;
}
set = env->mmu_rand_lfsr & 3;
}
+ if (!match && !debug) {
cris_mmu_update_rand_lfsr(env);
/* Compute index. */
cris_mmu_update_rand_lfsr(env);
/* Compute index. */
int cris_mmu_translate(struct cris_mmu_result *res,
CPUState *env, uint32_t vaddr,
int cris_mmu_translate(struct cris_mmu_result *res,
CPUState *env, uint32_t vaddr,
+ int rw, int mmu_idx, int debug)
base = cris_mmu_translate_seg(env, seg);
res->phy = base | (0x0fffffff & vaddr);
res->prot = PAGE_BITS;
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;
done:
env->pregs[PR_SRS] = old_srs;
return miss;
void cris_mmu_flush_pid(CPUState *env, uint32_t pid);
int cris_mmu_translate(struct cris_mmu_result *res,
CPUState *env, uint32_t vaddr,
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, int debug);