From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
To: Jessica Yu <jeyu@kernel.org>
Cc: Torsten Duwe <duwe@lst.de>, Will Deacon <will.deacon@arm.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Julien Thierry <julien.thierry@arm.com>,
Steven Rostedt <rostedt@goodmis.org>,
Josh Poimboeuf <jpoimboe@redhat.com>,
Ingo Molnar <mingo@redhat.com>, Arnd Bergmann <arnd@arndb.de>,
AKASHI Takahiro <takahiro.akashi@linaro.org>,
linux-arm-kernel <linux-arm-kernel@lists.infradead.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
live-patching@vger.kernel.org
Subject: Re: [PATCH] arm64/module: use plt section indices for relocations
Date: Mon, 5 Nov 2018 19:04:03 +0100 [thread overview]
Message-ID: <CAKv+Gu8nd2gyX6K8uAWig7BQa=qFMTajPKgEYPLcHkxmYedgsA@mail.gmail.com> (raw)
In-Reply-To: <20181105175722.removbbpilqxu7tr@redbean>
On 5 November 2018 at 18:57, Jessica Yu <jeyu@kernel.org> wrote:
> Instead of saving a pointer to the .plt and .init.plt sections to apply
> plt-based relocations, save and use their section indices instead.
>
> The mod->arch.{core,init}.plt pointers were problematic for livepatch
> because they pointed within temporary section headers (provided by the
> module loader via info->sechdrs) that would be freed after module load.
> Since livepatch modules may need to apply relocations post-module-load
> (for example, to patch a module that is loaded later), using section
> indices to offset into the section headers (instead of accessing them
> through a saved pointer) allows livepatch modules on arm64 to pass in
> their own copy of the section headers to apply_relocate_add() to apply
> delayed relocations.
>
> Signed-off-by: Jessica Yu <jeyu@kernel.org>
> ---
>
> Note: Addressed Will's comment about the pltsec -> plt_info rename and
> removed that change to reduce unnecessary code churn. That is the only
> change from the first version. I didn't include the Ack's for this reason
> so let me know if this version is OK as well.
>
> arch/arm64/include/asm/module.h | 8 +++++---
> arch/arm64/kernel/module-plts.c | 36 ++++++++++++++++++++----------------
> arch/arm64/kernel/module.c | 9 +++++----
> 3 files changed, 30 insertions(+), 23 deletions(-)
>
> diff --git a/arch/arm64/include/asm/module.h
> b/arch/arm64/include/asm/module.h
> index 97d0ef12e2ff..f81c1847312d 100644
> --- a/arch/arm64/include/asm/module.h
> +++ b/arch/arm64/include/asm/module.h
> @@ -22,7 +22,7 @@
>
> #ifdef CONFIG_ARM64_MODULE_PLTS
> struct mod_plt_sec {
> - struct elf64_shdr *plt;
> + int plt_shndx;
> int plt_num_entries;
> int plt_max_entries;
> };
> @@ -36,10 +36,12 @@ struct mod_arch_specific {
> };
> #endif
>
> -u64 module_emit_plt_entry(struct module *mod, void *loc, const Elf64_Rela
> *rela,
> +u64 module_emit_plt_entry(struct module *mod, Elf64_Shdr *sechdrs,
> + void *loc, const Elf64_Rela *rela,
> Elf64_Sym *sym);
>
> -u64 module_emit_veneer_for_adrp(struct module *mod, void *loc, u64 val);
> +u64 module_emit_veneer_for_adrp(struct module *mod, Elf64_Shdr *sechdrs,
> + void *loc, u64 val);
>
> #ifdef CONFIG_RANDOMIZE_BASE
> extern u64 module_alloc_base;
> diff --git a/arch/arm64/kernel/module-plts.c
> b/arch/arm64/kernel/module-plts.c
> index f0690c2ca3e0..c04b0d6abde0 100644
> --- a/arch/arm64/kernel/module-plts.c
> +++ b/arch/arm64/kernel/module-plts.c
> @@ -16,12 +16,13 @@ static bool in_init(const struct module *mod, void *loc)
> return (u64)loc - (u64)mod->init_layout.base <
> mod->init_layout.size;
> }
>
> -u64 module_emit_plt_entry(struct module *mod, void *loc, const Elf64_Rela
> *rela,
> +u64 module_emit_plt_entry(struct module *mod, Elf64_Shdr *sechdrs,
> + void *loc, const Elf64_Rela *rela,
> Elf64_Sym *sym)
> {
> struct mod_plt_sec *pltsec = !in_init(mod, loc) ? &mod->arch.core :
> &mod->arch.init;
> - struct plt_entry *plt = (struct plt_entry *)pltsec->plt->sh_addr;
> + struct plt_entry *plt = (struct plt_entry *)(sechdrs +
> pltsec->plt_shndx)->sh_addr;
What's wrong with
(struct plt_entry *)sechdrs[pltsec->plt_shndx].sh_addr
?
> int i = pltsec->plt_num_entries;
> u64 val = sym->st_value + rela->r_addend;
>
> @@ -43,11 +44,12 @@ u64 module_emit_plt_entry(struct module *mod, void *loc,
> const Elf64_Rela *rela,
> }
>
> #ifdef CONFIG_ARM64_ERRATUM_843419
> -u64 module_emit_veneer_for_adrp(struct module *mod, void *loc, u64 val)
> +u64 module_emit_veneer_for_adrp(struct module *mod, Elf64_Shdr *sechdrs,
> + void *loc, u64 val)
> {
> struct mod_plt_sec *pltsec = !in_init(mod, loc) ? &mod->arch.core :
> &mod->arch.init;
> - struct plt_entry *plt = (struct plt_entry *)pltsec->plt->sh_addr;
> + struct plt_entry *plt = (struct plt_entry *)(sechdrs +
> pltsec->plt_shndx)->sh_addr;
> int i = pltsec->plt_num_entries++;
> u32 mov0, mov1, mov2, br;
> int rd;
> @@ -202,7 +204,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr
> *sechdrs,
> unsigned long core_plts = 0;
> unsigned long init_plts = 0;
> Elf64_Sym *syms = NULL;
> - Elf_Shdr *tramp = NULL;
> + Elf_Shdr *pltsec, *tramp = NULL;
> int i;
>
> /*
> @@ -211,9 +213,9 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr
> *sechdrs,
> */
> for (i = 0; i < ehdr->e_shnum; i++) {
> if (!strcmp(secstrings + sechdrs[i].sh_name, ".plt"))
> - mod->arch.core.plt = sechdrs + i;
> + mod->arch.core.plt_shndx = i;
> else if (!strcmp(secstrings + sechdrs[i].sh_name,
> ".init.plt"))
> - mod->arch.init.plt = sechdrs + i;
> + mod->arch.init.plt_shndx = i;
> else if (IS_ENABLED(CONFIG_DYNAMIC_FTRACE) &&
> !strcmp(secstrings + sechdrs[i].sh_name,
> ".text.ftrace_trampoline"))
> @@ -222,7 +224,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr
> *sechdrs,
> syms = (Elf64_Sym *)sechdrs[i].sh_addr;
> }
>
> - if (!mod->arch.core.plt || !mod->arch.init.plt) {
> + if (!mod->arch.core.plt_shndx || !mod->arch.init.plt_shndx) {
> pr_err("%s: module PLT section(s) missing\n", mod->name);
> return -ENOEXEC;
> }
> @@ -254,17 +256,19 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr
> *sechdrs,
> sechdrs[i].sh_info, dstsec);
> }
>
> - mod->arch.core.plt->sh_type = SHT_NOBITS;
> - mod->arch.core.plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
> - mod->arch.core.plt->sh_addralign = L1_CACHE_BYTES;
> - mod->arch.core.plt->sh_size = (core_plts + 1) * sizeof(struct
> plt_entry);
> + pltsec = sechdrs + mod->arch.core.plt_shndx;
> + pltsec->sh_type = SHT_NOBITS;
> + pltsec->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
> + pltsec->sh_addralign = L1_CACHE_BYTES;
> + pltsec->sh_size = (core_plts + 1) * sizeof(struct plt_entry);
> mod->arch.core.plt_num_entries = 0;
> mod->arch.core.plt_max_entries = core_plts;
>
> - mod->arch.init.plt->sh_type = SHT_NOBITS;
> - mod->arch.init.plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
> - mod->arch.init.plt->sh_addralign = L1_CACHE_BYTES;
> - mod->arch.init.plt->sh_size = (init_plts + 1) * sizeof(struct
> plt_entry);
> + pltsec = sechdrs + mod->arch.init.plt_shndx;
> + pltsec->sh_type = SHT_NOBITS;
> + pltsec->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
> + pltsec->sh_addralign = L1_CACHE_BYTES;
> + pltsec->sh_size = (init_plts + 1) * sizeof(struct plt_entry);
> mod->arch.init.plt_num_entries = 0;
> mod->arch.init.plt_max_entries = init_plts;
>
> diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c
> index f0f27aeefb73..c2abe59c6f8f 100644
> --- a/arch/arm64/kernel/module.c
> +++ b/arch/arm64/kernel/module.c
> @@ -198,7 +198,8 @@ static int reloc_insn_imm(enum aarch64_reloc_op op,
> __le32 *place, u64 val,
> return 0;
> }
>
> -static int reloc_insn_adrp(struct module *mod, __le32 *place, u64 val)
> +static int reloc_insn_adrp(struct module *mod, Elf64_Shdr *sechdrs,
> + __le32 *place, u64 val)
> {
> u32 insn;
>
> @@ -215,7 +216,7 @@ static int reloc_insn_adrp(struct module *mod, __le32
> *place, u64 val)
> insn &= ~BIT(31);
> } else {
> /* out of range for ADR -> emit a veneer */
> - val = module_emit_veneer_for_adrp(mod, place, val & ~0xfff);
> + val = module_emit_veneer_for_adrp(mod, sechdrs, place, val &
> ~0xfff);
> if (!val)
> return -ENOEXEC;
> insn = aarch64_insn_gen_branch_imm((u64)place, val,
> @@ -368,7 +369,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
> case R_AARCH64_ADR_PREL_PG_HI21_NC:
> overflow_check = false;
> case R_AARCH64_ADR_PREL_PG_HI21:
> - ovf = reloc_insn_adrp(me, loc, val);
> + ovf = reloc_insn_adrp(me, sechdrs, loc, val);
> if (ovf && ovf != -ERANGE)
> return ovf;
> break;
> @@ -413,7 +414,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
>
> if (IS_ENABLED(CONFIG_ARM64_MODULE_PLTS) &&
> ovf == -ERANGE) {
> - val = module_emit_plt_entry(me, loc,
> &rel[i], sym);
> + val = module_emit_plt_entry(me, sechdrs,
> loc, &rel[i], sym);
> if (!val)
> return -ENOEXEC;
> ovf = reloc_insn_imm(RELOC_OP_PREL, loc,
> val, 2,
> --
> 2.14.5
>
next prev parent reply other threads:[~2018-11-05 18:04 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-01 14:09 [PATCH v3 0/4] arm64 live patching Torsten Duwe
2018-10-01 14:16 ` [PATCH v3 1/4] DYNAMIC_FTRACE configurable with and without REGS Torsten Duwe
2018-10-01 14:52 ` Ard Biesheuvel
2018-10-01 15:03 ` Torsten Duwe
2018-10-01 15:06 ` Ard Biesheuvel
2018-10-01 15:10 ` Torsten Duwe
2018-10-01 15:14 ` Steven Rostedt
2018-10-01 14:16 ` [PATCH v3 2/4] arm64: implement ftrace with regs Torsten Duwe
2018-10-01 15:57 ` Ard Biesheuvel
2018-10-02 10:02 ` Torsten Duwe
2018-10-02 10:39 ` Ard Biesheuvel
2018-10-02 11:27 ` Mark Rutland
2018-10-02 12:18 ` Torsten Duwe
2018-10-02 12:57 ` Mark Rutland
2018-10-01 14:16 ` [PATCH v3 3/4] arm64: implement live patching Torsten Duwe
2018-10-17 13:39 ` Miroslav Benes
2018-10-18 12:58 ` Jessica Yu
2018-10-19 11:59 ` Miroslav Benes
2018-10-19 12:18 ` Jessica Yu
2018-10-19 15:14 ` Miroslav Benes
2018-10-19 13:46 ` Torsten Duwe
2018-10-19 13:52 ` Ard Biesheuvel
2018-10-19 15:21 ` Miroslav Benes
2018-10-20 14:10 ` Ard Biesheuvel
2018-10-22 12:53 ` Miroslav Benes
2018-10-22 14:54 ` Torsten Duwe
2018-10-23 17:55 ` [PATCH] arm64/module: use mod->klp_info section header information Jessica Yu
2018-10-23 19:32 ` kbuild test robot
2018-10-24 11:57 ` Miroslav Benes
2018-10-25 8:08 ` Petr Mladek
2018-10-25 9:00 ` Miroslav Benes
2018-10-25 11:42 ` Jessica Yu
2018-10-26 17:25 ` [PATCH v2] arm64/module: use mod->klp_info section header information for livepatch modules Jessica Yu
2018-10-29 13:24 ` Miroslav Benes
2018-10-29 13:32 ` Jessica Yu
2018-10-29 15:28 ` Will Deacon
2018-10-30 13:19 ` Jessica Yu
2018-11-01 15:18 ` Miroslav Benes
2018-11-01 16:07 ` Will Deacon
2018-11-05 12:30 ` Ard Biesheuvel
2018-11-05 17:57 ` [PATCH] arm64/module: use plt section indices for relocations Jessica Yu
2018-11-05 18:04 ` Ard Biesheuvel [this message]
2018-11-05 18:53 ` [PATCH v2] " Jessica Yu
2018-11-05 18:56 ` Ard Biesheuvel
2018-11-05 19:26 ` Will Deacon
2018-11-05 19:49 ` Jessica Yu
2018-11-06 9:44 ` Miroslav Benes
2018-10-01 14:16 ` [PATCH v3 4/4] arm64: reliable stacktraces Torsten Duwe
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='CAKv+Gu8nd2gyX6K8uAWig7BQa=qFMTajPKgEYPLcHkxmYedgsA@mail.gmail.com' \
--to=ard.biesheuvel@linaro.org \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=duwe@lst.de \
--cc=jeyu@kernel.org \
--cc=jpoimboe@redhat.com \
--cc=julien.thierry@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=live-patching@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=rostedt@goodmis.org \
--cc=takahiro.akashi@linaro.org \
--cc=will.deacon@arm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).