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 | 127 | { |
128 | 128 | unsigned int vpage; |
129 | 129 | unsigned int idx; |
130 | - uint32_t lo, hi; | |
130 | + uint32_t pid, lo, hi; | |
131 | 131 | uint32_t tlb_vpn, tlb_pfn = 0; |
132 | 132 | int tlb_pid, tlb_g, tlb_v, tlb_k, tlb_w, tlb_x; |
133 | 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 | 140 | |
141 | 141 | r_cause = env->sregs[SFR_R_MM_CAUSE]; |
142 | 142 | r_cfg = env->sregs[SFR_RW_MM_CFG]; |
143 | + pid = env->pregs[PR_PID]; | |
143 | 144 | |
144 | 145 | switch (rw) { |
145 | 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 | 176 | lo = env->tlbsets[mmu][set][idx].lo; |
176 | 177 | hi = env->tlbsets[mmu][set][idx].hi; |
177 | 178 | |
178 | - tlb_vpn = EXTRACT_FIELD(hi, 13, 31); | |
179 | + tlb_vpn = hi >> 13; | |
179 | 180 | tlb_pid = EXTRACT_FIELD(hi, 0, 7); |
180 | - tlb_pfn = EXTRACT_FIELD(lo, 13, 31); | |
181 | 181 | tlb_g = EXTRACT_FIELD(lo, 4, 4); |
182 | 182 | |
183 | 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 | 187 | && tlb_vpn == vpage) { |
188 | 188 | match = 1; |
189 | 189 | break; |
... | ... | @@ -245,9 +245,6 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, |
245 | 245 | } |
246 | 246 | else |
247 | 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 | 248 | } else { |
252 | 249 | /* If refill, provide a randomized set. */ |
253 | 250 | set = env->mmu_rand_lfsr & 3; |
... | ... | @@ -278,7 +275,6 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, |
278 | 275 | D(printf("refill vaddr=%x pc=%x\n", vaddr, env->pc)); |
279 | 276 | } |
280 | 277 | |
281 | - | |
282 | 278 | D(printf ("%s rw=%d mtch=%d pc=%x va=%x vpn=%x tlbvpn=%x pfn=%x pid=%x" |
283 | 279 | " %x cause=%x sel=%x sp=%x %x %x\n", |
284 | 280 | __func__, rw, match, env->pc, |
... | ... | @@ -348,7 +344,7 @@ int cris_mmu_translate(struct cris_mmu_result_t *res, |
348 | 344 | |
349 | 345 | if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) { |
350 | 346 | res->phy = vaddr; |
351 | - res->prot = PAGE_BITS; | |
347 | + res->prot = PAGE_BITS; | |
352 | 348 | goto done; |
353 | 349 | } |
354 | 350 | |
... | ... | @@ -361,7 +357,7 @@ int cris_mmu_translate(struct cris_mmu_result_t *res, |
361 | 357 | base = cris_mmu_translate_seg(env, seg); |
362 | 358 | phy = base | (0x0fffffff & vaddr); |
363 | 359 | res->phy = phy; |
364 | - res->prot = PAGE_BITS; | |
360 | + res->prot = PAGE_BITS; | |
365 | 361 | } |
366 | 362 | else |
367 | 363 | { | ... | ... |