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