From: Will Deacon <will@kernel.org>
To: Peter Collingbourne <pcc@google.com>
Cc: Mark Rutland <mark.rutland@arm.com>,
clang-built-linux@googlegroups.com,
Catalin Marinas <catalin.marinas@arm.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>,
Nick Desaulniers <ndesaulniers@google.com>,
Masahiro Yamada <yamada.masahiro@socionext.com>,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v2] arm64: Add support for relocating the kernel with RELR relocations
Date: Wed, 31 Jul 2019 17:48:18 +0100 [thread overview]
Message-ID: <20190731164818.m2und6msyhlbf5oi@willie-the-truck> (raw)
In-Reply-To: <20190712193846.174893-1-pcc@google.com>
On Fri, Jul 12, 2019 at 12:38:46PM -0700, Peter Collingbourne wrote:
> RELR is a relocation packing format for relative relocations.
> The format is described in a generic-abi proposal:
> https://groups.google.com/d/topic/generic-abi/bX460iggiKg/discussion
>
> The LLD linker can be instructed to pack relocations in the RELR
> format by passing the flag --pack-dyn-relocs=relr.
>
> This patch adds a new config option, CONFIG_RELR. Enabling this option
> instructs the linker to pack vmlinux's relative relocations in the RELR
> format, and causes the kernel to apply the relocations at startup along
> with the RELA relocations. RELA relocations still need to be applied
> because the linker will emit RELA relative relocations if they are
> unrepresentable in the RELR format (i.e. address not a multiple of 2).
>
> Enabling CONFIG_RELR reduces the size of a defconfig kernel image
> with CONFIG_RANDOMIZE_BASE by 3.5MB/16% uncompressed, or 550KB/5%
> compressed (lz4).
>
> Signed-off-by: Peter Collingbourne <pcc@google.com>
> Tested-by: Nick Desaulniers <ndesaulniers@google.com>
> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
> ---
> Changes in v2:
> - Reverted change to RELA processing
> - Added more comments, as requested by Nick and Will
> - Added a feature test for NM and OBJCOPY
> - Made CONFIG_RELR=y the default if the tools support it
>
> arch/arm64/Kconfig | 10 ++++
> arch/arm64/Makefile | 4 ++
> arch/arm64/kernel/head.S | 96 ++++++++++++++++++++++++++++++---
> arch/arm64/kernel/vmlinux.lds.S | 9 ++++
> init/Kconfig | 3 ++
> scripts/tools-support-relr.sh | 16 ++++++
> 6 files changed, 132 insertions(+), 6 deletions(-)
> create mode 100755 scripts/tools-support-relr.sh
>
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 7442edbcabfc3..cf3907d21d097 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -1476,6 +1476,16 @@ config RELOCATABLE
> relocation pass at runtime even if the kernel is loaded at the
> same address it was linked at.
>
> +config RELR
> + bool "Use RELR relocation packing"
> + depends on RELOCATABLE && TOOLS_SUPPORT_RELR
> + default y
> + help
> + Store the kernel's dynamic relocations in the RELR relocation packing
> + format. Requires a compatible linker (currently only LLD supports
Drop "currently" because it will just rot
> + this feature), as well as compatible NM and OBJCOPY utilities
> + (llvm-nm and llvm-objcopy are compatible).
> +
> config RANDOMIZE_BASE
> bool "Randomize the address of the kernel image"
> select ARM64_MODULE_PLTS if MODULES
> diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
> index bb1f1dbb34e8f..11f84450c7784 100644
> --- a/arch/arm64/Makefile
> +++ b/arch/arm64/Makefile
> @@ -22,6 +22,10 @@ LDFLAGS_vmlinux += -shared -Bsymbolic -z notext -z norelro \
> $(call ld-option, --no-apply-dynamic-relocs)
> endif
>
> +ifeq ($(CONFIG_RELR),y)
> + LDFLAGS_vmlinux += --pack-dyn-relocs=relr
> +endif
RELR isn't arm64-specific, right? So we could put this in the top-level
Makefile and have arm64 select ARCH_HAS_RELR if relocatable, so that other
architecture can easily support this in future.
> ifeq ($(CONFIG_ARM64_ERRATUM_843419),y)
> ifeq ($(call ld-option, --fix-cortex-a53-843419),)
> $(warning ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum)
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index 2cdacd1c141b9..cc23302e9d95e 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -102,6 +102,8 @@ pe_header:
> * x23 stext() .. start_kernel() physical misalignment/KASLR offset
> * x28 __create_page_tables() callee preserved temp register
> * x19/x20 __primary_switch() callee preserved temp registers
> + * x24 __primary_switch() .. relocate_kernel()
> + * current RELR displacement
> */
> ENTRY(stext)
> bl preserve_boot_args
> @@ -834,14 +836,93 @@ __relocate_kernel:
>
> 0: cmp x9, x10
> b.hs 1f
> - ldp x11, x12, [x9], #24
> - ldr x13, [x9, #-8]
> - cmp w12, #R_AARCH64_RELATIVE
> + ldp x12, x13, [x9], #24
> + ldr x14, [x9, #-8]
> + cmp w13, #R_AARCH64_RELATIVE
> b.ne 0b
> - add x13, x13, x23 // relocate
> - str x13, [x11, x23]
> + add x14, x14, x23 // relocate
> + str x14, [x12, x23]
> b 0b
> -1: ret
> +
> +1:
> +#ifdef CONFIG_RELR
> + /*
> + * Apply RELR relocations.
> + *
> + * RELR is a compressed format for storing relative relocations. The
> + * encoded sequence of entries looks like:
> + * [ AAAAAAAA BBBBBBB1 BBBBBBB1 ... AAAAAAAA BBBBBB1 ... ]
I assume these are treated as an array of u64 types for the purposes of
endianness? (have you tested with a big-endian kernel?).
Will
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-07-31 16:48 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-05 8:02 [PATCH] arm64: Add support for relocating the kernel with RELR relocations Peter Collingbourne
2019-07-08 18:02 ` Nick Desaulniers
2019-07-09 22:04 ` Peter Collingbourne
2019-07-09 23:13 ` Nick Desaulniers
2019-07-12 19:40 ` Peter Collingbourne
2019-07-10 16:21 ` Will Deacon
2019-07-12 19:40 ` Peter Collingbourne
2019-07-10 23:14 ` Nick Desaulniers
2019-07-12 19:40 ` Peter Collingbourne
2019-07-12 19:33 ` [PATCH v2] arm64: Add support for relocating the kernel with RELR Peter Collingbourne
2019-07-12 19:38 ` [PATCH v2] arm64: Add support for relocating the kernel with RELR relocations Peter Collingbourne
2019-07-29 20:00 ` Peter Collingbourne
2019-07-31 16:48 ` Will Deacon [this message]
2019-08-01 1:19 ` Peter Collingbourne
2019-08-01 1:18 ` [PATCH v3] " Peter Collingbourne
2019-08-01 12:05 ` Will Deacon
2019-08-01 17:51 ` Peter Collingbourne
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=20190731164818.m2und6msyhlbf5oi@willie-the-truck \
--to=will@kernel.org \
--cc=ard.biesheuvel@linaro.org \
--cc=catalin.marinas@arm.com \
--cc=clang-built-linux@googlegroups.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=mark.rutland@arm.com \
--cc=ndesaulniers@google.com \
--cc=pcc@google.com \
--cc=yamada.masahiro@socionext.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.