comparison src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp @ 12996:d70a665e25d7

8020753: JNI_CreateJavaVM on Mac OSX 10.9 Mavericks corrupts the callers stack size Summary: Use hard-coded DEFAULT_MAIN_THREAD_STACK_PAGES = 2048 for 10.9 Reviewed-by: dcubed, iveresov Contributed-by: gerard.ziemski@oracle.com
author iklam
date Thu, 24 Oct 2013 22:19:48 -0700
parents e16282db4946
children de6a9e811145
comparison
equal deleted inserted replaced
12995:e64f1fe9756b 12996:d70a665e25d7
75 # include <ucontext.h> 75 # include <ucontext.h>
76 #endif 76 #endif
77 77
78 #if !defined(__APPLE__) && !defined(__NetBSD__) 78 #if !defined(__APPLE__) && !defined(__NetBSD__)
79 # include <pthread_np.h> 79 # include <pthread_np.h>
80 #endif
81
82 // needed by current_stack_region() workaround for Mavericks
83 #if defined(__APPLE__)
84 # include <errno.h>
85 # include <sys/types.h>
86 # include <sys/sysctl.h>
87 # define DEFAULT_MAIN_THREAD_STACK_PAGES 2048
88 # define OS_X_10_9_0_KERNEL_MAJOR_VERSION 13
80 #endif 89 #endif
81 90
82 #ifdef AMD64 91 #ifdef AMD64
83 #define SPELL_REG_SP "rsp" 92 #define SPELL_REG_SP "rsp"
84 #define SPELL_REG_FP "rbp" 93 #define SPELL_REG_FP "rbp"
826 static void current_stack_region(address * bottom, size_t * size) { 835 static void current_stack_region(address * bottom, size_t * size) {
827 #ifdef __APPLE__ 836 #ifdef __APPLE__
828 pthread_t self = pthread_self(); 837 pthread_t self = pthread_self();
829 void *stacktop = pthread_get_stackaddr_np(self); 838 void *stacktop = pthread_get_stackaddr_np(self);
830 *size = pthread_get_stacksize_np(self); 839 *size = pthread_get_stacksize_np(self);
840 // workaround for OS X 10.9.0 (Mavericks)
841 // pthread_get_stacksize_np returns 128 pages even though the actual size is 2048 pages
842 if (pthread_main_np() == 1) {
843 if ((*size) < (DEFAULT_MAIN_THREAD_STACK_PAGES * (size_t)getpagesize())) {
844 char kern_osrelease[256];
845 size_t kern_osrelease_size = sizeof(kern_osrelease);
846 int ret = sysctlbyname("kern.osrelease", kern_osrelease, &kern_osrelease_size, NULL, 0);
847 if (ret == 0) {
848 // get the major number, atoi will ignore the minor amd micro portions of the version string
849 if (atoi(kern_osrelease) >= OS_X_10_9_0_KERNEL_MAJOR_VERSION) {
850 *size = (DEFAULT_MAIN_THREAD_STACK_PAGES*getpagesize());
851 }
852 }
853 }
854 }
831 *bottom = (address) stacktop - *size; 855 *bottom = (address) stacktop - *size;
832 #elif defined(__OpenBSD__) 856 #elif defined(__OpenBSD__)
833 stack_t ss; 857 stack_t ss;
834 int rslt = pthread_stackseg_np(pthread_self(), &ss); 858 int rslt = pthread_stackseg_np(pthread_self(), &ss);
835 859