Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

arm64: vmlinux.ld.S: add assertion for reserved_pg_dir offset

Add RESERVED_SWAPPER_OFFSET and use that instead of hardcoding
the offset between swapper_pg_dir and reserved_pg_dir.

Then use RESERVED_SWAPPER_OFFSET to assert that the offset is
correct at link time.

Signed-off-by: Joey Gouly <joey.gouly@arm.com>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Tested-by: Mark Rutland <mark.rutland@arm.com>
Link: https://lore.kernel.org/r/20210202123658.22308-2-joey.gouly@arm.com
Signed-off-by: Will Deacon <will@kernel.org>

authored by

Joey Gouly and committed by
Will Deacon
00ef5434 b9ba6809

+12 -3
+2 -2
arch/arm64/include/asm/asm-uaccess.h
··· 15 15 .macro __uaccess_ttbr0_disable, tmp1 16 16 mrs \tmp1, ttbr1_el1 // swapper_pg_dir 17 17 bic \tmp1, \tmp1, #TTBR_ASID_MASK 18 - sub \tmp1, \tmp1, #PAGE_SIZE // reserved_pg_dir just before swapper_pg_dir 18 + sub \tmp1, \tmp1, #RESERVED_SWAPPER_OFFSET // reserved_pg_dir 19 19 msr ttbr0_el1, \tmp1 // set reserved TTBR0_EL1 20 20 isb 21 - add \tmp1, \tmp1, #PAGE_SIZE 21 + add \tmp1, \tmp1, #RESERVED_SWAPPER_OFFSET 22 22 msr ttbr1_el1, \tmp1 // set reserved ASID 23 23 isb 24 24 .endm
+6
arch/arm64/include/asm/memory.h
··· 159 159 #define IOREMAP_MAX_ORDER (PMD_SHIFT) 160 160 #endif 161 161 162 + /* 163 + * Open-coded (swapper_pg_dir - reserved_pg_dir) as this cannot be calculated 164 + * until link time. 165 + */ 166 + #define RESERVED_SWAPPER_OFFSET (PAGE_SIZE) 167 + 162 168 #ifndef __ASSEMBLY__ 163 169 164 170 #include <linux/bitops.h>
+1 -1
arch/arm64/include/asm/uaccess.h
··· 87 87 ttbr = read_sysreg(ttbr1_el1); 88 88 ttbr &= ~TTBR_ASID_MASK; 89 89 /* reserved_pg_dir placed before swapper_pg_dir */ 90 - write_sysreg(ttbr - PAGE_SIZE, ttbr0_el1); 90 + write_sysreg(ttbr - RESERVED_SWAPPER_OFFSET, ttbr0_el1); 91 91 isb(); 92 92 /* Set reserved ASID */ 93 93 write_sysreg(ttbr, ttbr1_el1);
+3
arch/arm64/kernel/vmlinux.lds.S
··· 316 316 * If padding is applied before .head.text, virt<->phys conversions will fail. 317 317 */ 318 318 ASSERT(_text == KIMAGE_VADDR, "HEAD is misaligned") 319 + 320 + ASSERT(swapper_pg_dir - reserved_pg_dir == RESERVED_SWAPPER_OFFSET, 321 + "RESERVED_SWAPPER_OFFSET is wrong!")