diff options
| -rw-r--r-- | Documentation/arm64/tagged-pointers.txt | 34 | ||||
| -rw-r--r-- | arch/arm64/include/asm/pgtable-hwdef.h | 1 | ||||
| -rw-r--r-- | arch/arm64/kernel/entry.S | 1 | ||||
| -rw-r--r-- | arch/arm64/mm/proc.S | 2 |
4 files changed, 37 insertions, 1 deletions
diff --git a/Documentation/arm64/tagged-pointers.txt b/Documentation/arm64/tagged-pointers.txt new file mode 100644 index 000000000000..264e9841563a --- /dev/null +++ b/Documentation/arm64/tagged-pointers.txt | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | Tagged virtual addresses in AArch64 Linux | ||
| 2 | ========================================= | ||
| 3 | |||
| 4 | Author: Will Deacon <will.deacon@arm.com> | ||
| 5 | Date : 12 June 2013 | ||
| 6 | |||
| 7 | This document briefly describes the provision of tagged virtual | ||
| 8 | addresses in the AArch64 translation system and their potential uses | ||
| 9 | in AArch64 Linux. | ||
| 10 | |||
| 11 | The kernel configures the translation tables so that translations made | ||
| 12 | via TTBR0 (i.e. userspace mappings) have the top byte (bits 63:56) of | ||
| 13 | the virtual address ignored by the translation hardware. This frees up | ||
| 14 | this byte for application use, with the following caveats: | ||
| 15 | |||
| 16 | (1) The kernel requires that all user addresses passed to EL1 | ||
| 17 | are tagged with tag 0x00. This means that any syscall | ||
| 18 | parameters containing user virtual addresses *must* have | ||
| 19 | their top byte cleared before trapping to the kernel. | ||
| 20 | |||
| 21 | (2) Tags are not guaranteed to be preserved when delivering | ||
| 22 | signals. This means that signal handlers in applications | ||
| 23 | making use of tags cannot rely on the tag information for | ||
| 24 | user virtual addresses being maintained for fields inside | ||
| 25 | siginfo_t. One exception to this rule is for signals raised | ||
| 26 | in response to debug exceptions, where the tag information | ||
| 27 | will be preserved. | ||
| 28 | |||
| 29 | (3) Special care should be taken when using tagged pointers, | ||
| 30 | since it is likely that C compilers will not hazard two | ||
| 31 | addresses differing only in the upper bits. | ||
| 32 | |||
| 33 | The architecture prevents the use of a tagged PC, so the upper byte will | ||
| 34 | be set to a sign-extension of bit 55 on exception return. | ||
diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h index e182a356c979..d57e66845c86 100644 --- a/arch/arm64/include/asm/pgtable-hwdef.h +++ b/arch/arm64/include/asm/pgtable-hwdef.h | |||
| @@ -122,5 +122,6 @@ | |||
| 122 | #define TCR_TG1_64K (UL(1) << 30) | 122 | #define TCR_TG1_64K (UL(1) << 30) |
| 123 | #define TCR_IPS_40BIT (UL(2) << 32) | 123 | #define TCR_IPS_40BIT (UL(2) << 32) |
| 124 | #define TCR_ASID16 (UL(1) << 36) | 124 | #define TCR_ASID16 (UL(1) << 36) |
| 125 | #define TCR_TBI0 (UL(1) << 37) | ||
| 125 | 126 | ||
| 126 | #endif | 127 | #endif |
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 57640df9d70c..3881fd115ebb 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S | |||
| @@ -423,6 +423,7 @@ el0_da: | |||
| 423 | * Data abort handling | 423 | * Data abort handling |
| 424 | */ | 424 | */ |
| 425 | mrs x0, far_el1 | 425 | mrs x0, far_el1 |
| 426 | bic x0, x0, #(0xff << 56) | ||
| 426 | disable_step x1 | 427 | disable_step x1 |
| 427 | isb | 428 | isb |
| 428 | enable_dbg | 429 | enable_dbg |
diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S index f84fcf71f129..b1b31bbc967b 100644 --- a/arch/arm64/mm/proc.S +++ b/arch/arm64/mm/proc.S | |||
| @@ -147,7 +147,7 @@ ENTRY(__cpu_setup) | |||
| 147 | * both user and kernel. | 147 | * both user and kernel. |
| 148 | */ | 148 | */ |
| 149 | ldr x10, =TCR_TxSZ(VA_BITS) | TCR_FLAGS | TCR_IPS_40BIT | \ | 149 | ldr x10, =TCR_TxSZ(VA_BITS) | TCR_FLAGS | TCR_IPS_40BIT | \ |
| 150 | TCR_ASID16 | (1 << 31) | 150 | TCR_ASID16 | TCR_TBI0 | (1 << 31) |
| 151 | #ifdef CONFIG_ARM64_64K_PAGES | 151 | #ifdef CONFIG_ARM64_64K_PAGES |
| 152 | orr x10, x10, TCR_TG0_64K | 152 | orr x10, x10, TCR_TG0_64K |
| 153 | orr x10, x10, TCR_TG1_64K | 153 | orr x10, x10, TCR_TG1_64K |
