Module Name: src
Committed By: matt
Date: Fri Apr 17 17:28:34 UTC 2015
Modified Files:
src/sys/arch/arm/arm: ast.c
src/sys/arch/arm/include/arm32: frame.h
Log Message:
Put the clearing of ci_astpending back in frame.h while interrupts are
disabled.
To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/arm/arm/ast.c
cvs rdiff -u -r1.41 -r1.42 src/sys/arch/arm/include/arm32/frame.h
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/arm/arm/ast.c
diff -u src/sys/arch/arm/arm/ast.c:1.27 src/sys/arch/arm/arm/ast.c:1.28
--- src/sys/arch/arm/arm/ast.c:1.27 Tue Apr 14 22:36:53 2015
+++ src/sys/arch/arm/arm/ast.c Fri Apr 17 17:28:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: ast.c,v 1.27 2015/04/14 22:36:53 jmcneill Exp $ */
+/* $NetBSD: ast.c,v 1.28 2015/04/17 17:28:33 matt Exp $ */
/*
* Copyright (c) 1994,1995 Mark Brinicombe
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ast.c,v 1.27 2015/04/14 22:36:53 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ast.c,v 1.28 2015/04/17 17:28:33 matt Exp $");
#include "opt_ddb.h"
@@ -131,11 +131,6 @@ ast(struct trapframe *tf)
ci->ci_data.cpu_ntrap++;
KDASSERT(ci->ci_cpl == IPL_NONE);
-#ifdef __HAVE_PREEMPTION
- atomic_and_uint(&ci->ci_astpending, ~__BIT(0));
-#else
- ci->ci_astpending = 0;
-#endif
const int want_resched = ci->ci_want_resched;
#ifdef __HAVE_PREEMPTION
kpreempt_enable();
Index: src/sys/arch/arm/include/arm32/frame.h
diff -u src/sys/arch/arm/include/arm32/frame.h:1.41 src/sys/arch/arm/include/arm32/frame.h:1.42
--- src/sys/arch/arm/include/arm32/frame.h:1.41 Wed Apr 8 18:10:08 2015
+++ src/sys/arch/arm/include/arm32/frame.h Fri Apr 17 17:28:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: frame.h,v 1.41 2015/04/08 18:10:08 matt Exp $ */
+/* $NetBSD: frame.h,v 1.42 2015/04/17 17:28:33 matt Exp $ */
/*
* Copyright (c) 1994-1997 Mark Brinicombe.
@@ -150,6 +150,28 @@ void validate_trapframe(trapframe_t *, i
msr cpsr_c, ra /* Restore interrupts */
#endif
+#ifdef __HAVE_PREEMPTION
+#define DO_CLEAR_ASTPENDING \
+ mvn r1, #1 /* complement of 1 */ ;\
+ add r0, r4, #CI_ASTPENDING /* address of astpending */ ;\
+ bl _C_LABEL(atomic_and_uint) /* clear AST */
+#else
+#define DO_CLEAR_ASTPENDING \
+ mov r0, #0 ;\
+ str r0, [r4, #CI_ASTPENDING] /* clear AST */
+#endif
+
+#define DO_PENDING_AST(lbl) ;\
+1: ldr r1, [r4, #CI_ASTPENDING] /* Pending AST? */ ;\
+ tst r1, #0x00000001 ;\
+ beq lbl /* Nope. Just bail */ ;\
+ DO_CLEAR_ASTPENDING ;\
+ CPSIE_I(r5, r5) /* Restore interrupts */ ;\
+ mov r0, sp ;\
+ bl _C_LABEL(ast) /* ast(frame) */ ;\
+ CPSID_I(r0, r5) /* Disable interrupts */ ;\
+ b 1b /* test again */
+
/*
* AST_ALIGNMENT_FAULT_LOCALS and ENABLE_ALIGNMENT_FAULTS
* These are used in order to support dynamic enabling/disabling of
@@ -199,10 +221,8 @@ void validate_trapframe(trapframe_t *, i
CPSID_I(r1, r5) /* Disable interrupts */ ;\
cmp r7, #(PSR_USR32_MODE) /* Returning to USR mode? */ ;\
bne 3f /* Nope, get out now */ ;\
-1: ldr r1, [r4, #CI_ASTPENDING] /* Pending AST? */ ;\
- tst r1, #0x00000001 ;\
- bne 2f /* Yup. Go deal with it */ ;\
- ldr r1, [r4, #CI_CURLWP] /* get curlwp from cpu_info */ ;\
+ DO_PENDING_AST(2f) /* Pending AST? */ ;\
+2: ldr r1, [r4, #CI_CURLWP] /* get curlwp from cpu_info */ ;\
ldr r0, [r1, #L_MD_FLAGS] /* get md_flags from lwp */ ;\
tst r0, #MDLWP_NOALIGNFLT ;\
beq 3f /* Keep AFLTs enabled */ ;\
@@ -210,14 +230,7 @@ void validate_trapframe(trapframe_t *, i
ldr r2, .Laflt_cpufuncs ;\
mov r0, #-1 ;\
bic r1, r1, #CPU_CONTROL_AFLT_ENABLE /* Disable AFLTs */ ;\
- adr lr, 3f ;\
- B_CF_CONTROL(r2) /* Set new CTRL reg value */ ;\
- /* NOTREACHED */ \
-2: CPSIE_I(r5, r5) /* Restore interrupts */ ;\
- mov r0, sp ;\
- bl _C_LABEL(ast) /* ast(frame) */ ;\
- CPSID_I(r0, r5) /* Disable interrupts */ ;\
- b 1b /* Back around again */ ;\
+ BL_CF_CONTROL(r2) /* Set new CTRL reg value */ ;\
3: /* done */
#else /* !EXEC_AOUT */
@@ -235,14 +248,7 @@ void validate_trapframe(trapframe_t *, i
CPSID_I(r1, r5) /* Disable interrupts */ ;\
cmp r7, #(PSR_USR32_MODE) ;\
bne 2f /* Nope, get out now */ ;\
-1: ldr r1, [r4, #CI_ASTPENDING] /* Pending AST? */ ;\
- tst r1, #0x00000001 ;\
- beq 2f /* Nope. Just bail */ ;\
- CPSIE_I(r5, r5) /* Restore interrupts */ ;\
- mov r0, sp ;\
- bl _C_LABEL(ast) /* ast(frame) */ ;\
- CPSID_I(r0, r5) /* Disable interrupts */ ;\
- b 1b ;\
+ DO_PENDING_AST(2f) /* Pending AST? */ ;\
2: /* done */
#endif /* EXEC_AOUT */