#ifdef __FreeBSD__
#include <sys/sysctl.h>
+#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX)
+#include <sys/umtx.h>
+#endif
static void freebsd_init();
#endif /* __FreeBSD__ */
if (!maybe_gc(context)) {
interrupt_handle_now(signal, siginfo, context);
}
-#if defined(LISP_FEATURE_DARWIN)
- /* Work around G5 bug; fix courtesy gbyers */
- DARWIN_FIX_CONTEXT(context);
-#endif
#endif
}
}
(__siginfohandler_t *)
#endif
memory_fault_handler);
-#ifdef SIG_MEMORY_FAULT2
- undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT2,
-#ifdef LISP_FEATURE_FREEBSD
- (__siginfohandler_t *)
-#endif
- memory_fault_handler);
-#endif
#endif
#ifdef LISP_FEATURE_SB_THREAD
if (!cheneygc_handle_wp_violation(context, addr))
if (!handle_guard_page_triggered(context, addr))
interrupt_handle_now(signal, info, context);
- /* Work around G5 bug; fix courtesy gbyers */
- DARWIN_FIX_CONTEXT(context);
}
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 */
#endif /* __NetBSD__ */
#ifdef __FreeBSD__
+extern int getosreldate(void);
+
+int sig_memory_fault;
+
static void freebsd_init()
{
+ /* Memory fault signal on FreeBSD was changed from SIGBUS to
+ * SIGSEGV. */
+ if (getosreldate() < 700004)
+ sig_memory_fault = SIGBUS;
+ else
+ sig_memory_fault = SIGSEGV;
+
/* 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
* 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;
+ {
+ 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 */
}
+
+#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX)
+int
+futex_wait(int *lock_word, long oldval, long sec, unsigned long usec)
+{
+ struct timespec timeout;
+ int ret;
+
+again:
+ if (sec < 0)
+ ret = umtx_wait((void *)lock_word, oldval, NULL);
+ else {
+ timeout.tv_sec = sec;
+ timeout.tv_nsec = usec * 1000;
+ ret = umtx_wait((void *)lock_word, oldval, &timeout);
+ }
+
+ switch (ret) {
+ case 0:
+ return 0;
+ case ETIMEDOUT:
+ return 1;
+ case EINTR:
+ /* spurious wakeup from interrupt */
+ goto again;
+ default:
+ /* EWOULDBLOCK and others, need to check the lock */
+ return -1;
+ }
+}
+
+int
+futex_wake(int *lock_word, int n)
+{
+ return umtx_wake((void *)lock_word, n);
+}
+#endif
#endif /* __FreeBSD__ */
#ifdef LISP_FEATURE_DARWIN
#define KERN_PROC_PATHNAME 12
#endif
-extern int getosreldate(void);
-
char *
os_get_runtime_executable_path()
{