vtophys.cc (10037:5cac77888310) | vtophys.cc (10707:f7d17d8a854c) |
---|---|
1/* 2 * Copyright (c) 2010, 2012-2013 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 --- 49 unchanged lines hidden (view full) --- 58using namespace ArmISA; 59 60Addr 61ArmISA::vtophys(Addr vaddr) 62{ 63 fatal("VTOPHYS: Can't convert vaddr to paddr on ARM without a thread context"); 64} 65 | 1/* 2 * Copyright (c) 2010, 2012-2013 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 --- 49 unchanged lines hidden (view full) --- 58using namespace ArmISA; 59 60Addr 61ArmISA::vtophys(Addr vaddr) 62{ 63 fatal("VTOPHYS: Can't convert vaddr to paddr on ARM without a thread context"); 64} 65 |
66Addr 67ArmISA::vtophys(ThreadContext *tc, Addr addr) | 66static std::pair<bool, Addr> 67try_translate(ThreadContext *tc, Addr addr) |
68{ 69 Fault fault; 70 // Set up a functional memory Request to pass to the TLB 71 // to get it to translate the vaddr to a paddr 72 Request req(0, addr, 64, 0x40, -1, 0, 0, 0); 73 ArmISA::TLB *tlb; 74 75 // Check the TLBs for a translation 76 // It's possible that there is a valid translation in the tlb 77 // that is no loger valid in the page table in memory 78 // so we need to check here first 79 // 80 // Calling translateFunctional invokes a table-walk if required 81 // so we should always succeed 82 tlb = static_cast<ArmISA::TLB*>(tc->getDTBPtr()); 83 fault = tlb->translateFunctional(&req, tc, BaseTLB::Read, TLB::NormalTran); 84 if (fault == NoFault) | 68{ 69 Fault fault; 70 // Set up a functional memory Request to pass to the TLB 71 // to get it to translate the vaddr to a paddr 72 Request req(0, addr, 64, 0x40, -1, 0, 0, 0); 73 ArmISA::TLB *tlb; 74 75 // Check the TLBs for a translation 76 // It's possible that there is a valid translation in the tlb 77 // that is no loger valid in the page table in memory 78 // so we need to check here first 79 // 80 // Calling translateFunctional invokes a table-walk if required 81 // so we should always succeed 82 tlb = static_cast<ArmISA::TLB*>(tc->getDTBPtr()); 83 fault = tlb->translateFunctional(&req, tc, BaseTLB::Read, TLB::NormalTran); 84 if (fault == NoFault) |
85 return req.getPaddr(); | 85 return std::make_pair(true, req.getPaddr()); |
86 87 tlb = static_cast<ArmISA::TLB*>(tc->getITBPtr()); 88 fault = tlb->translateFunctional(&req, tc, BaseTLB::Read, TLB::NormalTran); 89 if (fault == NoFault) | 86 87 tlb = static_cast<ArmISA::TLB*>(tc->getITBPtr()); 88 fault = tlb->translateFunctional(&req, tc, BaseTLB::Read, TLB::NormalTran); 89 if (fault == NoFault) |
90 return req.getPaddr(); | 90 return std::make_pair(true, req.getPaddr()); |
91 | 91 |
92 panic("Table walkers support functional accesses. We should never get here\n"); | 92 return std::make_pair(false, 0); |
93} 94 | 93} 94 |
95Addr 96ArmISA::vtophys(ThreadContext *tc, Addr addr) 97{ 98 const std::pair<bool, Addr> translation(try_translate(tc, addr)); 99 100 if (translation.first) 101 return translation.second; 102 else 103 panic("Table walkers support functional accesses. We should never get here\n"); 104} 105 |
|
95bool 96ArmISA::virtvalid(ThreadContext *tc, Addr vaddr) 97{ | 106bool 107ArmISA::virtvalid(ThreadContext *tc, Addr vaddr) 108{ |
98 if (vtophys(tc, vaddr) != -1) 99 return true; 100 return false; | 109 const std::pair<bool, Addr> translation(try_translate(tc, vaddr)); 110 111 return translation.first; |
101} 102 103 | 112} 113 114 |