X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbsd-os.c;h=9b25e7b2467d9151d6308171fed77e003c2eb970;hb=baa0eaf21221dc564088c37b228c620c298aeaa1;hp=f41911df71b82b1e9eb266f8d33020dd94d5f645;hpb=2c6105acde389717317e725854d7dd3b3d6ece5c;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index f41911d..9b25e7b 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -51,6 +51,12 @@ os_vm_size_t os_vm_page_size; static void netbsd_init(); #endif /* __NetBSD__ */ +#ifdef __FreeBSD__ +#include + +static void freebsd_init(); +#endif /* __FreeBSD__ */ + void os_init(char *argv[], char *envp[]) { @@ -59,6 +65,9 @@ os_init(char *argv[], char *envp[]) #ifdef __NetBSD__ netbsd_init(); #endif /* __NetBSD__ */ +#ifdef __FreeBSD__ + freebsd_init(); +#endif /* __FreeBSD__ */ } int *os_context_pc_addr(os_context_t *context) @@ -126,7 +135,7 @@ os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len) if (addr == MAP_FAILED) { perror("mmap"); - lose("unexpected mmap(..) failure"); + lose("unexpected mmap(..) failure\n"); } return addr; @@ -204,6 +213,10 @@ os_install_interrupt_handlers(void) SHOW("os_install_interrupt_handlers()/bsd-os/defined(GENCGC)"); undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT, memory_fault_handler); +#ifdef SIG_MEMORY_FAULT2 + undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT2, + memory_fault_handler); +#endif SHOW("leaving os_install_interrupt_handlers()"); } @@ -230,6 +243,10 @@ os_install_interrupt_handlers(void) SHOW("os_install_interrupt_handlers()/bsd-os/!defined(GENCGC)"); undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT, sigsegv_handler); +#ifdef SIG_MEMORY_FAULT2 + undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT2, + sigsegv_handler); +#endif } #endif /* defined GENCGC */ @@ -271,6 +288,29 @@ The system may fail to start.\n", } } #endif /* __NetBSD__ */ + +#ifdef __FreeBSD__ +static void freebsd_init() +{ + /* Quote from sbcl-devel (NIIMI Satoshi): "Some OSes, like FreeBSD + * 4.x with GENERIC kernel, does not enable SSE support even on + * SSE capable CPUs". Detect this situation and skip the + * fast_bzero sse/base selection logic that's normally done in + * x86-assem.S. + */ +#ifdef LISP_FEATURE_X86 + size_t len; + int instruction_sse; + + len = sizeof(instruction_sse); + if (sysctlbyname("hw.instruction_sse", &instruction_sse, &len, NULL, 0) == 0 + && instruction_sse != 0) { + /* Use the SSE detector */ + fast_bzero_pointer = fast_bzero_detect; + } +#endif /* LISP_FEATURE_X86 */ +} +#endif /* __FreeBSD__ */ /* threads */ @@ -295,3 +335,11 @@ int arch_os_thread_cleanup(struct thread *thread) { return 1; /* success */ } #endif + +#ifndef LISP_FEATURE_DARWIN /* defined in ppc-darwin-os.c instead */ +char * +os_get_runtime_executable_path() +{ + return NULL; +} +#endif