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 */
 

Reply via email to