diff options
author | Steve Capper <steve.capper@linaro.org> | 2013-05-28 08:35:51 -0400 |
---|---|---|
committer | Steve Capper <steve.capper@linaro.org> | 2013-06-14 04:52:19 -0400 |
commit | 59911ca4325dc7bd95e05c988fef3593b694e62c (patch) | |
tree | cc4a255ac8b12f57f946900f6c52e850691b2433 | |
parent | 072b1b62a6436b71ab951faae4500db2fbed63de (diff) |
ARM64: mm: Move PTE_PROT_NONE bit.
Under ARM64, PTEs can be broadly categorised as follows:
- Present and valid: Bit #0 is set. The PTE is valid and memory
access to the region may fault.
- Present and invalid: Bit #0 is clear and bit #1 is set.
Represents present memory with PROT_NONE protection. The PTE
is an invalid entry, and the user fault handler will raise a
SIGSEGV.
- Not present (file or swap): Bits #0 and #1 are clear.
Memory represented has been paged out. The PTE is an invalid
entry, and the fault handler will try and re-populate the
memory where necessary.
Huge PTEs are block descriptors that have bit #1 clear. If we wish
to represent PROT_NONE huge PTEs we then run into a problem as
there is no way to distinguish between regular and huge PTEs if we
set bit #1.
To resolve this ambiguity this patch moves PTE_PROT_NONE from
bit #1 to bit #2 and moves PTE_FILE from bit #2 to bit #3. The
number of swap/file bits is reduced by 1 as a consequence, leaving
60 bits for file and swap entries.
Signed-off-by: Steve Capper <steve.capper@linaro.org>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
-rw-r--r-- | arch/arm64/include/asm/pgtable.h | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index 77b09d6fee23..2291de0258ed 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h | |||
@@ -25,8 +25,8 @@ | |||
25 | * Software defined PTE bits definition. | 25 | * Software defined PTE bits definition. |
26 | */ | 26 | */ |
27 | #define PTE_VALID (_AT(pteval_t, 1) << 0) | 27 | #define PTE_VALID (_AT(pteval_t, 1) << 0) |
28 | #define PTE_PROT_NONE (_AT(pteval_t, 1) << 1) /* only when !PTE_VALID */ | 28 | #define PTE_PROT_NONE (_AT(pteval_t, 1) << 2) /* only when !PTE_VALID */ |
29 | #define PTE_FILE (_AT(pteval_t, 1) << 2) /* only when !pte_present() */ | 29 | #define PTE_FILE (_AT(pteval_t, 1) << 3) /* only when !pte_present() */ |
30 | #define PTE_DIRTY (_AT(pteval_t, 1) << 55) | 30 | #define PTE_DIRTY (_AT(pteval_t, 1) << 55) |
31 | #define PTE_SPECIAL (_AT(pteval_t, 1) << 56) | 31 | #define PTE_SPECIAL (_AT(pteval_t, 1) << 56) |
32 | 32 | ||
@@ -281,12 +281,12 @@ extern pgd_t idmap_pg_dir[PTRS_PER_PGD]; | |||
281 | 281 | ||
282 | /* | 282 | /* |
283 | * Encode and decode a swap entry: | 283 | * Encode and decode a swap entry: |
284 | * bits 0-1: present (must be zero) | 284 | * bits 0, 2: present (must both be zero) |
285 | * bit 2: PTE_FILE | 285 | * bit 3: PTE_FILE |
286 | * bits 3-8: swap type | 286 | * bits 4-8: swap type |
287 | * bits 9-63: swap offset | 287 | * bits 9-63: swap offset |
288 | */ | 288 | */ |
289 | #define __SWP_TYPE_SHIFT 3 | 289 | #define __SWP_TYPE_SHIFT 4 |
290 | #define __SWP_TYPE_BITS 6 | 290 | #define __SWP_TYPE_BITS 6 |
291 | #define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1) | 291 | #define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1) |
292 | #define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) | 292 | #define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) |
@@ -306,15 +306,15 @@ extern pgd_t idmap_pg_dir[PTRS_PER_PGD]; | |||
306 | 306 | ||
307 | /* | 307 | /* |
308 | * Encode and decode a file entry: | 308 | * Encode and decode a file entry: |
309 | * bits 0-1: present (must be zero) | 309 | * bits 0, 2: present (must both be zero) |
310 | * bit 2: PTE_FILE | 310 | * bit 3: PTE_FILE |
311 | * bits 3-63: file offset / PAGE_SIZE | 311 | * bits 4-63: file offset / PAGE_SIZE |
312 | */ | 312 | */ |
313 | #define pte_file(pte) (pte_val(pte) & PTE_FILE) | 313 | #define pte_file(pte) (pte_val(pte) & PTE_FILE) |
314 | #define pte_to_pgoff(x) (pte_val(x) >> 3) | 314 | #define pte_to_pgoff(x) (pte_val(x) >> 4) |
315 | #define pgoff_to_pte(x) __pte(((x) << 3) | PTE_FILE) | 315 | #define pgoff_to_pte(x) __pte(((x) << 4) | PTE_FILE) |
316 | 316 | ||
317 | #define PTE_FILE_MAX_BITS 61 | 317 | #define PTE_FILE_MAX_BITS 60 |
318 | 318 | ||
319 | extern int kern_addr_valid(unsigned long addr); | 319 | extern int kern_addr_valid(unsigned long addr); |
320 | 320 | ||