gem5 v24.1.0.1
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
pagetable.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013, 2018-2019, 2021, 2024 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
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#include "arch/arm/pagetable.hh"
39
40#include "base/bitfield.hh"
41#include "base/logging.hh"
42
43namespace gem5
44{
45
46namespace ArmISA
47{
48
53
54Addr
56{
57 return ~mask(walkBits(level));
58}
59
60bool
62{
63 switch (level) {
64 case 1: return pte & 0x1;
65 case 2: return pte & 0x1;
66 case 3: return (pte & 0x1) && (pte & 0x2);
67 default: panic("bad level %d", level);
68 }
69}
70
71bool
73{
74 switch (level) {
75 case 1: return !(pte & 0x2);
76 case 2: return !(pte & 0x2);
77 case 3: return true;
78 default: panic("bad level %d", level);
79 }
80}
81
82bool
83V7LPageTableOps::isWritable(pte_t pte, unsigned level, bool stage2) const
84{
85 return stage2 ? bits(pte, 7, 6)==3 : bits(pte, 7)==0;
86}
87
88Addr
90{
91 if (isLeaf(pte, level)) {
92 switch (level) {
93 case 1: return mbits(pte, 39, 30);
94 case 2: return mbits(pte, 39, 21);
95 case 3: return mbits(pte, 39, 12);
96 default: panic("bad level %d", level);
97 }
98 } else {
99 return mbits(pte, 39, 12);
100 }
101}
102
103Addr
104V7LPageTableOps::index(Addr va, unsigned level, int tsz) const
105{
106 // In theory this should be configurable...
107 const int n = 12;
108
109 switch (level) {
110 case 1: return bits(va, std::min(26+n, tsz - 1), 30) << 3; break;
111 case 2: return bits(va, std::min(29, tsz - 1), 21) << 3; break;
112 case 3: return bits(va, std::min(20, tsz - 1), 12) << 3; break;
113 default: panic("bad level %d", level);
114 }
115}
116
117Addr
119{
120 switch (level) {
121 case 1: return ~mask(30);
122 case 2: return ~mask(21);
123 case 3: return bits(pte, 52) ? ~mask(16) : ~mask(12);
124 default: panic("bad level %d", level);
125 }
126}
127
128unsigned
130{
131 switch (level) {
132 case 1: return 30;
133 case 2: return 21;
134 case 3: return 12;
135 default: panic("bad level %d", level);
136 }
137}
138
141{
142 return LookupLevel::L1;
143}
144
147{
148 return LookupLevel::L3;
149}
150
151bool
153{
154 switch (level) {
155 case 0: return pte & 0x1;
156 case 1: return pte & 0x1;
157 case 2: return pte & 0x1;
158 case 3: return (pte & 0x1) && (pte & 0x2);
159 default: panic("bad level %d", level);
160 }
161}
162
163bool
165{
166 switch (level) {
167 case 0: return false;
168 case 1: return !(pte & 0x2);
169 case 2: return !(pte & 0x2);
170 case 3: return true;
171 default: panic("bad level %d", level);
172 }
173}
174
175bool
176V8PageTableOps4k::isWritable(pte_t pte, unsigned level, bool stage2) const
177{
178 return stage2 ? bits(pte, 7, 6)==3 : bits(pte, 7)==0;
179}
180
181Addr
183{
184 if (isLeaf(pte, level)) {
185 switch (level) {
186 // no level 0 here
187 case 1: return mbits(pte, 47, 30);
188 case 2: return mbits(pte, 47, 21);
189 case 3: return mbits(pte, 47, 12);
190 default: panic("bad level %d", level);
191 }
192 } else {
193 return mbits(pte, 47, 12);
194 }
195}
196
197Addr
198V8PageTableOps4k::index(Addr va, unsigned level, int tsz) const
199{
200 switch (level) {
201 case 0: return bits(va, std::min(47, tsz - 1), 39) << 3; break;
202 case 1: return bits(va, std::min(38, tsz - 1), 30) << 3; break;
203 case 2: return bits(va, std::min(29, tsz - 1), 21) << 3; break;
204 case 3: return bits(va, std::min(20, tsz - 1), 12) << 3; break;
205 default: panic("bad level %d", level);
206 }
207}
208
209Addr
211{
212 switch (level) {
213 // no level 0 here
214 case 1: return ~mask(30);
215 case 2: return ~mask(21);
216 case 3: return bits(pte, 52) ? ~mask(16) : ~mask(12);
217 default: panic("bad level %d", level);
218 }
219}
220
221unsigned
223{
224 switch (level) {
225 case 0: return 39;
226 case 1: return 30;
227 case 2: return 21;
228 case 3: return 12;
229 default: panic("bad level %d", level);
230 }
231}
232
235{
236 if (tsz >= 16 && tsz <= 24) return LookupLevel::L0;
237 if (tsz >= 25 && tsz <= 33) return LookupLevel::L1;
238 if (tsz >= 34 && tsz <= 39) return LookupLevel::L2;
239
240 panic("Unsupported TnSZ: %d\n", tsz);
241}
242
245{
246 switch (sl0) {
247 case 0: return LookupLevel::L2;
248 case 1: return LookupLevel::L1;
249 case 2: return LookupLevel::L0;
250 case 3: return LookupLevel::L3; // Only when FEAT_TTST is implemented
251 default: panic("Unsupported VTCR_EL2.SL0: %d", sl0);
252 }
253}
254
257{
258 return LookupLevel::L3;
259}
260
261bool
263{
264 switch (level) {
265 case 0: return pte & 0x1;
266 case 1: return pte & 0x1;
267 case 2: return pte & 0x1;
268 case 3: return (pte & 0x1) && (pte & 0x2);
269 default: panic("bad level %d", level);
270 }
271}
272
273bool
275{
276 switch (level) {
277 case 0: return false;
278 case 1: return false;
279 case 2: return !(pte & 0x2);
280 case 3: return true;
281 default: panic("bad level %d", level);
282 }
283}
284
285bool
286V8PageTableOps16k::isWritable(pte_t pte, unsigned level, bool stage2) const
287{
288 return stage2 ? bits(pte, 7, 6) == 3 : bits(pte, 7) == 0;
289}
290
291Addr
293{
294 if (isLeaf(pte, level)) {
295 switch (level) {
296 // no level 0 here
297 case 1: return mbits(pte, 47, 36);
298 case 2: return mbits(pte, 47, 25);
299 case 3: return mbits(pte, 47, 14);
300 default: panic("bad level %d", level);
301 }
302 } else {
303 return mbits(pte, 47, 14);
304 }
305}
306
307Addr
308V8PageTableOps16k::index(Addr va, unsigned level, int tsz) const
309{
310 switch (level) {
311 case 0: return bits(va, std::min(47, tsz - 1), 47) << 3; break;
312 case 1: return bits(va, std::min(46, tsz - 1), 36) << 3; break;
313 case 2: return bits(va, std::min(35, tsz - 1), 25) << 3; break;
314 case 3: return bits(va, std::min(24, tsz - 1), 14) << 3; break;
315 default: panic("bad level %d", level);
316 }
317}
318
319Addr
321{
322 switch (level) {
323 // no level 0 here
324 case 1: return ~mask(36);
325 // 16K granule supports contiguous entries also at L2; - 1G
326 case 2: return bits(pte, 52) ? ~mask(30) : ~mask(25);
327 // as well as at L3; - 2M
328 case 3: return bits(pte, 52) ? ~mask(21) : ~mask(14);
329 default: panic("bad level %d", level);
330 }
331}
332
333unsigned
335{
336 switch (level) {
337 case 0: return 47;
338 case 1: return 36;
339 case 2: return 25;
340 case 3: return 14;
341 default: panic("bad level %d", level);
342 }
343}
344
347{
348 if (tsz == 16) return LookupLevel::L0;
349 if (tsz >= 17 && tsz <= 27) return LookupLevel::L1;
350 if (tsz >= 28 && tsz <= 38) return LookupLevel::L2;
351 if (tsz == 39) return LookupLevel::L3;
352
353 panic("Unsupported TnSZ: %d\n", tsz);
354}
355
358{
359 switch (sl0) {
360 case 0: return LookupLevel::L3;
361 case 1: return LookupLevel::L2;
362 case 2: return LookupLevel::L1;
363 default: panic("Unsupported VTCR_EL2.SL0: %d", sl0);
364 }
365}
366
369{
370 return LookupLevel::L3;
371}
372
373bool
375{
376 switch (level) {
377 case 1: return pte & 0x1;
378 case 2: return pte & 0x1;
379 case 3: return (pte & 0x1) && (pte & 0x2);
380 default: panic("bad level %d", level);
381 }
382}
383
384bool
386{
387 switch (level) {
388 case 1: return false;
389 case 2: return !(pte & 0x2);
390 case 3: return true;
391 default: panic("bad level %d", level);
392 }
393}
394
395bool
396V8PageTableOps64k::isWritable(pte_t pte, unsigned level, bool stage2) const
397{
398 return stage2 ? bits(pte, 7, 6)==3 : bits(pte, 7)==0;
399}
400
401Addr
403{
404 if (isLeaf(pte, level)) {
405 switch (level) {
406 // no level 1 here
407 case 2: return mbits(pte, 47, 29);
408 case 3: return mbits(pte, 47, 16);
409 default: panic("bad level %d", level);
410 }
411 } else {
412 return mbits(pte, 47, 16);
413 }
414}
415
416Addr
417V8PageTableOps64k::index(Addr va, unsigned level, int tsz) const
418{
419 switch (level) {
420 case 1: return bits(va, std::min(47, tsz - 1), 42) << 3; break;
421 case 2: return bits(va, std::min(41, tsz - 1), 29) << 3; break;
422 case 3: return bits(va, std::min(28, tsz - 1), 16) << 3; break;
423 default: panic("bad level %d", level);
424 }
425}
426
427Addr
429{
430 switch (level) {
431 // no level 1 here
432 case 2: return ~mask(29);
433 case 3: return bits(pte, 52) ? ~mask(21) : ~mask(16);
434 default: panic("bad level %d", level);
435 }
436}
437
438unsigned
440{
441 switch (level) {
442 case 1: return 42;
443 case 2: return 29;
444 case 3: return 16;
445 default: panic("bad level %d", level);
446 }
447}
448
451{
452 if (tsz >= 12 && tsz <= 21) return LookupLevel::L1;
453 if (tsz >= 22 && tsz <= 34) return LookupLevel::L2;
454 if (tsz >= 35 && tsz <= 39) return LookupLevel::L3;
455
456 panic("Unsupported TnSZ: %d\n", tsz);
457}
458
461{
462 switch (sl0) {
463 case 0: return LookupLevel::L3;
464 case 1: return LookupLevel::L2;
465 case 2: return LookupLevel::L1;
466 default: panic("Unsupported VTCR_EL2.SL0: %d", sl0);
467 }
468}
469
472{
473 return LookupLevel::L3;
474}
475
476const PageTableOps *
478{
479 static V8PageTableOps4k ptOps4k;
480 static V8PageTableOps16k ptOps16k;
481 static V8PageTableOps64k ptOps64k;
482
483 switch (trans_granule) {
484 case Grain4KB: return &ptOps4k;
485 case Grain16KB: return &ptOps16k;
486 case Grain64KB: return &ptOps64k;
487 default:
488 panic("Unknown translation granule size %d", trans_granule);
489 }
490}
491
493 : va(entry.vpn << entry.N), pageSize(entry.N), size(0),
494 asn(entry.asid), ignoreAsn(false),
495 vmid(entry.vmid), ss(entry.ss),
496 functional(false),
497 targetRegime(entry.regime),
498 mode(BaseMMU::Read)
499{}
500
501} // namespace ArmISA
502} // namespace gem5
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
Definition bitfield.hh:79
constexpr T mbits(T val, unsigned first, unsigned last)
Mask off the given bits in place like bits() but without shifting.
Definition bitfield.hh:106
#define panic(...)
This implements a cprintf based panic() function.
Definition logging.hh:188
const PageTableOps * getPageTableOps(GrainSize trans_granule)
Definition pagetable.cc:477
Bitfield< 31 > n
Bitfield< 4, 0 > mode
Definition misc_types.hh:74
const GrainSize GrainMap_tg1[]
Definition pagetable.cc:51
const GrainSize GrainMap_tg0[]
Definition pagetable.cc:49
Bitfield< 21 > ss
Definition misc_types.hh:60
Bitfield< 8 > va
Bitfield< 7, 6 > sl0
Bitfield< 20 > level
Definition intmessage.hh:51
Copyright (c) 2024 Arm Limited All rights reserved.
Definition binary32.hh:36
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
enums::ArmLookupLevel LookupLevel
Definition pagetable.hh:96
Addr walkMask(unsigned level) const
Definition pagetable.cc:55
virtual unsigned walkBits(unsigned level) const =0
Addr pageMask(pte_t pte, unsigned level) const override
Definition pagetable.cc:118
bool isValid(pte_t pte, unsigned level) const override
Definition pagetable.cc:61
bool isLeaf(pte_t pte, unsigned level) const override
Definition pagetable.cc:72
bool isWritable(pte_t pte, unsigned level, bool stage2) const override
Definition pagetable.cc:83
Addr nextLevelPointer(pte_t pte, unsigned level) const override
Definition pagetable.cc:89
Addr index(Addr va, unsigned level, int tsz) const override
Definition pagetable.cc:104
unsigned walkBits(unsigned level) const override
Definition pagetable.cc:129
LookupLevel firstLevel(uint8_t tsz) const override
Definition pagetable.cc:140
LookupLevel lastLevel() const override
Definition pagetable.cc:146
Addr index(Addr va, unsigned level, int tsz) const override
Definition pagetable.cc:308
LookupLevel firstS2Level(uint8_t sl0) const override
Definition pagetable.cc:357
unsigned walkBits(unsigned level) const override
Definition pagetable.cc:334
Addr pageMask(pte_t pte, unsigned level) const override
Definition pagetable.cc:320
bool isLeaf(pte_t pte, unsigned level) const override
Definition pagetable.cc:274
LookupLevel firstLevel(uint8_t tsz) const override
Definition pagetable.cc:346
bool isValid(pte_t pte, unsigned level) const override
Definition pagetable.cc:262
LookupLevel lastLevel() const override
Definition pagetable.cc:368
Addr nextLevelPointer(pte_t pte, unsigned level) const override
Definition pagetable.cc:292
bool isWritable(pte_t pte, unsigned level, bool stage2) const override
Definition pagetable.cc:286
unsigned walkBits(unsigned level) const override
Definition pagetable.cc:222
Addr pageMask(pte_t pte, unsigned level) const override
Definition pagetable.cc:210
LookupLevel firstS2Level(uint8_t sl0) const override
Definition pagetable.cc:244
bool isWritable(pte_t pte, unsigned level, bool stage2) const override
Definition pagetable.cc:176
Addr index(Addr va, unsigned level, int tsz) const override
Definition pagetable.cc:198
Addr nextLevelPointer(pte_t pte, unsigned level) const override
Definition pagetable.cc:182
LookupLevel lastLevel() const override
Definition pagetable.cc:256
bool isValid(pte_t pte, unsigned level) const override
Definition pagetable.cc:152
bool isLeaf(pte_t pte, unsigned level) const override
Definition pagetable.cc:164
LookupLevel firstLevel(uint8_t tsz) const override
Definition pagetable.cc:234
Addr nextLevelPointer(pte_t pte, unsigned level) const override
Definition pagetable.cc:402
LookupLevel lastLevel() const override
Definition pagetable.cc:471
bool isValid(pte_t pte, unsigned level) const override
Definition pagetable.cc:374
unsigned walkBits(unsigned level) const override
Definition pagetable.cc:439
Addr index(Addr va, unsigned level, int tsz) const override
Definition pagetable.cc:417
LookupLevel firstLevel(uint8_t tsz) const override
Definition pagetable.cc:450
Addr pageMask(pte_t pte, unsigned level) const override
Definition pagetable.cc:428
bool isWritable(pte_t pte, unsigned level, bool stage2) const override
Definition pagetable.cc:396
LookupLevel firstS2Level(uint8_t sl0) const override
Definition pagetable.cc:460
bool isLeaf(pte_t pte, unsigned level) const override
Definition pagetable.cc:385

Generated on Mon Jan 13 2025 04:28:22 for gem5 by doxygen 1.9.8