Module Name:    src
Committed By:   jmcneill
Date:           Sat Oct 30 20:23:12 UTC 2021

Modified Files:
        src/sys/arch/aarch64/aarch64: genassym.cf
        src/sys/arch/arm/cortex: gic_splfuncs_armv8.S

Log Message:
Add __HAVE_PREEMPTION support to gic_splfuncs asm funcs.

"looks right to me" - thorpej


To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/aarch64/aarch64/genassym.cf
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/cortex/gic_splfuncs_armv8.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/aarch64/aarch64/genassym.cf
diff -u src/sys/arch/aarch64/aarch64/genassym.cf:1.36 src/sys/arch/aarch64/aarch64/genassym.cf:1.37
--- src/sys/arch/aarch64/aarch64/genassym.cf:1.36	Sat Oct 30 18:49:47 2021
+++ src/sys/arch/aarch64/aarch64/genassym.cf	Sat Oct 30 20:23:11 2021
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.36 2021/10/30 18:49:47 jmcneill Exp $
+# $NetBSD: genassym.cf,v 1.37 2021/10/30 20:23:11 jmcneill Exp $
 #-
 # Copyright (c) 2014 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -163,6 +163,7 @@ define	L_MD_IB_USER		offsetof(struct lwp
 define	L_MD_DA_USER		offsetof(struct lwp, l_md.md_da_user)
 define	L_MD_DB_USER		offsetof(struct lwp, l_md.md_db_user)
 define	L_MD_GA_USER		offsetof(struct lwp, l_md.md_ga_user)
+define	L_NOPREEMPT		offsetof(struct lwp, l_nopreempt)
 define	LW_SYSTEM		LW_SYSTEM
 
 define	FB_X19			FB_X19

Index: src/sys/arch/arm/cortex/gic_splfuncs_armv8.S
diff -u src/sys/arch/arm/cortex/gic_splfuncs_armv8.S:1.1 src/sys/arch/arm/cortex/gic_splfuncs_armv8.S:1.2
--- src/sys/arch/arm/cortex/gic_splfuncs_armv8.S:1.1	Sat Oct 30 18:44:24 2021
+++ src/sys/arch/arm/cortex/gic_splfuncs_armv8.S	Sat Oct 30 20:23:12 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: gic_splfuncs_armv8.S,v 1.1 2021/10/30 18:44:24 jmcneill Exp $ */
+/* $NetBSD: gic_splfuncs_armv8.S,v 1.2 2021/10/30 20:23:12 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2021 Jared McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,21 @@
 #include <machine/asm.h>
 #include "assym.h"
 
-RCSID("$NetBSD: gic_splfuncs_armv8.S,v 1.1 2021/10/30 18:44:24 jmcneill Exp $")
+RCSID("$NetBSD: gic_splfuncs_armv8.S,v 1.2 2021/10/30 20:23:12 jmcneill Exp $")
+
+#ifdef __HAVE_PREEMPTION
+#define	DISABLE_PREEMPTION			\
+	ldr	w1, [x3, #L_NOPREEMPT];		\
+	add	w1, w1, #1;			\
+	str	w1, [x3, #L_NOPREEMPT]
+#define	ENABLE_PREEMPTION			\
+	ldr	w1, [x3, #L_NOPREEMPT];		\
+	sub	w1, w1, #1;			\
+	str	w1, [x3, #L_NOPREEMPT]
+#else
+#define	DISABLE_PREEMPTION
+#define	ENABLE_PREEMPTION
+#endif
 
 /*
  * int
@@ -39,9 +53,10 @@ RCSID("$NetBSD: gic_splfuncs_armv8.S,v 1
  */
 	.align 7        /* cacheline-aligned */
 ENTRY_NP(gic_splraise)
-	/* Save cpu_info pointer in x1 */
-	mrs	x1, tpidr_el1			/* get curlwp */
-	ldr	x1, [x1, #L_CPU]		/* get curcpu */
+	/* Save curlwp in x3, curcpu in x1 */
+	mrs	x3, tpidr_el1			/* get curlwp */
+	DISABLE_PREEMPTION
+	ldr	x1, [x3, #L_CPU]		/* get curcpu */
 
 	/* If newipl > cpl, update cpl */
 	ldr	w2, [x1, #CI_CPL]
@@ -50,6 +65,7 @@ ENTRY_NP(gic_splraise)
 	str	w0, [x1, #CI_CPL]
 
 .Lnoraise:
+	ENABLE_PREEMPTION
 	mov	w0, w2				/* return oldipl */
 	ret
 END(gic_splraise)
@@ -63,9 +79,10 @@ END(gic_splraise)
  */
 	.align 7        /* cacheline-aligned */
 ENTRY_NP(gic_splx)
-	/* Save cpu_info pointer in x1 */
-	mrs	x1, tpidr_el1			/* get curlwp */
-	ldr	x1, [x1, #L_CPU]		/* get curcpu */
+	/* Save curlwp in x3, curcpu in x1 */
+	mrs	x3, tpidr_el1			/* get curlwp */
+	DISABLE_PREEMPTION
+	ldr	x1, [x3, #L_CPU]		/* get curcpu */
 
 	/* If newipl >= cpl, just return */
 	ldr	w2, [x1, #CI_CPL]
@@ -99,6 +116,7 @@ ENTRY_NP(gic_splx)
 	cbnz	w2, _C_LABEL(dosoftints)
 
 .Ldone:
+	ENABLE_PREEMPTION
 	ret
 
 .Lrestart:
@@ -113,6 +131,7 @@ ENTRY_NP(gic_splx)
 	str	xzr, [x1, #CI_SPLX_RESTART]
 
 .Lslow:
+	ENABLE_PREEMPTION
 	/* Jump to slow path */
 	b	_C_LABEL(Xgic_splx)
 END(gic_splx)

Reply via email to