Revision f2e9ebef target-mips/op_helper.c
b/target-mips/op_helper.c | ||
---|---|---|
390 | 390 |
|
391 | 391 |
/* XXX: detect conflicting TLBs and raise a MCHECK exception when needed */ |
392 | 392 |
tlb = &env->mmu.r4k.tlb[idx]; |
393 |
tlb->VPN = env->CP0_EntryHi & ~(target_ulong)0x1FFF;
|
|
393 |
tlb->VPN = env->CP0_EntryHi & (TARGET_PAGE_MASK << 1);
|
|
394 | 394 |
tlb->ASID = env->CP0_EntryHi & 0xFF; |
395 | 395 |
tlb->PageMask = env->CP0_PageMask; |
396 | 396 |
tlb->G = env->CP0_EntryLo0 & env->CP0_EntryLo1 & 1; |
... | ... | |
426 | 426 |
void r4k_do_tlbp (void) |
427 | 427 |
{ |
428 | 428 |
r4k_tlb_t *tlb; |
429 |
target_ulong mask; |
|
429 | 430 |
target_ulong tag; |
431 |
target_ulong VPN; |
|
430 | 432 |
uint8_t ASID; |
431 | 433 |
int i; |
432 | 434 |
|
433 |
tag = env->CP0_EntryHi & (int32_t)0xFFFFE000; |
|
434 | 435 |
ASID = env->CP0_EntryHi & 0xFF; |
435 | 436 |
for (i = 0; i < env->nb_tlb; i++) { |
436 | 437 |
tlb = &env->mmu.r4k.tlb[i]; |
438 |
/* 1k pages are not supported. */ |
|
439 |
mask = tlb->PageMask | ~(TARGET_PAGE_MASK << 1); |
|
440 |
tag = env->CP0_EntryHi & ~mask; |
|
441 |
VPN = tlb->VPN & ~mask; |
|
437 | 442 |
/* Check ASID, virtual page number & size */ |
438 |
if ((tlb->G == 1 || tlb->ASID == ASID) && tlb->VPN == tag) {
|
|
443 |
if ((tlb->G == 1 || tlb->ASID == ASID) && VPN == tag) { |
|
439 | 444 |
/* TLB match */ |
440 | 445 |
env->CP0_Index = i; |
441 | 446 |
break; |
... | ... | |
445 | 450 |
/* No match. Discard any shadow entries, if any of them match. */ |
446 | 451 |
for (i = env->nb_tlb; i < env->tlb_in_use; i++) { |
447 | 452 |
tlb = &env->mmu.r4k.tlb[i]; |
448 |
|
|
453 |
/* 1k pages are not supported. */ |
|
454 |
mask = tlb->PageMask | ~(TARGET_PAGE_MASK << 1); |
|
455 |
tag = env->CP0_EntryHi & ~mask; |
|
456 |
VPN = tlb->VPN & ~mask; |
|
449 | 457 |
/* Check ASID, virtual page number & size */ |
450 |
if ((tlb->G == 1 || tlb->ASID == ASID) && tlb->VPN == tag) {
|
|
458 |
if ((tlb->G == 1 || tlb->ASID == ASID) && VPN == tag) { |
|
451 | 459 |
r4k_mips_tlb_flush_extra (env, i); |
452 | 460 |
break; |
453 | 461 |
} |
Also available in: Unified diff