table_walker.cc (11583:13c5ba4250b3) table_walker.cc (11588:32cbf6ab7730)
1/*
2 * Copyright (c) 2010, 2012-2016 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 51 unchanged lines hidden (view full) ---

60 : MemObject(p),
61 stage2Mmu(NULL), port(NULL), masterId(Request::invldMasterId),
62 isStage2(p->is_stage2), tlb(NULL),
63 currState(NULL), pending(false),
64 numSquashable(p->num_squash_per_cycle),
65 pendingReqs(0),
66 pendingChangeTick(curTick()),
67 doL1DescEvent(this), doL2DescEvent(this),
1/*
2 * Copyright (c) 2010, 2012-2016 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 51 unchanged lines hidden (view full) ---

60 : MemObject(p),
61 stage2Mmu(NULL), port(NULL), masterId(Request::invldMasterId),
62 isStage2(p->is_stage2), tlb(NULL),
63 currState(NULL), pending(false),
64 numSquashable(p->num_squash_per_cycle),
65 pendingReqs(0),
66 pendingChangeTick(curTick()),
67 doL1DescEvent(this), doL2DescEvent(this),
68 doL0LongDescEvent(this), doL1LongDescEvent(this), doL2LongDescEvent(this),
69 doL3LongDescEvent(this),
68 doL0LongDescEvent(this), doL1LongDescEvent(this),
69 doL2LongDescEvent(this), doL3LongDescEvent(this),
70 LongDescEventByLevel { &doL0LongDescEvent, &doL1LongDescEvent,
71 &doL2LongDescEvent, &doL3LongDescEvent },
70 doProcessEvent(this)
71{
72 sctlr = 0;
73
74 // Cache system-level properties
75 if (FullSystem) {
76 ArmSystem *armSys = dynamic_cast<ArmSystem *>(p->sys);
77 assert(armSys);

--- 55 unchanged lines hidden (view full) ---

133 delayed(false), tableWalker(nullptr)
134{
135}
136
137void
138TableWalker::completeDrain()
139{
140 if (drainState() == DrainState::Draining &&
72 doProcessEvent(this)
73{
74 sctlr = 0;
75
76 // Cache system-level properties
77 if (FullSystem) {
78 ArmSystem *armSys = dynamic_cast<ArmSystem *>(p->sys);
79 assert(armSys);

--- 55 unchanged lines hidden (view full) ---

135 delayed(false), tableWalker(nullptr)
136{
137}
138
139void
140TableWalker::completeDrain()
141{
142 if (drainState() == DrainState::Draining &&
141 stateQueues[L1].empty() && stateQueues[L2].empty() &&
143 stateQueues[L0].empty() && stateQueues[L1].empty() &&
144 stateQueues[L2].empty() && stateQueues[L3].empty() &&
142 pendingQueue.empty()) {
143
144 DPRINTF(Drain, "TableWalker done draining, processing drain event\n");
145 signalDrainDone();
146 }
147}
148
149DrainState

--- 542 unchanged lines hidden (view full) ---

692 if (currState->sctlr.c == 0) {
693 flag.set(Request::UNCACHEABLE);
694 }
695
696 currState->longDesc.lookupLevel = start_lookup_level;
697 currState->longDesc.aarch64 = false;
698 currState->longDesc.grainSize = Grain4KB;
699
145 pendingQueue.empty()) {
146
147 DPRINTF(Drain, "TableWalker done draining, processing drain event\n");
148 signalDrainDone();
149 }
150}
151
152DrainState

--- 542 unchanged lines hidden (view full) ---

695 if (currState->sctlr.c == 0) {
696 flag.set(Request::UNCACHEABLE);
697 }
698
699 currState->longDesc.lookupLevel = start_lookup_level;
700 currState->longDesc.aarch64 = false;
701 currState->longDesc.grainSize = Grain4KB;
702
700 Event *event = start_lookup_level == L1 ? (Event *) &doL1LongDescEvent
701 : (Event *) &doL2LongDescEvent;
702
703 bool delayed = fetchDescriptor(desc_addr, (uint8_t*)&currState->longDesc.data,
704 sizeof(uint64_t), flag, start_lookup_level,
703 bool delayed = fetchDescriptor(desc_addr, (uint8_t*)&currState->longDesc.data,
704 sizeof(uint64_t), flag, start_lookup_level,
705 event, &TableWalker::doLongDescriptor);
705 LongDescEventByLevel[start_lookup_level],
706 &TableWalker::doLongDescriptor);
706 if (!delayed) {
707 f = currState->fault;
708 }
709
710 return f;
711}
712
713unsigned

--- 248 unchanged lines hidden (view full) ---

962 flag.set(Request::SECURE);
963 }
964
965 currState->longDesc.lookupLevel = start_lookup_level;
966 currState->longDesc.aarch64 = true;
967 currState->longDesc.grainSize = tg;
968
969 if (currState->timing) {
707 if (!delayed) {
708 f = currState->fault;
709 }
710
711 return f;
712}
713
714unsigned

--- 248 unchanged lines hidden (view full) ---

963 flag.set(Request::SECURE);
964 }
965
966 currState->longDesc.lookupLevel = start_lookup_level;
967 currState->longDesc.aarch64 = true;
968 currState->longDesc.grainSize = tg;
969
970 if (currState->timing) {
970 Event *event;
971 switch (start_lookup_level) {
972 case L0:
973 event = (Event *) &doL0LongDescEvent;
974 break;
975 case L1:
976 event = (Event *) &doL1LongDescEvent;
977 break;
978 case L2:
979 event = (Event *) &doL2LongDescEvent;
980 break;
981 case L3:
982 event = (Event *) &doL3LongDescEvent;
983 break;
984 default:
985 panic("Invalid table lookup level");
986 break;
987 }
988 port->dmaAction(MemCmd::ReadReq, desc_addr, sizeof(uint64_t),
989 event, (uint8_t*) &currState->longDesc.data,
990 currState->tc->getCpuPtr()->clockPeriod(), flag);
991 DPRINTF(TLBVerbose,
992 "Adding to walker fifo: queue size before adding: %d\n",
993 stateQueues[start_lookup_level].size());
994 stateQueues[start_lookup_level].push_back(currState);
995 currState = NULL;
971 fetchDescriptor(desc_addr, (uint8_t*) &currState->longDesc.data,
972 sizeof(uint64_t), flag, start_lookup_level,
973 LongDescEventByLevel[start_lookup_level], NULL);
996 } else {
997 fetchDescriptor(desc_addr, (uint8_t*)&currState->longDesc.data,
998 sizeof(uint64_t), flag, -1, NULL,
999 &TableWalker::doLongDescriptor);
1000 f = currState->fault;
1001 }
1002
1003 return f;

--- 663 unchanged lines hidden (view full) ---

1667 }
1668 return;
1669 }
1670
1671 Request::Flags flag = Request::PT_WALK;
1672 if (currState->secureLookup)
1673 flag.set(Request::SECURE);
1674
974 } else {
975 fetchDescriptor(desc_addr, (uint8_t*)&currState->longDesc.data,
976 sizeof(uint64_t), flag, -1, NULL,
977 &TableWalker::doLongDescriptor);
978 f = currState->fault;
979 }
980
981 return f;

--- 663 unchanged lines hidden (view full) ---

1645 }
1646 return;
1647 }
1648
1649 Request::Flags flag = Request::PT_WALK;
1650 if (currState->secureLookup)
1651 flag.set(Request::SECURE);
1652
1675 currState->longDesc.lookupLevel =
1653 LookupLevel L = currState->longDesc.lookupLevel =
1676 (LookupLevel) (currState->longDesc.lookupLevel + 1);
1677 Event *event = NULL;
1654 (LookupLevel) (currState->longDesc.lookupLevel + 1);
1655 Event *event = NULL;
1678 switch (currState->longDesc.lookupLevel) {
1656 switch (L) {
1679 case L1:
1680 assert(currState->aarch64);
1657 case L1:
1658 assert(currState->aarch64);
1681 event = &doL1LongDescEvent;
1682 break;
1683 case L2:
1659 case L2:
1684 event = &doL2LongDescEvent;
1685 break;
1686 case L3:
1660 case L3:
1687 event = &doL3LongDescEvent;
1661 event = LongDescEventByLevel[L];
1688 break;
1689 default:
1690 panic("Wrong lookup level in table walk\n");
1691 break;
1692 }
1693
1694 bool delayed;
1695 delayed = fetchDescriptor(next_desc_addr, (uint8_t*)&currState->longDesc.data,

--- 576 unchanged lines hidden ---
1662 break;
1663 default:
1664 panic("Wrong lookup level in table walk\n");
1665 break;
1666 }
1667
1668 bool delayed;
1669 delayed = fetchDescriptor(next_desc_addr, (uint8_t*)&currState->longDesc.data,

--- 576 unchanged lines hidden ---