aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniel Eischen <deischen@FreeBSD.org>2003-03-29 16:38:15 +0000
committerDaniel Eischen <deischen@FreeBSD.org>2003-03-29 16:38:15 +0000
commit67aba1c6a48e9a611ef4f2262ca1cca742cfcff1 (patch)
treebe90800fdebe1c1f5dc9bbc462cc3492b4350fad /lib
parente3a2085326c8be8925c5a87c127514c8a945c63d (diff)
downloadsrc-67aba1c6a48e9a611ef4f2262ca1cca742cfcff1.tar.gz
src-67aba1c6a48e9a611ef4f2262ca1cca742cfcff1.zip
Align signal frame placed on stack to 16 bytes so that SSE FPU register
restores can work. Also correct allocation for signal frame size. Reviewed by: mini
Notes
Notes: svn path=/head/; revision=112807
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/i386/gen/signalcontext.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/lib/libc/i386/gen/signalcontext.c b/lib/libc/i386/gen/signalcontext.c
index a66e2db16fc3..50c4889a0df5 100644
--- a/lib/libc/i386/gen/signalcontext.c
+++ b/lib/libc/i386/gen/signalcontext.c
@@ -56,7 +56,8 @@ __signalcontext(ucontext_t *ucp, int sig, __sighandler_t *func)
*/
p = (register_t *)(void *)(intptr_t)ucp->uc_mcontext.mc_esp;
*--p = (register_t)(intptr_t)ucp;
- p -= sizeof(struct sigframe);
+ p = (register_t *)((u_register_t)p & ~0xF); /* Align to 16 bytes. */
+ p = (register_t *)((u_register_t)p - sizeof(struct sigframe));
sfp = (struct sigframe *)p;
bzero(sfp, sizeof(struct sigframe));
sfp->sf_signum = sig;