1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-15 10:17:20 +00:00

Make libc_r check the kern.usrstack sysctl instead of using internal

kernel #defines to figure out where the stack is located.  This stops
libc_r from exploding when the kernel is compiled with a different
KVM size.  IMHO this is all kinda bogus, it would be better to just
check %esp and work from that.
This commit is contained in:
Peter Wemm 2001-10-26 21:19:22 +00:00
parent 0b9272be42
commit eb9053b12f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=85567
9 changed files with 60 additions and 18 deletions

View File

@ -881,6 +881,13 @@ struct pthread {
* Global variables for the uthread kernel.
*/
SCLASS void *_usrstack
#ifdef GLOBAL_PTHREAD_PRIVATE
= (void *) USRSTACK;
#else
;
#endif
/* Kernel thread structure used when there are no running threads: */
SCLASS struct pthread _thread_kern_thread;

View File

@ -266,6 +266,12 @@ _thread_init(void)
memcpy((void *) &_thread_initial->attr, &pthread_attr_default,
sizeof(struct pthread_attr));
/* Find the stack top */
mib[0] = CTL_KERN;
mib[1] = KERN_USRSTACK;
len = sizeof (int);
if (sysctl(mib, 2, &_usrstack, &len, NULL, 0) == -1)
_usrstack = USRSTACK;
/*
* Create a red zone below the main stack. All other stacks are
* constrained to a maximum size by the paramters passed to
@ -273,14 +279,13 @@ _thread_init(void)
* this stack needs an explicitly mapped red zone to protect the
* thread stack that is just beyond.
*/
if (mmap((void *) USRSTACK - PTHREAD_STACK_INITIAL -
if (mmap(_usrstack - PTHREAD_STACK_INITIAL -
PTHREAD_GUARD_DEFAULT, PTHREAD_GUARD_DEFAULT, 0, MAP_ANON,
-1, 0) == MAP_FAILED)
PANIC("Cannot allocate red zone for initial thread");
/* Set the main thread stack pointer. */
_thread_initial->stack = (void *) USRSTACK -
PTHREAD_STACK_INITIAL;
_thread_initial->stack = _usrstack - PTHREAD_STACK_INITIAL;
/* Set the stack attributes: */
_thread_initial->attr.stackaddr_attr = _thread_initial->stack;

View File

@ -112,8 +112,7 @@ static LIST_HEAD(, stack) _mstackq = LIST_HEAD_INITIALIZER(_mstackq);
* high memory
*
*/
static void * last_stack = (void *) USRSTACK - PTHREAD_STACK_INITIAL
- PTHREAD_GUARD_DEFAULT;
static void * last_stack;
void *
_thread_stack_alloc(size_t stacksize, size_t guardsize)
@ -186,8 +185,11 @@ _thread_stack_alloc(size_t stacksize, size_t guardsize)
/* Check if a stack was not allocated from a stack cache: */
if (stack == NULL) {
/* Allocate a new stack. */
if (last_stack == NULL)
last_stack = _usrstack - PTHREAD_STACK_INITIAL -
PTHREAD_GUARD_DEFAULT;
/* Allocate a new stack. */
stack = last_stack - stack_size;
/*

View File

@ -266,6 +266,12 @@ _thread_init(void)
memcpy((void *) &_thread_initial->attr, &pthread_attr_default,
sizeof(struct pthread_attr));
/* Find the stack top */
mib[0] = CTL_KERN;
mib[1] = KERN_USRSTACK;
len = sizeof (int);
if (sysctl(mib, 2, &_usrstack, &len, NULL, 0) == -1)
_usrstack = USRSTACK;
/*
* Create a red zone below the main stack. All other stacks are
* constrained to a maximum size by the paramters passed to
@ -273,14 +279,13 @@ _thread_init(void)
* this stack needs an explicitly mapped red zone to protect the
* thread stack that is just beyond.
*/
if (mmap((void *) USRSTACK - PTHREAD_STACK_INITIAL -
if (mmap(_usrstack - PTHREAD_STACK_INITIAL -
PTHREAD_GUARD_DEFAULT, PTHREAD_GUARD_DEFAULT, 0, MAP_ANON,
-1, 0) == MAP_FAILED)
PANIC("Cannot allocate red zone for initial thread");
/* Set the main thread stack pointer. */
_thread_initial->stack = (void *) USRSTACK -
PTHREAD_STACK_INITIAL;
_thread_initial->stack = _usrstack - PTHREAD_STACK_INITIAL;
/* Set the stack attributes: */
_thread_initial->attr.stackaddr_attr = _thread_initial->stack;

View File

@ -881,6 +881,13 @@ struct pthread {
* Global variables for the uthread kernel.
*/
SCLASS void *_usrstack
#ifdef GLOBAL_PTHREAD_PRIVATE
= (void *) USRSTACK;
#else
;
#endif
/* Kernel thread structure used when there are no running threads: */
SCLASS struct pthread _thread_kern_thread;

View File

@ -112,8 +112,7 @@ static LIST_HEAD(, stack) _mstackq = LIST_HEAD_INITIALIZER(_mstackq);
* high memory
*
*/
static void * last_stack = (void *) USRSTACK - PTHREAD_STACK_INITIAL
- PTHREAD_GUARD_DEFAULT;
static void * last_stack;
void *
_thread_stack_alloc(size_t stacksize, size_t guardsize)
@ -186,8 +185,11 @@ _thread_stack_alloc(size_t stacksize, size_t guardsize)
/* Check if a stack was not allocated from a stack cache: */
if (stack == NULL) {
/* Allocate a new stack. */
if (last_stack == NULL)
last_stack = _usrstack - PTHREAD_STACK_INITIAL -
PTHREAD_GUARD_DEFAULT;
/* Allocate a new stack. */
stack = last_stack - stack_size;
/*

View File

@ -266,6 +266,12 @@ _thread_init(void)
memcpy((void *) &_thread_initial->attr, &pthread_attr_default,
sizeof(struct pthread_attr));
/* Find the stack top */
mib[0] = CTL_KERN;
mib[1] = KERN_USRSTACK;
len = sizeof (int);
if (sysctl(mib, 2, &_usrstack, &len, NULL, 0) == -1)
_usrstack = USRSTACK;
/*
* Create a red zone below the main stack. All other stacks are
* constrained to a maximum size by the paramters passed to
@ -273,14 +279,13 @@ _thread_init(void)
* this stack needs an explicitly mapped red zone to protect the
* thread stack that is just beyond.
*/
if (mmap((void *) USRSTACK - PTHREAD_STACK_INITIAL -
if (mmap(_usrstack - PTHREAD_STACK_INITIAL -
PTHREAD_GUARD_DEFAULT, PTHREAD_GUARD_DEFAULT, 0, MAP_ANON,
-1, 0) == MAP_FAILED)
PANIC("Cannot allocate red zone for initial thread");
/* Set the main thread stack pointer. */
_thread_initial->stack = (void *) USRSTACK -
PTHREAD_STACK_INITIAL;
_thread_initial->stack = _usrstack - PTHREAD_STACK_INITIAL;
/* Set the stack attributes: */
_thread_initial->attr.stackaddr_attr = _thread_initial->stack;

View File

@ -881,6 +881,13 @@ struct pthread {
* Global variables for the uthread kernel.
*/
SCLASS void *_usrstack
#ifdef GLOBAL_PTHREAD_PRIVATE
= (void *) USRSTACK;
#else
;
#endif
/* Kernel thread structure used when there are no running threads: */
SCLASS struct pthread _thread_kern_thread;

View File

@ -112,8 +112,7 @@ static LIST_HEAD(, stack) _mstackq = LIST_HEAD_INITIALIZER(_mstackq);
* high memory
*
*/
static void * last_stack = (void *) USRSTACK - PTHREAD_STACK_INITIAL
- PTHREAD_GUARD_DEFAULT;
static void * last_stack;
void *
_thread_stack_alloc(size_t stacksize, size_t guardsize)
@ -186,8 +185,11 @@ _thread_stack_alloc(size_t stacksize, size_t guardsize)
/* Check if a stack was not allocated from a stack cache: */
if (stack == NULL) {
/* Allocate a new stack. */
if (last_stack == NULL)
last_stack = _usrstack - PTHREAD_STACK_INITIAL -
PTHREAD_GUARD_DEFAULT;
/* Allocate a new stack. */
stack = last_stack - stack_size;
/*