gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
vtophys.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2002-2005 The Regents of The University of Michigan
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met: redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer;
9  * redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution;
12  * neither the name of the copyright holders nor the names of its
13  * contributors may be used to endorse or promote products derived from
14  * this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * Authors: Ali Saidi
29  */
30 
31 #include "arch/sparc/vtophys.hh"
32 
33 #include <string>
34 
35 #include "arch/sparc/tlb.hh"
36 #include "base/chunk_generator.hh"
37 #include "base/compiler.hh"
38 #include "base/trace.hh"
39 #include "cpu/thread_context.hh"
40 #include "debug/VtoPhys.hh"
41 #include "mem/port_proxy.hh"
42 
43 using namespace std;
44 
45 namespace SparcISA {
46 
47 Addr
49 {
50  // In SPARC it's almost always impossible to turn a VA->PA w/o a
51  // context The only times we can kinda do it are if we have a
52  // SegKPM mapping and can find the real address in the tlb or we
53  // have a physical adddress already (beacuse we are looking at the
54  // hypervisor) Either case is rare, so we'll just panic.
55 
56  panic("vtophys() without context on SPARC largly worthless\n");
57  M5_DUMMY_RETURN;
58 }
59 
60 Addr
62 {
63  // Here we have many options and are really implementing something like
64  // a fill handler to find the address since there isn't a multilevel
65  // table for us to walk around.
66  //
67  // 1. We are currently hyperpriv, return the address unmodified
68  // 2. The mmu is off return(ra->pa)
69  // 3. We are currently priv, use ctx0* tsbs to find the page
70  // 4. We are not priv, use ctxN0* tsbs to find the page
71  // For all accesses we check the tlbs first since it's possible that
72  // long standing pages (e.g. locked kernel mappings) won't be in the tsb
73  uint64_t tlbdata = tc->readMiscRegNoEffect(MISCREG_TLB_DATA);
74 
75  bool hpriv = bits(tlbdata,0,0);
76  // bool priv = bits(tlbdata,2,2);
77  bool addr_mask = bits(tlbdata,3,3);
78  bool data_real = !bits(tlbdata,5,5);
79  bool inst_real = !bits(tlbdata,4,4);
80  bool ctx_zero = bits(tlbdata,18,16) > 0;
81  int part_id = bits(tlbdata,15,8);
82  int pri_context = bits(tlbdata,47,32);
83  // int sec_context = bits(tlbdata,63,48);
84 
85  PortProxy &mem = tc->getPhysProxy();
86  TLB* itb = tc->getITBPtr();
87  TLB* dtb = tc->getDTBPtr();
88  TlbEntry* tbe;
89  PageTableEntry pte;
90  Addr tsbs[4];
91  Addr va_tag;
92  TteTag ttetag;
93 
94  if (hpriv)
95  return addr;
96 
97  if (addr_mask)
98  addr = addr & VAddrAMask;
99 
100  tbe = dtb->lookup(addr, part_id, data_real, ctx_zero ? 0 : pri_context ,
101  false);
102  if (tbe)
103  goto foundtbe;
104 
105  tbe = itb->lookup(addr, part_id, inst_real, ctx_zero ? 0 : pri_context,
106  false);
107  if (tbe)
108  goto foundtbe;
109 
110  // We didn't find it in the tlbs, so lets look at the TSBs
111  dtb->GetTsbPtr(tc, addr, ctx_zero ? 0 : pri_context, tsbs);
112  va_tag = bits(addr, 63, 22);
113  for (int x = 0; x < 4; x++) {
114  ttetag = betoh(mem.read<uint64_t>(tsbs[x]));
115  if (ttetag.valid() && ttetag.va() == va_tag) {
116  uint64_t entry = mem.read<uint64_t>(tsbs[x]) + sizeof(uint64_t);
117  // I think it's sun4v at least!
118  pte.populate(betoh(entry), PageTableEntry::sun4v);
119  DPRINTF(VtoPhys, "Virtual(%#x)->Physical(%#x) found in TTE\n",
120  addr, pte.translate(addr));
121  goto foundpte;
122  }
123  }
124  panic("couldn't translate %#x\n", addr);
125 
126  foundtbe:
127  pte = tbe->pte;
128  DPRINTF(VtoPhys, "Virtual(%#x)->Physical(%#x) found in TLB\n", addr,
129  pte.translate(addr));
130  foundpte:
131  return pte.translate(addr);
132 }
133 
134 } // namespace SparcISA
Addr translate(Addr vaddr) const
Definition: pagetable.hh:175
#define DPRINTF(x,...)
Definition: trace.hh:212
#define panic(...)
Definition: misc.hh:153
const Addr VAddrAMask
Definition: isa_traits.hh:66
ip6_addr_t addr
Definition: inet.hh:335
virtual MiscReg readMiscRegNoEffect(int misc_reg) const =0
TlbEntry * lookup(Addr va, int partition_id, bool real, int context_id=0, bool update_used=true)
lookup an entry in the TLB based on the partition id, and real bit if real is true or the partition i...
Definition: tlb.cc:196
ThreadContext is the external interface to all thread state for anything outside of the CPU...
void populate(uint64_t e, EntryType t=sun4u)
Definition: pagetable.hh:98
Bitfield< 2 > hpriv
Definition: miscregs.hh:121
bool valid() const
Definition: pagetable.hh:67
PortProxy Object Declaration.
virtual PortProxy & getPhysProxy()=0
virtual TheISA::TLB * getDTBPtr()=0
T read(Addr address) const
Read sizeof(T) bytes from address and return as object T.
Definition: port_proxy.hh:146
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
This object is a proxy for a structural port, to be used for debug accesses.
Definition: port_proxy.hh:84
void GetTsbPtr(ThreadContext *tc, Addr addr, int ctx, Addr *ptrs)
Definition: tlb.cc:1303
Bitfield< 17 > tbe
Definition: mt_constants.hh:80
Addr va() const
Definition: pagetable.hh:68
T betoh(T value)
Definition: byteswap.hh:154
PageTableEntry pte
Definition: pagetable.hh:264
Addr vtophys(ThreadContext *tc, Addr vaddr)
Definition: vtophys.cc:61
Declaration and inline definition of ChunkGenerator object.
T bits(T val, int first, int last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it...
Definition: bitfield.hh:67
Bitfield< 1 > x
Definition: types.hh:105
virtual TheISA::TLB * getITBPtr()=0

Generated on Fri Jun 9 2017 13:03:37 for gem5 by doxygen 1.8.6