gem5
v20.1.0.0
arch
sparc
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
;
43
RangeMap
tree
;
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
83
intersect
(
const
TlbRange
&
r
)
84
{
85
iterator
i
;
86
i
=
find
(
r
);
87
if
(
i
!=
tree
.end())
88
return
true
;
89
return
false
;
90
}
91
92
93
iterator
94
insert
(
TlbRange
&
r
,
TlbEntry
*
d
)
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
103
erase
(
TlbRange
k
)
104
{
105
return
tree
.erase(
k
);
106
}
107
108
void
109
erase
(
iterator
p
)
110
{
111
tree
.erase(
p
);
112
}
113
114
void
115
erase
(
iterator
p
,
iterator
q
)
116
{
117
tree
.erase(
p
,
q
);
118
}
119
120
void
121
clear
()
122
{
123
tree
.erase(
tree
.begin(),
tree
.end());
124
}
125
126
iterator
127
begin
()
128
{
129
return
tree
.begin();
130
}
131
132
iterator
133
end
()
134
{
135
return
tree
.end();
136
}
137
138
size_t
139
size
()
140
{
141
return
tree
.size();
142
}
143
144
bool
145
empty
()
146
{
147
return
tree
.empty();
148
}
149
150
void
151
print
()
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