]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
um: remove fault_catcher infrastructure
authorJohannes Berg <johannes.berg@intel.com>
Thu, 10 Oct 2024 20:45:14 +0000 (22:45 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 23 Oct 2024 07:52:46 +0000 (09:52 +0200)
This was perhaps intended to do _nofault copies, but the
real reason is lost to history. Remove this, it's not
needed, and using longjmp() out of the middle of the
signal handler with all the state it has modified is
not going to be a good idea anyway.

Link: https://patch.msgid.link/20241010224513.901c4d390b3e.Ia74742668b44603c1ca23dd36f90e964e6e7ee55@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
arch/um/include/asm/processor-generic.h
arch/um/include/shared/kern_util.h
arch/um/kernel/trap.c
arch/um/os-Linux/signal.c

index bce4595798dae5d244b1fba966d46a2129f742da..02e759a4a435098d547a3c228db2aeaad34211ae 100644 (file)
@@ -22,8 +22,6 @@ struct mm_struct;
 struct thread_struct {
        struct pt_regs regs;
        struct pt_regs *segv_regs;
-       void *fault_addr;
-       jmp_buf *fault_catcher;
        struct task_struct *prev_sched;
        struct arch_thread arch;
        jmp_buf switch_buf;
@@ -38,7 +36,6 @@ struct thread_struct {
 #define INIT_THREAD \
 { \
        .regs                   = EMPTY_REGS,   \
-       .fault_addr             = NULL, \
        .prev_sched             = NULL, \
        .arch                   = INIT_ARCH_THREAD, \
        .request                = { } \
index d8ffd2db168e00a5e1e7c83f9008bdad091647cf..f21dc851753812018e41616a88ae44f885881cc6 100644 (file)
@@ -60,7 +60,6 @@ extern unsigned long from_irq_stack(int nested);
 extern int singlestepping(void);
 
 extern void segv_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
-extern void bus_handler(int sig, struct siginfo *si, struct uml_pt_regs *regs);
 extern void winch(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
 extern void fatal_sigsegv(void) __attribute__ ((noreturn));
 
index 97c8df9c44017c3b24610b16190b2cae51efa096..cdaee3e94273418c51856b26da0e5c977929b8f4 100644 (file)
@@ -201,7 +201,6 @@ void segv_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs)
 unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user,
                   struct uml_pt_regs *regs)
 {
-       jmp_buf *catcher;
        int si_code;
        int err;
        int is_write = FAULT_WRITE(fi);
@@ -246,15 +245,8 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user,
                address = 0;
        }
 
-       catcher = current->thread.fault_catcher;
        if (!err)
                goto out;
-       else if (catcher != NULL) {
-               current->thread.fault_addr = (void *) address;
-               UML_LONGJMP(catcher, 1);
-       }
-       else if (current->thread.fault_addr != NULL)
-               panic("fault_addr set but no fault catcher");
        else if (!is_user && arch_fixup(ip, regs))
                goto out;
 
@@ -310,14 +302,6 @@ void relay_signal(int sig, struct siginfo *si, struct uml_pt_regs *regs)
        }
 }
 
-void bus_handler(int sig, struct siginfo *si, struct uml_pt_regs *regs)
-{
-       if (current->thread.fault_catcher != NULL)
-               UML_LONGJMP(current->thread.fault_catcher, 1);
-       else
-               relay_signal(sig, si, regs);
-}
-
 void winch(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs)
 {
        do_IRQ(WINCH_IRQ, regs);
index b11ed66c8bb0eaaf9e16997784ee98002ff5ab1a..1978eaa557e9b0f465b0decc68e3162eb6a5b025 100644 (file)
@@ -26,7 +26,7 @@ void (*sig_info[NSIG])(int, struct siginfo *, struct uml_pt_regs *) = {
        [SIGFPE]        = relay_signal,
        [SIGILL]        = relay_signal,
        [SIGWINCH]      = winch,
-       [SIGBUS]        = bus_handler,
+       [SIGBUS]        = relay_signal,
        [SIGSEGV]       = segv_handler,
        [SIGIO]         = sigio_handler,
 };