diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c index f2a66c406e85..82bde10a153e 100644 --- a/lib/libthr/thread/thr_init.c +++ b/lib/libthr/thread/thr_init.c @@ -61,7 +61,7 @@ __FBSDID("$FreeBSD$"); #include "libc_private.h" #include "thr_private.h" -char *_stacktop; +char *_usrstack; struct pthread *_thr_initial; int _libthr_debug; int _thread_event_mask; @@ -388,7 +388,7 @@ init_main_thread(struct pthread *thread) * resource limits, so this stack needs an explicitly mapped * red zone to protect the thread stack that is just beyond. */ - if (mmap(_stacktop - _thr_stack_initial - + if (mmap(_usrstack - _thr_stack_initial - _thr_guard_default, _thr_guard_default, 0, MAP_ANON, -1, 0) == MAP_FAILED) PANIC("Cannot allocate red zone for initial thread"); @@ -402,7 +402,7 @@ init_main_thread(struct pthread *thread) * actually free() it; it just puts it in the free * stack queue for later reuse. */ - thread->attr.stackaddr_attr = _stacktop - _thr_stack_initial; + thread->attr.stackaddr_attr = _usrstack - _thr_stack_initial; thread->attr.stacksize_attr = _thr_stack_initial; thread->attr.guardsize_attr = _thr_guard_default; thread->attr.flags |= THR_STACK_USER; @@ -427,7 +427,7 @@ init_main_thread(struct pthread *thread) thread->attr.prio = sched_param.sched_priority; #ifdef _PTHREAD_FORCED_UNWIND - thread->unwind_stackend = _stacktop; + thread->unwind_stackend = _usrstack; #endif /* Others cleared to zero by thr_alloc() */ @@ -464,13 +464,10 @@ init_private(void) __thr_malloc_init(); /* Find the stack top */ mib[0] = CTL_KERN; - mib[1] = KERN_STACKTOP; - len = sizeof (_stacktop); - if (sysctl(mib, 2, &_stacktop, &len, NULL, 0) == -1) { - mib[1] = KERN_USRSTACK; - if (sysctl(mib, 2, &_stacktop, &len, NULL, 0) == -1) - PANIC("Cannot get kern.usrstack from sysctl"); - } + mib[1] = KERN_USRSTACK; + len = sizeof (_usrstack); + if (sysctl(mib, 2, &_usrstack, &len, NULL, 0) == -1) + PANIC("Cannot get kern.usrstack from sysctl"); env_bigstack = getenv("LIBPTHREAD_BIGSTACK_MAIN"); env_splitstack = getenv("LIBPTHREAD_SPLITSTACK_MAIN"); if (env_bigstack != NULL || env_splitstack == NULL) { diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h index d6fb74bb4372..a5bbc5997d30 100644 --- a/lib/libthr/thread/thr_private.h +++ b/lib/libthr/thread/thr_private.h @@ -724,7 +724,7 @@ extern int __isthreaded; * Global variables for the pthread kernel. */ -extern char *_stacktop __hidden; +extern char *_usrstack __hidden; /* For debugger */ extern int _libthr_debug; diff --git a/lib/libthr/thread/thr_stack.c b/lib/libthr/thread/thr_stack.c index fe50bc76db5f..b08bafdd9417 100644 --- a/lib/libthr/thread/thr_stack.c +++ b/lib/libthr/thread/thr_stack.c @@ -149,20 +149,18 @@ singlethread_map_stacks_exec(void) { int mib[2]; struct rlimit rlim; - u_long stacktop; + u_long usrstack; size_t len; mib[0] = CTL_KERN; - mib[1] = KERN_STACKTOP; - len = sizeof(stacktop); - if (sysctl(mib, nitems(mib), &stacktop, &len, NULL, 0) == -1) { - mib[1] = KERN_USRSTACK; - if (sysctl(mib, nitems(mib), &stacktop, &len, NULL, 0) == -1) - return; - } + mib[1] = KERN_USRSTACK; + len = sizeof(usrstack); + if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), &usrstack, &len, NULL, 0) + == -1) + return; if (getrlimit(RLIMIT_STACK, &rlim) == -1) return; - mprotect((void *)(uintptr_t)(stacktop - rlim.rlim_cur), + mprotect((void *)(uintptr_t)(usrstack - rlim.rlim_cur), rlim.rlim_cur, _rtld_get_stack_prot()); } @@ -215,7 +213,7 @@ _thr_stack_alloc(struct pthread_attr *attr) /* * Use the garbage collector lock for synchronization of the - * spare stack lists and allocations from stacktop. + * spare stack lists and allocations from usrstack. */ THREAD_LIST_WRLOCK(curthread); /* @@ -251,11 +249,11 @@ _thr_stack_alloc(struct pthread_attr *attr) } else { /* - * Allocate a stack from or below stacktop, depending + * Allocate a stack from or below usrstack, depending * on the LIBPTHREAD_BIGSTACK_MAIN env variable. */ if (last_stack == NULL) - last_stack = _stacktop - _thr_stack_initial - + last_stack = _usrstack - _thr_stack_initial - _thr_guard_default; /* Allocate a new stack. */