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)