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 --- |