351,357c351,362
< uint64_t hpstate = tc->readMiscReg(MISCREG_HPSTATE);
< uint64_t pstate = tc->readMiscReg(MISCREG_PSTATE);
< bool lsuIm = tc->readMiscReg(MISCREG_MMU_LSU_CTRL) >> 2 & 0x1;
< uint64_t tl = tc->readMiscReg(MISCREG_TL);
< uint64_t part_id = tc->readMiscReg(MISCREG_MMU_PART_ID);
< bool addr_mask = pstate >> 3 & 0x1;
< bool priv = pstate >> 2 & 0x1;
---
> uint64_t tlbdata = tc->readMiscReg(MISCREG_TLB_DATA);
>
> bool hpriv = bits(tlbdata,0,0);
> bool red = bits(tlbdata,1,1);
> bool priv = bits(tlbdata,2,2);
> bool addr_mask = bits(tlbdata,3,3);
> bool lsu_im = bits(tlbdata,4,4);
>
> int part_id = bits(tlbdata,15,8);
> int tl = bits(tlbdata,18,16);
> int pri_context = bits(tlbdata,47,32);
>
367,368c372,373
< DPRINTF(TLB, "TLB: pstate: %#X hpstate: %#X lsudm: %#X part_id: %#X\n",
< pstate, hpstate, lsuIm, part_id);
---
> DPRINTF(TLB, "TLB: priv:%d hpriv:%d red:%d lsuim:%d part_id: %#X\n",
> priv, hpriv, red, lsu_im, part_id);
379c384
< context = tc->readMiscReg(MISCREG_MMU_P_CONTEXT);
---
> context = pri_context;
382c387
< if ( hpstate >> 2 & 0x1 || hpstate >> 5 & 0x1 ) {
---
> if ( hpriv || red ) {
401c406
< if (!lsuIm) {
---
> if (!lsu_im) {
436,444c441,453
< uint64_t hpstate = tc->readMiscReg(MISCREG_HPSTATE);
< uint64_t pstate = tc->readMiscReg(MISCREG_PSTATE);
< bool lsuDm = tc->readMiscReg(MISCREG_MMU_LSU_CTRL) >> 3 & 0x1;
< uint64_t tl = tc->readMiscReg(MISCREG_TL);
< uint64_t part_id = tc->readMiscReg(MISCREG_MMU_PART_ID);
< bool hpriv = hpstate >> 2 & 0x1;
< bool red = hpstate >> 5 >> 0x1;
< bool addr_mask = pstate >> 3 & 0x1;
< bool priv = pstate >> 2 & 0x1;
---
> uint64_t tlbdata = tc->readMiscReg(MISCREG_TLB_DATA);
>
> bool hpriv = bits(tlbdata,0,0);
> bool red = bits(tlbdata,1,1);
> bool priv = bits(tlbdata,2,2);
> bool addr_mask = bits(tlbdata,3,3);
> bool lsu_dm = bits(tlbdata,5,5);
>
> int part_id = bits(tlbdata,15,8);
> int tl = bits(tlbdata,18,16);
> int pri_context = bits(tlbdata,47,32);
> int sec_context = bits(tlbdata,47,32);
>
458,459c467,468
< DPRINTF(TLB, "TLB: pstate: %#X hpstate: %#X lsudm: %#X part_id: %#X\n",
< pstate, hpstate, lsuDm, part_id);
---
> DPRINTF(TLB, "TLB: priv:%d hpriv:%d red:%d lsudm:%d part_id: %#X\n",
> priv, hpriv, red, lsu_dm, part_id);
471c480
< context = tc->readMiscReg(MISCREG_MMU_P_CONTEXT);
---
> context = pri_context;
479c488
< context = tc->readMiscReg(MISCREG_MMU_S_CONTEXT);
---
> context = sec_context;
481c490
< context = tc->readMiscReg(MISCREG_MMU_P_CONTEXT);
---
> context = pri_context;
499c508
< context = tc->readMiscReg(MISCREG_MMU_P_CONTEXT);
---
> context = pri_context;
550c559
< if ((!lsuDm && !hpriv) || AsiIsReal(asi)) {
---
> if ((!lsu_dm && !hpriv) || AsiIsReal(asi)) {
642a652,653
> uint64_t temp, data;
> uint64_t tsbtemp, cnftemp;
725a737,740
> case 0x0:
> temp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS);
> pkt->set(bits(temp,63,22) | bits(temp,12,0) << 48);
> break;
734a750,753
> case 0x0:
> temp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS);
> pkt->set(bits(temp,63,22) | bits(temp,12,0) << 48);
> break;
744a764,796
> case ASI_DMMU_TSB_PS0_PTR_REG:
> temp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS);
> if (bits(temp,12,0) == 0) {
> tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_TSB_PS0);
> cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_CONFIG);
> } else {
> tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS0);
> cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_CONFIG);
> }
> data = mbits(tsbtemp,63,13);
> data |= temp >> (9 + bits(cnftemp,2,0) * 3) &
> mbits((uint64_t)-1ll,12+bits(tsbtemp,3,0), 4);
> warn("base addr: %#X tag access: %#X page size: %#X tsb size: %#X\n",
> bits(tsbtemp,63,13), temp, bits(cnftemp,2,0), bits(tsbtemp,3,0));
> pkt->set(data);
> break;
> case ASI_DMMU_TSB_PS1_PTR_REG:
> temp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS);
> if (bits(temp,12,0) == 0) {
> tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_TSB_PS1);
> cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_CONFIG);
> } else {
> tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS1);
> cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_CONFIG);
> }
> data = mbits(tsbtemp,63,13);
> if (bits(tsbtemp,12,12))
> data |= ULL(1) << (13+bits(tsbtemp,3,0));
> data |= temp >> (9 + bits(cnftemp,2,0) * 3) &
> mbits((uint64_t)-1ll,12+bits(tsbtemp,3,0), 4);
> pkt->set(data);
> break;
>