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