Revision bc814401
b/target-mips/helper.c | ||
---|---|---|
50 | 50 |
tlb = &env->tlb[i]; |
51 | 51 |
/* Check ASID, virtual page number & size */ |
52 | 52 |
if ((tlb->G == 1 || tlb->ASID == ASID) && |
53 |
tlb->VPN == tag && address < tlb->end2) {
|
|
53 |
tlb->VPN == tag) { |
|
54 | 54 |
/* TLB match */ |
55 | 55 |
n = (address >> TARGET_PAGE_BITS) & 1; |
56 | 56 |
/* Check access rights */ |
... | ... | |
420 | 420 |
void invalidate_tlb (CPUState *env, int idx, int use_extra) |
421 | 421 |
{ |
422 | 422 |
tlb_t *tlb; |
423 |
target_ulong addr; |
|
424 | 423 |
uint8_t ASID; |
425 | 424 |
|
426 | 425 |
ASID = env->CP0_EntryHi & 0xFF; |
... | ... | |
441 | 440 |
return; |
442 | 441 |
} |
443 | 442 |
|
444 |
if (tlb->V0) { |
|
445 |
addr = tlb->VPN; |
|
446 |
while (addr < tlb->end) { |
|
447 |
tlb_flush_page (env, addr); |
|
448 |
addr += TARGET_PAGE_SIZE; |
|
449 |
} |
|
450 |
} |
|
451 |
if (tlb->V1) { |
|
452 |
addr = tlb->end; |
|
453 |
while (addr < tlb->end2) { |
|
454 |
tlb_flush_page (env, addr); |
|
455 |
addr += TARGET_PAGE_SIZE; |
|
456 |
} |
|
457 |
} |
|
443 |
if (tlb->V0) |
|
444 |
tlb_flush_page (env, tlb->VPN); |
|
445 |
if (tlb->V1) |
|
446 |
tlb_flush_page (env, tlb->VPN + TARGET_PAGE_SIZE); |
|
458 | 447 |
} |
459 |
|
b/target-mips/op_helper.c | ||
---|---|---|
387 | 387 |
static void fill_tlb (int idx) |
388 | 388 |
{ |
389 | 389 |
tlb_t *tlb; |
390 |
int size; |
|
391 | 390 |
|
392 | 391 |
/* XXX: detect conflicting TLBs and raise a MCHECK exception when needed */ |
393 | 392 |
tlb = &env->tlb[idx]; |
394 | 393 |
tlb->VPN = env->CP0_EntryHi & (int32_t)0xFFFFE000; |
395 | 394 |
tlb->ASID = env->CP0_EntryHi & 0xFF; |
396 |
size = env->CP0_PageMask >> 13; |
|
397 |
size = 4 * (size + 1); |
|
398 |
tlb->end = tlb->VPN + (1 << (8 + size)); |
|
399 |
tlb->end2 = tlb->end + (1 << (8 + size)); |
|
400 | 395 |
tlb->G = env->CP0_EntryLo0 & env->CP0_EntryLo1 & 1; |
401 | 396 |
tlb->V0 = (env->CP0_EntryLo0 & 2) != 0; |
402 | 397 |
tlb->D0 = (env->CP0_EntryLo0 & 4) != 0; |
... | ... | |
467 | 462 |
{ |
468 | 463 |
tlb_t *tlb; |
469 | 464 |
uint8_t ASID; |
470 |
int size; |
|
471 | 465 |
|
472 | 466 |
ASID = env->CP0_EntryHi & 0xFF; |
473 | 467 |
tlb = &env->tlb[env->CP0_index & (MIPS_TLB_NB - 1)]; |
... | ... | |
479 | 473 |
mips_tlb_flush_extra(env, MIPS_TLB_NB); |
480 | 474 |
|
481 | 475 |
env->CP0_EntryHi = tlb->VPN | tlb->ASID; |
482 |
size = (tlb->end - tlb->VPN) >> 12; |
|
483 |
env->CP0_PageMask = (size - 1) << 13; |
|
484 | 476 |
env->CP0_EntryLo0 = tlb->G | (tlb->V0 << 1) | (tlb->D0 << 2) | |
485 | 477 |
(tlb->C0 << 3) | (tlb->PFN[0] >> 6); |
486 | 478 |
env->CP0_EntryLo1 = tlb->G | (tlb->V1 << 1) | (tlb->D1 << 2) | |
Also available in: Unified diff