summaryrefslogtreecommitdiff
path: root/sys/arm64/linux/linux_sysvec.c
diff options
context:
space:
mode:
authorDmitry Chagin <dchagin@FreeBSD.org>2022-05-30 16:53:12 +0000
committerDmitry Chagin <dchagin@FreeBSD.org>2022-05-30 16:53:12 +0000
commit109fd18ad96957c25cfaa78da2f825c729e33fef (patch)
tree35ccbc5d533de143ffe68b03d480841fa2e35f95 /sys/arm64/linux/linux_sysvec.c
parentc30a767c6fd6d3f19e897fb800513e75175249b9 (diff)
Diffstat (limited to 'sys/arm64/linux/linux_sysvec.c')
-rw-r--r--sys/arm64/linux/linux_sysvec.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/arm64/linux/linux_sysvec.c b/sys/arm64/linux/linux_sysvec.c
index 72465285dfed..732eddf0c308 100644
--- a/sys/arm64/linux/linux_sysvec.c
+++ b/sys/arm64/linux/linux_sysvec.c
@@ -430,7 +430,7 @@ linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
ucontext_t uc;
uint8_t *scr;
struct sigacts *psp;
- int onstack, sig;
+ int onstack, sig, issiginfo;
td = curthread;
p = td->td_proc;
@@ -442,6 +442,7 @@ linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
tf = td->td_frame;
onstack = sigonstack(tf->tf_sp);
+ issiginfo = SIGISMEMBER(psp->ps_siginfo, sig);
CTR4(KTR_SIG, "sendsig: td=%p (%s) catcher=%p sig=%d", td, p->p_comm,
catcher, sig);
@@ -528,8 +529,13 @@ linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
free(frame, M_LINUX);
tf->tf_x[0]= sig;
- tf->tf_x[1] = (register_t)&fp->sf.sf_si;
- tf->tf_x[2] = (register_t)&fp->sf.sf_uc;
+ if (issiginfo) {
+ tf->tf_x[1] = (register_t)&fp->sf.sf_si;
+ tf->tf_x[2] = (register_t)&fp->sf.sf_uc;
+ } else {
+ tf->tf_x[1] = 0;
+ tf->tf_x[2] = 0;
+ }
tf->tf_x[8] = (register_t)catcher;
tf->tf_sp = (register_t)fp;
tf->tf_elr = (register_t)linux_vdso_sigcode;