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 ---