Module Name:    src
Committed By:   ryo
Date:           Wed Dec 12 11:14:51 UTC 2018

Modified Files:
        src/sys/arch/aarch64/aarch64: cpuswitch.S idle_machdep.S

Log Message:
- need to save/restore interrupt mask when entering/exiting to/from 
cpu_switchto_softint().
- when call dosoftints from cpu_idle, interrupts should be disabled.

rarely, lwp stack had been exhausted when high interrupts.
reported by alnsn@. thanks.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/aarch64/aarch64/cpuswitch.S
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/aarch64/aarch64/idle_machdep.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/cpuswitch.S
diff -u src/sys/arch/aarch64/aarch64/cpuswitch.S:1.8 src/sys/arch/aarch64/aarch64/cpuswitch.S:1.9
--- src/sys/arch/aarch64/aarch64/cpuswitch.S:1.8	Tue Dec 11 18:11:33 2018
+++ src/sys/arch/aarch64/aarch64/cpuswitch.S	Wed Dec 12 11:14:51 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: cpuswitch.S,v 1.8 2018/12/11 18:11:33 ryo Exp $ */
+/* $NetBSD: cpuswitch.S,v 1.9 2018/12/12 11:14:51 ryo Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
 #include "opt_ddb.h"
 #include "opt_kasan.h"
 
-RCSID("$NetBSD: cpuswitch.S,v 1.8 2018/12/11 18:11:33 ryo Exp $")
+RCSID("$NetBSD: cpuswitch.S,v 1.9 2018/12/12 11:14:51 ryo Exp $")
 
 /*
  * At IPL_SCHED:
@@ -123,6 +123,7 @@ ENTRY_NP(cpu_switchto_softint)
 	sub	sp, sp, #TF_SIZE	/* make switchframe */
 	adr	x2, softint_cleanup	/* return address for cpu_switchto() */
 	mov	x20, lr			/* x20 := original lr */
+	mrs	x19, daif		/* x19 := original interrupt mask */
 	stp	x19, x20, [sp, #TF_X19]
 	stp	x21, x22, [sp, #TF_X21]
 	stp	x23, x24, [sp, #TF_X23]
@@ -172,8 +173,11 @@ ENTRY_NP(cpu_switchto_softint)
 #endif
 	mov	sp, x4			/* restore pinned_lwp sp */
 	msr	cpacr_el1, x5		/* restore pinned_lwp cpacr */
-	ENABLE_INTERRUPT
+
+	ldp	x19, x20, [sp, #TF_X19]
+	msr	daif, x19		/* restore interrupt mask */
 	mov	lr, x20			/* restore pinned_lwp lr */
+
 	add	sp, sp, #TF_SIZE	/* unwind switchframe */
 	ldp	x19, x20, [sp], #16	/* restore */
 	ret
@@ -199,7 +203,8 @@ ENTRY_NP(softint_cleanup)
 	str	w2, [x3, #CI_MTX_COUNT]
 	str	wzr, [x0, #L_CTXSWTCH]	/* softlwp->l_ctxswtch = 0 */
 
-	ldp	x19, x20, [sp], #16
+	msr	daif, x19		/* restore interrupt mask */
+	ldp	x19, x20, [sp], #16	/* restore */
 	ret
 END(softint_cleanup)
 

Index: src/sys/arch/aarch64/aarch64/idle_machdep.S
diff -u src/sys/arch/aarch64/aarch64/idle_machdep.S:1.2 src/sys/arch/aarch64/aarch64/idle_machdep.S:1.3
--- src/sys/arch/aarch64/aarch64/idle_machdep.S:1.2	Sun Apr  1 04:35:03 2018
+++ src/sys/arch/aarch64/aarch64/idle_machdep.S	Wed Dec 12 11:14:51 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: idle_machdep.S,v 1.2 2018/04/01 04:35:03 ryo Exp $ */
+/* $NetBSD: idle_machdep.S,v 1.3 2018/12/12 11:14:51 ryo Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
 #include "opt_arm_intr_impl.h"
 #include "opt_ddb.h"
 
-RCSID("$NetBSD: idle_machdep.S,v 1.2 2018/04/01 04:35:03 ryo Exp $");
+RCSID("$NetBSD: idle_machdep.S,v 1.3 2018/12/12 11:14:51 ryo Exp $");
 
 #ifdef ARM_INTR_IMPL
 #include ARM_INTR_IMPL
@@ -89,20 +89,21 @@ ENTRY(cpu_idle)
 	mrs	x1, tpidr_el1			/* get curcpu() */
 	str	w28, [x1, #CI_INTR_DEPTH]	/* ci->ci_intr_depth = old */
 
-	ldr	x28, [sp, #TF_X28]		/* restore x28 */
-	ldp	x29, x30, [sp, #TF_X29]		/* restore x29,x30 */
-	add	sp, sp, #TF_SIZE		/* pop trapframe */
-
-	ENABLE_INTERRUPT
-
 #if defined(__HAVE_FAST_SOFTINTS) && !defined(__HAVE_PIC_FAST_SOFTINTS)
 	ldr	w3, [x1, #CI_SOFTINTS]		/* Get pending softint mask */
 	/* CPL should be 0 */
 	ldr	w2, [x1, #CI_CPL]		/* Get current priority level */
 	lsr	w3, w3, w2			/* shift mask by cpl */
-	cbnz	w3, _C_LABEL(dosoftints)	/* tailcall dosoftints() */
+	cbz	w3, 1f
+	bl	_C_LABEL(dosoftints)		/* dosoftints() */
+1:
 #endif /* __HAVE_FAST_SOFTINTS && !__HAVE_PIC_FAST_SOFTINTS */
 
+	ldr	x28, [sp, #TF_X28]		/* restore x28 */
+	ldp	x29, x30, [sp, #TF_X29]		/* restore x29,x30 */
+	add	sp, sp, #TF_SIZE		/* pop trapframe */
+
+	ENABLE_INTERRUPT
 #endif /* LAZY_CPUIDLE */
 
 	ret

Reply via email to