Commit a067d94d authored by Catalin Marinas's avatar Catalin Marinas Committed by Will Deacon

arm64: kaslr: Adjust the offset to avoid Image across alignment boundary

With 16KB pages and a kernel Image larger than 16MB, the current
kaslr_early_init() logic for avoiding mappings across swapper table
boundaries fails since increasing the offset by kimg_sz just moves the
problem to the next boundary.

This patch rounds the offset down to (1 << SWAPPER_TABLE_SHIFT) if the
Image crosses a PMD_SIZE boundary.

Fixes: afd0e5a8 ("arm64: kaslr: Fix up the kernel image alignment")
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Neeraj Upadhyay <neeraju@codeaurora.org>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 4a23e56a
...@@ -131,8 +131,7 @@ u64 __init kaslr_early_init(u64 dt_phys) ...@@ -131,8 +131,7 @@ u64 __init kaslr_early_init(u64 dt_phys)
/* /*
* The kernel Image should not extend across a 1GB/32MB/512MB alignment * The kernel Image should not extend across a 1GB/32MB/512MB alignment
* boundary (for 4KB/16KB/64KB granule kernels, respectively). If this * boundary (for 4KB/16KB/64KB granule kernels, respectively). If this
* happens, increase the KASLR offset by the size of the kernel image * happens, round down the KASLR offset by (1 << SWAPPER_TABLE_SHIFT).
* rounded up by SWAPPER_BLOCK_SIZE.
* *
* NOTE: The references to _text and _end below will already take the * NOTE: The references to _text and _end below will already take the
* modulo offset (the physical displacement modulo 2 MB) into * modulo offset (the physical displacement modulo 2 MB) into
...@@ -141,11 +140,8 @@ u64 __init kaslr_early_init(u64 dt_phys) ...@@ -141,11 +140,8 @@ u64 __init kaslr_early_init(u64 dt_phys)
* mapping we choose. * mapping we choose.
*/ */
if ((((u64)_text + offset) >> SWAPPER_TABLE_SHIFT) != if ((((u64)_text + offset) >> SWAPPER_TABLE_SHIFT) !=
(((u64)_end + offset) >> SWAPPER_TABLE_SHIFT)) { (((u64)_end + offset) >> SWAPPER_TABLE_SHIFT))
u64 kimg_sz = _end - _text; offset = round_down(offset, 1 << SWAPPER_TABLE_SHIFT);
offset = (offset + round_up(kimg_sz, SWAPPER_BLOCK_SIZE))
& mask;
}
if (IS_ENABLED(CONFIG_KASAN)) if (IS_ENABLED(CONFIG_KASAN))
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment