arm64: Support BTI checking in most of the kernel

LLD has the -zbti-report=error argument to check if the BTI note is
present when linking. To allow for this to be used when linking the
kernel and modules:
 - Add the BTI note to the remaining assembly files
 - Mark ptrauth.c as protected by BTI
 - Disable -zbti-report for vmm hypervisor switching code as it's not
   used there.

The linux64 module doesn't build with the flag as it includes vdso code
that doesn't include the note.

Reviewed by:	imp, kib, emaste
Sponsored by:	Arm Ltd
Differential Revision:	https://reviews.freebsd.org/D45466
This commit is contained in:
Andrew Turner 2024-06-04 13:46:46 +01:00
parent a5affc0c4c
commit c2e0d56f5e
21 changed files with 72 additions and 3 deletions

View File

@ -25,7 +25,9 @@
*
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
ENTRY(generic_bs_r_1)
ldrb w0, [x1, x2]
ret
@ -475,3 +477,5 @@ generic_bs_poke_8f:
mov x0, #0
ret
END(generic_bs_poke_8)
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -27,9 +27,10 @@
*
*/
#include <machine/asm.h>
#include <sys/elf_common.h>
#include <sys/errno.h>
#include <machine/asm.h>
#include <machine/param.h>
#include <machine/vmparam.h>
@ -220,3 +221,5 @@ ending:
mov x0, xzr /* return 0 */
ret
.size copycommon, . - copycommon
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -29,7 +29,9 @@
*
*/
#include <sys/elf_common.h>
#include <sys/errno.h>
#include <machine/asm.h>
#include <machine/param.h>
@ -190,3 +192,5 @@ ENTRY(cache_maint_fault)
mov x0, #EFAULT
ret
END(cache_maint_fault)
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -25,6 +25,8 @@
*
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
#include <machine/armreg.h>
#include "assym.inc"
@ -324,3 +326,4 @@ exception_vectors:
vempty 0 /* FIQ 32-bit EL0 */
vector el0_serror 0 /* Error 32-bit EL0 */
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -24,6 +24,8 @@
* SUCH DAMAGE.
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
.macro vempty
@ -63,3 +65,5 @@ hyp_stub_vectors:
vempty /* IRQ 32-bit EL1 */
vempty /* FIQ 32-bit EL1 */
vempty /* SError 32-bit EL1 */
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -26,6 +26,7 @@
#include "assym.inc"
#include "opt_kstack_pages.h"
#include <sys/elf_common.h>
#include <sys/syscall.h>
#include <machine/asm.h>
#include <machine/armreg.h>
@ -1006,3 +1007,5 @@ aarch32_esigcode:
.global sz_aarch32_sigcode
sz_aarch32_sigcode:
.quad aarch32_esigcode - aarch32_sigcode
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -9,6 +9,8 @@
* ARMv8-a, AArch64, unaligned accesses.
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
#define L(l) .L ## l
@ -134,3 +136,4 @@ L(byte_loop):
END (memcmp)
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -11,6 +11,8 @@
*
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
#define L(l) .L ## l
@ -240,3 +242,4 @@ L(copy64_from_start):
END(memcpy)
EEND(memmove)
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -31,6 +31,8 @@
*
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
#define dstin x0
@ -195,3 +197,5 @@ ENTRY(memset)
b.ne .Ltail_maybe_long
ret
END(memset)
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -27,6 +27,7 @@
*/
#include "assym.inc"
#include <sys/elf_common.h>
#include <sys/syscall.h>
#include <machine/asm.h>
@ -57,3 +58,5 @@ esigcode:
.global szsigcode
szsigcode:
.quad esigcode - sigcode
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -12,6 +12,8 @@
* MTE compatible.
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
#define L(l) .L ## l
@ -187,3 +189,4 @@ L(done):
END (strcmp)
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -11,6 +11,8 @@
* MTE compatible.
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
#define L(l) .L ## l
@ -305,3 +307,4 @@ L(ret0):
ret
END(strncmp)
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -29,6 +29,8 @@
*
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
#include <machine/setjmp.h>
#include <machine/param.h>
@ -387,3 +389,5 @@ ENTRY(pagezero_cache)
ret
END(pagezero_cache)
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -33,6 +33,8 @@
#include "opt_kstack_pages.h"
#include "opt_sched.h"
#include <sys/elf_common.h>
#include <machine/asm.h>
#include <machine/armreg.h>
.macro clear_step_flag pcbflags, tmp
@ -277,3 +279,4 @@ ENTRY(savectx)
ret
END(savectx)
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -28,6 +28,7 @@
* SUCH DAMAGE.
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
@ -37,3 +38,5 @@ ENTRY(vmm_call_hyp)
hvc #0
ret
END(vmm_call_hyp)
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -28,6 +28,9 @@
* SUCH DAMAGE.
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
#include <machine/param.h>
.section .rodata
@ -37,3 +40,5 @@ vmm_hyp_code:
.incbin "vmm_hyp_blob.bin"
.globl vmm_hyp_code_end
vmm_hyp_code_end:
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -29,6 +29,7 @@
#include <sys/cpuvar_defs.h>
#include <sys/dtrace.h>
#include <sys/elf_common.h>
#include <machine/armreg.h>
#include <machine/asm.h>
@ -172,3 +173,5 @@ ENTRY(dtrace_casptr)
2: mov x0, x3 /* Return the value loaded from target */
RET
END(dtrace_casptr)
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -65,7 +65,7 @@ arm64/arm64/nexus.c standard
arm64/arm64/ofw_machdep.c optional fdt
arm64/arm64/pl031_rtc.c optional fdt pl031
arm64/arm64/ptrauth.c standard \
compile-with "${NORMAL_C:N-mbranch-protection*}"
compile-with "${NORMAL_C:N-mbranch-protection*} -mbranch-protection=bti"
arm64/arm64/pmap.c standard
arm64/arm64/ptrace_machdep.c standard
arm64/arm64/sigtramp.S standard

View File

@ -30,7 +30,10 @@
* SUCH DAMAGE.
*/
#include <sys/elf_common.h>
#include <machine/asm.h>
.macro arm_smccc_1_0 insn
ENTRY(arm_smccc_\insn)
\insn #0
@ -84,3 +87,5 @@ END(arm_smccc_1_2_\insn)
*/
arm_smccc_1_2 hvc
arm_smccc_1_2 smc
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)

View File

@ -45,3 +45,9 @@ FIRMW_START(FIRMW_SYMBOL):
.type FIRMW_END(FIRMW_SYMBOL), %object
FIRMW_END(FIRMW_SYMBOL):
.size FIRMW_END(FIRMW_SYMBOL), . - FIRMW_END(FIRMW_SYMBOL)
#if defined(__aarch64__)
#include <machine/asm.h>
#include <sys/elf_common.h>
GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)
#endif

View File

@ -50,7 +50,7 @@ vmm_hyp.o: vmm_hyp.c
vmm_hyp_blob.elf.full: vmm_hyp_exception.o vmm_hyp.o
${LD} -m ${LD_EMULATION} -Bdynamic -T ${SYSDIR}/conf/ldscript.arm64 \
${_LDFLAGS} --no-warn-mismatch --warn-common --export-dynamic \
${_LDFLAGS:N-zbti-report*} --no-warn-mismatch --warn-common --export-dynamic \
--dynamic-linker /red/herring -X -o ${.TARGET} ${.ALLSRC} \
--defsym=_start='0x0' --defsym=text_start='0x0'