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