From nobody Tue Oct 10 09:53:13 2023 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 4S4WRt1lHcz4wVNX; Tue, 10 Oct 2023 09:53:14 +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 4S4WRt10z7z3R4q; Tue, 10 Oct 2023 09:53:14 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1696931594; 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=8mOxdWKVFmKB3XVOGJqgH1GiUrsVWwTJP+4iUkjdCEE=; b=hXANCXn4ZnOCCWQU3nNdPS9ftev55htIoLUPcoRJhltI+bOAxDtWfQVBtNUTTHcVt5lREd 7KhPs9h4wiV9bP1NNGHGDD11MBcbZsY1TQsU6CwoIJoGB8+pzMCHxHq2gOQEu4mnfx4mJM aOrRzThnn1Dy9H3YEkZdT1bEo7M4rZE3wCo6JKTpNGlIbl85MT0D4Hlu7Nrq5JXxzpsfp4 Y9EMjwkESXmZWQQzD1g4SIVoyM25+GbaeS96d6rEMElG4Ea2ouO43qJrswSOlaG6zJ+P+D 8Dq9t41gpKO/izfgjLPfWuErFaeQOYNLUiqPy+W/esC5gVd5g997FHk12X303g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1696931594; a=rsa-sha256; cv=none; b=YxcNnLVq1MmNVVT76ohLiVhemyVOxyQzUDqkAi40HudQYNW4kSFoENWd+B0rDagd2Kh2OR IdK6K62Wl2NJlddzZmUdoeiKRIK0Q+0iwGkP9euP7UiJzVnW3i8JMtWlRd+3JLiTzmbZFO GlrqMlrRDS2a/RGvROKnGTQhZqkwxdnrKz2semdvxh4saVcQcVzamOVblRHwMrlbZkb3UQ Jt78qC8i+kuacd9xTm10UtBUFrYqhZdkPXDv8kw/fcyxAteQ37lDpB1pxjue183Kmh7Or3 lJj8slLHHQvMa3n8iqKhRcF5Nh/JpMuaBjgh4Hu9lbijDTIm8YvAsk98/HAOBA== 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=1696931594; 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=8mOxdWKVFmKB3XVOGJqgH1GiUrsVWwTJP+4iUkjdCEE=; b=UTA+cHJ6dkbTK6kFtXfw/lK/A4BH8qGCQVppoctelGfuq8Y0imiee9bZ8PDAmTnvZka3L0 cIMj3LWiO2ujSDe06ZkdaNDmqbwXQtniRIYHrhTWw5oPoK5OQOkIegVvHuk+b3mG8ALn2V tC0wSjOYFwqGgw7MWrmOAtnCuyHul3utfmQJgunBAtscLhoPTccBRplZd0VJkoiZrFBqnd hHwmqR65Q9diJNJAH5V+qImmzGGxobeyHfszQo57qg8+ERodHB5SZMVy3OlP1rGUOKm8Vi RxIt400tu08I4OLvmKKVejqQmliQD44IA/2e5b1bp1NLQrIBIXrdZSFq3L7lMA== 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 4S4WRt04dLzZWH; Tue, 10 Oct 2023 09:53:14 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 39A9rDXj036796; Tue, 10 Oct 2023 09:53:13 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 39A9rDJY036793; Tue, 10 Oct 2023 09:53:13 GMT (envelope-from git) Date: Tue, 10 Oct 2023 09:53:13 GMT Message-Id: <202310100953.39A9rDJY036793@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: e340882d3e49 - main - arm64: Add BTI landing pads to assembly functions 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: e340882d3e49a98aa39b13041a2bf714c30dccdf Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=e340882d3e49a98aa39b13041a2bf714c30dccdf commit e340882d3e49a98aa39b13041a2bf714c30dccdf Author: Andrew Turner AuthorDate: 2023-10-03 08:52:02 +0000 Commit: Andrew Turner CommitDate: 2023-10-10 09:52:16 +0000 arm64: Add BTI landing pads to assembly functions When we enable BTI iboth the first instruction in a function that could be called indirectly, and a branch within a function need a valid landing pad instruction. There are three options for these instructions: 1. A breakpoint instruction 2. A pointer authentication PACIASP/PACIBSP 3. A BTI instruction Option 1 will raise a breakpoint exception so isn't useable in either cases. Option 2 could be used in some function entry cases, but needs to be paired with an authentication instruction, and is normally only used in non-leaf functions we can't use it in this case. This leaves option 3. There are four variants of the instruction, the C variant is used on function entry and the J variant is for jumping within a function. There is also a JC that works with both and one with no target that works with neither. Reviewed by: markj Sponsored by: Arm Ltd Sponsored by: The FreeBSD Foundation (earlier version) Differential Revision: https://reviews.freebsd.org/D42078 --- sys/arm64/arm64/locore.S | 4 ++++ sys/arm64/include/asm.h | 30 +++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/sys/arm64/arm64/locore.S b/sys/arm64/arm64/locore.S index bc2a84c404ab..f741bccf598a 100644 --- a/sys/arm64/arm64/locore.S +++ b/sys/arm64/arm64/locore.S @@ -107,6 +107,8 @@ ENTRY(_start) br x15 virtdone: + BTI_J + /* Set up the stack */ adrp x25, initstack_end add x25, x25, :lo12:initstack_end @@ -223,6 +225,8 @@ ENTRY(mpentry) br x15 mp_virtdone: + BTI_J + /* Start using the AP boot stack */ ldr x4, =bootstack ldr x4, [x4] diff --git a/sys/arm64/include/asm.h b/sys/arm64/include/asm.h index 5c1f874366fd..6ebfca6eaf0c 100644 --- a/sys/arm64/include/asm.h +++ b/sys/arm64/include/asm.h @@ -48,7 +48,7 @@ #define LENTRY(sym) \ .text; .align 2; .type sym,#function; sym: \ - .cfi_startproc; DTRACE_NOP + .cfi_startproc; BTI_C; DTRACE_NOP #define ENTRY(sym) \ .globl sym; LENTRY(sym) #define EENTRY(sym) \ @@ -114,6 +114,34 @@ dsb sy; \ isb +/* + * When a CPU that implements FEAT_BTI uses a BR/BLR instruction (or the + * pointer authentication variants, e.g. BLRAA) and the target location + * has the GP attribute in its page table, then the target of the BR/BLR + * needs to be a valid BTI landing pad. + * + * BTI_C should be used at the start of a function and is used in the + * ENTRY macro. It can be replaced by PACIASP or PACIBSP, however these + * also need an appropriate authenticate instruction before returning. + * + * BTI_J should be used as the target instruction when branching with a + * BR instruction within a function. + * + * When using a BR to branch to a new function, e.g. a tail call, then + * the target register should be x16 or x17 so it is compatible with + * the BRI_C instruction. + * + * As these instructions are in the hint space they are a NOP when + * the CPU doesn't implement FEAT_BTI so are safe to use. + */ +#ifdef __ARM_FEATURE_BTI_DEFAULT +#define BTI_C hint #34 +#define BTI_J hint #36 +#else +#define BTI_C +#define BTI_J +#endif + #endif /* _MACHINE_ASM_H_ */ #endif /* !__arm__ */