diff mbox series

MIPS: Ignore relocs against __ex_table for relocatable kernel

Message ID 20250226132841.381063-1-xry111@xry111.site (mailing list archive)
State New
Headers show
Series MIPS: Ignore relocs against __ex_table for relocatable kernel | expand

Commit Message

Xi Ruoyao Feb. 26, 2025, 1:28 p.m. UTC
Since commit 6f2c2f93a190 ("scripts/sorttable: Remove unneeded
Elf_Rel"), sorttable no longer clears relocs against __ex_table,
claiming "it was never used."  But in fact MIPS relocatable kernel had
been implicitly depending on this behavior, so after this commit the
MIPS relocatable kernel has started to spit oops like:

	CPU 1 Unable to handle kernel paging request at virtual address 000000fffbbdbff8, epc == ffffffff818f9a6c, ra == ffffffff813ad7d0
	... ...
	Call Trace:
	[<ffffffff818f9a6c>] __raw_copy_from_user+0x48/0x2fc
	[<ffffffff813ad7d0>] cp_statx+0x1a0/0x1e0
	[<ffffffff813ae528>] do_statx_fd+0xa8/0x118
	[<ffffffff813ae670>] sys_statx+0xd8/0xf8
	[<ffffffff81156cc8>] syscall_common+0x34/0x58

So ignore those relocs on our own to fix the issue.

Fixes: 6f2c2f93a190 ("scripts/sorttable: Remove unneeded Elf_Rel")
Signed-off-by: Xi Ruoyao <xry111@xry111.site>
---
 arch/mips/boot/tools/relocs.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Steven Rostedt Feb. 26, 2025, 3:43 p.m. UTC | #1
On Wed, 26 Feb 2025 21:28:41 +0800
Xi Ruoyao <xry111@xry111.site> wrote:

> Since commit 6f2c2f93a190 ("scripts/sorttable: Remove unneeded
> Elf_Rel"), sorttable no longer clears relocs against __ex_table,
> claiming "it was never used."  But in fact MIPS relocatable kernel had
> been implicitly depending on this behavior, so after this commit the
> MIPS relocatable kernel has started to spit oops like:

 Oops!

> 
> 	CPU 1 Unable to handle kernel paging request at virtual address 000000fffbbdbff8, epc == ffffffff818f9a6c, ra == ffffffff813ad7d0
> 	... ...
> 	Call Trace:
> 	[<ffffffff818f9a6c>] __raw_copy_from_user+0x48/0x2fc
> 	[<ffffffff813ad7d0>] cp_statx+0x1a0/0x1e0
> 	[<ffffffff813ae528>] do_statx_fd+0xa8/0x118
> 	[<ffffffff813ae670>] sys_statx+0xd8/0xf8
> 	[<ffffffff81156cc8>] syscall_common+0x34/0x58
> 
> So ignore those relocs on our own to fix the issue.
> 
> Fixes: 6f2c2f93a190 ("scripts/sorttable: Remove unneeded Elf_Rel")
> Signed-off-by: Xi Ruoyao <xry111@xry111.site>

Thanks! Yeah, this is better than having an implicit dependency to the
sorttable code.

I take it that this will go through the mips tree?

-- Steve
diff mbox series

Patch

diff --git a/arch/mips/boot/tools/relocs.c b/arch/mips/boot/tools/relocs.c
index a88d66c46d7f..9863e1d5c62e 100644
--- a/arch/mips/boot/tools/relocs.c
+++ b/arch/mips/boot/tools/relocs.c
@@ -468,6 +468,8 @@  static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel,
 			Elf_Sym *sym, const char *symname))
 {
 	int i;
+	struct section *extab_sec = sec_lookup("__ex_table");
+	int extab_index = extab_sec ? extab_sec - secs : -1;
 
 	/* Walk through the relocations */
 	for (i = 0; i < ehdr.e_shnum; i++) {
@@ -480,6 +482,9 @@  static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel,
 		if (sec->shdr.sh_type != SHT_REL_TYPE)
 			continue;
 
+		if (sec->shdr.sh_info == extab_index)
+			continue;
+
 		sec_symtab  = sec->link;
 		sec_applies = &secs[sec->shdr.sh_info];
 		if (!(sec_applies->shdr.sh_flags & SHF_ALLOC))