svn commit: r196930 - in projects/ppc64/sys/powerpc: aim64 powerpc

Nathan Whitehorn nwhitehorn at FreeBSD.org
Mon Sep 7 15:43:11 UTC 2009


Author: nwhitehorn
Date: Mon Sep  7 15:43:09 2009
New Revision: 196930
URL: http://svn.freebsd.org/changeset/base/196930

Log:
  Fix stack_machdep.c to work correctly by taking into account the TOC
  reload slot offset when determining if we are coming out of a trap.
  This avoids a nested fault when init exits.

Modified:
  projects/ppc64/sys/powerpc/aim64/swtch.S
  projects/ppc64/sys/powerpc/aim64/trap_subr.S
  projects/ppc64/sys/powerpc/powerpc/stack_machdep.c

Modified: projects/ppc64/sys/powerpc/aim64/swtch.S
==============================================================================
--- projects/ppc64/sys/powerpc/aim64/swtch.S	Mon Sep  7 15:22:54 2009	(r196929)
+++ projects/ppc64/sys/powerpc/aim64/swtch.S	Mon Sep  7 15:43:09 2009	(r196930)
@@ -259,5 +259,5 @@ ENTRY(fork_trampoline)
 					   trapframe to simulate FRAME_SETUP
 					   does when allocating space for
 					   a frame pointer/saved LR */
-	b	.trapexit
+	b	trapexit
 	nop

Modified: projects/ppc64/sys/powerpc/aim64/trap_subr.S
==============================================================================
--- projects/ppc64/sys/powerpc/aim64/trap_subr.S	Mon Sep  7 15:22:54 2009	(r196929)
+++ projects/ppc64/sys/powerpc/aim64/trap_subr.S	Mon Sep  7 15:43:09 2009	(r196930)
@@ -267,9 +267,9 @@ CNAME(rstcode):
 	mflr	%r1
 	addi	%r1,%r1,(124-16)@l
 
-	lis	%r3,1 at l
 	lis	%r3,tocbase at ha
 	ld	%r2,tocbase at l(%r3)
+	lis	%r3,1 at l
 	bla	CNAME(.pmap_cpu_bootstrap)
 	nop
 	bla	CNAME(.cpudep_ap_bootstrap)
@@ -476,10 +476,9 @@ trapagain:
 	addi	%r3,%r1,48
 	bl	CNAME(.powerpc_interrupt)
 	nop
-	bl	CNAME(.trapexit)
-	nop
 
-ASENTRY(trapexit)	/* backtrace code sentinel */
+	.globl	CNAME(trapexit)	/* backtrace code sentinel */
+CNAME(trapexit):
 /* Disable interrupts: */
 	mfmsr	%r3
 	andi.	%r3,%r3,~PSL_EE at l
@@ -500,8 +499,11 @@ ASENTRY(trapexit)	/* backtrace code sent
 	ori	%r3,%r3,PSL_EE at l
 	mtmsr	%r3
 	isync
-	addi	%r3,%r1,8
-	bl	CNAME(ast)
+	lis	%r3,tocbase at ha
+	ld	%r2,tocbase at l(%r3)
+	addi	%r3,%r1,48
+	bl	CNAME(.ast)
+	nop
 	.globl	CNAME(asttrapexit)	/* backtrace code sentinel #2 */
 CNAME(asttrapexit):
 	b	trapexit		/* test ast ret value ? */

Modified: projects/ppc64/sys/powerpc/powerpc/stack_machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/powerpc/stack_machdep.c	Mon Sep  7 15:22:54 2009	(r196929)
+++ projects/ppc64/sys/powerpc/powerpc/stack_machdep.c	Mon Sep  7 15:43:09 2009	(r196930)
@@ -42,6 +42,12 @@ __FBSDID("$FreeBSD$");
 #include <machine/stack.h>
 #include <machine/trap.h>
 
+#ifdef __powerpc64__
+#define CALLOFFSET 8 /* Account for the TOC reload slot */
+#else
+#define CALLOFFSET 4
+#endif
+
 static void
 stack_capture(struct stack *st, register_t frame)
 {
@@ -54,7 +60,12 @@ stack_capture(struct stack *st, register
 		frame = *(register_t *)frame;
 		if (frame < PAGE_SIZE)
 			break;
+
+	    #ifdef __powerpc64__
+		callpc = *(vm_offset_t *)(frame + 16) - 4;
+	    #else
 		callpc = *(vm_offset_t *)(frame + 4) - 4;
+	    #endif
 		if ((callpc & 3) || (callpc < 0x100))
 			break;
 
@@ -64,8 +75,8 @@ stack_capture(struct stack *st, register
 		 * things are going wrong. Plus, prevents this shortened
 		 * version of code from accessing user-space frames
 		 */
-		if (callpc + 4 == (register_t) &trapexit ||
-		    callpc + 4 == (register_t) &asttrapexit)
+		if (callpc + CALLOFFSET == (register_t) &trapexit ||
+		    callpc + CALLOFFSET == (register_t) &asttrapexit)
 			break;
 
 		if (stack_put(st, callpc) == -1)


More information about the svn-src-projects mailing list