Module Name:    src
Committed By:   thorpej
Date:           Fri Sep 18 00:04:58 UTC 2020

Modified Files:
        src/sys/arch/alpha/alpha: debug.s

Log Message:
Fix entering the kernel debugger when MULTIPROCESSOR is enabled; the
arguments to alpha_debug() were getting clobbered by the call to
cpu_pause_resume_all(), but they need to be passed along to ddb_trap().


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/alpha/alpha/debug.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/alpha/alpha/debug.s
diff -u src/sys/arch/alpha/alpha/debug.s:1.12 src/sys/arch/alpha/alpha/debug.s:1.13
--- src/sys/arch/alpha/alpha/debug.s:1.12	Thu Aug 20 21:34:03 2009
+++ src/sys/arch/alpha/alpha/debug.s	Fri Sep 18 00:04:58 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: debug.s,v 1.12 2009/08/20 21:34:03 skrll Exp $ */
+/* $NetBSD: debug.s,v 1.13 2020/09/18 00:04:58 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1999, 2001 The NetBSD Foundation, Inc.
@@ -30,9 +30,10 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-__KERNEL_RCSID(6, "$NetBSD: debug.s,v 1.12 2009/08/20 21:34:03 skrll Exp $")
+__KERNEL_RCSID(6, "$NetBSD: debug.s,v 1.13 2020/09/18 00:04:58 thorpej Exp $")
 
 #include "opt_multiprocessor.h"
+#include "opt_ddb.h"
 #include "opt_kgdb.h"
 
 /*
@@ -64,17 +65,30 @@ BSS(debug_stack_bottom, DEBUG_STACK_SIZE
  *		a3	kernel trap entry point
  *		a4	frame pointer
  */
-NESTED_NOPROFILE(alpha_debug, 5, 32, ra, IM_RA|IM_S0, 0)
+NESTED_NOPROFILE(alpha_debug, 5, 64, ra,
+    IM_RA|IM_S0|IM_S1|IM_S2|IM_S3|IM_S4|IM_S5, 0)
 	br	pv, 1f
 1:	LDGP(pv)
 	lda	t0, FRAME_SIZE*8(a4)	/* what would sp have been? */
 	stq	t0, FRAME_SP*8(a4)	/* belatedly save sp for ddb view */
-	lda	sp, -32(sp)		/* set up stack frame */
-	stq	ra, (32-8)(sp)		/* save ra */
-	stq	s0, (32-16)(sp)		/* save s0 */
+	lda	sp, -64(sp)		/* set up stack frame */
+	stq	s0, (0*8)(sp)		/* save s0 ... */
+	stq	s1, (1*8)(sp)
+	stq	s2, (2*8)(sp)
+	stq	s3, (3*8)(sp)
+	stq	s4, (4*8)(sp)
+	stq	s5, (5*8)(sp)		/* ... through s5 */
+	stq	ra, (6*8)(sp)		/* save ra */
 
 	/* Remember our current stack pointer. */
-	mov	sp, s0
+	mov	sp, s5
+
+	/* Save off our arguments. */
+	mov	a0, s0
+	mov	a1, s1
+	mov	a2, s2
+	mov	a3, s3
+	mov	a4, s4
 
 #if defined(MULTIPROCESSOR)
 	/* Pause all other CPUs. */
@@ -95,19 +109,24 @@ NESTED_NOPROFILE(alpha_debug, 5, 32, ra,
 
 2:	lda	sp, debug_stack_top	/* sp <- debug_stack_top */
 
-3:	/* Dispatch to the debugger - arguments are already in place. */
+3:	/* Dispatch to the debugger. */
 #if defined(KGDB)
-	mov	a3, a0			/* a0 == entry (trap type) */
-	mov	a4, a1			/* a1 == frame pointer */
+	mov	s3, a0			/* a0 == entry (trap type) */
+	mov	s4, a1			/* a1 == frame pointer */
 	CALL(kgdb_trap)
 	br	9f
 #endif
 #if defined(DDB)
+	mov	s0, a1			/* same arguments as the call */
+	mov	s1, a1			/* to alpha_debug() */
+	mov	s2, a2			/* (these may have been clobbered */
+	mov	s3, a3			/* when pausing other CPUs.) */
+	mov	s4, a4
 	CALL(ddb_trap)
 	br	9f
 #endif
 9:	/* Debugger return value in v0; switch back to our previous stack. */
-	mov	s0, sp
+	mov	s5, sp
 
 #if defined(MULTIPROCESSOR)
 	mov	v0, s0
@@ -119,8 +138,13 @@ NESTED_NOPROFILE(alpha_debug, 5, 32, ra,
 	mov	s0, v0
 #endif
 
-	ldq	ra, (32-8)(sp)		/* restore ra */
-	ldq	s0, (32-16)(sp)		/* restore s0 */
-	lda	sp, 32(sp)		/* pop stack frame */
+	ldq	s0, (0*8)(sp)		/* restore s0 ... */
+	ldq	s1, (1*8)(sp)
+	ldq	s2, (2*8)(sp)
+	ldq	s3, (3*8)(sp)
+	ldq	s4, (4*8)(sp)
+	ldq	s5, (5*8)(sp)		/* ... through s5 */
+	ldq	ra, (6*8)(sp)		/* restore ra */
+	lda	sp, 64(sp)		/* pop stack frame */
 	RET
 	END(alpha_debug)

Reply via email to