Kexec Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 0/3] RISC-V: Fix a few kexec_file_load(2) failures
@ 2023-07-25 10:01 Petr Tesarik
  2023-07-25 10:01 ` [PATCH v1 1/3] riscv/kexec: handle R_RISCV_CALL_PLT relocation type Petr Tesarik
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Petr Tesarik @ 2023-07-25 10:01 UTC (permalink / raw)
  To: kexec

From: Petr Tesarik <petr.tesarik.ext@huawei.com>

The kexec_file_load(2) syscall does not work at least in some kernel
builds. For details see the relevant section in this blog post:

https://sigillatum.tesarici.cz/2023-07-21-state-of-riscv64-kdump.html

This patch series handles additional relocation types and removes the need
to implement a Global Offset Table (GOT) for the purgatory.

Petr Tesarik (2):
  riscv/kexec: handle R_RISCV_ADD16 and R_RISCV_SUB16 relocation types
  riscv/purgatory: do not link with string.o

Torsten Duwe (1):
  riscv/kexec: handle R_RISCV_CALL_PLT relocation type

 arch/riscv/kernel/elf_kexec.c | 7 +++++++
 arch/riscv/purgatory/Makefile | 9 +--------
 2 files changed, 8 insertions(+), 8 deletions(-)

-- 
2.25.1


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v1 1/3] riscv/kexec: handle R_RISCV_CALL_PLT relocation type
  2023-07-25 10:01 [PATCH v1 0/3] RISC-V: Fix a few kexec_file_load(2) failures Petr Tesarik
@ 2023-07-25 10:01 ` Petr Tesarik
  2023-07-25 10:01 ` [PATCH v1 2/3] riscv/kexec: handle R_RISCV_ADD16 and R_RISCV_SUB16 relocation types Petr Tesarik
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Petr Tesarik @ 2023-07-25 10:01 UTC (permalink / raw)
  To: kexec

From: Torsten Duwe <duwe@suse.de>

R_RISCV_CALL has been deprecated and replaced by R_RISCV_CALL_PLT. See Enum
18-19 in Table 3. Relocation types here:

https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc

It was deprecated in ("Deprecated R_RISCV_CALL, prefer R_RISCV_CALL_PLT"):

https://github.com/riscv-non-isa/riscv-elf-psabi-doc/commit/a0dced85018d7a0ec17023c9389cbd70b1dbc1b0

Recent tools (at least GNU binutils-2.40) already use R_RISCV_CALL_PLT.
Kernels built with such binutils fail kexec_load_file(2) with:

 kexec_image: Unknown rela relocation: 19
 kexec_image: Error loading purgatory ret=-8

The binary code at the call site remains the same, so tell
arch_kexec_apply_relocations_add() to handle _PLT alike.

Fixes: 838b3e28488f ("RISC-V: Load purgatory in kexec_file")
Signed-off-by: Torsten Duwe <duwe@suse.de>
Signed-off-by: Petr Tesarik <petr.tesarik.ext@huawei.com>
Cc: Li Zhengyu <lizhengyu3@huawei.com>
Cc: stable@vger.kernel.org
---
 arch/riscv/kernel/elf_kexec.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/riscv/kernel/elf_kexec.c b/arch/riscv/kernel/elf_kexec.c
index 5372b708fae2..38390d3bdcac 100644
--- a/arch/riscv/kernel/elf_kexec.c
+++ b/arch/riscv/kernel/elf_kexec.c
@@ -425,6 +425,7 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
 		 * sym, instead of searching the whole relsec.
 		 */
 		case R_RISCV_PCREL_HI20:
+		case R_RISCV_CALL_PLT:
 		case R_RISCV_CALL:
 			*(u64 *)loc = CLEAN_IMM(UITYPE, *(u64 *)loc) |
 				 ENCODE_UJTYPE_IMM(val - addr);
-- 
2.25.1


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v1 2/3] riscv/kexec: handle R_RISCV_ADD16 and R_RISCV_SUB16 relocation types
  2023-07-25 10:01 [PATCH v1 0/3] RISC-V: Fix a few kexec_file_load(2) failures Petr Tesarik
  2023-07-25 10:01 ` [PATCH v1 1/3] riscv/kexec: handle R_RISCV_CALL_PLT relocation type Petr Tesarik
@ 2023-07-25 10:01 ` Petr Tesarik
  2023-07-25 10:01 ` [PATCH v1 3/3] riscv/purgatory: do not link with string.o Petr Tesarik
  2023-07-25 10:06 ` [PATCH v1 0/3] RISC-V: Fix a few kexec_file_load(2) failures Petr Tesařík
  3 siblings, 0 replies; 5+ messages in thread
From: Petr Tesarik @ 2023-07-25 10:01 UTC (permalink / raw)
  To: kexec

From: Petr Tesarik <petr.tesarik.ext@huawei.com>

16-bit add and subtract relocation types are used by the purgatory code
when the kernel is built with CONFIG_RISCV_ALTERNATIVES. If they are not
handled, kexec_file_load(2) fails with:

 Unknown rela relocation: 34
 kexec_image: Error loading purgatory ret=-8

or later with:

 Unknown rela relocation: 38
 kexec_image: Error loading purgatory ret=-8

Note that alternatives are not yet handled in purgatory code; this patch
merely allows to load it.

Fixes: 838b3e28488f ("RISC-V: Load purgatory in kexec_file")
Signed-off-by: Petr Tesarik <petr.tesarik.ext@huawei.com>
Cc: Li Zhengyu <lizhengyu3@huawei.com>
Cc: stable@vger.kernel.org
---
 arch/riscv/kernel/elf_kexec.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/arch/riscv/kernel/elf_kexec.c b/arch/riscv/kernel/elf_kexec.c
index 38390d3bdcac..f23fd419c402 100644
--- a/arch/riscv/kernel/elf_kexec.c
+++ b/arch/riscv/kernel/elf_kexec.c
@@ -444,6 +444,12 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
 		case R_RISCV_SUB32:
 			*(u32 *)loc -= val;
 			break;
+		case R_RISCV_ADD16:
+			*(u16 *)loc += val;
+			break;
+		case R_RISCV_SUB16:
+			*(u16 *)loc -= val;
+			break;
 		/* It has been applied by R_RISCV_PCREL_HI20 sym */
 		case R_RISCV_PCREL_LO12_I:
 		case R_RISCV_ALIGN:
-- 
2.25.1


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v1 3/3] riscv/purgatory: do not link with string.o
  2023-07-25 10:01 [PATCH v1 0/3] RISC-V: Fix a few kexec_file_load(2) failures Petr Tesarik
  2023-07-25 10:01 ` [PATCH v1 1/3] riscv/kexec: handle R_RISCV_CALL_PLT relocation type Petr Tesarik
  2023-07-25 10:01 ` [PATCH v1 2/3] riscv/kexec: handle R_RISCV_ADD16 and R_RISCV_SUB16 relocation types Petr Tesarik
@ 2023-07-25 10:01 ` Petr Tesarik
  2023-07-25 10:06 ` [PATCH v1 0/3] RISC-V: Fix a few kexec_file_load(2) failures Petr Tesařík
  3 siblings, 0 replies; 5+ messages in thread
From: Petr Tesarik @ 2023-07-25 10:01 UTC (permalink / raw)
  To: kexec

From: Petr Tesarik <petr.tesarik.ext@huawei.com>

Linking with this object file it makes kexec_file_load(2) fail with:

 kexec_image: Unknown rela relocation: 20
 kexec_image: Error loading purgatory ret=-8

This is R_RISCV_GOT_HI20, generated by the linker to handle references to
the global variable _ctype from strcasecmp() and strncasecmp().

Rather than implementing GOT for the purgatory, remove the object file,
because it is not needed by the purgatory code.

Fixes: 838b3e28488f ("RISC-V: Load purgatory in kexec_file")
Signed-off-by: Petr Tesarik <petr.tesarik.ext@huawei.com>
Cc: Li Zhengyu <lizhengyu3@huawei.com>
Cc: stable@vger.kernel.org
---
 arch/riscv/purgatory/Makefile | 9 +--------
 1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/arch/riscv/purgatory/Makefile b/arch/riscv/purgatory/Makefile
index dc20e166983e..497bb72b6ba8 100644
--- a/arch/riscv/purgatory/Makefile
+++ b/arch/riscv/purgatory/Makefile
@@ -1,15 +1,12 @@
 # SPDX-License-Identifier: GPL-2.0
 OBJECT_FILES_NON_STANDARD := y
 
-purgatory-y := purgatory.o sha256.o entry.o string.o ctype.o memcpy.o memset.o
+purgatory-y := purgatory.o sha256.o entry.o ctype.o memcpy.o memset.o
 purgatory-y += strcmp.o strlen.o strncmp.o
 
 targets += $(purgatory-y)
 PURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y))
 
-$(obj)/string.o: $(srctree)/lib/string.c FORCE
-	$(call if_changed_rule,cc_o_c)
-
 $(obj)/ctype.o: $(srctree)/lib/ctype.c FORCE
 	$(call if_changed_rule,cc_o_c)
 
@@ -32,7 +29,6 @@ $(obj)/sha256.o: $(srctree)/lib/crypto/sha256.c FORCE
 	$(call if_changed_rule,cc_o_c)
 
 CFLAGS_sha256.o := -D__DISABLE_EXPORTS -D__NO_FORTIFY
-CFLAGS_string.o := -D__DISABLE_EXPORTS
 CFLAGS_ctype.o := -D__DISABLE_EXPORTS
 
 # When profile-guided optimization is enabled, llvm emits two different
@@ -83,9 +79,6 @@ CFLAGS_purgatory.o		+= $(PURGATORY_CFLAGS)
 CFLAGS_REMOVE_sha256.o		+= $(PURGATORY_CFLAGS_REMOVE)
 CFLAGS_sha256.o			+= $(PURGATORY_CFLAGS)
 
-CFLAGS_REMOVE_string.o		+= $(PURGATORY_CFLAGS_REMOVE)
-CFLAGS_string.o			+= $(PURGATORY_CFLAGS)
-
 CFLAGS_REMOVE_ctype.o		+= $(PURGATORY_CFLAGS_REMOVE)
 CFLAGS_ctype.o			+= $(PURGATORY_CFLAGS)
 
-- 
2.25.1


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v1 0/3] RISC-V: Fix a few kexec_file_load(2) failures
  2023-07-25 10:01 [PATCH v1 0/3] RISC-V: Fix a few kexec_file_load(2) failures Petr Tesarik
                   ` (2 preceding siblings ...)
  2023-07-25 10:01 ` [PATCH v1 3/3] riscv/purgatory: do not link with string.o Petr Tesarik
@ 2023-07-25 10:06 ` Petr Tesařík
  3 siblings, 0 replies; 5+ messages in thread
From: Petr Tesařík @ 2023-07-25 10:06 UTC (permalink / raw)
  To: Petr Tesarik; +Cc: kexec

Hi,

oops. I wanted to _add_ the kexec ML to all other recipients, but I
somehow screwed up, so this version is sent _only_ to the kexec ML. If
you reply here, the other recipients will not see your reply. The real
thread is here:

https://lore.kernel.org/lkml/cover.1690274483.git.petr.tesarik.ext@huawei.com/

I'm sorry
Petr T

On Tue, 25 Jul 2023 12:01:07 +0200
Petr Tesarik <petrtesarik@huaweicloud.com> wrote:

> From: Petr Tesarik <petr.tesarik.ext@huawei.com>
> 
> The kexec_file_load(2) syscall does not work at least in some kernel
> builds. For details see the relevant section in this blog post:
> 
> https://sigillatum.tesarici.cz/2023-07-21-state-of-riscv64-kdump.html
> 
> This patch series handles additional relocation types and removes the need
> to implement a Global Offset Table (GOT) for the purgatory.
> 
> Petr Tesarik (2):
>   riscv/kexec: handle R_RISCV_ADD16 and R_RISCV_SUB16 relocation types
>   riscv/purgatory: do not link with string.o
> 
> Torsten Duwe (1):
>   riscv/kexec: handle R_RISCV_CALL_PLT relocation type
> 
>  arch/riscv/kernel/elf_kexec.c | 7 +++++++
>  arch/riscv/purgatory/Makefile | 9 +--------
>  2 files changed, 8 insertions(+), 8 deletions(-)
> 


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-07-25 10:06 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-25 10:01 [PATCH v1 0/3] RISC-V: Fix a few kexec_file_load(2) failures Petr Tesarik
2023-07-25 10:01 ` [PATCH v1 1/3] riscv/kexec: handle R_RISCV_CALL_PLT relocation type Petr Tesarik
2023-07-25 10:01 ` [PATCH v1 2/3] riscv/kexec: handle R_RISCV_ADD16 and R_RISCV_SUB16 relocation types Petr Tesarik
2023-07-25 10:01 ` [PATCH v1 3/3] riscv/purgatory: do not link with string.o Petr Tesarik
2023-07-25 10:06 ` [PATCH v1 0/3] RISC-V: Fix a few kexec_file_load(2) failures Petr Tesařík

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox