Merge tag 'for-5.15/parisc' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[linux-2.6-microblaze.git] / arch / arm64 / kernel / signal.c
index f8192f4..9fe70b1 100644 (file)
@@ -29,6 +29,7 @@
 #include <asm/unistd.h>
 #include <asm/fpsimd.h>
 #include <asm/ptrace.h>
+#include <asm/syscall.h>
 #include <asm/signal32.h>
 #include <asm/traps.h>
 #include <asm/vdso.h>
@@ -289,6 +290,11 @@ static int restore_sve_fpsimd_context(struct user_ctxs *user)
        /* From now, fpsimd_thread_switch() won't touch thread.sve_state */
 
        sve_alloc(current);
+       if (!current->thread.sve_state) {
+               clear_thread_flag(TIF_SVE);
+               return -ENOMEM;
+       }
+
        err = __copy_from_user(current->thread.sve_state,
                               (char __user const *)user->sve +
                                        SVE_SIG_REGS_OFFSET,
@@ -890,7 +896,7 @@ static void do_signal(struct pt_regs *regs)
                     retval == -ERESTART_RESTARTBLOCK ||
                     (retval == -ERESTARTSYS &&
                      !(ksig.ka.sa.sa_flags & SA_RESTART)))) {
-                       regs->regs[0] = -EINTR;
+                       syscall_set_return_value(current, regs, -EINTR, 0);
                        regs->pc = continue_addr;
                }
 
@@ -911,21 +917,7 @@ static void do_signal(struct pt_regs *regs)
        restore_saved_sigmask();
 }
 
-static bool cpu_affinity_invalid(struct pt_regs *regs)
-{
-       if (!compat_user_mode(regs))
-               return false;
-
-       /*
-        * We're preemptible, but a reschedule will cause us to check the
-        * affinity again.
-        */
-       return !cpumask_test_cpu(raw_smp_processor_id(),
-                                system_32bit_el0_cpumask());
-}
-
-asmlinkage void do_notify_resume(struct pt_regs *regs,
-                                unsigned long thread_flags)
+void do_notify_resume(struct pt_regs *regs, unsigned long thread_flags)
 {
        do {
                if (thread_flags & _TIF_NEED_RESCHED) {
@@ -951,19 +943,6 @@ asmlinkage void do_notify_resume(struct pt_regs *regs,
                        if (thread_flags & _TIF_NOTIFY_RESUME) {
                                tracehook_notify_resume(regs);
                                rseq_handle_notify_resume(NULL, regs);
-
-                               /*
-                                * If we reschedule after checking the affinity
-                                * then we must ensure that TIF_NOTIFY_RESUME
-                                * is set so that we check the affinity again.
-                                * Since tracehook_notify_resume() clears the
-                                * flag, ensure that the compiler doesn't move
-                                * it after the affinity check.
-                                */
-                               barrier();
-
-                               if (cpu_affinity_invalid(regs))
-                                       force_sig(SIGKILL);
                        }
 
                        if (thread_flags & _TIF_FOREIGN_FPSTATE)
@@ -999,3 +978,42 @@ void __init minsigstksz_setup(void)
                round_up(sizeof(struct frame_record), 16) +
                16; /* max alignment padding */
 }
+
+/*
+ * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
+ * changes likely come with new fields that should be added below.
+ */
+static_assert(NSIGILL  == 11);
+static_assert(NSIGFPE  == 15);
+static_assert(NSIGSEGV == 9);
+static_assert(NSIGBUS  == 5);
+static_assert(NSIGTRAP == 6);
+static_assert(NSIGCHLD == 6);
+static_assert(NSIGSYS  == 2);
+static_assert(sizeof(siginfo_t) == 128);
+static_assert(__alignof__(siginfo_t) == 8);
+static_assert(offsetof(siginfo_t, si_signo)    == 0x00);
+static_assert(offsetof(siginfo_t, si_errno)    == 0x04);
+static_assert(offsetof(siginfo_t, si_code)     == 0x08);
+static_assert(offsetof(siginfo_t, si_pid)      == 0x10);
+static_assert(offsetof(siginfo_t, si_uid)      == 0x14);
+static_assert(offsetof(siginfo_t, si_tid)      == 0x10);
+static_assert(offsetof(siginfo_t, si_overrun)  == 0x14);
+static_assert(offsetof(siginfo_t, si_status)   == 0x18);
+static_assert(offsetof(siginfo_t, si_utime)    == 0x20);
+static_assert(offsetof(siginfo_t, si_stime)    == 0x28);
+static_assert(offsetof(siginfo_t, si_value)    == 0x18);
+static_assert(offsetof(siginfo_t, si_int)      == 0x18);
+static_assert(offsetof(siginfo_t, si_ptr)      == 0x18);
+static_assert(offsetof(siginfo_t, si_addr)     == 0x10);
+static_assert(offsetof(siginfo_t, si_addr_lsb) == 0x18);
+static_assert(offsetof(siginfo_t, si_lower)    == 0x20);
+static_assert(offsetof(siginfo_t, si_upper)    == 0x28);
+static_assert(offsetof(siginfo_t, si_pkey)     == 0x20);
+static_assert(offsetof(siginfo_t, si_perf_data)        == 0x18);
+static_assert(offsetof(siginfo_t, si_perf_type)        == 0x20);
+static_assert(offsetof(siginfo_t, si_band)     == 0x10);
+static_assert(offsetof(siginfo_t, si_fd)       == 0x18);
+static_assert(offsetof(siginfo_t, si_call_addr)        == 0x10);
+static_assert(offsetof(siginfo_t, si_syscall)  == 0x18);
+static_assert(offsetof(siginfo_t, si_arch)     == 0x1c);