From nobody Fri Jun 17 19:41:27 2022 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 78BE785DC4F; Fri, 17 Jun 2022 19:41:29 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4LPqD74m6Bz3jGR; Fri, 17 Jun 2022 19:41:27 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655494887; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=7YDOWF+8JQCeuao5r6DbEqlU1jsrnBo01/E4LZtywxI=; b=Ygwzpmg4RK1HJQlBIToChUVRy4nVkMXZFDgOs5YA30M8erGvCtWWel8QYUKEbEZglo14nL GnxXNInsQrF0Dsq+ecS4+xHODOzKdJgmjMp06bwimEhNEabAAhCkJGgs7vHJN0S48BXlqq FxTtcuNzCBu4Tis7fRmJd+0lyACvkU0vJknd2tWGdJPhAZ7ZBKDKv93bN2h5EGOx6L8GTk 4TacWQTJajeq+HpQEK6ZxmZOl47hXvpQkiV61hkR1sy5sq6jHrFHooxTMRqhY+VBqyag54 s0Tgd4qn0t9DdDV0BsKGHIJXyy5+BRipeMlFa6I2+iTTfdV0hR5+zXzkBlX1Zw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 3BF4925DB2; Fri, 17 Jun 2022 19:41:27 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 25HJfRSD030485; Fri, 17 Jun 2022 19:41:27 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 25HJfRr9030484; Fri, 17 Jun 2022 19:41:27 GMT (envelope-from git) Date: Fri, 17 Jun 2022 19:41:27 GMT Message-Id: <202206171941.25HJfRr9030484@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Dmitry Chagin Subject: git: c272720e2a96 - stable/13 - linux(4): Properly build argument list for the signal handler List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dchagin X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: c272720e2a96c3648ef37ee139d99d56bccb7fbd Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655494887; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=7YDOWF+8JQCeuao5r6DbEqlU1jsrnBo01/E4LZtywxI=; b=g2HHaeVmcwd7LyEf1CQWSOW6Np8F7I0ZUL/5H8L7YcEkN+0/SMmB/Or62EV5KiT8VgdHzj NUs1T/F4QqgQr/yma3mVLRy6SrvbRXiT2rsjLbpt7TbUH0i7x2W8OgaP6a08SRQNTmr72y 62xLDZDhZZ870lGklLU3K2E3A76S0LQ7DAjjr/rYf0sRMMcJ2jbhfuOBkOmTtZ8pHhEdq0 5SRYm2XavrQ+Dq0C9Dl/h7qbH1XoFZrE5a5dRyCJDEVbM058XtJrBZFN/MWQQBL9oA+uqW THDa04NVqDCQDQKKnxqpQCfwX79WfI3ncOPH1v7PlXnApK5Y5I7G1043emsrtA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1655494887; a=rsa-sha256; cv=none; b=M1RYxXOW2NGFwoFHFZJOzR+QVh1YMxei4gSYE0NksZM5X0xxiqzsvwnvVT5ICW9HFYfbJj 4cjK6RFPK4vWC40TFH+HT4kNMEOfjKpGkGC+jvAQped9rS7jZZbzhPJucfjSYXklc556Oq I5jzg8ZaGggt6vmjNAfmj5i77hDKS5dTIdUg50WMAILcfdsCXKsBqDVD7nPMhC2DyoUcDO q2BHsDdLXjDgUJ9UUM3M/zPXNw5NLPzqCukygwkqPmT418S51r390ls0efB343nkdKJsTM h41EQxE6BzOBboumw7Esld4c6rbn7b7KEZBQBXlx8ggh/we6+wgHOnUwy3eHBg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=c272720e2a96c3648ef37ee139d99d56bccb7fbd commit c272720e2a96c3648ef37ee139d99d56bccb7fbd Author: Dmitry Chagin AuthorDate: 2022-05-30 16:53:12 +0000 Commit: Dmitry Chagin CommitDate: 2022-06-17 19:35:38 +0000 linux(4): Properly build argument list for the signal handler Provide arguments 2 and 3 if signal handler installed with SA_SIGINFO. MFC after: 2 weeks (cherry picked from commit 109fd18ad96957c25cfaa78da2f825c729e33fef) --- sys/amd64/linux/linux_sysvec.c | 28 ++++++++++++++++------------ sys/arm64/linux/linux_sysvec.c | 12 +++++++++--- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/sys/amd64/linux/linux_sysvec.c b/sys/amd64/linux/linux_sysvec.c index 8d9557a5aebc..dbf702d51bb1 100644 --- a/sys/amd64/linux/linux_sysvec.c +++ b/sys/amd64/linux/linux_sysvec.c @@ -557,13 +557,14 @@ linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) caddr_t sp; struct trapframe *regs; int sig, code; - int oonstack; + int oonstack, issiginfo; td = curthread; p = td->td_proc; PROC_LOCK_ASSERT(p, MA_OWNED); sig = linux_translate_traps(ksi->ksi_signo, ksi->ksi_trapno); psp = p->p_sigacts; + issiginfo = SIGISMEMBER(psp->ps_siginfo, sig); code = ksi->ksi_code; mtx_assert(&psp->ps_mtx, MA_OWNED); regs = td->td_frame; @@ -615,22 +616,14 @@ linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) /* Align to 16 bytes. */ sfp = (struct l_rt_sigframe *)((unsigned long)sp & ~0xFul); + mtx_unlock(&psp->ps_mtx); + PROC_UNLOCK(p); + /* Translate the signal. */ sig = bsd_to_linux_signal(sig); - - /* Build the argument list for the signal handler. */ - regs->tf_rdi = sig; /* arg 1 in %rdi */ - regs->tf_rax = 0; - regs->tf_rsi = (register_t)&sfp->sf_si; /* arg 2 in %rsi */ - regs->tf_rdx = (register_t)&sfp->sf_uc; /* arg 3 in %rdx */ - regs->tf_rcx = (register_t)catcher; - /* Fill in POSIX parts. */ siginfo_to_lsiginfo(&ksi->ksi_info, &sf.sf_si, sig); - mtx_unlock(&psp->ps_mtx); - PROC_UNLOCK(p); - /* Copy the sigframe out to the user's stack. */ if (copyout(&sf, sfp, sizeof(*sfp)) != 0) { uprintf("pid %d comm %s has trashed its stack, killing\n", @@ -639,6 +632,17 @@ linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) sigexit(td, SIGILL); } + /* Build the argument list for the signal handler. */ + regs->tf_rdi = sig; /* arg 1 in %rdi */ + regs->tf_rax = 0; + if (issiginfo) { + regs->tf_rsi = (register_t)&sfp->sf_si; /* arg 2 in %rsi */ + regs->tf_rdx = (register_t)&sfp->sf_uc; /* arg 3 in %rdx */ + } else { + regs->tf_rsi = 0; + regs->tf_rdx = 0; + } + regs->tf_rcx = (register_t)catcher; regs->tf_rsp = (long)sfp; regs->tf_rip = linux_rt_sigcode; regs->tf_rflags &= ~(PSL_T | PSL_D); diff --git a/sys/arm64/linux/linux_sysvec.c b/sys/arm64/linux/linux_sysvec.c index 85b5ce992ff1..b8361584c31a 100644 --- a/sys/arm64/linux/linux_sysvec.c +++ b/sys/arm64/linux/linux_sysvec.c @@ -428,7 +428,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; @@ -440,6 +440,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); @@ -526,8 +527,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;