hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/arch/m68k/kernel/signal.c
....@@ -882,11 +882,17 @@
882882 }
883883
884884 static inline void __user *
885
-get_sigframe(struct ksignal *ksig, size_t frame_size)
885
+get_sigframe(struct ksignal *ksig, struct pt_regs *tregs, size_t frame_size)
886886 {
887887 unsigned long usp = sigsp(rdusp(), ksig);
888
+ unsigned long gap = 0;
888889
889
- return (void __user *)((usp - frame_size) & -8UL);
890
+ if (CPU_IS_020_OR_030 && tregs->format == 0xb) {
891
+ /* USP is unreliable so use worst-case value */
892
+ gap = 256;
893
+ }
894
+
895
+ return (void __user *)((usp - gap - frame_size) & -8UL);
890896 }
891897
892898 static int setup_frame(struct ksignal *ksig, sigset_t *set,
....@@ -904,7 +910,7 @@
904910 return -EFAULT;
905911 }
906912
907
- frame = get_sigframe(ksig, sizeof(*frame) + fsize);
913
+ frame = get_sigframe(ksig, tregs, sizeof(*frame) + fsize);
908914
909915 if (fsize)
910916 err |= copy_to_user (frame + 1, regs + 1, fsize);
....@@ -976,7 +982,7 @@
976982 return -EFAULT;
977983 }
978984
979
- frame = get_sigframe(ksig, sizeof(*frame));
985
+ frame = get_sigframe(ksig, tregs, sizeof(*frame));
980986
981987 if (fsize)
982988 err |= copy_to_user (&frame->uc.uc_extra, regs + 1, fsize);