Revision 28de16da target-cris/mmu.c
b/target-cris/mmu.c | ||
---|---|---|
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 |
pid = env->pregs[PR_PID] & 0xff;
|
|
144 | 144 |
|
145 | 145 |
switch (rw) { |
146 | 146 |
case 2: rwcause = CRIS_MMU_ERR_EXEC; mmu = 0; break; |
... | ... | |
270 | 270 |
/* Update RW_MM_CAUSE. */ |
271 | 271 |
set_field(&r_cause, rwcause, 8, 2); |
272 | 272 |
set_field(&r_cause, vpage, 13, 19); |
273 |
set_field(&r_cause, env->pregs[PR_PID], 0, 8);
|
|
273 |
set_field(&r_cause, pid, 0, 8);
|
|
274 | 274 |
env->sregs[SFR_R_MM_CAUSE] = r_cause; |
275 | 275 |
D(printf("refill vaddr=%x pc=%x\n", vaddr, env->pc)); |
276 | 276 |
} |
... | ... | |
280 | 280 |
__func__, rw, match, env->pc, |
281 | 281 |
vaddr, vpage, |
282 | 282 |
tlb_vpn, tlb_pfn, tlb_pid, |
283 |
env->pregs[PR_PID],
|
|
283 |
pid,
|
|
284 | 284 |
r_cause, |
285 | 285 |
env->sregs[SFR_RW_MM_TLB_SEL], |
286 | 286 |
env->regs[R_SP], env->pregs[PR_USP], env->ksp)); |
... | ... | |
315 | 315 |
|
316 | 316 |
/* Kernel protected areas need to be flushed |
317 | 317 |
as well. */ |
318 |
if (tlb_v && !tlb_g) { |
|
318 |
if (tlb_v && !tlb_g && (tlb_pid == pid || tlb_k)) {
|
|
319 | 319 |
vaddr = tlb_vpn << TARGET_PAGE_BITS; |
320 | 320 |
D(fprintf(logfile, |
321 | 321 |
"flush pid=%x vaddr=%x\n", |
Also available in: Unified diff