From owner-svn-src-projects@FreeBSD.ORG Mon Sep 7 15:43:10 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D787B1065670; Mon, 7 Sep 2009 15:43:10 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9150C8FC18; Mon, 7 Sep 2009 15:43:10 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n87FhA2U018973; Mon, 7 Sep 2009 15:43:10 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n87FhASq018971; Mon, 7 Sep 2009 15:43:10 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <200909071543.n87FhASq018971@svn.freebsd.org> From: Nathan Whitehorn Date: Mon, 7 Sep 2009 15:43:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196930 - in projects/ppc64/sys/powerpc: aim64 powerpc X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Sep 2009 15:43:11 -0000 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 #include +#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)