Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm Put the clearing of ci_astpending back in frame...



details:   https://anonhg.NetBSD.org/src/rev/6bb61a3a9d39
branches:  trunk
changeset: 337509:6bb61a3a9d39
user:      matt <matt%NetBSD.org@localhost>
date:      Fri Apr 17 17:28:33 2015 +0000

description:
Put the clearing of ci_astpending back in frame.h while interrupts are
disabled.

diffstat:

 sys/arch/arm/arm/ast.c             |   9 +-----
 sys/arch/arm/include/arm32/frame.h |  48 +++++++++++++++++++++----------------
 2 files changed, 29 insertions(+), 28 deletions(-)

diffs (113 lines):

diff -r 1de82e4e0aeb -r 6bb61a3a9d39 sys/arch/arm/arm/ast.c
--- a/sys/arch/arm/arm/ast.c    Fri Apr 17 15:13:47 2015 +0000
+++ b/sys/arch/arm/arm/ast.c    Fri Apr 17 17:28:33 2015 +0000
@@ -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 @@
        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();
diff -r 1de82e4e0aeb -r 6bb61a3a9d39 sys/arch/arm/include/arm32/frame.h
--- a/sys/arch/arm/include/arm32/frame.h        Fri Apr 17 15:13:47 2015 +0000
+++ b/sys/arch/arm/include/arm32/frame.h        Fri Apr 17 17:28:33 2015 +0000
@@ -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 @@
        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 @@
        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 @@
        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 @@
        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 */
 



Home | Main Index | Thread Index | Old Index