X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbsd-os.c;h=1b1db92e3f72a37f2b04ba3aadfe3702b278eb65;hb=743831e679b673a5680a0afd8402911516bf50e2;hp=a1acc1e83168279916c9a279611f66ce31dae585;hpb=64eccd1724e5f1e638bfc574f7f376427ee3dcb1;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index a1acc1e..1b1db92 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -70,7 +70,11 @@ static void freebsd_init(); #include #include #include +#include #include +#ifdef LISP_FEATURE_X86 +#include +#endif static void openbsd_init(); #endif @@ -194,20 +198,9 @@ is_valid_lisp_addr(os_vm_address_t addr) */ void -memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context -#if defined(LISP_FEATURE_FREEBSD) && defined(LISP_FEATURE_X86_64) -/* FreeBSD/amd64 stores fault address only in undocumented 4th arg. */ - ,void *fault_addr -#endif - ) +memory_fault_handler(int signal, siginfo_t *siginfo, os_context_t *context) { - os_context_t *context = arch_os_get_context(&void_context); -#if defined(LISP_FEATURE_FREEBSD) && defined(LISP_FEATURE_X86_64) - /* KLUDGE: Store fault address into si_addr for compatibilities. */ - siginfo->si_addr = fault_addr; -#else void *fault_addr = arch_get_bad_addr(signal, siginfo, context); -#endif #if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT) FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in memory_fault_handler\n", @@ -224,7 +217,8 @@ memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context #if defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) void -mach_error_memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context) { +mach_error_memory_fault_handler(int signal, siginfo_t *siginfo, + os_context_t *context) { lose("Unhandled memory fault. Exiting."); } #endif @@ -254,9 +248,8 @@ os_install_interrupt_handlers(void) #else /* Currently PPC/Darwin/Cheney only */ static void -sigsegv_handler(int signal, siginfo_t *info, void* void_context) +sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) { - os_context_t *context = arch_os_get_context(&void_context); #if 0 unsigned int pc = (unsigned int *)(*os_context_pc_addr(context)); #endif @@ -390,7 +383,8 @@ static void freebsd_init() #endif /* LISP_FEATURE_X86 */ } -#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX) +#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX) \ + && !defined(LISP_FEATURE_SB_LUTEX) int futex_wait(int *lock_word, long oldval, long sec, unsigned long usec) { @@ -434,7 +428,7 @@ futex_wake(int *lock_word, int n) #endif char * -os_get_runtime_executable_path() +os_get_runtime_executable_path(int external) { char path[PATH_MAX + 1]; @@ -462,35 +456,56 @@ os_get_runtime_executable_path() } #elif defined(LISP_FEATURE_NETBSD) || defined(LISP_FEATURE_OPENBSD) char * -os_get_runtime_executable_path() +os_get_runtime_executable_path(int external) { struct stat sb; - char *path = strdup("/proc/curproc/file"); - if (path && ((stat(path, &sb)) == 0)) - return path; - else { - fprintf(stderr, "Couldn't stat /proc/curproc/file; is /proc mounted?\n"); - return NULL; - } + if (!external && stat("/proc/curproc/file", &sb) == 0) + return copied_string("/proc/curproc/file"); + return NULL; } #else /* Not DARWIN or FREEBSD or NETBSD or OPENBSD */ char * -os_get_runtime_executable_path() +os_get_runtime_executable_path(int external) { return NULL; } #endif #ifdef __OpenBSD__ + +int openbsd_use_fxsave = 0; + void openbsd_init() { +#ifdef LISP_FEATURE_X86 + int mib[2]; + size_t size; +#endif + /* + * Show a warning if it looks like the memory available after + * allocating the spaces won't be at least this much. + */ +#ifdef LISP_FEATURE_X86_64 + const int wantfree = 64 * 1024 * 1024; +#else + const int wantfree = 32 * 1024 * 1024; +#endif struct rlimit rl; +#ifdef LISP_FEATURE_X86 + /* Save the machdep.osfxsr sysctl for use by os_restore_fp_control() */ + mib[0] = CTL_MACHDEP; + mib[1] = CPU_OSFXSR; + size = sizeof (openbsd_use_fxsave); + sysctl(mib, 2, &openbsd_use_fxsave, &size, NULL, 0); +#endif + /* OpenBSD, like NetBSD, counts mmap()ed space against the * process's data size limit. If the soft limit is lower than the * hard limit then try to yank it up, this lets users in the - * "staff" login class run sbcl with a default /etc/login.conf + * "staff" or "daemon" login classes run sbcl with larger dynamic + * space sizes. */ getrlimit (RLIMIT_DATA, &rl); if (rl.rlim_cur < rl.rlim_max) { @@ -504,18 +519,17 @@ The system may fail to start.\n", } } - /* Display a (hopefully) helpful warning if it looks like we won't - * be able to allocate enough memory. In testing I found that on - * my system at least, a minimum of 25M on top of the three space - * sizes was needed to start SBCL. Show a warning below 32M so as - * to leave a little breathing room. + /* + * Display a (hopefully) helpful warning if it looks like we won't + * be able to allocate enough memory. */ getrlimit (RLIMIT_DATA, &rl); if (dynamic_space_size + READ_ONLY_SPACE_SIZE + STATIC_SPACE_SIZE + - LINKAGE_TABLE_SPACE_SIZE + (32*1024*1024) > rl.rlim_cur) + LINKAGE_TABLE_SPACE_SIZE + wantfree > rl.rlim_cur) fprintf (stderr, "RUNTIME WARNING: data size resource limit may be too low,\n" - " try decreasing the dynamic space size with --dynamic-space-size\n"); + " try decreasing the dynamic space size with --dynamic-space-size\n" + " or raising the datasize or datasize-max limits in /etc/login.conf\n"); } /* OpenBSD's dlsym() relies on the gcc bulitin