git: a9e12d3ec8bd - main - arm64: Support building sys/sysl instructions

From: Andrew Turner <andrew_at_FreeBSD.org>
Date: Thu, 18 Jun 2026 14:57:38 UTC
The branch main has been updated by andrew:

URL: https://cgit.FreeBSD.org/src/commit/?id=a9e12d3ec8bde29e97227757bc08cb1a0a93afa9

commit a9e12d3ec8bde29e97227757bc08cb1a0a93afa9
Author:     Andrew Turner <andrew@FreeBSD.org>
AuthorDate: 2026-06-18 13:34:04 +0000
Commit:     Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2026-06-18 14:56:52 +0000

    arm64: Support building sys/sysl instructions
    
    Add support to build system instructions from a macro. These are based
    on the existing support for msr/mrs instructions with adjustments for
    the different instruction format.
    
    Sponsored by:   Arm Ltd
    Differential Revision:  https://reviews.freebsd.org/D57017
---
 sys/arm64/include/_armreg.h | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/sys/arm64/include/_armreg.h b/sys/arm64/include/_armreg.h
index 0f5134e5a978..0ade9e6168c9 100644
--- a/sys/arm64/include/_armreg.h
+++ b/sys/arm64/include/_armreg.h
@@ -52,6 +52,34 @@
 #define	WRITE_SPECIALREG(reg, _val)					\
 	__asm __volatile("msr	" __STRING(reg) ", %0" : : "r"((uint64_t)_val))
 
+
+#define	__SYS_ALT_NAME(op1, crn, crm, op2)				\
+    "#" #op1 ", C" #crn ", C" #crm ", #" #op2
+#define	_SYS_ALT_NAME(op1, crn, crm, op2)				\
+    __SYS_ALT_NAME(op1, crn, crm, op2)
+#define	SYS_ALT_NAME(insn)						\
+    _SYS_ALT_NAME(insn##_op1, insn##_CRn, insn##_CRm, insn##_op2)
+
+#define	SYS(insn) do {							\
+	_Static_assert(insn##_op0 == 1, "Invalid SYS instruction");	\
+	__asm __volatile("sys	" SYS_ALT_NAME(insn));			\
+} while (0)
+
+#define	SYS_ARG(insn, _val) do {					\
+	_Static_assert(insn##_op0 == 1, "Invalid SYS instruction");	\
+	__asm __volatile("sys	" SYS_ALT_NAME(insn) ", %0"		\
+	    : : "r"((uint64_t)_val));					\
+} while (0)
+
+#define	SYSL(insn)							\
+({									\
+	uint64_t _val;							\
+	_Static_assert(insn##_op0 == 1, "Invalid SYS instruction");	\
+	__asm __volatile("sysl	%0, " SYS_ALT_NAME(insn)		\
+	    : "=&r"(_val));						\
+	_val;								\
+})
+
 #define	UL(x)	UINT64_C(x)
 
 #endif /* !_MACHINE__ARMREG_H_ */