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 <[email protected]>
@@ -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)