]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
arm64: Add support for GICv5 GSB barriers
authorLorenzo Pieralisi <lpieralisi@kernel.org>
Thu, 3 Jul 2025 10:25:09 +0000 (12:25 +0200)
committerMarc Zyngier <maz@kernel.org>
Tue, 8 Jul 2025 17:35:51 +0000 (18:35 +0100)
The GICv5 architecture introduces two barriers instructions
(GSB SYS, GSB ACK) that are used to manage interrupt effects.

Rework macro used to emit the SB barrier instruction and implement
the GSB barriers on top of it.

Suggested-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Cc: Will Deacon <will@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Marc Zyngier <maz@kernel.org>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/r/20250703-gicv5-host-v7-19-12e71f1b3528@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/include/asm/barrier.h
arch/arm64/include/asm/sysreg.h

index 1ca947d5c93963d33fe8fb02d6037fc71bd9fd7a..f5801b0ba9e9e7e0433f16ffedf0ec7dfb3e358e 100644 (file)
@@ -44,6 +44,9 @@
                                                 SB_BARRIER_INSN"nop\n",        \
                                                 ARM64_HAS_SB))
 
+#define gsb_ack()      asm volatile(GSB_ACK_BARRIER_INSN : : : "memory")
+#define gsb_sys()      asm volatile(GSB_SYS_BARRIER_INSN : : : "memory")
+
 #ifdef CONFIG_ARM64_PSEUDO_NMI
 #define pmr_sync()                                             \
        do {                                                    \
index f1bb0d10c39a3f52d2c2bb6a8b9f4adb8cb371dc..9b5fc6389715d04b3fcd9d9f36f431a8117561c3 100644 (file)
 /* Register-based PAN access, for save/restore purposes */
 #define SYS_PSTATE_PAN                 sys_reg(3, 0, 4, 2, 3)
 
-#define __SYS_BARRIER_INSN(CRm, op2, Rt) \
-       __emit_inst(0xd5000000 | sys_insn(0, 3, 3, (CRm), (op2)) | ((Rt) & 0x1f))
-
-#define SB_BARRIER_INSN                        __SYS_BARRIER_INSN(0, 7, 31)
+#define __SYS_BARRIER_INSN(op0, op1, CRn, CRm, op2, Rt)                        \
+       __emit_inst(0xd5000000                                  |       \
+                   sys_insn((op0), (op1), (CRn), (CRm), (op2)) |       \
+                   ((Rt) & 0x1f))
+
+#define SB_BARRIER_INSN                        __SYS_BARRIER_INSN(0, 3, 3, 0, 7, 31)
+#define GSB_SYS_BARRIER_INSN           __SYS_BARRIER_INSN(1, 0, 12, 0, 0, 31)
+#define GSB_ACK_BARRIER_INSN           __SYS_BARRIER_INSN(1, 0, 12, 0, 1, 31)
 
 /* Data cache zero operations */
 #define SYS_DC_ISW                     sys_insn(1, 0, 7, 6, 2)