tlb.cc (3916:3f394f5bc533) | tlb.cc (3918:1f9a98d198e8) |
---|---|
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 |
|
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]; | 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]; |
56 memset(tlb, 0, sizeof(TlbEntry) * size); | 58 std::memset(tlb, 0, sizeof(TlbEntry) * size); |
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; | 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; |
88 va &= ~(PTE.size()-1); | |
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{ | 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{ |
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 | |
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) { | 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) { |
543 writeTagAccess(tc, vaddr, context); | 541 tc->setMiscReg(MISCREG_MMU_ITLB_TAG_ACCESS, 542 vaddr & ~BytesInPageMask | context); |
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); | 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); |
616 int sec_context = bits(tlbdata,63,48); | 615 int sec_context = bits(tlbdata,47,32); |
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 } | 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 } |
637 } else { | 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 |
638 // We need to check for priv level/asi priv | 648 // We need to check for priv level/asi priv |
639 if (!priv && !hpriv && !AsiIsUnPriv(asi)) { | 649 if (!priv && !AsiIsUnPriv(asi)) { |
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 } | 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 } |
644 645 if (!hpriv && AsiIsHPriv(asi)) { | 654 if (priv && AsiIsHPriv(asi)) { |
646 writeSfr(tc, vaddr, write, Nucleus, false, IllegalAsi, asi); 647 return new DataAccessException; 648 } 649 | 655 writeSfr(tc, vaddr, write, Nucleus, false, IllegalAsi, asi); 656 return new DataAccessException; 657 } 658 |
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 } | |
663 } | 659 } |
660 if (asi == ASI_P || asi == ASI_LDTX_P) { 661 ct = Primary; 662 context = pri_context; 663 goto continueDtbFlow; 664 } |
|
664 665 if (!implicit) { 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"); | 665 666 if (!implicit) { 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"); |
672 673 // These twin ASIs are OK 674 if (asi == ASI_P || asi == ASI_LDTX_P) 675 goto continueDtbFlow; | |
676 if (!write && (asi == ASI_QUAD_LDD || asi == ASI_LDTX_REAL)) 677 goto continueDtbFlow; 678 679 if (AsiIsTwin(asi)) 680 panic("Twin ASIs not supported\n"); 681 if (AsiIsPartialStore(asi)) 682 panic("Partial Store ASIs not supported\n"); 683 if (AsiIsInterrupt(asi)) 684 panic("Interrupt ASIs not supported\n"); 685 686 if (AsiIsMmu(asi)) 687 goto handleMmuRegAccess; 688 if (AsiIsScratchPad(asi)) 689 goto handleScratchRegAccess; 690 if (AsiIsQueue(asi)) 691 goto handleQueueRegAccess; 692 if (AsiIsSparcError(asi)) 693 goto handleSparcErrorRegAccess; 694 | 673 if (!write && (asi == ASI_QUAD_LDD || asi == ASI_LDTX_REAL)) 674 goto continueDtbFlow; 675 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 |
695 if (!AsiIsReal(asi) && !AsiIsNucleus(asi) && !AsiIsAsIfUser(asi)) | 692 if (!AsiIsReal(asi) && !AsiIsNucleus(asi)) |
696 panic("Accessing ASI %#X. Should we?\n", asi); 697 } 698 699continueDtbFlow: 700 // If the asi is unaligned trap 701 if (vaddr & size-1) { 702 writeSfr(tc, vaddr, false, ct, false, OtherFault, asi); 703 return new MemAddressNotAligned; 704 } 705 706 if (addr_mask) 707 vaddr = vaddr & VAddrAMask; 708 709 if (!validVirtualAddress(vaddr, addr_mask)) { 710 writeSfr(tc, vaddr, false, ct, true, VaOutOfRange, asi); 711 return new DataAccessException; 712 } 713 714 | 693 panic("Accessing ASI %#X. Should we?\n", asi); 694 } 695 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 |
715 if ((!lsu_dm && !hpriv && !red) || AsiIsReal(asi)) { | 712 if ((!lsu_dm && !hpriv) || AsiIsReal(asi)) { |
716 real = true; 717 context = 0; 718 }; 719 720 if (hpriv && (implicit || (!AsiIsAsIfUser(asi) && !AsiIsReal(asi)))) { 721 req->setPaddr(vaddr & PAddrImplMask); 722 return NoFault; 723 } 724 725 e = lookup(vaddr, part_id, real, context); 726 727 if (e == NULL || !e->valid) { | 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) { |
728 writeTagAccess(tc, vaddr, context); | 725 tc->setMiscReg(MISCREG_MMU_DTLB_TAG_ACCESS, 726 vaddr & ~BytesInPageMask | context); |
729 DPRINTF(TLB, "TLB: DTB Failed to find matching TLB entry\n"); 730 if (real) 731 return new DataRealTranslationMiss; 732 else 733 return new FastDataAccessMMUMiss; 734 735 } 736 --- 155 unchanged lines hidden (view full) --- 892 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS1)); 893 break; 894 case ASI_IMMU_CTXT_NONZERO_CONFIG: 895 assert(va == 0); 896 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG)); 897 break; 898 case ASI_SPARC_ERROR_STATUS_REG: 899 warn("returning 0 for SPARC ERROR regsiter read\n"); | 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"); |
900 pkt->set((uint64_t)0); | 898 pkt->set(0); |
901 break; 902 case ASI_HYP_SCRATCHPAD: 903 case ASI_SCRATCHPAD: 904 pkt->set(tc->readMiscRegWithEffect(MISCREG_SCRATCHPAD_R0 + (va >> 3))); 905 break; 906 case ASI_IMMU: 907 switch (va) { 908 case 0x0: --- 53 unchanged lines hidden (view full) --- 962 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_CONFIG); 963 } else { 964 tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS1); 965 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_CONFIG); 966 } 967 data = mbits(tsbtemp,63,13); 968 if (bits(tsbtemp,12,12)) 969 data |= ULL(1) << (13+bits(tsbtemp,3,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)); |
970 data |= temp >> (9 + bits(cnftemp,10,8) * 3) & | 968 data |= temp >> (9 + bits(cnftemp,2,0) * 3) & |
971 mbits((uint64_t)-1ll,12+bits(tsbtemp,3,0), 4); 972 pkt->set(data); 973 break; 974 case ASI_IMMU_TSB_PS0_PTR_REG: 975 temp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS); 976 if (bits(temp,12,0) == 0) { 977 tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_TSB_PS0); 978 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG); --- 13 unchanged lines hidden (view full) --- 992 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG); 993 } else { 994 tsbtemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS1); 995 cnftemp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG); 996 } 997 data = mbits(tsbtemp,63,13); 998 if (bits(tsbtemp,12,12)) 999 data |= ULL(1) << (13+bits(tsbtemp,3,0)); | 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)); |
1000 data |= temp >> (9 + bits(cnftemp,10,8) * 3) & | 998 data |= temp >> (9 + bits(cnftemp,2,0) * 3) & |
1001 mbits((uint64_t)-1ll,12+bits(tsbtemp,3,0), 4); 1002 pkt->set(data); 1003 break; 1004 1005 default: 1006doMmuReadError: 1007 panic("need to impl DTB::doMmuRegRead() got asi=%#x, va=%#x\n", 1008 (uint32_t)asi, va); --- 102 unchanged lines hidden (view full) --- 1111 tc->setMiscRegWithEffect(MISCREG_SCRATCHPAD_R0 + (va >> 3), data); 1112 break; 1113 case ASI_IMMU: 1114 switch (va) { 1115 case 0x18: 1116 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_SFSR, data); 1117 break; 1118 case 0x30: | 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: |
1119 sext<59>(bits(data, 59,0)); | |
1120 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS, data); 1121 break; 1122 default: 1123 goto doMmuWriteError; 1124 } 1125 break; 1126 case ASI_ITLB_DATA_ACCESS_REG: 1127 entry_insert = bits(va, 8,3); --- 58 unchanged lines hidden (view full) --- 1186 } 1187 break; 1188 case ASI_DMMU: 1189 switch (va) { 1190 case 0x18: 1191 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_SFSR, data); 1192 break; 1193 case 0x30: | 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: |
1194 sext<59>(bits(data, 59,0)); | |
1195 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS, data); 1196 break; 1197 case 0x80: 1198 tc->setMiscRegWithEffect(MISCREG_MMU_PART_ID, data); 1199 break; 1200 default: 1201 goto doMmuWriteError; 1202 } --- 99 unchanged lines hidden --- | 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 --- |