blob: 8ab2196dc71d454fdda2b804cac7391605ec4062 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
From 1410ebe685f13c1699a16bf147ae1332e7fd1983 Mon Sep 17 00:00:00 2001
From: Greg Ungerer <gerg@kernel.org>
Date: Thu, 20 Apr 2023 09:52:08 +1000
Subject: [PATCH] ARM: start_thread: restore registers on ELF load for noMMU
The binfmt_elf-fdpic loader is capable of loading constant displacement
ELF format binaries (like those compiled -pie) on noMMU systems as well
as elf-fdpic format binaries. The traditional ELF loader cannot be
enabled on noMMU systems.
Commit 5e588114329c ("ARM: start_thread(): don't always clear all regs")
fixed the start_thread() code so that it maintains the required
elf-fdpic registers through to the new process, but it only does that if
current has its personality FDPIC_FUNCPTRS bit set. That is true for
elf-fdpic format binaries but will not be true for non-fdpic ELF
binaries.
Modify the test of the FDPIC_FUNCPTRS personality bit to also carry out
the register restore if this is a noMMU system. This is not perfect,
since it will also preserve these registers on noMMU systems for all
binary format types (could be flat format for example). That won't break
anything, but it is potentially leaking some information into the new
process. But for the noMMU case we need those start time registers set to
be able to finalize the runtime loading of the -pie style ELF binary
(carry out its segment and dynamic relocation processing).
Unfortunately the FDPIC_FUNCPTRS flag cannot just be enabled for all
elf-fdpic loaded binaries. That personality bit is used for other things
like the controlling the changed behavior for signal handling.
There is no change in behavior for normal ELF loading on MMU systems.
A -pie style ELF binary built for noMMU systems can be load and run using
the usual ELF loader on an MMU system (elf-fdpic loader not required in
this case).
Signed-off-by: Greg Ungerer <gerg@kernel.org>
---
arch/arm/include/asm/processor.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h
index 326864f79d18..5074cc3ae4e1 100644
--- a/arch/arm/include/asm/processor.h
+++ b/arch/arm/include/asm/processor.h
@@ -60,7 +60,8 @@ static inline void arch_thread_struct_whitelist(unsigned long *offset,
} \
memset(regs->uregs, 0, sizeof(regs->uregs)); \
if (IS_ENABLED(CONFIG_BINFMT_ELF_FDPIC) && \
- current->personality & FDPIC_FUNCPTRS) { \
+ ((! IS_ENABLED(CONFIG_MMU)) || \
+ current->personality & FDPIC_FUNCPTRS)) { \
regs->ARM_r7 = r7; \
regs->ARM_r8 = r8; \
regs->ARM_r9 = r9; \
--
2.25.1
|