public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
From: Mark Rutland <mark.rutland@arm.com>
To: Ard Biesheuvel <ardb@google.com>
Cc: linux-arm-kernel@lists.infradead.org,
	Ard Biesheuvel <ardb@kernel.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>, Marc Zyngier <maz@kernel.org>,
	Ryan Roberts <ryan.roberts@arm.com>,
	Anshuman Khandual <anshuman.khandual@arm.com>,
	Kees Cook <keescook@chromium.org>
Subject: Re: [PATCH v6 02/41] arm64: mm: Take potential load offset into account when KASLR is off
Date: Mon, 4 Dec 2023 14:12:10 +0000	[thread overview]
Message-ID: <ZW3eOoVTotfNXIJo@FVFF77S0Q05N> (raw)
In-Reply-To: <20231129111555.3594833-45-ardb@google.com>

On Wed, Nov 29, 2023 at 12:15:58PM +0100, Ard Biesheuvel wrote:
> From: Ard Biesheuvel <ardb@kernel.org>
> 
> We enable CONFIG_RELOCATABLE even when CONFIG_RANDOMIZE_BASE is
> disabled, and this permits the loader (i.e., EFI) to place the kernel
> anywhere in physical memory as long as the base address is 64k aligned.

I don't think that case is something we actually intend to permit today:

(a) When CONFIG_RANDOMIZE_BASE=n, the EFI stub will load the kernel at SZ_2M
    alignment. We initialize efi_nokaslr to !IS_ENABLED(CONFIG_RANDOMIZE_BASE),
    and so arm64's efi_get_kimg_min_align() will return SZ_2M.

    ... unless I'm missing something there?

(b) We don't expose anything in the Image header such that an external
    bootloader (i.e. not the EFI stub) can decide that 64K alignment is
    sufficient. It would be unsound for a bootloader to load the kernel at less
    than 2M alignment.

(c) We never documented 64K alignment as being permitted. In booting.txt we say
    "The Image must be placed text_offset bytes from a 2MB aligned base address
    anywhere in usable system RAM and called there.", with no mention of a
    relaxation down to 64K.

... so I don't think this patch is necessary, unless it's going to make
something else simpler later in the series?

Mark.

> This means that the 'KASLR' case described in the header that defines
> the size of the statically allocated page tables could take effect even
> when CONFIG_RANDMIZE_BASE=n. So check for CONFIG_RELOCATABLE instead.
> 
> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
> ---
>  arch/arm64/include/asm/kernel-pgtable.h | 27 +++++---------------
>  1 file changed, 6 insertions(+), 21 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/kernel-pgtable.h b/arch/arm64/include/asm/kernel-pgtable.h
> index 85d26143faa5..83ddb14b95a5 100644
> --- a/arch/arm64/include/asm/kernel-pgtable.h
> +++ b/arch/arm64/include/asm/kernel-pgtable.h
> @@ -37,27 +37,12 @@
>  
>  
>  /*
> - * If KASLR is enabled, then an offset K is added to the kernel address
> - * space. The bottom 21 bits of this offset are zero to guarantee 2MB
> - * alignment for PA and VA.
> - *
> - * For each pagetable level of the swapper, we know that the shift will
> - * be larger than 21 (for the 4KB granule case we use section maps thus
> - * the smallest shift is actually 30) thus there is the possibility that
> - * KASLR can increase the number of pagetable entries by 1, so we make
> - * room for this extra entry.
> - *
> - * Note KASLR cannot increase the number of required entries for a level
> - * by more than one because it increments both the virtual start and end
> - * addresses equally (the extra entry comes from the case where the end
> - * address is just pushed over a boundary and the start address isn't).
> + * A relocatable kernel may execute from an address that differs from the one at
> + * which it was linked. In the worst case, its runtime placement may intersect
> + * with two adjacent PGDIR entries, which means that an additional page table
> + * may be needed at each subordinate level.
>   */
> -
> -#ifdef CONFIG_RANDOMIZE_BASE
> -#define EARLY_KASLR	(1)
> -#else
> -#define EARLY_KASLR	(0)
> -#endif
> +#define EXTRA_PAGE	__is_defined(CONFIG_RELOCATABLE)
>  
>  #define SPAN_NR_ENTRIES(vstart, vend, shift) \
>  	((((vend) - 1) >> (shift)) - ((vstart) >> (shift)) + 1)
> @@ -83,7 +68,7 @@
>  			+ EARLY_PGDS((vstart), (vend), add) 	/* each PGDIR needs a next level page table */	\
>  			+ EARLY_PUDS((vstart), (vend), add)	/* each PUD needs a next level page table */	\
>  			+ EARLY_PMDS((vstart), (vend), add))	/* each PMD needs a next level page table */
> -#define INIT_DIR_SIZE (PAGE_SIZE * EARLY_PAGES(KIMAGE_VADDR, _end, EARLY_KASLR))
> +#define INIT_DIR_SIZE (PAGE_SIZE * EARLY_PAGES(KIMAGE_VADDR, _end, EXTRA_PAGE))
>  
>  /* the initial ID map may need two extra pages if it needs to be extended */
>  #if VA_BITS < 48
> -- 
> 2.43.0.rc1.413.gea7ed67945-goog
> 

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2023-12-04 14:12 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-29 11:15 [PATCH v6 00/41] arm64: Reorganize kernel VA space for LPA2 Ard Biesheuvel
2023-11-29 11:15 ` [PATCH v6 01/41] arm64: kernel: Disable latent_entropy GCC plugin in early C runtime Ard Biesheuvel
2023-11-30  4:44   ` Anshuman Khandual
2023-11-29 11:15 ` [PATCH v6 02/41] arm64: mm: Take potential load offset into account when KASLR is off Ard Biesheuvel
2023-11-30  5:23   ` Anshuman Khandual
2023-12-04 14:12   ` Mark Rutland [this message]
2023-12-04 15:40     ` Ard Biesheuvel
2023-11-29 11:15 ` [PATCH v6 03/41] arm64: mm: get rid of kimage_vaddr global variable Ard Biesheuvel
2023-11-30  5:38   ` Anshuman Khandual
2023-12-04 14:37     ` Mark Rutland
2023-12-05  2:26       ` Anshuman Khandual
2023-11-29 11:16 ` [PATCH v6 04/41] arm64: mm: Move PCI I/O emulation region above the vmemmap region Ard Biesheuvel
2023-11-30  7:59   ` Anshuman Khandual
2023-11-30  8:02     ` Ard Biesheuvel
2023-11-30  8:52       ` Anshuman Khandual
2023-11-30  8:56         ` Ard Biesheuvel
2023-12-11 13:57   ` Mark Rutland
2023-12-11 14:10     ` Ard Biesheuvel
2023-12-11 14:21       ` Mark Rutland
2023-11-29 11:16 ` [PATCH v6 05/41] arm64: mm: Move fixmap region above " Ard Biesheuvel
2023-12-11 14:23   ` Mark Rutland
2023-11-29 11:16 ` [PATCH v6 06/41] arm64: ptdump: Allow all region boundaries to be defined at boot time Ard Biesheuvel
2023-12-11 14:15   ` Mark Rutland
2023-11-29 11:16 ` [PATCH v6 07/41] arm64: ptdump: Discover start of vmemmap region at runtime Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 08/41] arm64: vmemmap: Avoid base2 order of struct page size to dimension region Ard Biesheuvel
2023-12-11 14:35   ` Mark Rutland
2023-12-12 21:34     ` Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 09/41] arm64: mm: Reclaim unused vmemmap region for vmalloc use Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 10/41] arm64: kaslr: Adjust randomization range dynamically Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 11/41] arm64: kernel: Manage absolute relocations in code built under pi/ Ard Biesheuvel
2023-11-29 12:27   ` Marc Zyngier
2023-11-29 12:46     ` Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 12/41] arm64: kernel: Don't rely on objcopy to make code under pi/ __init Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 13/41] arm64: head: move relocation handling to C code Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 14/41] arm64: idreg-override: Omit non-NULL checks for override pointer Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 15/41] arm64: idreg-override: Prepare for place relative reloc patching Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 16/41] arm64: idreg-override: Avoid parameq() and parameqn() Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 17/41] arm64: idreg-override: avoid strlen() to check for empty strings Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 18/41] arm64: idreg-override: Avoid sprintf() for simple string concatenation Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 19/41] arm64: idreg-override: Avoid kstrtou64() to parse a single hex digit Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 20/41] arm64/kernel: Move 'nokaslr' parsing out of early idreg code Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 21/41] arm64: idreg-override: Move to early mini C runtime Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 22/41] arm64: kernel: Remove early fdt remap code Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 23/41] arm64: head: Clear BSS and the kernel page tables in one go Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 24/41] arm64: Move feature overrides into the BSS section Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 25/41] arm64: head: Run feature override detection before mapping the kernel Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 26/41] arm64: head: move dynamic shadow call stack patching into early C runtime Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 27/41] arm64: cpufeature: Add helper to test for CPU feature overrides Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 28/41] arm64: kaslr: Use feature override instead of parsing the cmdline again Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 29/41] arm64: idreg-override: Create a pseudo feature for rodata=off Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 30/41] arm64: Add helpers to probe local CPU for PAC and BTI support Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 31/41] arm64: head: allocate more pages for the kernel mapping Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 32/41] arm64: head: move memstart_offset_seed handling to C code Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 33/41] arm64: mm: Make kaslr_requires_kpti() a static inline Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 34/41] arm64: mmu: Make __cpu_replace_ttbr1() out of line Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 35/41] arm64: head: Move early kernel mapping routines into C code Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 36/41] arm64: mm: Use 48-bit virtual addressing for the permanent ID map Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 37/41] arm64: pgtable: Decouple PGDIR size macros from PGD/PUD/PMD levels Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 38/41] arm64: kernel: Create initial ID map from C code Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 39/41] arm64: mm: avoid fixmap for early swapper_pg_dir updates Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 40/41] arm64: mm: omit redundant remap of kernel image Ard Biesheuvel
2023-11-29 11:16 ` [PATCH v6 41/41] arm64: Revert "mm: provide idmap pointer to cpu_replace_ttbr1()" Ard Biesheuvel
2023-12-12 17:20 ` [PATCH v6 00/41] arm64: Reorganize kernel VA space for LPA2 Will Deacon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZW3eOoVTotfNXIJo@FVFF77S0Q05N \
    --to=mark.rutland@arm.com \
    --cc=anshuman.khandual@arm.com \
    --cc=ardb@google.com \
    --cc=ardb@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=keescook@chromium.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=maz@kernel.org \
    --cc=ryan.roberts@arm.com \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox