mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
Merge tag 'm68k-for-v6.4-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k
Pull m68k fix from Geert Uytterhoeven: - Fix signal frame issue causing user-space crashes on 68020/68030 * tag 'm68k-for-v6.4-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k: m68k: Move signal frame following exception on 68020/030
This commit is contained in:
@@ -858,11 +858,17 @@ static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline void __user *
|
static inline void __user *
|
||||||
get_sigframe(struct ksignal *ksig, size_t frame_size)
|
get_sigframe(struct ksignal *ksig, struct pt_regs *tregs, size_t frame_size)
|
||||||
{
|
{
|
||||||
unsigned long usp = sigsp(rdusp(), ksig);
|
unsigned long usp = sigsp(rdusp(), ksig);
|
||||||
|
unsigned long gap = 0;
|
||||||
|
|
||||||
return (void __user *)((usp - frame_size) & -8UL);
|
if (CPU_IS_020_OR_030 && tregs->format == 0xb) {
|
||||||
|
/* USP is unreliable so use worst-case value */
|
||||||
|
gap = 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (void __user *)((usp - gap - frame_size) & -8UL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int setup_frame(struct ksignal *ksig, sigset_t *set,
|
static int setup_frame(struct ksignal *ksig, sigset_t *set,
|
||||||
@@ -880,7 +886,7 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
|
|||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
frame = get_sigframe(ksig, sizeof(*frame) + fsize);
|
frame = get_sigframe(ksig, tregs, sizeof(*frame) + fsize);
|
||||||
|
|
||||||
if (fsize)
|
if (fsize)
|
||||||
err |= copy_to_user (frame + 1, regs + 1, fsize);
|
err |= copy_to_user (frame + 1, regs + 1, fsize);
|
||||||
@@ -952,7 +958,7 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
|
|||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
frame = get_sigframe(ksig, sizeof(*frame));
|
frame = get_sigframe(ksig, tregs, sizeof(*frame));
|
||||||
|
|
||||||
if (fsize)
|
if (fsize)
|
||||||
err |= copy_to_user (&frame->uc.uc_extra, regs + 1, fsize);
|
err |= copy_to_user (&frame->uc.uc_extra, regs + 1, fsize);
|
||||||
|
Reference in New Issue
Block a user