For the amd64 we need to do some extra stack alignment fixups. Otherwise
we can end up with some threads with a non-16-byte-aligned stack. This causes some interesting side effects, including general protection faults leading to a SIGBUS when doing floating point or varargs. This should be just a verbose NOP for the other platforms. Approved by: re (scottl)
This commit is contained in:
parent
20109fa046
commit
29f2f145e4
@ -73,6 +73,9 @@ _pthread_create(pthread_t *thread, const pthread_attr_t *attr,
|
||||
pthread_t new_thread;
|
||||
pthread_attr_t pattr;
|
||||
void *stack;
|
||||
#if !defined(__ia64__)
|
||||
u_long stackp;
|
||||
#endif
|
||||
|
||||
if (thread == NULL)
|
||||
return(EINVAL);
|
||||
@ -145,10 +148,12 @@ _pthread_create(pthread_t *thread, const pthread_attr_t *attr,
|
||||
SET_RETURN_ADDR_JB(new_thread->ctx.jb, _thread_start);
|
||||
|
||||
#if !defined(__ia64__)
|
||||
stackp = (long)new_thread->stack + pattr->stacksize_attr - sizeof(double);
|
||||
#if defined(__amd64__)
|
||||
stackp &= ~0xFUL;
|
||||
#endif
|
||||
/* The stack starts high and builds down: */
|
||||
SET_STACK_JB(new_thread->ctx.jb,
|
||||
(long)new_thread->stack + pattr->stacksize_attr
|
||||
- sizeof(double));
|
||||
SET_STACK_JB(new_thread->ctx.jb, stackp);
|
||||
#else
|
||||
SET_STACK_JB(new_thread->ctx.jb,
|
||||
(long)new_thread->stack, pattr->stacksize_attr);
|
||||
|
@ -208,6 +208,9 @@ _thread_init(void)
|
||||
size_t len;
|
||||
int mib[2];
|
||||
int sched_stack_size; /* Size of scheduler stack. */
|
||||
#if !defined(__ia64__)
|
||||
u_long stackp;
|
||||
#endif
|
||||
|
||||
struct clockinfo clockinfo;
|
||||
struct sigaction act;
|
||||
@ -374,8 +377,11 @@ _thread_init(void)
|
||||
/* Setup the context for the scheduler: */
|
||||
_setjmp(_thread_kern_sched_jb);
|
||||
#if !defined(__ia64__)
|
||||
SET_STACK_JB(_thread_kern_sched_jb, _thread_kern_sched_stack +
|
||||
sched_stack_size - sizeof(double));
|
||||
stackp = (long)_thread_kern_sched_stack + sched_stack_size - sizeof(double);
|
||||
#if defined(__amd64__)
|
||||
stackp &= ~0xFUL;
|
||||
#endif
|
||||
SET_STACK_JB(_thread_kern_sched_jb, stackp);
|
||||
#else
|
||||
SET_STACK_JB(_thread_kern_sched_jb, _thread_kern_sched_stack,
|
||||
sched_stack_size);
|
||||
|
@ -1048,13 +1048,20 @@ thread_sigframe_add(struct pthread *thread, int sig, int has_args)
|
||||
* Leave a little space on the stack and round down to the
|
||||
* nearest aligned word:
|
||||
*/
|
||||
#if defined(__amd64__)
|
||||
stackp -= 128; /* Skip over 128 byte red-zone */
|
||||
#endif
|
||||
stackp -= sizeof(double);
|
||||
#if defined(__amd64__)
|
||||
stackp &= ~0xFUL;
|
||||
#else
|
||||
stackp &= ~0x3UL;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Allocate room on top of the stack for a new signal frame: */
|
||||
stackp -= sizeof(struct pthread_signal_frame);
|
||||
#if defined(__ia64__)
|
||||
#if defined(__ia64__) || defined(__amd64__)
|
||||
stackp &= ~0xFUL;
|
||||
#endif
|
||||
|
||||
@ -1087,6 +1094,9 @@ thread_sigframe_add(struct pthread *thread, int sig, int has_args)
|
||||
*/
|
||||
#if !defined(__ia64__)
|
||||
stackp -= sizeof(double);
|
||||
#if defined(__amd64__)
|
||||
stackp &= ~0xFUL;
|
||||
#endif
|
||||
#endif
|
||||
_setjmp(thread->ctx.jb);
|
||||
#if !defined(__ia64__)
|
||||
|
Loading…
x
Reference in New Issue
Block a user