cris: Dont clobber the MMU state across calls to cpu_get_phys_page_debug.
authorEdgar E. Iglesias <edgar.iglesias@gmail.com>
Mon, 5 Jul 2010 08:24:56 +0000 (10:24 +0200)
committerEdgar E. Iglesias <edgar.iglesias@gmail.com>
Mon, 5 Jul 2010 08:24:56 +0000 (10:24 +0200)
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
target-cris/helper.c

index 240bda0..19c3755 100644 (file)
@@ -248,9 +248,26 @@ void do_interrupt(CPUState *env)
 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;
+
+       /* 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);
+       /* If D TLB misses, try I TLB.  */
+       if (miss) {
+               miss = cris_mmu_translate(&res, env, addr, 2, 0);
+       }
+
+       /* 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));