gem5  v20.1.0.0
tlb_map.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2006 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 
29 #ifndef __ARCH_SPARC_TLB_MAP_HH__
30 #define __ARCH_SPARC_TLB_MAP_HH__
31 
32 #include <map>
33 
34 #include "arch/sparc/pagetable.hh"
35 
36 namespace SparcISA
37 {
38 
39 class TlbMap
40 {
41  private:
42  typedef std::map<TlbRange, TlbEntry*> RangeMap;
44 
45  public:
46  typedef RangeMap::iterator iterator;
47 
48  iterator
49  find(const TlbRange &r)
50  {
51  iterator i;
52 
53  i = tree.upper_bound(r);
54 
55  if (i == tree.begin()) {
56  if (r.real == i->first.real &&
57  r.partitionId == i->first.partitionId &&
58  i->first.va < r.va + r.size &&
59  i->first.va+i->first.size >= r.va &&
60  (r.real || r.contextId == i->first.contextId))
61  return i;
62  else
63  // Nothing could match, so return end()
64  return tree.end();
65  }
66 
67  i--;
68 
69  if (r.real != i->first.real)
70  return tree.end();
71  if (!r.real && r.contextId != i->first.contextId)
72  return tree.end();
73  if (r.partitionId != i->first.partitionId)
74  return tree.end();
75  if (i->first.va <= r.va+r.size &&
76  i->first.va+i->first.size >= r.va)
77  return i;
78 
79  return tree.end();
80  }
81 
82  bool
84  {
85  iterator i;
86  i = find(r);
87  if (i != tree.end())
88  return true;
89  return false;
90  }
91 
92 
93  iterator
95  {
96  if (intersect(r))
97  return tree.end();
98 
99  return tree.insert(std::make_pair(r, d)).first;
100  }
101 
102  size_t
104  {
105  return tree.erase(k);
106  }
107 
108  void
110  {
111  tree.erase(p);
112  }
113 
114  void
116  {
117  tree.erase(p,q);
118  }
119 
120  void
122  {
123  tree.erase(tree.begin(), tree.end());
124  }
125 
126  iterator
128  {
129  return tree.begin();
130  }
131 
132  iterator
133  end()
134  {
135  return tree.end();
136  }
137 
138  size_t
140  {
141  return tree.size();
142  }
143 
144  bool
146  {
147  return tree.empty();
148  }
149 
150  void
152  {
153  iterator i;
154  i = tree.begin();
155  while (i != tree.end()) {
156  std::cout << std::hex << i->first.va << " " << i->first.size << " " <<
157  i->first.contextId << " " << i->first.partitionId << " " <<
158  i->first.real << " " << i->second << std::endl;
159  i++;
160  }
161  }
162 
163 };
164 
165 };
166 
167 #endif // __ARCH_SPARC_TLB_MAP_HH__
SparcISA::TlbMap::RangeMap
std::map< TlbRange, TlbEntry * > RangeMap
Definition: tlb_map.hh:42
SparcISA::TlbMap::begin
iterator begin()
Definition: tlb_map.hh:127
ArmISA::i
Bitfield< 7 > i
Definition: miscregs_types.hh:63
SparcISA::TlbMap::insert
iterator insert(TlbRange &r, TlbEntry *d)
Definition: tlb_map.hh:94
SparcISA::TlbMap::empty
bool empty()
Definition: tlb_map.hh:145
SparcISA::TlbEntry
Definition: pagetable.hh:221
ArmISA::q
Bitfield< 27 > q
Definition: miscregs_types.hh:52
SparcISA::TlbMap::end
iterator end()
Definition: tlb_map.hh:133
SparcISA::TlbMap::clear
void clear()
Definition: tlb_map.hh:121
SparcISA::TlbMap::size
size_t size()
Definition: tlb_map.hh:139
SparcISA
Definition: asi.cc:31
SparcISA::TlbMap::erase
size_t erase(TlbRange k)
Definition: tlb_map.hh:103
MipsISA::k
Bitfield< 23 > k
Definition: dt_constants.hh:78
SparcISA::TlbMap::print
void print()
Definition: tlb_map.hh:151
ArmISA::d
Bitfield< 9 > d
Definition: miscregs_types.hh:60
MipsISA::r
r
Definition: pra_constants.hh:95
SparcISA::TlbMap::iterator
RangeMap::iterator iterator
Definition: tlb_map.hh:46
SparcISA::TlbMap::erase
void erase(iterator p, iterator q)
Definition: tlb_map.hh:115
SparcISA::TlbRange
Definition: pagetable.hh:176
SparcISA::TlbMap::intersect
bool intersect(const TlbRange &r)
Definition: tlb_map.hh:83
SparcISA::TlbMap
Definition: tlb_map.hh:39
SparcISA::TlbMap::erase
void erase(iterator p)
Definition: tlb_map.hh:109
MipsISA::p
Bitfield< 0 > p
Definition: pra_constants.hh:323
SparcISA::TlbMap::tree
RangeMap tree
Definition: tlb_map.hh:43
pagetable.hh
SparcISA::TlbMap::find
iterator find(const TlbRange &r)
Definition: tlb_map.hh:49

Generated on Wed Sep 30 2020 14:02:07 for gem5 by doxygen 1.8.17