Revision fcb4a419 target-mips/op_helper.c
b/target-mips/op_helper.c | ||
---|---|---|
394 | 394 |
{ |
395 | 395 |
/* Flush qemu's TLB and discard all shadowed entries. */ |
396 | 396 |
tlb_flush (env, flush_global); |
397 |
env->tlb_in_use = MIPS_TLB_NB;
|
|
397 |
env->tlb_in_use = env->nb_tlb;
|
|
398 | 398 |
} |
399 | 399 |
|
400 | 400 |
static void mips_tlb_flush_extra (CPUState *env, int first) |
... | ... | |
430 | 430 |
/* Discard cached TLB entries. We could avoid doing this if the |
431 | 431 |
tlbwi is just upgrading access permissions on the current entry; |
432 | 432 |
that might be a further win. */ |
433 |
mips_tlb_flush_extra (env, MIPS_TLB_NB);
|
|
433 |
mips_tlb_flush_extra (env, env->nb_tlb);
|
|
434 | 434 |
|
435 |
/* Wildly undefined effects for CP0_Index containing a too high value and |
|
436 |
MIPS_TLB_NB not being a power of two. But so does real silicon. */ |
|
437 |
invalidate_tlb(env, env->CP0_Index & (MIPS_TLB_NB - 1), 0); |
|
438 |
fill_tlb(env->CP0_Index & (MIPS_TLB_NB - 1)); |
|
435 |
invalidate_tlb(env, env->CP0_Index % env->nb_tlb, 0); |
|
436 |
fill_tlb(env->CP0_Index % env->nb_tlb); |
|
439 | 437 |
} |
440 | 438 |
|
441 | 439 |
void do_tlbwr (void) |
... | ... | |
455 | 453 |
|
456 | 454 |
tag = env->CP0_EntryHi & (int32_t)0xFFFFE000; |
457 | 455 |
ASID = env->CP0_EntryHi & 0xFF; |
458 |
for (i = 0; i < MIPS_TLB_NB; i++) {
|
|
456 |
for (i = 0; i < env->nb_tlb; i++) {
|
|
459 | 457 |
tlb = &env->tlb[i]; |
460 | 458 |
/* Check ASID, virtual page number & size */ |
461 | 459 |
if ((tlb->G == 1 || tlb->ASID == ASID) && tlb->VPN == tag) { |
... | ... | |
464 | 462 |
break; |
465 | 463 |
} |
466 | 464 |
} |
467 |
if (i == MIPS_TLB_NB) {
|
|
465 |
if (i == env->nb_tlb) {
|
|
468 | 466 |
/* No match. Discard any shadow entries, if any of them match. */ |
469 |
for (i = MIPS_TLB_NB; i < env->tlb_in_use; i++) {
|
|
467 |
for (i = env->nb_tlb; i < env->tlb_in_use; i++) {
|
|
470 | 468 |
tlb = &env->tlb[i]; |
471 | 469 |
|
472 | 470 |
/* Check ASID, virtual page number & size */ |
... | ... | |
486 | 484 |
uint8_t ASID; |
487 | 485 |
|
488 | 486 |
ASID = env->CP0_EntryHi & 0xFF; |
489 |
tlb = &env->tlb[env->CP0_Index & (MIPS_TLB_NB - 1)];
|
|
487 |
tlb = &env->tlb[env->CP0_Index % env->nb_tlb];
|
|
490 | 488 |
|
491 | 489 |
/* If this will change the current ASID, flush qemu's TLB. */ |
492 | 490 |
if (ASID != tlb->ASID) |
493 | 491 |
cpu_mips_tlb_flush (env, 1); |
494 | 492 |
|
495 |
mips_tlb_flush_extra(env, MIPS_TLB_NB);
|
|
493 |
mips_tlb_flush_extra(env, env->nb_tlb);
|
|
496 | 494 |
|
497 | 495 |
env->CP0_EntryHi = tlb->VPN | tlb->ASID; |
498 | 496 |
env->CP0_PageMask = tlb->PageMask; |
Also available in: Unified diff