From owner-svn-src-projects@FreeBSD.ORG Sat Mar 20 03:39:02 2010 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 869EA106564A; Sat, 20 Mar 2010 03:39:02 +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 5A16B8FC0C; Sat, 20 Mar 2010 03:39:02 +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 o2K3d2cl054115; Sat, 20 Mar 2010 03:39:02 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o2K3d2iR054112; Sat, 20 Mar 2010 03:39:02 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201003200339.o2K3d2iR054112@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 20 Mar 2010 03:39:02 +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: r205353 - projects/ppc64/sys/powerpc/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: Sat, 20 Mar 2010 03:39:02 -0000 Author: nwhitehorn Date: Sat Mar 20 03:39:02 2010 New Revision: 205353 URL: http://svn.freebsd.org/changeset/base/205353 Log: Correct stack setup. This incorporates two changes: 1. The MI code in kern_exec.c will produce a mis-aligned stack if sigcodesz is not a multiple of register_t. Fix this with a hammer. 2. C functions (like _start) write their parent LR to the parent's stack frame. As such, the 48 bytes above the stack address, which used to include argv, can be overwritten by garbage in certain circumstances. The correct amount of stack padding is now applied. Modified: projects/ppc64/sys/powerpc/powerpc/exec_machdep.c projects/ppc64/sys/powerpc/powerpc/sigcode64.S Modified: projects/ppc64/sys/powerpc/powerpc/exec_machdep.c ============================================================================== --- projects/ppc64/sys/powerpc/powerpc/exec_machdep.c Sat Mar 20 02:23:58 2010 (r205352) +++ projects/ppc64/sys/powerpc/powerpc/exec_machdep.c Sat Mar 20 03:39:02 2010 (r205353) @@ -496,7 +496,11 @@ exec_setregs(struct thread *td, struct i tf = trapframe(td); bzero(tf, sizeof *tf); + #ifdef __powerpc64__ + tf->fixreg[1] = -roundup(-stack + 48, 16); + #else tf->fixreg[1] = -roundup(-stack + 8, 16); + #endif /* * XXX Machine-independent code has already copied arguments and @@ -1000,8 +1004,13 @@ cpu_set_upcall_kse(struct thread *td, vo tf = td->td_frame; /* align stack and alloc space for frame ptr and saved LR */ - sp = ((uintptr_t)stack->ss_sp + stack->ss_size - sizeof(uint64_t)) & + #ifdef __powerpc64__ + sp = ((uintptr_t)stack->ss_sp + stack->ss_size - 48) & ~0x1f; + #else + sp = ((uintptr_t)stack->ss_sp + stack->ss_size - 8) & + ~0x1f; + #endif bzero(tf, sizeof(struct trapframe)); tf->fixreg[1] = (register_t)sp; Modified: projects/ppc64/sys/powerpc/powerpc/sigcode64.S ============================================================================== --- projects/ppc64/sys/powerpc/powerpc/sigcode64.S Sat Mar 20 02:23:58 2010 (r205352) +++ projects/ppc64/sys/powerpc/powerpc/sigcode64.S Sat Mar 20 03:39:02 2010 (r205353) @@ -58,6 +58,7 @@ CNAME(sigcode64): sc /* sigreturn(scp) */ li 0,SYS_exit sc /* exit(errno) */ + nop /* align to doubleword */ endsigcode64: .data