git: e1c77d783206 - main - arm64: add inline functions for FEAT_WFxT instructions

From: Andrew Turner <andrew_at_FreeBSD.org>
Date: Thu, 23 Jan 2025 17:27:27 UTC
The branch main has been updated by andrew:

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

commit e1c77d783206bceee1f8d5fcbb0b3df214b4b282
Author:     Harry Moulton <harry.moulton@arm.com>
AuthorDate: 2025-01-23 12:27:28 +0000
Commit:     Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2025-01-23 17:26:25 +0000

    arm64: add inline functions for FEAT_WFxT instructions
    
    This adds inline functions for WFET/WFIT instructions introduced with
    ARMv8.7 FEAT_WFxT. These instructions allow for regular WFE/WFI
    instructions to be bound by a timeout. Once the value of CNTVCT_EL0
    reaches, or exceeds, that of the timeout value, the WFE/WFI state will
    be exited and the PE will continue.
    
    These instructions are implemented as inline functions, with a write to
    the corresponding system register acting as an alias for the two
    instructions. Writing to these registers is only valid on ARMv8.7 and
    above, therefore the use of these functions must be guarded by a feature
    check.
    
    Reviewed by:    andrew
    Sponsored by:   Arm Ltd
    Differential Revision:  https://reviews.freebsd.org/D48579
    Signed-off-by: Harry Moulton <harry.moulton@arm.com>
---
 sys/arm64/include/cpufunc.h | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/sys/arm64/include/cpufunc.h b/sys/arm64/include/cpufunc.h
index ba712f48b262..c948799eb7b9 100644
--- a/sys/arm64/include/cpufunc.h
+++ b/sys/arm64/include/cpufunc.h
@@ -160,6 +160,26 @@ invalidate_local_icache(void)
 	    "isb               \n");
 }
 
+static __inline void
+wfet(uint64_t val)
+{
+	__asm __volatile(
+		"msr s0_3_c1_c0_0, %0\n"
+		:
+		: "r" ((val))
+		: "memory");
+}
+
+static __inline void
+wfit(uint64_t val)
+{
+	__asm __volatile(
+		"msr s0_3_c1_c0_1, %0\n"
+		:
+		: "r" ((val))
+		: "memory");
+}
+
 extern bool icache_aliasing;
 extern bool icache_vmid;