Despite official i386 ABI does not mandate any stack alignment besides
the word alignment, some versions of gcc do require 16-byte alignment. Make sure the stack is 16-byte aligned before calling a subroutine. Inspired by: PR amd64/162214 MFC after: 1 week
This commit is contained in:
parent
990d53343a
commit
1a9879c32a
@ -51,12 +51,19 @@ __FBSDID("$FreeBSD$");
|
||||
ENTRY(setjmp)
|
||||
movl 4(%esp),%ecx
|
||||
PIC_PROLOGUE
|
||||
#ifdef PIC
|
||||
subl $12,%esp /* make the stack 16-byte aligned */
|
||||
#endif
|
||||
leal 28(%ecx), %eax
|
||||
pushl %eax /* (sigset_t*)oset */
|
||||
pushl $0 /* (sigset_t*)set */
|
||||
pushl $1 /* SIG_BLOCK */
|
||||
call PIC_PLT(CNAME(_sigprocmask))
|
||||
#ifdef PIC
|
||||
addl $24,%esp
|
||||
#else
|
||||
addl $12,%esp
|
||||
#endif
|
||||
PIC_EPILOGUE
|
||||
movl 4(%esp),%ecx
|
||||
movl 0(%esp),%edx
|
||||
@ -76,12 +83,19 @@ END(setjmp)
|
||||
ENTRY(__longjmp)
|
||||
movl 4(%esp),%edx
|
||||
PIC_PROLOGUE
|
||||
#ifdef PIC
|
||||
subl $12,%esp /* make the stack 16-byte aligned */
|
||||
#endif
|
||||
pushl $0 /* (sigset_t*)oset */
|
||||
leal 28(%edx), %eax
|
||||
pushl %eax /* (sigset_t*)set */
|
||||
pushl $3 /* SIG_SETMASK */
|
||||
call PIC_PLT(CNAME(_sigprocmask))
|
||||
#ifdef PIC
|
||||
addl $24,%esp
|
||||
#else
|
||||
addl $12,%esp
|
||||
#endif
|
||||
PIC_EPILOGUE
|
||||
movl 4(%esp),%edx
|
||||
movl 8(%esp),%eax
|
||||
|
@ -60,12 +60,19 @@ ENTRY(sigsetjmp)
|
||||
testl %eax,%eax
|
||||
jz 2f
|
||||
PIC_PROLOGUE
|
||||
#ifdef PIC
|
||||
subl $12,%esp /* make the stack 16-byte aligned */
|
||||
#endif
|
||||
leal 28(%ecx), %eax
|
||||
pushl %eax /* (sigset_t*)oset */
|
||||
pushl $0 /* (sigset_t*)set */
|
||||
pushl $1 /* SIG_BLOCK */
|
||||
call PIC_PLT(CNAME(_sigprocmask))
|
||||
#ifdef PIC
|
||||
addl $24,%esp
|
||||
#else
|
||||
addl $12,%esp
|
||||
#endif
|
||||
PIC_EPILOGUE
|
||||
movl 4(%esp),%ecx
|
||||
2: movl 0(%esp),%edx
|
||||
@ -87,12 +94,19 @@ ENTRY(__siglongjmp)
|
||||
cmpl $0,44(%edx)
|
||||
jz 2f
|
||||
PIC_PROLOGUE
|
||||
#ifdef PIC
|
||||
subl $12,%esp /* make the stack 16-byte aligned */
|
||||
#endif
|
||||
pushl $0 /* (sigset_t*)oset */
|
||||
leal 28(%edx), %eax
|
||||
pushl %eax /* (sigset_t*)set */
|
||||
pushl $3 /* SIG_SETMASK */
|
||||
call PIC_PLT(CNAME(_sigprocmask))
|
||||
#ifdef PIC
|
||||
addl $24,%esp
|
||||
#else
|
||||
addl $12,%esp
|
||||
#endif
|
||||
PIC_EPILOGUE
|
||||
movl 4(%esp),%edx
|
||||
2: movl 8(%esp),%eax
|
||||
|
Loading…
x
Reference in New Issue
Block a user