Date: Mon, 7 Sep 2009 15:43:10 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r196930 - in projects/ppc64/sys/powerpc: aim64 powerpc Message-ID: <200909071543.n87FhASq018971@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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@l lis %r3,tocbase@ha ld %r2,tocbase@l(%r3) + lis %r3,1@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@l @@ -500,8 +499,11 @@ ASENTRY(trapexit) /* backtrace code sent ori %r3,%r3,PSL_EE@l mtmsr %r3 isync - addi %r3,%r1,8 - bl CNAME(ast) + lis %r3,tocbase@ha + ld %r2,tocbase@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)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200909071543.n87FhASq018971>