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 2303633..9fe70b1 100644 (file)
@@ -290,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,
@@ -912,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) {
@@ -952,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)
@@ -1000,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);