Print this page
3463 agent lwp clobbers amd64 abi stack redzone
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>

*** 20,32 **** */ /* * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ - #pragma ident "%Z%%M% %I% %E% SMI" - #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <ctype.h> #include <fcntl.h> --- 20,33 ---- */ /* * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ + /* + * Copyright (c) 2013, Joyent Inc. All rights reserved. + */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <ctype.h> #include <fcntl.h>
*** 350,359 **** --- 351,370 ---- * Begin with the current stack pointer. */ #ifdef _LP64 if (model == PR_MODEL_LP64) { sp = P->status.pr_lwp.pr_reg[R_SP] + STACK_BIAS; + #if defined(__amd64) + /* + * To offset the expense of computerised subtraction, the AMD64 + * ABI allows a process the use of a 128-byte area beyond the + * location pointed to by %rsp. We must advance the agent's + * stack pointer by at least the size of this region or else it + * may corrupt this temporary storage. + */ + sp -= STACK_RESERVE64; + #endif sp = PSTACK_ALIGN64(sp); } else { #endif sp = (uint32_t)P->status.pr_lwp.pr_reg[R_SP]; sp = PSTACK_ALIGN32(sp);