X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fbsd-os.c;h=f9cf70c8b92ca088847f2d21a3647e4980d40c48;hb=5de74c72e5a9522c7fdd3dbb31a39641e9de8877;hp=9b496c375f013f2af2926e599b52ecb02461ebef;hpb=3a0f3612dc2bbf3e4e8e7395bcbbf8cd1791b963;p=sbcl.git diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 9b496c3..f9cf70c 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -53,6 +53,7 @@ static void netbsd_init(); #ifdef __FreeBSD__ #include +#include static void freebsd_init(); #endif /* __FreeBSD__ */ @@ -78,6 +79,8 @@ int *os_context_pc_addr(os_context_t *context) return CONTEXT_ADDR_FROM_STEM(pc); #elif defined __NetBSD__ return CONTEXT_ADDR_FROM_STEM(EIP); +#elif defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86) + return CONTEXT_ADDR_FROM_STEM(eip); #elif defined LISP_FEATURE_DARWIN return &context->uc_mcontext->ss.srr0; #else @@ -91,9 +94,9 @@ os_context_sigmask_addr(os_context_t *context) /* (Unlike most of the other context fields that we access, the * signal mask field is a field of the basic, outermost context * struct itself both in FreeBSD 4.0 and in OpenBSD 2.6.) */ -#if defined __FreeBSD__ || __NetBSD__ || defined LISP_FEATURE_DARWIN +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(LISP_FEATURE_DARWIN) return &context->uc_sigmask; -#elif defined __OpenBSD__ +#elif defined (__OpenBSD__) return &context->sc_mask; #else #error unsupported BSD variant @@ -191,6 +194,13 @@ memory_fault_handler(int signal, siginfo_t *siginfo, void *void_context) os_context_t *context = arch_os_get_context(&void_context); void *fault_addr = arch_get_bad_addr(signal, siginfo, context); +#if defined(MEMORY_FAULT_DEBUG) + fprintf(stderr, "Memory fault at: %p, PC: %x\n", fault_addr, *os_context_pc_addr(context)); +#if defined(ARCH_HAS_STACK_POINTER) + fprintf(stderr, "Stack pointer: %x\n", *os_context_sp_addr(context)); +#endif +#endif + if (!gencgc_handle_wp_violation(fault_addr)) if(!handle_guard_page_triggered(context,fault_addr)) { #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK @@ -339,35 +349,35 @@ int arch_os_thread_cleanup(struct thread *thread) { #ifdef LISP_FEATURE_DARWIN /* defined in ppc-darwin-os.c instead */ #elif defined(LISP_FEATURE_FREEBSD) +#ifndef KERN_PROC_PATHNAME +#define KERN_PROC_PATHNAME 12 +#endif + char * os_get_runtime_executable_path() { char path[PATH_MAX + 1]; - /* Defined on FreeBSD 6 and later. -- JES, 2006-02-06. */ -#ifdef KERN_PROC_PATHNAME - size_t len = PATH_MAX + 1; - int mib[4]; - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PATHNAME; - mib[3] = -1; - if (sysctl(mib, 4, &path, &len, NULL, 0) != 0) - /* FIXME: Should we rather fall back into the /proc/-based - * code below, so that an SBCL executable core made on - * FreeBSD 6 would have at least some chance of working on - * FreeBSD 4? -- JES, 2006-02-06. - */ - return NULL; -#else - int size; - size = readlink("/proc/curproc/file", path, sizeof(path) - 1); - if (size < 0) - return NULL; - path[size] = '\0'; + if (getosreldate() >= 600024) { + /* KERN_PROC_PATHNAME is available */ + size_t len = PATH_MAX + 1; + int mib[4]; + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PATHNAME; + mib[3] = -1; + if (sysctl(mib, 4, &path, &len, NULL, 0) != 0) + return NULL; + } else { + int size; + size = readlink("/proc/curproc/file", path, sizeof(path) - 1); + if (size < 0) + return NULL; + path[size] = '\0'; + } if (strcmp(path, "unknown") == 0) return NULL; -#endif return copied_string(path); } #else /* Not DARWIN or FREEBSD */