summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Berg <benjamin@sipsolutions.net>2025-06-02 15:00:46 +0200
committerJohannes Berg <johannes.berg@intel.com>2025-06-02 15:17:19 +0200
commit247ed9e4a6869f3bf07bffd277a341a6833abdbc (patch)
treeca52d898fa724fe905ba743a914bf1feb4e85aa5
parentb76d18b53a3f52880452a58cc982910abcccd111 (diff)
um: Move faultinfo extraction into userspace routine
The segv handler is called slightly differently depending on whether PTRACE_FULL_FAULTINFO is set or not (32bit vs. 64bit). The only difference is that we don't try to pass the registers and instruction pointer to the segv handler. It would be good to either document or remove the difference, but I do not know why this difference exists. And, passing NULL can even result in a crash. Signed-off-by: Benjamin Berg <benjamin@sipsolutions.net> Link: https://patch.msgid.link/20250602130052.545733-2-benjamin@sipsolutions.net Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--arch/um/os-Linux/skas/process.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c
index ae2aea062f06..97c2f964f5fc 100644
--- a/arch/um/os-Linux/skas/process.c
+++ b/arch/um/os-Linux/skas/process.c
@@ -163,12 +163,6 @@ static void get_skas_faultinfo(int pid, struct faultinfo *fi)
memcpy(fi, (void *)current_stub_stack(), sizeof(*fi));
}
-static void handle_segv(int pid, struct uml_pt_regs *regs)
-{
- get_skas_faultinfo(pid, &regs->faultinfo);
- segv(regs->faultinfo, 0, 1, NULL, NULL);
-}
-
static void handle_trap(int pid, struct uml_pt_regs *regs)
{
if ((UPT_IP(regs) >= STUB_START) && (UPT_IP(regs) < STUB_END))
@@ -521,13 +515,14 @@ void userspace(struct uml_pt_regs *regs)
switch (sig) {
case SIGSEGV:
- if (PTRACE_FULL_FAULTINFO) {
- get_skas_faultinfo(pid,
- &regs->faultinfo);
+ get_skas_faultinfo(pid, &regs->faultinfo);
+
+ if (PTRACE_FULL_FAULTINFO)
(*sig_info[SIGSEGV])(SIGSEGV, (struct siginfo *)&si,
regs, NULL);
- }
- else handle_segv(pid, regs);
+ else
+ segv(regs->faultinfo, 0, 1, NULL, NULL);
+
break;
case SIGTRAP + 0x80:
handle_trap(pid, regs);