svn commit: r205353 - projects/ppc64/sys/powerpc/powerpc
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Sat Mar 20 03:39:02 UTC 2010
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
More information about the svn-src-projects
mailing list