2c2
< * Copyright (c) 2010-2013 ARM Limited
---
> * Copyright (c) 2010-2014 ARM Limited
364a365,372
> // Granule sizes for AArch64 long descriptors
> enum GrainSize {
> Grain4KB = 12,
> Grain16KB = 14,
> Grain64KB = 16,
> ReservedGrain = 0
> };
>
412,414d419
< /** True if the granule size is 64 KB (AArch64 only) */
< bool largeGrain;
<
416c421
< int grainSize;
---
> GrainSize grainSize;
424,425c429,430
< // and at L1 for the 64 KB granule
< if (largeGrain)
---
> // and at L1 for 16/64 KB granules
> if (grainSize > Grain4KB)
438,442c443,463
< assert(type() == Block || type() == Page);
< if (largeGrain) {
< if (type() == Block)
< return 29 /* 512 MB */;
< return 16 /* 64 KB */; // type() == Page
---
> if (type() == Block) {
> switch (grainSize) {
> case Grain4KB:
> return lookupLevel == L1 ? 30 /* 1 GB */
> : 21 /* 2 MB */;
> case Grain16KB:
> return 25 /* 32 MB */;
> case Grain64KB:
> return 29 /* 512 MB */;
> default:
> panic("Invalid AArch64 VM granule size\n");
> }
> } else if (type() == Page) {
> switch (grainSize) {
> case Grain4KB:
> case Grain16KB:
> case Grain64KB:
> return grainSize; /* enum -> uint okay */
> default:
> panic("Invalid AArch64 VM granule size\n");
> }
444,446c465
< if (type() == Block)
< return lookupLevel == L1 ? 30 /* 1 GB */ : 21 /* 2 MB */;
< return 12 /* 4 KB */; // type() == Page
---
> panic("AArch64 page table entry must be block or page\n");
710,711c729,733
< /** Cached copy of the ttbcr as it existed when translation began. */
< TTBCR ttbcr;
---
> /** Cached copy of ttbcr/tcr as it existed when translation began */
> union {
> TTBCR ttbcr; // AArch32 translations
> TCR tcr; // AArch64 translations
> };