From nobody Mon Jul 18 14:29:44 2022 X-Original-To: dev-commits-src-main@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 4Lmkr92dWHz4TKDL; Mon, 18 Jul 2022 14:29:45 +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 4Lmkr926Ngz45QR; Mon, 18 Jul 2022 14:29:45 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1658154585; 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=pbI3AA3zktAN5qodQCc/M+LdpZhMPTOMJPuu9rWlFkE=; b=Md1XkQifM8s9/USdNiBL1Pyu3GdQZfceG9VyULo+L8mrP0pCg/cuq79b1tHaNQ5se6NtyS z6utzau+qH7OR+EWsEh3JKX7YZo9uy+oHYEb89NVvegTn7tenAQJJ1kKtlJnhtLZyhduL/ 5VnbDqR0APNoeSzGoo14f1unl6AmMmwq7SB1CMGK9fOcL0nkBzQSu53vQ6TdpYAVAUbV53 AnSjS916adE/4X2Z245r3kD/6BeDxvYIONieRpZ4y3c6G0SwRgV1/7g+Ui+2Vnl3EZ0J/Z kjm/gBvO572mTJN8yvn/nQ22GRMpUCK8btWNRG7Zak8FZ3PTVKqD+v7w9jFkLw== 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 4Lmkr90mYfzhn0; Mon, 18 Jul 2022 14:29:45 +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 26IETiKA019037; Mon, 18 Jul 2022 14:29:44 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 26IETi64019036; Mon, 18 Jul 2022 14:29:44 GMT (envelope-from git) Date: Mon, 18 Jul 2022 14:29:44 GMT Message-Id: <202207181429.26IETi64019036@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: =?utf-8?Q?Kornel=20Dul=C4=99ba?= Subject: git: f6ac79fb12f3 - main - Introduce the PROC_SIGCODE() macro List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kd X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f6ac79fb12f3c7ad891849d6721a20a100f6a9a9 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1658154585; 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=pbI3AA3zktAN5qodQCc/M+LdpZhMPTOMJPuu9rWlFkE=; b=a/TGzkaQ2dKTtXPtoOmR1gIvpTR3Q6ng9wb3use/yLkfa17573jzX3XwfXDkGyTd6dIKTF gbFgsA8ssr0+5q+WgfrX6/h4EAJxNB/KzrwQSdGv8kE0zf1pYuXqa+VzA+o4ZiNHu9MFp2 4aDCs1O0kevnMBs+qo/AuJWYP3O8cKvGR3+zwrtWdZWHaKSX/u18C5lfWUV/bYZjSAptNj UoI6ag8EO5cjvTNKxwGwNW9FSadCWExJzNhhd2IYcZYSXw06Lx0M+pl8uKaS9I1n1sbHDf /yHT3cMtzG82mvpO2uOTc169cN6EK9EnjSvucU5kkfj6lLOT73kIf5i5hJ8Eiw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1658154585; a=rsa-sha256; cv=none; b=gdGhDJ2OpgvcQwt9WS8lD8VXEu6NRhKJsbE3157qzJmmwxuhXArvuPD366hVx+7Y2VICOh XIlQF0aRYJcPAVOpxORUrbTvij9ZJbLschaSchym8Vnzz074aVQgUVpyJiU87zl70MPRL7 Faldb2QSdVBxIYGegkdb2xHYkM+41jDjvLl0+Yo4/07YmMuzCGBkeVoGntu5JMF5Rq3GbM nxe+CYNJojbuggEWXTPYq1r/iUogXXi8rLv8zBS4qU3B/S5VxOPNdSRdGjayDv1ZmTrs4T rfAeGRw2lM2j9FN58IW76L/wkFo/hSEiYdmdd2Hc0rYp4pU+8FKoBhP0qdrwfw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kd: URL: https://cgit.FreeBSD.org/src/commit/?id=f6ac79fb12f3c7ad891849d6721a20a100f6a9a9 commit f6ac79fb12f3c7ad891849d6721a20a100f6a9a9 Author: Kornel Dulęba AuthorDate: 2022-06-02 08:45:54 +0000 Commit: Kornel Dulęba CommitDate: 2022-07-18 14:27:26 +0000 Introduce the PROC_SIGCODE() macro Use a getter macro instead of fetching the sigcode address directly from a sysent of a given process. It assumes that the sigcode is stored in the shared page, which is true in all cases, except for a.out binaries. This will be later useful when the shared page address randomization is introduced. No functional change intended. Approved by: mw(mentor) Sponsored by: Stormshield Obtained from: Semihalf Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D35392 --- sys/amd64/amd64/exec_machdep.c | 2 +- sys/amd64/ia32/ia32_signal.c | 4 ++-- sys/arm/arm/exec_machdep.c | 2 +- sys/arm64/arm64/exec_machdep.c | 2 +- sys/arm64/arm64/freebsd32_machdep.c | 2 +- sys/i386/i386/exec_machdep.c | 6 +++--- sys/kern/kern_proc.c | 8 ++++---- sys/powerpc/powerpc/exec_machdep.c | 2 +- sys/riscv/riscv/exec_machdep.c | 2 +- sys/sys/exec.h | 8 ++++++++ 10 files changed, 23 insertions(+), 15 deletions(-) diff --git a/sys/amd64/amd64/exec_machdep.c b/sys/amd64/amd64/exec_machdep.c index f66203d1812e..1e537cad43f4 100644 --- a/sys/amd64/amd64/exec_machdep.c +++ b/sys/amd64/amd64/exec_machdep.c @@ -203,7 +203,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) fpstate_drop(td); regs->tf_rsp = (long)sfp; - regs->tf_rip = p->p_sysent->sv_sigcode_base; + regs->tf_rip = PROC_SIGCODE(p); regs->tf_rflags &= ~(PSL_T | PSL_D); regs->tf_cs = _ucodesel; regs->tf_ds = _udatasel; diff --git a/sys/amd64/ia32/ia32_signal.c b/sys/amd64/ia32/ia32_signal.c index 6d0370a14f7f..6c1288b6af72 100644 --- a/sys/amd64/ia32/ia32_signal.c +++ b/sys/amd64/ia32/ia32_signal.c @@ -535,7 +535,7 @@ freebsd4_ia32_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) } regs->tf_rsp = (uintptr_t)sfp; - regs->tf_rip = p->p_sysent->sv_sigcode_base + + regs->tf_rip = PROC_SIGCODE(p) + VDSO_FREEBSD4_IA32_SIGCODE_OFFSET - VDSO_IA32_SIGCODE_OFFSET; regs->tf_rflags &= ~(PSL_T | PSL_D); regs->tf_cs = _ucode32sel; @@ -670,7 +670,7 @@ ia32_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) fpstate_drop(td); regs->tf_rsp = (uintptr_t)sfp; - regs->tf_rip = p->p_sysent->sv_sigcode_base; + regs->tf_rip = PROC_SIGCODE(p); regs->tf_rflags &= ~(PSL_T | PSL_D); regs->tf_cs = _ucode32sel; regs->tf_ss = _udatasel; diff --git a/sys/arm/arm/exec_machdep.c b/sys/arm/arm/exec_machdep.c index 5867988a7347..56e6006c0767 100644 --- a/sys/arm/arm/exec_machdep.c +++ b/sys/arm/arm/exec_machdep.c @@ -347,7 +347,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) tf->tf_usr_sp = (register_t)fp; sysent = p->p_sysent; if (sysent->sv_sigcode_base != 0) - tf->tf_usr_lr = (register_t)sysent->sv_sigcode_base; + tf->tf_usr_lr = (register_t)PROC_SIGCODE(p); else tf->tf_usr_lr = (register_t)(PROC_PS_STRINGS(p) - *(sysent->sv_szsigcode)); diff --git a/sys/arm64/arm64/exec_machdep.c b/sys/arm64/arm64/exec_machdep.c index c8e333f330cc..49765e73f390 100644 --- a/sys/arm64/arm64/exec_machdep.c +++ b/sys/arm64/arm64/exec_machdep.c @@ -626,7 +626,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) tf->tf_x[2] = (register_t)&fp->sf_uc; tf->tf_x[8] = (register_t)catcher; tf->tf_sp = (register_t)fp; - tf->tf_elr = (register_t)p->p_sysent->sv_sigcode_base; + tf->tf_elr = (register_t)PROC_SIGCODE(p); /* Clear the single step flag while in the signal handler */ if ((td->td_pcb->pcb_flags & PCB_SINGLE_STEP) != 0) { diff --git a/sys/arm64/arm64/freebsd32_machdep.c b/sys/arm64/arm64/freebsd32_machdep.c index 3997b1ea6ab5..85ed3b923bc0 100644 --- a/sys/arm64/arm64/freebsd32_machdep.c +++ b/sys/arm64/arm64/freebsd32_machdep.c @@ -419,7 +419,7 @@ freebsd32_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) tf->tf_x[13] = (register_t)fp; sysent = p->p_sysent; if (sysent->sv_sigcode_base != 0) - tf->tf_x[14] = (register_t)sysent->sv_sigcode_base; + tf->tf_x[14] = (register_t)PROC_SIGCODE(p); else tf->tf_x[14] = (register_t)(PROC_PS_STRINGS(p) - *(sysent->sv_szsigcode)); diff --git a/sys/i386/i386/exec_machdep.c b/sys/i386/i386/exec_machdep.c index 0463615d96d9..ba85cf9756a9 100644 --- a/sys/i386/i386/exec_machdep.c +++ b/sys/i386/i386/exec_machdep.c @@ -238,7 +238,7 @@ osendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) regs->tf_esp = (int)fp; if (p->p_sysent->sv_sigcode_base != 0) { - regs->tf_eip = p->p_sysent->sv_sigcode_base + szsigcode - + regs->tf_eip = PROC_SIGCODE(p) + szsigcode - szosigcode; } else { /* a.out sysentvec does not use shared page */ @@ -363,7 +363,7 @@ freebsd4_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) } regs->tf_esp = (int)sfp; - regs->tf_eip = p->p_sysent->sv_sigcode_base + szsigcode - + regs->tf_eip = PROC_SIGCODE(p) + szsigcode - szfreebsd4_sigcode; regs->tf_eflags &= ~(PSL_T | PSL_D); regs->tf_cs = _ucodesel; @@ -525,7 +525,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) } regs->tf_esp = (int)sfp; - regs->tf_eip = p->p_sysent->sv_sigcode_base; + regs->tf_eip = PROC_SIGCODE(p); if (regs->tf_eip == 0) regs->tf_eip = PROC_PS_STRINGS(p) - szsigcode; regs->tf_eflags &= ~(PSL_T | PSL_D); diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 67299472231a..3938bfe611b9 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -3097,8 +3097,8 @@ sysctl_kern_proc_sigtramp(SYSCTL_HANDLER_ARGS) bzero(&kst32, sizeof(kst32)); if (SV_PROC_FLAG(p, SV_ILP32)) { if (sv->sv_sigcode_base != 0) { - kst32.ksigtramp_start = sv->sv_sigcode_base; - kst32.ksigtramp_end = sv->sv_sigcode_base + + kst32.ksigtramp_start = PROC_SIGCODE(p); + kst32.ksigtramp_end = kst32.ksigtramp_start + ((sv->sv_flags & SV_DSO_SIG) == 0 ? *sv->sv_szsigcode : (uintptr_t)sv->sv_szsigcode); @@ -3115,8 +3115,8 @@ sysctl_kern_proc_sigtramp(SYSCTL_HANDLER_ARGS) #endif bzero(&kst, sizeof(kst)); if (sv->sv_sigcode_base != 0) { - kst.ksigtramp_start = (char *)sv->sv_sigcode_base; - kst.ksigtramp_end = (char *)sv->sv_sigcode_base + + kst.ksigtramp_start = (char *)PROC_SIGCODE(p); + kst.ksigtramp_end = (char *)kst.ksigtramp_start + ((sv->sv_flags & SV_DSO_SIG) == 0 ? *sv->sv_szsigcode : (uintptr_t)sv->sv_szsigcode); } else { diff --git a/sys/powerpc/powerpc/exec_machdep.c b/sys/powerpc/powerpc/exec_machdep.c index 1c868a7813b3..000892bdf295 100644 --- a/sys/powerpc/powerpc/exec_machdep.c +++ b/sys/powerpc/powerpc/exec_machdep.c @@ -310,7 +310,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) mtx_unlock(&psp->ps_mtx); PROC_UNLOCK(p); - tf->srr0 = (register_t)p->p_sysent->sv_sigcode_base; + tf->srr0 = (register_t)PROC_SIGCODE(p); /* * copy the frame out to userland. diff --git a/sys/riscv/riscv/exec_machdep.c b/sys/riscv/riscv/exec_machdep.c index 2d30ba9cb01c..d45e8b808f74 100644 --- a/sys/riscv/riscv/exec_machdep.c +++ b/sys/riscv/riscv/exec_machdep.c @@ -416,7 +416,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) sysent = p->p_sysent; if (sysent->sv_sigcode_base != 0) - tf->tf_ra = (register_t)sysent->sv_sigcode_base; + tf->tf_ra = (register_t)PROC_SIGCODE(p); else tf->tf_ra = (register_t)(PROC_PS_STRINGS(p) - *(sysent->sv_szsigcode)); diff --git a/sys/sys/exec.h b/sys/sys/exec.h index 82ee16befe28..8e62876deb81 100644 --- a/sys/sys/exec.h +++ b/sys/sys/exec.h @@ -90,6 +90,14 @@ struct execsw { #define PROC_PS_STRINGS(p) \ ((p)->p_vmspace->vm_stacktop - (p)->p_sysent->sv_psstringssz) +/* + * Address of signal trampoline (in user space). + * This assumes that the sigcode resides in the shared page, which is true + * in all cases, except for a.out binaries. + */ +#define PROC_SIGCODE(p) \ + ((p)->p_sysent->sv_sigcode_base) + int exec_map_first_page(struct image_params *); void exec_unmap_first_page(struct image_params *);