diff --git a/lib/libc/arch/sparc/sys/__clone.S b/lib/libc/arch/sparc/sys/__clone.S index 66cb9abbb1f9..fe3e9d22b011 100644 --- a/lib/libc/arch/sparc/sys/__clone.S +++ b/lib/libc/arch/sparc/sys/__clone.S @@ -1,4 +1,4 @@ -/* $NetBSD: __clone.S,v 1.4 2006/12/28 10:02:43 martin Exp $ */ +/* $NetBSD: __clone.S,v 1.5 2006/12/28 17:46:03 martin Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -60,11 +60,17 @@ ENTRY(__clone) mov %i2, %o0 ! setup flags arg for syscall /* - * Store the function and the argument on our child's stack + * Allocate "caller's" frame in the child stack as ABI + * requires. + * + * We pass the function and the argument to the child by + * stashing them at the bottom of the frame. There they are + * safe from window spill would we need to take one as it's + * below the window save area. */ - sub %o1, 8, %o1 ! make space on the child's stack - st %i0, [%o1] ! save func - st %i3, [%o1+4] ! save arg + sub %o1, CCFSZ, %o1 ! make space on the child's stack + st %i0, [%o1+CCFSZ-8] ! save func + st %i3, [%o1+CCFSZ-4] ! save arg /* * Args are now set up for system call as (flags, stack). @@ -75,11 +81,9 @@ ENTRY(__clone) tst %o1 ! %o1 (rv[1]) == 0 in parent 1: bz 2f ! yes, parent - ld [%sp], %l0 ! grab the function - ld [%sp+4], %o0 ! and the argument from the stack - add %sp, 8, %sp ! restore the stack + ld [%sp+CCFSZ-8], %l0 ! grab the function... call %l0 ! Call the clone's entry point. - nop + ld [%sp+CCFSZ-4], %o0 ! ...and the argument from the stack CALL(_C_LABEL(_exit)) /* NOTREACHED */