Commit b23761f959166cb2320086bf1ea875ddb2fc4f09
1 parent
7d5099d5
CRIS: Avoid a few unecessary steps in the mmu.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5146 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
8 additions
and
12 deletions
target-cris/mmu.c
| @@ -127,7 +127,7 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, | @@ -127,7 +127,7 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, | ||
| 127 | { | 127 | { |
| 128 | unsigned int vpage; | 128 | unsigned int vpage; |
| 129 | unsigned int idx; | 129 | unsigned int idx; |
| 130 | - uint32_t lo, hi; | 130 | + uint32_t pid, lo, hi; |
| 131 | uint32_t tlb_vpn, tlb_pfn = 0; | 131 | uint32_t tlb_vpn, tlb_pfn = 0; |
| 132 | int tlb_pid, tlb_g, tlb_v, tlb_k, tlb_w, tlb_x; | 132 | int tlb_pid, tlb_g, tlb_v, tlb_k, tlb_w, tlb_x; |
| 133 | int cfg_v, cfg_k, cfg_w, cfg_x; | 133 | int cfg_v, cfg_k, cfg_w, cfg_x; |
| @@ -140,6 +140,7 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, | @@ -140,6 +140,7 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, | ||
| 140 | 140 | ||
| 141 | r_cause = env->sregs[SFR_R_MM_CAUSE]; | 141 | r_cause = env->sregs[SFR_R_MM_CAUSE]; |
| 142 | r_cfg = env->sregs[SFR_RW_MM_CFG]; | 142 | r_cfg = env->sregs[SFR_RW_MM_CFG]; |
| 143 | + pid = env->pregs[PR_PID]; | ||
| 143 | 144 | ||
| 144 | switch (rw) { | 145 | switch (rw) { |
| 145 | case 2: rwcause = CRIS_MMU_ERR_EXEC; mmu = 0; break; | 146 | case 2: rwcause = CRIS_MMU_ERR_EXEC; mmu = 0; break; |
| @@ -175,15 +176,14 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, | @@ -175,15 +176,14 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, | ||
| 175 | lo = env->tlbsets[mmu][set][idx].lo; | 176 | lo = env->tlbsets[mmu][set][idx].lo; |
| 176 | hi = env->tlbsets[mmu][set][idx].hi; | 177 | hi = env->tlbsets[mmu][set][idx].hi; |
| 177 | 178 | ||
| 178 | - tlb_vpn = EXTRACT_FIELD(hi, 13, 31); | 179 | + tlb_vpn = hi >> 13; |
| 179 | tlb_pid = EXTRACT_FIELD(hi, 0, 7); | 180 | tlb_pid = EXTRACT_FIELD(hi, 0, 7); |
| 180 | - tlb_pfn = EXTRACT_FIELD(lo, 13, 31); | ||
| 181 | tlb_g = EXTRACT_FIELD(lo, 4, 4); | 181 | tlb_g = EXTRACT_FIELD(lo, 4, 4); |
| 182 | 182 | ||
| 183 | D(fprintf(logfile, | 183 | D(fprintf(logfile, |
| 184 | - "TLB[%d][%d][%d] v=%x vpage=%x->pfn=%x lo=%x hi=%x\n", | ||
| 185 | - mmu, set, idx, tlb_vpn, vpage, tlb_pfn, lo, hi)); | ||
| 186 | - if ((tlb_g || (tlb_pid == (env->pregs[PR_PID] & 0xff))) | 184 | + "TLB[%d][%d][%d] v=%x vpage=%x lo=%x hi=%x\n", |
| 185 | + mmu, set, idx, tlb_vpn, vpage, lo, hi)); | ||
| 186 | + if ((tlb_g || (tlb_pid == pid)) | ||
| 187 | && tlb_vpn == vpage) { | 187 | && tlb_vpn == vpage) { |
| 188 | match = 1; | 188 | match = 1; |
| 189 | break; | 189 | break; |
| @@ -245,9 +245,6 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, | @@ -245,9 +245,6 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, | ||
| 245 | } | 245 | } |
| 246 | else | 246 | else |
| 247 | D(dump_tlb(env, mmu)); | 247 | D(dump_tlb(env, mmu)); |
| 248 | - | ||
| 249 | - env->sregs[SFR_RW_MM_TLB_HI] = hi; | ||
| 250 | - env->sregs[SFR_RW_MM_TLB_LO] = lo; | ||
| 251 | } else { | 248 | } else { |
| 252 | /* If refill, provide a randomized set. */ | 249 | /* If refill, provide a randomized set. */ |
| 253 | set = env->mmu_rand_lfsr & 3; | 250 | set = env->mmu_rand_lfsr & 3; |
| @@ -278,7 +275,6 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, | @@ -278,7 +275,6 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, | ||
| 278 | D(printf("refill vaddr=%x pc=%x\n", vaddr, env->pc)); | 275 | D(printf("refill vaddr=%x pc=%x\n", vaddr, env->pc)); |
| 279 | } | 276 | } |
| 280 | 277 | ||
| 281 | - | ||
| 282 | D(printf ("%s rw=%d mtch=%d pc=%x va=%x vpn=%x tlbvpn=%x pfn=%x pid=%x" | 278 | D(printf ("%s rw=%d mtch=%d pc=%x va=%x vpn=%x tlbvpn=%x pfn=%x pid=%x" |
| 283 | " %x cause=%x sel=%x sp=%x %x %x\n", | 279 | " %x cause=%x sel=%x sp=%x %x %x\n", |
| 284 | __func__, rw, match, env->pc, | 280 | __func__, rw, match, env->pc, |
| @@ -348,7 +344,7 @@ int cris_mmu_translate(struct cris_mmu_result_t *res, | @@ -348,7 +344,7 @@ int cris_mmu_translate(struct cris_mmu_result_t *res, | ||
| 348 | 344 | ||
| 349 | if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) { | 345 | if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) { |
| 350 | res->phy = vaddr; | 346 | res->phy = vaddr; |
| 351 | - res->prot = PAGE_BITS; | 347 | + res->prot = PAGE_BITS; |
| 352 | goto done; | 348 | goto done; |
| 353 | } | 349 | } |
| 354 | 350 | ||
| @@ -361,7 +357,7 @@ int cris_mmu_translate(struct cris_mmu_result_t *res, | @@ -361,7 +357,7 @@ int cris_mmu_translate(struct cris_mmu_result_t *res, | ||
| 361 | base = cris_mmu_translate_seg(env, seg); | 357 | base = cris_mmu_translate_seg(env, seg); |
| 362 | phy = base | (0x0fffffff & vaddr); | 358 | phy = base | (0x0fffffff & vaddr); |
| 363 | res->phy = phy; | 359 | res->phy = phy; |
| 364 | - res->prot = PAGE_BITS; | 360 | + res->prot = PAGE_BITS; |
| 365 | } | 361 | } |
| 366 | else | 362 | else |
| 367 | { | 363 | { |