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), 69 doL2LongDescEvent(this), doL3LongDescEvent(this), 70 LongDescEventByLevel { &doL0LongDescEvent, &doL1LongDescEvent, 71 &doL2LongDescEvent, &doL3LongDescEvent }, |
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 && |
143 stateQueues[L0].empty() && stateQueues[L1].empty() && 144 stateQueues[L2].empty() && stateQueues[L3].empty() && |
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 |
703 bool delayed = fetchDescriptor(desc_addr, (uint8_t*)&currState->longDesc.data, 704 sizeof(uint64_t), flag, start_lookup_level, |
705 LongDescEventByLevel[start_lookup_level], 706 &TableWalker::doLongDescriptor); |
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) { |
971 fetchDescriptor(desc_addr, (uint8_t*) &currState->longDesc.data, 972 sizeof(uint64_t), flag, start_lookup_level, 973 LongDescEventByLevel[start_lookup_level], NULL); |
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 |
1653 LookupLevel L = currState->longDesc.lookupLevel = |
1654 (LookupLevel) (currState->longDesc.lookupLevel + 1); 1655 Event *event = NULL; |
1656 switch (L) { |
1657 case L1: 1658 assert(currState->aarch64); |
1659 case L2: |
1660 case L3: |
1661 event = LongDescEventByLevel[L]; |
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 --- |