From 3a9ad7746b6f53f68dbdc55493baf7528b524422 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 15 Oct 2013 08:41:41 -0600 Subject: [PATCH] OpenBSD: another approach to finding stack bounds OpenBSD provides pthread_stackseg_np(), which directly reports the stack-bounds information that Racket needs, so we can use that instead of the approach used on other Unix variants. The approach used for other Unix variants seems not to work for OpenBSD because the stack location at the point that main() is called is already significantly far from the stack base (on the order of 100k on a 32-bit system in my test using OpenBSD 5.2). --- racket/src/racket/sconfig.h | 9 ++++----- racket/src/racket/src/eval.c | 22 +++++++++++++++++----- racket/src/racket/src/module.c | 4 ++-- racket/src/racket/src/mzstkchk.h | 2 +- racket/src/racket/src/schpriv.h | 2 +- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/racket/src/racket/sconfig.h b/racket/src/racket/sconfig.h index 898fab8c5a..3abd64aa20 100644 --- a/racket/src/racket/sconfig.h +++ b/racket/src/racket/sconfig.h @@ -322,15 +322,12 @@ # endif # include -# if OpenBSD < 201211 -/* This is needed for (pre-5.2) userspace threads: */ -# define ASSUME_FIXED_STACK_SIZE -# define FIXED_STACK_SIZE 1048576 -# endif # include "uconfig.h" # undef HAS_STANDARD_IOB # define HAS_BSD_IOB +# undef UNIX_FIND_STACK_BOUNDS +# define PTHREAD_STACKSEG_FIND_STACK_BOUNDS /* Default UNIX_STACK_MAXIMUM is too big for a non-root user. */ # undef UNIX_STACK_MAXIMUM @@ -1515,6 +1512,8 @@ line. ASSUME_FIXED_STACK_SIZE assumes that the main stack size is always FIXED_STACK_SIZE. + PTHREAD_STACKSEG_FIND_STACK_BOUNDS finds stack bounds using + pthread_stackseg_np(). Use only one of these if DO_STACK_CHECK is used, or none otherwise. */ /* FIXED_STACK_SIZE sets the stack size to when the diff --git a/racket/src/racket/src/eval.c b/racket/src/racket/src/eval.c index 02719e9705..2ab4aea549 100644 --- a/racket/src/racket/src/eval.c +++ b/racket/src/racket/src/eval.c @@ -144,6 +144,11 @@ #include #include #endif +#ifdef PTHREAD_STACKSEG_FIND_STACK_BOUNDS +# include +# include +# include +#endif #ifdef WINDOWS_FIND_STACK_BOUNDS #include #endif @@ -595,9 +600,6 @@ void scheme_init_stack_check() { int *v, stack_grows_up; uintptr_t deeper; -#ifdef UNIX_FIND_STACK_BOUNDS - struct rlimit rl; -#endif deeper = scheme_get_deeper_address(); stack_grows_up = (deeper > (uintptr_t)&v); @@ -665,12 +667,14 @@ void scheme_init_stack_check() # endif # ifdef UNIX_FIND_STACK_BOUNDS - getrlimit(RLIMIT_STACK, &rl); - { + struct rlimit rl; uintptr_t bnd, lim; + bnd = (uintptr_t)scheme_get_current_os_thread_stack_base(); + getrlimit(RLIMIT_STACK, &rl); + # ifdef LINUX_FIND_STACK_BASE bnd = adjust_stack_base(bnd); # endif @@ -689,6 +693,14 @@ void scheme_init_stack_check() scheme_stack_boundary = bnd; } # endif + +# ifdef PTHREAD_STACKSEG_FIND_STACK_BOUNDS + { + stack_t stack; + pthread_stackseg_np(pthread_self(), &stack); + scheme_stack_boundary = (uintptr_t)((char *)stack.ss_sp - (stack.ss_size - STACK_SAFETY_MARGIN)); + } +# endif } #endif diff --git a/racket/src/racket/src/module.c b/racket/src/racket/src/module.c index 23376b12eb..9c27d20790 100644 --- a/racket/src/racket/src/module.c +++ b/racket/src/racket/src/module.c @@ -28,7 +28,7 @@ #include "schmach.h" #include "schexpobs.h" -#define MIN(l,o) ((l) < (o) ? (l) : (o)) +#define mz_MIN(l,o) ((l) < (o) ? (l) : (o)) /* globals */ SHARED_OK Scheme_Object *(*scheme_module_demand_hook)(int, Scheme_Object **); @@ -3673,7 +3673,7 @@ int scheme_resolved_module_path_value_matches(Scheme_Object *rmp, Scheme_Object else if (SCHEME_BYTE_STRINGP(rmp_val) && SCHEME_SYMBOLP(o)) { return !strncmp(SCHEME_BYTE_STR_VAL(rmp_val), SCHEME_SYM_VAL(o), - MIN(SCHEME_BYTE_STRLEN_VAL(rmp_val), SCHEME_SYM_LEN(o))); + mz_MIN(SCHEME_BYTE_STRLEN_VAL(rmp_val), SCHEME_SYM_LEN(o))); } else { scheme_arg_mismatch("scheme_resolved_module_path_value_matches", "internal error: unknown type of resolved_module_path_value", diff --git a/racket/src/racket/src/mzstkchk.h b/racket/src/racket/src/mzstkchk.h index fbe2fc6e36..402af226a8 100644 --- a/racket/src/racket/src/mzstkchk.h +++ b/racket/src/racket/src/mzstkchk.h @@ -21,7 +21,7 @@ # if defined(UNIX_FIND_STACK_BOUNDS) || defined(WINDOWS_FIND_STACK_BOUNDS) \ || defined(MACOS_FIND_STACK_BOUNDS) || defined(ASSUME_FIXED_STACK_SIZE) \ || defined(BEOS_FIND_STACK_BOUNDS) || defined(OSKIT_FIXED_STACK_BOUNDS) \ - || defined(PALM_FIND_STACK_BOUNDS) + || defined(PALM_FIND_STACK_BOUNDS) || defined(PTHREAD_STACKSEG_FIND_STACK_BOUNDS) uintptr_t _stk_pos; _stk_pos = (uintptr_t)&_stk_pos; diff --git a/racket/src/racket/src/schpriv.h b/racket/src/racket/src/schpriv.h index d2697c94e9..798147fad6 100644 --- a/racket/src/racket/src/schpriv.h +++ b/racket/src/racket/src/schpriv.h @@ -1705,7 +1705,7 @@ typedef struct Scheme_Overflow { #if defined(UNIX_FIND_STACK_BOUNDS) || defined(WINDOWS_FIND_STACK_BOUNDS) \ || defined(MACOS_FIND_STACK_BOUNDS) || defined(ASSUME_FIXED_STACK_SIZE) \ || defined(BEOS_FIND_STACK_BOUNDS) || defined(OSKIT_FIXED_STACK_BOUNDS) \ - || defined(PALM_FIND_STACK_BOUNDS) + || defined(PALM_FIND_STACK_BOUNDS) || defined(PTHREAD_STACKSEG_FIND_STACK_BOUNDS) # define USE_STACK_BOUNDARY_VAR THREAD_LOCAL_DECL(extern uintptr_t scheme_stack_boundary); /* Same as scheme_stack_boundary, but set to an extreme value when feul auto-expires,