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