tlb.cc (3918:1f9a98d198e8) | tlb.cc (3926:c57925da8d38) |
---|---|
1/* 2 * Copyright (c) 2001-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 14 unchanged lines hidden (view full) --- 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Authors: Ali Saidi 29 */ 30 | 1/* 2 * Copyright (c) 2001-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 14 unchanged lines hidden (view full) --- 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Authors: Ali Saidi 29 */ 30 |
31#include <cstring> 32 | |
33#include "arch/sparc/asi.hh" 34#include "arch/sparc/miscregfile.hh" 35#include "arch/sparc/tlb.hh" 36#include "base/bitfield.hh" 37#include "base/trace.hh" 38#include "cpu/thread_context.hh" 39#include "cpu/base.hh" 40#include "mem/packet_access.hh" --- 9 unchanged lines hidden (view full) --- 50 : SimObject(name), size(s), usedEntries(0), lastReplaced(0), 51 cacheValid(false) 52{ 53 // To make this work you'll have to change the hypervisor and OS 54 if (size > 64) 55 fatal("SPARC T1 TLB registers don't support more than 64 TLB entries."); 56 57 tlb = new TlbEntry[size]; | 31#include "arch/sparc/asi.hh" 32#include "arch/sparc/miscregfile.hh" 33#include "arch/sparc/tlb.hh" 34#include "base/bitfield.hh" 35#include "base/trace.hh" 36#include "cpu/thread_context.hh" 37#include "cpu/base.hh" 38#include "mem/packet_access.hh" --- 9 unchanged lines hidden (view full) --- 48 : SimObject(name), size(s), usedEntries(0), lastReplaced(0), 49 cacheValid(false) 50{ 51 // To make this work you'll have to change the hypervisor and OS 52 if (size > 64) 53 fatal("SPARC T1 TLB registers don't support more than 64 TLB entries."); 54 55 tlb = new TlbEntry[size]; |
58 std::memset(tlb, 0, sizeof(TlbEntry) * size); | 56 memset(tlb, 0, sizeof(TlbEntry) * size); |
59 60 for (int x = 0; x < size; x++) 61 freeList.push_back(&tlb[x]); 62} 63 64void 65TLB::clearUsedBits() 66{ --- 15 unchanged lines hidden (view full) --- 82 83 84 MapIter i; 85 TlbEntry *new_entry = NULL; 86// TlbRange tr; 87 int x; 88 89 cacheValid = false; | 57 58 for (int x = 0; x < size; x++) 59 freeList.push_back(&tlb[x]); 60} 61 62void 63TLB::clearUsedBits() 64{ --- 15 unchanged lines hidden (view full) --- 80 81 82 MapIter i; 83 TlbEntry *new_entry = NULL; 84// TlbRange tr; 85 int x; 86 87 cacheValid = false; |
88 va &= ~(PTE.size()-1); |
|
90 /* tr.va = va; 91 tr.size = PTE.size() - 1; 92 tr.contextId = context_id; 93 tr.partitionId = partition_id; 94 tr.real = real; 95*/ 96 97 DPRINTF(TLB, "TLB: Inserting TLB Entry; va=%#x pa=%#x pid=%d cid=%d r=%d entryid=%d\n", --- 313 unchanged lines hidden (view full) --- 411 sfsr |= ft << 7; 412 sfsr |= asi << 16; 413 tc->setMiscRegWithEffect(reg, sfsr); 414} 415 416void 417TLB::writeTagAccess(ThreadContext *tc, int reg, Addr va, int context) 418{ | 89 /* tr.va = va; 90 tr.size = PTE.size() - 1; 91 tr.contextId = context_id; 92 tr.partitionId = partition_id; 93 tr.real = real; 94*/ 95 96 DPRINTF(TLB, "TLB: Inserting TLB Entry; va=%#x pa=%#x pid=%d cid=%d r=%d entryid=%d\n", --- 313 unchanged lines hidden (view full) --- 410 sfsr |= ft << 7; 411 sfsr |= asi << 16; 412 tc->setMiscRegWithEffect(reg, sfsr); 413} 414 415void 416TLB::writeTagAccess(ThreadContext *tc, int reg, Addr va, int context) 417{ |
418 DPRINTF(TLB, "TLB: Writing Tag Access: va: %#X ctx: %#X value: %#X\n", 419 va, context, mbits(va, 63,13) | mbits(context,12,0)); 420 |
|
419 tc->setMiscRegWithEffect(reg, mbits(va, 63,13) | mbits(context,12,0)); 420} 421 422void 423ITB::writeSfsr(ThreadContext *tc, bool write, ContextType ct, 424 bool se, FaultTypes ft, int asi) 425{ 426 DPRINTF(TLB, "TLB: ITB Fault: w=%d ct=%d ft=%d asi=%d\n", --- 106 unchanged lines hidden (view full) --- 533 e = lookup(vaddr, part_id, true); 534 real = true; 535 context = 0; 536 } else { 537 e = lookup(vaddr, part_id, false, context); 538 } 539 540 if (e == NULL || !e->valid) { | 421 tc->setMiscRegWithEffect(reg, mbits(va, 63,13) | mbits(context,12,0)); 422} 423 424void 425ITB::writeSfsr(ThreadContext *tc, bool write, ContextType ct, 426 bool se, FaultTypes ft, int asi) 427{ 428 DPRINTF(TLB, "TLB: ITB Fault: w=%d ct=%d ft=%d asi=%d\n", --- 106 unchanged lines hidden (view full) --- 535 e = lookup(vaddr, part_id, true); 536 real = true; 537 context = 0; 538 } else { 539 e = lookup(vaddr, part_id, false, context); 540 } 541 542 if (e == NULL || !e->valid) { |
541 tc->setMiscReg(MISCREG_MMU_ITLB_TAG_ACCESS, 542 vaddr & ~BytesInPageMask | context); | 543 writeTagAccess(tc, vaddr, context); |
543 if (real) 544 return new InstructionRealTranslationMiss; 545 else 546 return new FastInstructionAccessMMUMiss; 547 } 548 549 // were not priviledged accesing priv page 550 if (!priv && e->pte.priv()) { --- 56 unchanged lines hidden (view full) --- 607 bool red = bits(tlbdata,1,1); 608 bool priv = bits(tlbdata,2,2); 609 bool addr_mask = bits(tlbdata,3,3); 610 bool lsu_dm = bits(tlbdata,5,5); 611 612 int part_id = bits(tlbdata,15,8); 613 int tl = bits(tlbdata,18,16); 614 int pri_context = bits(tlbdata,47,32); | 544 if (real) 545 return new InstructionRealTranslationMiss; 546 else 547 return new FastInstructionAccessMMUMiss; 548 } 549 550 // were not priviledged accesing priv page 551 if (!priv && e->pte.priv()) { --- 56 unchanged lines hidden (view full) --- 608 bool red = bits(tlbdata,1,1); 609 bool priv = bits(tlbdata,2,2); 610 bool addr_mask = bits(tlbdata,3,3); 611 bool lsu_dm = bits(tlbdata,5,5); 612 613 int part_id = bits(tlbdata,15,8); 614 int tl = bits(tlbdata,18,16); 615 int pri_context = bits(tlbdata,47,32); |
615 int sec_context = bits(tlbdata,47,32); | 616 int sec_context = bits(tlbdata,63,48); |
616 617 bool real = false; 618 ContextType ct = Primary; 619 int context = 0; 620 621 TlbEntry *e; 622 623 DPRINTF(TLB, "TLB: priv:%d hpriv:%d red:%d lsudm:%d part_id: %#X\n", --- 4 unchanged lines hidden (view full) --- 628 asi = ASI_N; 629 ct = Nucleus; 630 context = 0; 631 } else { 632 asi = ASI_P; 633 ct = Primary; 634 context = pri_context; 635 } | 617 618 bool real = false; 619 ContextType ct = Primary; 620 int context = 0; 621 622 TlbEntry *e; 623 624 DPRINTF(TLB, "TLB: priv:%d hpriv:%d red:%d lsudm:%d part_id: %#X\n", --- 4 unchanged lines hidden (view full) --- 629 asi = ASI_N; 630 ct = Nucleus; 631 context = 0; 632 } else { 633 asi = ASI_P; 634 ct = Primary; 635 context = pri_context; 636 } |
636 } else if (!hpriv && !red) { 637 if (tl > 0 || AsiIsNucleus(asi)) { 638 ct = Nucleus; 639 context = 0; 640 } else if (AsiIsSecondary(asi)) { 641 ct = Secondary; 642 context = sec_context; 643 } else { 644 context = pri_context; 645 ct = Primary; //??? 646 } 647 | 637 } else { |
648 // We need to check for priv level/asi priv | 638 // We need to check for priv level/asi priv |
649 if (!priv && !AsiIsUnPriv(asi)) { | 639 if (!priv && !hpriv && !AsiIsUnPriv(asi)) { |
650 // It appears that context should be Nucleus in these cases? 651 writeSfr(tc, vaddr, write, Nucleus, false, IllegalAsi, asi); 652 return new PrivilegedAction; 653 } | 640 // It appears that context should be Nucleus in these cases? 641 writeSfr(tc, vaddr, write, Nucleus, false, IllegalAsi, asi); 642 return new PrivilegedAction; 643 } |
654 if (priv && AsiIsHPriv(asi)) { | 644 645 if (!hpriv && AsiIsHPriv(asi)) { |
655 writeSfr(tc, vaddr, write, Nucleus, false, IllegalAsi, asi); 656 return new DataAccessException; 657 } 658 | 646 writeSfr(tc, vaddr, write, Nucleus, false, IllegalAsi, asi); 647 return new DataAccessException; 648 } 649 |
650 if (AsiIsPrimary(asi)) { 651 context = pri_context; 652 ct = Primary; 653 } else if (AsiIsSecondary(asi)) { 654 context = sec_context; 655 ct = Secondary; 656 } else if (AsiIsNucleus(asi)) { 657 ct = Nucleus; 658 context = 0; 659 } else { // ???? 660 ct = Primary; 661 context = pri_context; 662 } |
|
659 } | 663 } |
660 if (asi == ASI_P || asi == ASI_LDTX_P) { 661 ct = Primary; 662 context = pri_context; 663 goto continueDtbFlow; 664 } | |
665 | 664 |
666 if (!implicit) { | 665 if (!implicit && asi != ASI_P && asi != ASI_S) { |
667 if (AsiIsLittle(asi)) 668 panic("Little Endian ASIs not supported\n"); 669 if (AsiIsBlock(asi)) 670 panic("Block ASIs not supported\n"); 671 if (AsiIsNoFault(asi)) 672 panic("No Fault ASIs not supported\n"); | 666 if (AsiIsLittle(asi)) 667 panic("Little Endian ASIs not supported\n"); 668 if (AsiIsBlock(asi)) 669 panic("Block ASIs not supported\n"); 670 if (AsiIsNoFault(asi)) 671 panic("No Fault ASIs not supported\n"); |
673 if (!write && (asi == ASI_QUAD_LDD || asi == ASI_LDTX_REAL)) 674 goto continueDtbFlow; | |
675 | 672 |
676 if (AsiIsTwin(asi)) 677 panic("Twin ASIs not supported\n"); | |
678 if (AsiIsPartialStore(asi)) 679 panic("Partial Store ASIs not supported\n"); 680 if (AsiIsInterrupt(asi)) 681 panic("Interrupt ASIs not supported\n"); 682 683 if (AsiIsMmu(asi)) 684 goto handleMmuRegAccess; 685 if (AsiIsScratchPad(asi)) 686 goto handleScratchRegAccess; 687 if (AsiIsQueue(asi)) 688 goto handleQueueRegAccess; 689 if (AsiIsSparcError(asi)) 690 goto handleSparcErrorRegAccess; 691 | 673 if (AsiIsPartialStore(asi)) 674 panic("Partial Store ASIs not supported\n"); 675 if (AsiIsInterrupt(asi)) 676 panic("Interrupt ASIs not supported\n"); 677 678 if (AsiIsMmu(asi)) 679 goto handleMmuRegAccess; 680 if (AsiIsScratchPad(asi)) 681 goto handleScratchRegAccess; 682 if (AsiIsQueue(asi)) 683 goto handleQueueRegAccess; 684 if (AsiIsSparcError(asi)) 685 goto handleSparcErrorRegAccess; 686 |
692 if (!AsiIsReal(asi) && !AsiIsNucleus(asi)) | 687 if (!AsiIsReal(asi) && !AsiIsNucleus(asi) && !AsiIsAsIfUser(asi) && 688 !AsiIsTwin(asi)) |
693 panic("Accessing ASI %#X. Should we?\n", asi); 694 } 695 | 689 panic("Accessing ASI %#X. Should we?\n", asi); 690 } 691 |
696continueDtbFlow: | |
697 // If the asi is unaligned trap 698 if (vaddr & size-1) { 699 writeSfr(tc, vaddr, false, ct, false, OtherFault, asi); 700 return new MemAddressNotAligned; 701 } 702 703 if (addr_mask) 704 vaddr = vaddr & VAddrAMask; 705 706 if (!validVirtualAddress(vaddr, addr_mask)) { 707 writeSfr(tc, vaddr, false, ct, true, VaOutOfRange, asi); 708 return new DataAccessException; 709 } 710 711 | 692 // If the asi is unaligned trap 693 if (vaddr & size-1) { 694 writeSfr(tc, vaddr, false, ct, false, OtherFault, asi); 695 return new MemAddressNotAligned; 696 } 697 698 if (addr_mask) 699 vaddr = vaddr & VAddrAMask; 700 701 if (!validVirtualAddress(vaddr, addr_mask)) { 702 writeSfr(tc, vaddr, false, ct, true, VaOutOfRange, asi); 703 return new DataAccessException; 704 } 705 706 |
712 if ((!lsu_dm && !hpriv) || AsiIsReal(asi)) { | 707 if ((!lsu_dm && !hpriv && !red) || AsiIsReal(asi)) { |
713 real = true; 714 context = 0; 715 }; 716 717 if (hpriv && (implicit || (!AsiIsAsIfUser(asi) && !AsiIsReal(asi)))) { 718 req->setPaddr(vaddr & PAddrImplMask); 719 return NoFault; 720 } 721 722 e = lookup(vaddr, part_id, real, context); 723 724 if (e == NULL || !e->valid) { | 708 real = true; 709 context = 0; 710 }; 711 712 if (hpriv && (implicit || (!AsiIsAsIfUser(asi) && !AsiIsReal(asi)))) { 713 req->setPaddr(vaddr & PAddrImplMask); 714 return NoFault; 715 } 716 717 e = lookup(vaddr, part_id, real, context); 718 719 if (e == NULL || !e->valid) { |
725 tc->setMiscReg(MISCREG_MMU_DTLB_TAG_ACCESS, 726 vaddr & ~BytesInPageMask | context); | 720 writeTagAccess(tc, vaddr, context); |
727 DPRINTF(TLB, "TLB: DTB Failed to find matching TLB entry\n"); 728 if (real) 729 return new DataRealTranslationMiss; 730 else 731 return new FastDataAccessMMUMiss; 732 733 } 734 --- 155 unchanged lines hidden (view full) --- 890 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS1)); 891 break; 892 case ASI_IMMU_CTXT_NONZERO_CONFIG: 893 assert(va == 0); 894 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG)); 895 break; 896 case ASI_SPARC_ERROR_STATUS_REG: 897 warn("returning 0 for SPARC ERROR regsiter read\n"); | 721 DPRINTF(TLB, "TLB: DTB Failed to find matching TLB entry\n"); 722 if (real) 723 return new DataRealTranslationMiss; 724 else 725 return new FastDataAccessMMUMiss; 726 727 } 728 --- 155 unchanged lines hidden (view full) --- 884 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS1)); 885 break; 886 case ASI_IMMU_CTXT_NONZERO_CONFIG: 887 assert(va == 0); 888 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG)); 889 break; 890 case ASI_SPARC_ERROR_STATUS_REG: 891 warn("returning 0 for SPARC ERROR regsiter read\n"); |
898 pkt->set(0); | 892 pkt->set((uint64_t)0); |
899 break; 900 case ASI_HYP_SCRATCHPAD: 901 case ASI_SCRATCHPAD: 902 pkt->set(tc->readMiscRegWithEffect(MISCREG_SCRATCHPAD_R0 + (va >> 3))); 903 break; 904 case ASI_IMMU: 905 switch (va) { 906 case 0x0: --- 53 unchanged lines hidden (view full) --- 960 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_CONFIG); 961 } else { 962 tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS1); 963 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_CONFIG); 964 } 965 data = mbits(tsbtemp,63,13); 966 if (bits(tsbtemp,12,12)) 967 data |= ULL(1) << (13+bits(tsbtemp,3,0)); | 893 break; 894 case ASI_HYP_SCRATCHPAD: 895 case ASI_SCRATCHPAD: 896 pkt->set(tc->readMiscRegWithEffect(MISCREG_SCRATCHPAD_R0 + (va >> 3))); 897 break; 898 case ASI_IMMU: 899 switch (va) { 900 case 0x0: --- 53 unchanged lines hidden (view full) --- 954 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_CONFIG); 955 } else { 956 tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS1); 957 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_CONFIG); 958 } 959 data = mbits(tsbtemp,63,13); 960 if (bits(tsbtemp,12,12)) 961 data |= ULL(1) << (13+bits(tsbtemp,3,0)); |
968 data |= temp >> (9 + bits(cnftemp,2,0) * 3) & | 962 data |= temp >> (9 + bits(cnftemp,10,8) * 3) & |
969 mbits((uint64_t)-1ll,12+bits(tsbtemp,3,0), 4); 970 pkt->set(data); 971 break; 972 case ASI_IMMU_TSB_PS0_PTR_REG: 973 temp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS); 974 if (bits(temp,12,0) == 0) { 975 tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_TSB_PS0); 976 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG); --- 13 unchanged lines hidden (view full) --- 990 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG); 991 } else { 992 tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS1); 993 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG); 994 } 995 data = mbits(tsbtemp,63,13); 996 if (bits(tsbtemp,12,12)) 997 data |= ULL(1) << (13+bits(tsbtemp,3,0)); | 963 mbits((uint64_t)-1ll,12+bits(tsbtemp,3,0), 4); 964 pkt->set(data); 965 break; 966 case ASI_IMMU_TSB_PS0_PTR_REG: 967 temp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS); 968 if (bits(temp,12,0) == 0) { 969 tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_TSB_PS0); 970 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG); --- 13 unchanged lines hidden (view full) --- 984 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG); 985 } else { 986 tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS1); 987 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG); 988 } 989 data = mbits(tsbtemp,63,13); 990 if (bits(tsbtemp,12,12)) 991 data |= ULL(1) << (13+bits(tsbtemp,3,0)); |
998 data |= temp >> (9 + bits(cnftemp,2,0) * 3) & | 992 data |= temp >> (9 + bits(cnftemp,10,8) * 3) & |
999 mbits((uint64_t)-1ll,12+bits(tsbtemp,3,0), 4); 1000 pkt->set(data); 1001 break; 1002 1003 default: 1004doMmuReadError: 1005 panic("need to impl DTB::doMmuRegRead() got asi=%#x, va=%#x\n", 1006 (uint32_t)asi, va); --- 102 unchanged lines hidden (view full) --- 1109 tc->setMiscRegWithEffect(MISCREG_SCRATCHPAD_R0 + (va >> 3), data); 1110 break; 1111 case ASI_IMMU: 1112 switch (va) { 1113 case 0x18: 1114 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_SFSR, data); 1115 break; 1116 case 0x30: | 993 mbits((uint64_t)-1ll,12+bits(tsbtemp,3,0), 4); 994 pkt->set(data); 995 break; 996 997 default: 998doMmuReadError: 999 panic("need to impl DTB::doMmuRegRead() got asi=%#x, va=%#x\n", 1000 (uint32_t)asi, va); --- 102 unchanged lines hidden (view full) --- 1103 tc->setMiscRegWithEffect(MISCREG_SCRATCHPAD_R0 + (va >> 3), data); 1104 break; 1105 case ASI_IMMU: 1106 switch (va) { 1107 case 0x18: 1108 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_SFSR, data); 1109 break; 1110 case 0x30: |
1111 sext<59>(bits(data, 59,0)); |
|
1117 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS, data); 1118 break; 1119 default: 1120 goto doMmuWriteError; 1121 } 1122 break; 1123 case ASI_ITLB_DATA_ACCESS_REG: 1124 entry_insert = bits(va, 8,3); --- 58 unchanged lines hidden (view full) --- 1183 } 1184 break; 1185 case ASI_DMMU: 1186 switch (va) { 1187 case 0x18: 1188 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_SFSR, data); 1189 break; 1190 case 0x30: | 1112 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS, data); 1113 break; 1114 default: 1115 goto doMmuWriteError; 1116 } 1117 break; 1118 case ASI_ITLB_DATA_ACCESS_REG: 1119 entry_insert = bits(va, 8,3); --- 58 unchanged lines hidden (view full) --- 1178 } 1179 break; 1180 case ASI_DMMU: 1181 switch (va) { 1182 case 0x18: 1183 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_SFSR, data); 1184 break; 1185 case 0x30: |
1186 sext<59>(bits(data, 59,0)); |
|
1191 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS, data); 1192 break; 1193 case 0x80: 1194 tc->setMiscRegWithEffect(MISCREG_MMU_PART_ID, data); 1195 break; 1196 default: 1197 goto doMmuWriteError; 1198 } --- 99 unchanged lines hidden --- | 1187 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS, data); 1188 break; 1189 case 0x80: 1190 tc->setMiscRegWithEffect(MISCREG_MMU_PART_ID, data); 1191 break; 1192 default: 1193 goto doMmuWriteError; 1194 } --- 99 unchanged lines hidden --- |