From nobody Tue Feb 22 17:27:04 2022 X-Original-To: dev-commits-src-all@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 2EB7419E9BE2; Tue, 22 Feb 2022 17:27:05 +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 4K35h90pSFz3jG8; Tue, 22 Feb 2022 17:27:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1645550825; 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=Ugft1f2D8+su0vPK0jxUx7zX9vE82te4TEg5AotU6Gk=; b=rCOf1CSsp9NK8M2rEAx3gQAee2DC6lY3cl9theCEu9HyHlD43GHxBRr/m8IFuMtwZ0V+hq USNMTS47rGpM8dAQXixqIgvB+glzzYX2xuG8NqM6VZEQmepG6H5t2UIpzls2GKlLViaLGo UZaNw1M1tkc3Vm6zfmtJ8L03N++agSAzxI42llXS8xEPIPkv2EXkp8xNekTQdJ9rRnYA5p UXRmmNOy5n66Bc5ol63kUZJ1obW2i5VoTjVjo2rBWxtvf7WWSs78qXEzgYv0oiqmmogR1E /bUY1PVwbmrqXrsaP8TWLeKyE5w7AiA2rMn4zFEqKamUSK6EW2LI2XD+tMv0+Q== 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 EFCFD556; Tue, 22 Feb 2022 17:27:04 +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 21MHR4GF022629; Tue, 22 Feb 2022 17:27:04 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 21MHR4dv022628; Tue, 22 Feb 2022 17:27:04 GMT (envelope-from git) Date: Tue, 22 Feb 2022 17:27:04 GMT Message-Id: <202202221727.21MHR4dv022628@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: 6713be315900 - main - Add NT_ARM_ADDR_MASK List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 6713be3159000783f7aacf3ea90d6c6878c44da0 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1645550825; 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=Ugft1f2D8+su0vPK0jxUx7zX9vE82te4TEg5AotU6Gk=; b=QE5efqKLH7iLDY3geympwjRmWEKwFGRKHYWUDpLe+KURnr5uqabfBo45DWq4gMSKYkOvsp aTW8PwcQZMfwh+exfHPnwb/dXtmBJXbx2+Sy4W2YbCrUegHQUd/491umz+0ddipLytod5F KWspChaTASOaHvpkjs+R4z/AcPR2xlVvOmCftgUXiqp/TUBYOeLKcyY1zBn47WOtKckgyk dadgy/uTGDHjBtuvGsxAbtaSmSK4bQqRHJLDcEp/qzEoVlMCEt2Uys3eozpmN0mijAP0ux ARhBxjOSsRYg0zu5AxNNCtXGdYbO95FqaZr5mheYhsCccTvxcZltjYUKEgmFKA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1645550825; a=rsa-sha256; cv=none; b=Vio8PRFTEsFKdsKB87ujXApL/DkCMNbVrEhOTXjPe71L7BHc3oCxgFPtR+NW74CznYH2gW HJs39nELaQmZb+kay8H5YVV4TDFVkNlNTXwr9X+e7aFS8cJAda4awoIzPyfe886uIUwhSf GHyq+Y2Hd/4+NCROifBmbLAemo/p/LyKbUUISsZ4chXfTWSYSCKjpwoT8zs8vNLvO7AQkx +oIybjZvOqvoa/xP4IkPBAQWrhTLCgDumO59pAeTkuYNKQgmo1ZRtCeIgugkkn0J20ObIx TIutFKj7XRbx++W5FFdKcaQk+o7r85Z4MXLVfVYdpWxAcb6maTVjtyWHrsgpGw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=6713be3159000783f7aacf3ea90d6c6878c44da0 commit 6713be3159000783f7aacf3ea90d6c6878c44da0 Author: Andrew Turner AuthorDate: 2021-08-30 16:43:22 +0000 Commit: Andrew Turner CommitDate: 2022-02-22 17:10:35 +0000 Add NT_ARM_ADDR_MASK This can be used by debuggers to find which bits in a virtual address should be masked off to get a canonical address. This is currently used by the Pointer Authentication Code support to get its mask. It could also be used if we support Top Byte Ignore for the same purpose. Reviewed by: kib Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D34302 --- sys/arm64/arm64/elf_machdep.c | 42 ++++++++++++++++++++++++++++++++++++++++-- sys/arm64/arm64/ptrauth.c | 8 +++++++- sys/arm64/include/cpu.h | 3 +++ sys/arm64/include/reg.h | 5 +++++ sys/arm64/include/vmparam.h | 3 +++ sys/sys/elf_common.h | 1 + tests/sys/kern/ptrace_test.c | 13 +++++++++++++ 7 files changed, 72 insertions(+), 3 deletions(-) diff --git a/sys/arm64/arm64/elf_machdep.c b/sys/arm64/arm64/elf_machdep.c index d98512b71e6c..383a0911b7fe 100644 --- a/sys/arm64/arm64/elf_machdep.c +++ b/sys/arm64/arm64/elf_machdep.c @@ -59,6 +59,8 @@ __FBSDID("$FreeBSD$"); u_long __read_frequently elf_hwcap; u_long __read_frequently elf_hwcap2; +struct arm64_addr_mask elf64_addr_mask; + static struct sysentvec elf64_freebsd_sysvec = { .sv_size = SYS_MAXSYSCALL, .sv_table = sysent, @@ -119,11 +121,47 @@ static Elf64_Brandinfo freebsd_brand_info = { SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t)elf64_insert_brand_entry, &freebsd_brand_info); +static bool +get_arm64_addr_mask(struct regset *rs, struct thread *td, void *buf, + size_t *sizep) +{ + if (buf != NULL) { + KASSERT(*sizep == sizeof(elf64_addr_mask), + ("%s: invalid size", __func__)); + memcpy(buf, &elf64_addr_mask, sizeof(elf64_addr_mask)); + } + *sizep = sizeof(elf64_addr_mask); + + return (true); +} + +static struct regset regset_arm64_addr_mask = { + .note = NT_ARM_ADDR_MASK, + .size = sizeof(struct arm64_addr_mask), + .get = get_arm64_addr_mask, +}; +ELF_REGSET(regset_arm64_addr_mask); + void -elf64_dump_thread(struct thread *td __unused, void *dst __unused, - size_t *off __unused) +elf64_dump_thread(struct thread *td, void *dst, size_t *off) { + struct arm64_addr_mask addr_mask; + size_t len, mask_size; + + len = 0; + if (dst != NULL) { + mask_size = sizeof(addr_mask); + get_arm64_addr_mask(®set_arm64_addr_mask, td, &addr_mask, + &mask_size); + + len += elf64_populate_note(NT_ARM_ADDR_MASK, &addr_mask, dst, + sizeof(addr_mask), NULL); + } else { + len += elf64_populate_note(NT_ARM_ADDR_MASK, NULL, NULL, + sizeof(addr_mask), NULL); + } + *off += len; } bool diff --git a/sys/arm64/arm64/ptrauth.c b/sys/arm64/arm64/ptrauth.c index aa0591e351bb..5c129820cd37 100644 --- a/sys/arm64/arm64/ptrauth.c +++ b/sys/arm64/arm64/ptrauth.c @@ -46,6 +46,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include #define SCTLR_PTRAUTH (SCTLR_EnIA | SCTLR_EnIB | SCTLR_EnDA | SCTLR_EnDB) @@ -82,8 +84,12 @@ ptrauth_init(void) * it will also be available on any non-boot CPUs. If this is ever * not the case we will have to add a quirk. */ - if (ID_AA64ISAR1_APA_VAL(isar1) > 0 || ID_AA64ISAR1_API_VAL(isar1) > 0) + if (ID_AA64ISAR1_APA_VAL(isar1) > 0 || + ID_AA64ISAR1_API_VAL(isar1) > 0) { enable_ptrauth = true; + elf64_addr_mask.code |= PAC_ADDR_MASK; + elf64_addr_mask.data |= PAC_ADDR_MASK; + } } /* Copy the keys when forking a new process */ diff --git a/sys/arm64/include/cpu.h b/sys/arm64/include/cpu.h index a6a606b58912..d3b13470a9be 100644 --- a/sys/arm64/include/cpu.h +++ b/sys/arm64/include/cpu.h @@ -164,6 +164,9 @@ extern char etext[]; extern uint64_t __cpu_affinity[]; +struct arm64_addr_mask; +extern struct arm64_addr_mask elf64_addr_mask; + void cpu_halt(void) __dead2; void cpu_reset(void) __dead2; void fork_trampoline(void); diff --git a/sys/arm64/include/reg.h b/sys/arm64/include/reg.h index bb151af55ba6..44b2e2b21b72 100644 --- a/sys/arm64/include/reg.h +++ b/sys/arm64/include/reg.h @@ -83,6 +83,11 @@ struct dbreg32 { int dummy; }; +struct arm64_addr_mask { + __uint64_t code; + __uint64_t data; +}; + #define __HAVE_REG32 #endif /* !_MACHINE_REG_H_ */ diff --git a/sys/arm64/include/vmparam.h b/sys/arm64/include/vmparam.h index 3e08b0a513b9..483c6d1f91a2 100644 --- a/sys/arm64/include/vmparam.h +++ b/sys/arm64/include/vmparam.h @@ -156,6 +156,9 @@ #define VM_MIN_KERNEL_ADDRESS (0xffff000000000000UL) #define VM_MAX_KERNEL_ADDRESS (0xffff008000000000UL) +/* The address bits that hold a pointer authentication code */ +#define PAC_ADDR_MASK (0xff7f000000000000UL) + /* If true addr is in the kernel address space */ #define ADDR_IS_KERNEL(addr) (((addr) & (1ul << 55)) == (1ul << 55)) /* If true addr is in its canonical form (i.e. no TBI, PAC, etc.) */ diff --git a/sys/sys/elf_common.h b/sys/sys/elf_common.h index b8629fec8cbc..0bc93659adc5 100644 --- a/sys/sys/elf_common.h +++ b/sys/sys/elf_common.h @@ -825,6 +825,7 @@ typedef struct { #define NT_PPC_VSX 0x102 /* PowerPC VSX registers */ #define NT_X86_XSTATE 0x202 /* x86 XSAVE extended state. */ #define NT_ARM_VFP 0x400 /* ARM VFP registers */ +#define NT_ARM_ADDR_MASK 0x406 /* arm64 address mask (e.g. for TBI) */ /* GNU note types. */ #define NT_GNU_ABI_TAG 1 diff --git a/tests/sys/kern/ptrace_test.c b/tests/sys/kern/ptrace_test.c index 3e3a445c6152..c62db66fd6f6 100644 --- a/tests/sys/kern/ptrace_test.c +++ b/tests/sys/kern/ptrace_test.c @@ -3204,6 +3204,9 @@ ATF_TC_BODY(ptrace__PT_CONTINUE_with_signal_thread_sigmask, tc) ATF_TC_WITHOUT_HEAD(ptrace__PT_REGSET); ATF_TC_BODY(ptrace__PT_REGSET, tc) { +#if defined(__aarch64__) + struct arm64_addr_mask addr_mask; +#endif struct prstatus prstatus; struct iovec vec; pid_t child, wpid; @@ -3242,6 +3245,16 @@ ATF_TC_BODY(ptrace__PT_REGSET, tc) ATF_REQUIRE(ptrace(PT_SETREGSET, wpid, (caddr_t)&vec, NT_PRSTATUS) != -1); +#if defined(__aarch64__) + vec.iov_base = &addr_mask; + vec.iov_len = sizeof(addr_mask); + ATF_REQUIRE(ptrace(PT_GETREGSET, wpid, (caddr_t)&vec, + NT_ARM_ADDR_MASK) != -1); + REQUIRE_EQ(addr_mask.code, addr_mask.data); + ATF_REQUIRE(addr_mask.code == 0 || + addr_mask.code == 0xff7f000000000000UL); +#endif + REQUIRE_EQ(ptrace(PT_CONTINUE, child, (caddr_t)1, 0), 0); /* The second wait() should report the exit status. */