From nobody Thu Mar 27 13:47:47 2025 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 4ZNlN36v5wz5rPKS; Thu, 27 Mar 2025 13:47:47 +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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZNlN3635kz3MHF; Thu, 27 Mar 2025 13:47:47 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1743083267; 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=0D0dTM6A06joZHmbR3wuJJlsOAbibeJnV4/uXJJW6Bk=; b=Pcr+mWQGDsL3+GEekqCBawPGeqdXtacHgirMFjvSSKZurZgq7WdOHdl8j7Nr8PRp4MysSA aeFS5kN1LQw1oWsBZ8NAJl/g+t2WnQ6++Gd5kkckSIFx4y2ShVjV8GP7OFJ/T8vMEA2LuB qeoV506+bMX2mpA8cGafTYVR89EsrQZCWNgDQADDc/paQAw0rOYyll2nHQkYPamqhb9RW8 6mM4UAKbp8miHo6+1BEG/xZANvC8IV/6AegIk6GaKQP9dzjCATlQ0oDo8slxvskHx/Asj/ eLuzv/LzoYM3WE9rWhAUYkviog+38I4XZsJXAOEPvSgiiQXR23goMC/RRNr8JA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1743083267; a=rsa-sha256; cv=none; b=JyUZgHojqF/UTOppCpIK1TsWEIGYCEerBjb6q87ov0RmFhxIjDy/fh0+YRis6L6PH4+zRE WGyQa/SKxwzB300bCS9k0ywpwC/U5PJl9LOEo9yYAhkPOmZLg7EQUGUUIzVbFNwA/+e2L0 7mqBaRXQMBAggPQ/wTdjwGXs04zJfQJ96H2IYONnDzdnXEcDfI++zfyjrb2FSTTmuQJtQa moPtLDqn+vlQyugkFDSoVVcf84UAD7qRflXs9LpFO1VMTcINnFEhUNb2rLB6Q4CC8XYEIb rjyK9bH0slscf65yJ82UE/CKHsigMBvb6/eRyO2PhdbesPBUyj2YsG623N7p2g== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1743083267; 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=0D0dTM6A06joZHmbR3wuJJlsOAbibeJnV4/uXJJW6Bk=; b=W7G9cRPkjUmL5FJIE/OV4fEIl2Iz7AIdMKfSdv+j0gPfY81XY2gN1FfWgQoeePF/390XKA SdCfkpWoH4Bk7sNV/+dvEo5w3HBE80MqON8qOiPrSnLORqjZSSfUr2TqTtiYGGrD4RfOO+ rM37tkQrFClOYpElAQ11u9dB0O4PzgGFItFEOYDNuhTbC+gSnv/YvC2sxi3nXiO9igf5XE WaDH/lTbYnW/rXkjNtL0aBNINUu4SIL+xQISCMBvRO5frZnehxmHKWYyDR5PFc6EVD5Y4q nd1QVhaT5EQANvALH+fdjFR1MLDGRoLnz2W2cJcQ7oI1H7AnfL1iDuIlgk0drw== 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 4ZNlN35Sj3z109Q; Thu, 27 Mar 2025 13:47:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 52RDll5d025475; Thu, 27 Mar 2025 13:47:47 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 52RDllCE025472; Thu, 27 Mar 2025 13:47:47 GMT (envelope-from git) Date: Thu, 27 Mar 2025 13:47:47 GMT Message-Id: <202503271347.52RDllCE025472@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: e9ab9910fa12 - main - arm64: Clean up enabling in-kernel BTI 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: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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: e9ab9910fa12ce7b042a83a25dfaf5efdb631a32 Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=e9ab9910fa12ce7b042a83a25dfaf5efdb631a32 commit e9ab9910fa12ce7b042a83a25dfaf5efdb631a32 Author: Andrew Turner AuthorDate: 2025-03-27 13:47:28 +0000 Commit: Andrew Turner CommitDate: 2025-03-27 13:47:28 +0000 arm64: Clean up enabling in-kernel BTI Some hypervisors incorrectly use the Guarded Page (GP) bit from the last level page table as part of the output address. This causes them to raise an address size exception as the calculated physical address is too large. Only set the GP bit in the page table when BTI is present. Reviewed by: alc, kib, markj Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D49154 --- sys/arm64/arm64/locore.S | 22 +++++++++++++++++++--- sys/arm64/arm64/pmap.c | 3 ++- sys/arm64/include/pte.h | 3 ++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/sys/arm64/arm64/locore.S b/sys/arm64/arm64/locore.S index 88193b6c93f7..9cf23fcf13a1 100644 --- a/sys/arm64/arm64/locore.S +++ b/sys/arm64/arm64/locore.S @@ -87,6 +87,7 @@ ENTRY(_start) * x26 = Kernel L1 table * x24 = TTBR1 table * x22 = PTE shareability attributes + * x21 = BTI guarded page attribute if supported */ /* Enable the mmu */ @@ -136,9 +137,13 @@ virtdone: str x27, [x0, #BP_KERN_TTBR0] str x23, [x0, #BP_BOOT_EL] - /* Set this before it's used in kasan_init_early */ + /* Set these before they are used in kasan_init_early */ adrp x1, pmap_sh_attr str x22, [x1, :lo12:pmap_sh_attr] +#ifdef __ARM_FEATURE_BTI_DEFAULT + adrp x1, pmap_gp_attr + str x21, [x1, :lo12:pmap_gp_attr] +#endif #ifdef KASAN /* Save bootparams */ @@ -487,6 +492,17 @@ LENTRY(create_pagetables) cmp x6, x27 b.lo 1b +#ifdef __ARM_FEATURE_BTI_DEFAULT + /* + * Check if the CPU supports BTI + */ + mrs x6, id_aa64pfr1_el1 /* Read the ID register */ + and x6, x6, ID_AA64PFR1_BT_MASK /* Mask the field we need */ + cmp x6, xzr /* Check it's non-zero */ + cset x6, ne /* x6 is set if non-zero */ + lsl x21, x6, ATTR_S1_GP_SHIFT /* Shift to the correct bit */ +#endif + /* * Find the shareability attribute we should use. If FEAT_LPA2 is * enabled then the shareability field is moved from the page table @@ -785,7 +801,7 @@ LENTRY(build_l2_block_pagetable) orr x12, x12, #(ATTR_AF) orr x12, x12, #(ATTR_S1_UXN) #ifdef __ARM_FEATURE_BTI_DEFAULT - orr x12, x12, #(ATTR_S1_GP) + orr x12, x12, x21 #endif /* Set the shareability attribute */ orr x12, x12, x22 @@ -863,7 +879,7 @@ LENTRY(build_l3_page_pagetable) orr x12, x12, #(ATTR_AF) orr x12, x12, #(ATTR_S1_UXN) #ifdef __ARM_FEATURE_BTI_DEFAULT - orr x12, x12, #(ATTR_S1_GP) + orr x12, x12, x21 #endif /* Set the shareability attribute */ orr x12, x12, x22 diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index 5a3dbbf00203..14ef7dd0169c 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -182,7 +182,8 @@ #define pmap_l2_pindex(v) ((v) >> L2_SHIFT) #ifdef __ARM_FEATURE_BTI_DEFAULT -#define ATTR_KERN_GP ATTR_S1_GP +pt_entry_t __read_mostly pmap_gp_attr; +#define ATTR_KERN_GP pmap_gp_attr #else #define ATTR_KERN_GP 0 #endif diff --git a/sys/arm64/include/pte.h b/sys/arm64/include/pte.h index ae6a8694f6c4..464d8c941c56 100644 --- a/sys/arm64/include/pte.h +++ b/sys/arm64/include/pte.h @@ -73,7 +73,8 @@ typedef uint64_t pt_entry_t; /* page table entry */ #define ATTR_CONTIGUOUS (1UL << 52) #define ATTR_DBM (1UL << 51) -#define ATTR_S1_GP (1UL << 50) +#define ATTR_S1_GP_SHIFT 50 +#define ATTR_S1_GP (1UL << ATTR_S1_GP_SHIFT) /* * Largest possible output address field for a level 3 page. Block