diff options
author | peter <peter@FreeBSD.org> | 2001-10-26 21:19:22 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2001-10-26 21:19:22 +0000 |
commit | 14e9bfa8fe88e6350016240194199cefbd2c3d47 (patch) | |
tree | eecbcf12bbd3734f9d86b3bf3acdc1a2169fece3 /lib/libkse/thread/thr_init.c | |
parent | 6d1df6cd852ab6f870e101152652f0aaad76b1bc (diff) | |
download | FreeBSD-src-14e9bfa8fe88e6350016240194199cefbd2c3d47.zip FreeBSD-src-14e9bfa8fe88e6350016240194199cefbd2c3d47.tar.gz |
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.
Diffstat (limited to 'lib/libkse/thread/thr_init.c')
-rw-r--r-- | lib/libkse/thread/thr_init.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/libkse/thread/thr_init.c b/lib/libkse/thread/thr_init.c index 7bf09e5..30ec765 100644 --- a/lib/libkse/thread/thr_init.c +++ b/lib/libkse/thread/thr_init.c @@ -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; |