smmu_v3_ptops.cc (14039:4991b2a345a1) smmu_v3_ptops.cc (14098:f4b9024d1a96)
1/*
2 * Copyright (c) 2013, 2018-2019 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

--- 214 unchanged lines hidden (view full) ---

223
224unsigned
225V8PageTableOps4k::lastLevel() const
226{
227 return 3;
228}
229
230bool
1/*
2 * Copyright (c) 2013, 2018-2019 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

--- 214 unchanged lines hidden (view full) ---

223
224unsigned
225V8PageTableOps4k::lastLevel() const
226{
227 return 3;
228}
229
230bool
231V8PageTableOps16k::isValid(pte_t pte, unsigned level) const
232{
233 switch (level) {
234 case 0: return pte & 0x1;
235 case 1: return pte & 0x1;
236 case 2: return pte & 0x1;
237 case 3: return (pte & 0x1) && (pte & 0x2);
238 default: panic("bad level %d", level);
239 }
240}
241
242bool
243V8PageTableOps16k::isLeaf(pte_t pte, unsigned level) const
244{
245 switch (level) {
246 case 0: return false;
247 case 1: return false;
248 case 2: return !(pte & 0x2);
249 case 3: return true;
250 default: panic("bad level %d", level);
251 }
252}
253
254bool
255V8PageTableOps16k::isWritable(pte_t pte, unsigned level, bool stage2) const
256{
257 return stage2 ? bits(pte, 7, 6) == 3 : bits(pte, 7) == 0;
258}
259
260Addr
261V8PageTableOps16k::nextLevelPointer(pte_t pte, unsigned level) const
262{
263 if (isLeaf(pte, level)) {
264 switch (level) {
265 // no level 0 here
266 case 1: return mbits(pte, 47, 36);
267 case 2: return mbits(pte, 47, 25);
268 case 3: return mbits(pte, 47, 14);
269 default: panic("bad level %d", level);
270 }
271 } else {
272 return mbits(pte, 47, 12);
273 }
274}
275
276Addr
277V8PageTableOps16k::index(Addr va, unsigned level) const
278{
279 switch (level) {
280 case 0: return bits(va, 47, 47) << 3; break;
281 case 1: return bits(va, 46, 36) << 3; break;
282 case 2: return bits(va, 35, 25) << 3; break;
283 case 3: return bits(va, 24, 14) << 3; break;
284 default: panic("bad level %d", level);
285 }
286}
287
288Addr
289V8PageTableOps16k::pageMask(pte_t pte, unsigned level) const
290{
291 switch (level) {
292 // no level 0 here
293 case 1: return ~mask(36);
294 // 16K granule supports contiguous entries also at L2; - 1G
295 case 2: return bits(pte, 52) ? ~mask(30) : ~mask(25);
296 // as well as at L3; - 2M
297 case 3: return bits(pte, 52) ? ~mask(21) : ~mask(14);
298 default: panic("bad level %d", level);
299 }
300}
301
302Addr
303V8PageTableOps16k::walkMask(unsigned level) const
304{
305 switch (level) {
306 case 0: return ~mask(47);
307 case 1: return ~mask(36);
308 case 2: return ~mask(25);
309 case 3: return ~mask(14);
310 default: panic("bad level %d", level);
311 }
312}
313
314unsigned
315V8PageTableOps16k::firstLevel() const
316{
317 return 0;
318}
319
320unsigned
321V8PageTableOps16k::lastLevel() const
322{
323 return 3;
324}
325
326bool
231V8PageTableOps64k::isValid(pte_t pte, unsigned level) const
232{
233 switch (level) {
234 case 1: return pte & 0x1;
235 case 2: return pte & 0x1;
236 case 3: return (pte & 0x1) && (pte & 0x2);
237 default: panic("bad level %d", level);
238 }

--- 78 unchanged lines hidden ---
327V8PageTableOps64k::isValid(pte_t pte, unsigned level) const
328{
329 switch (level) {
330 case 1: return pte & 0x1;
331 case 2: return pte & 0x1;
332 case 3: return (pte & 0x1) && (pte & 0x2);
333 default: panic("bad level %d", level);
334 }

--- 78 unchanged lines hidden ---