From f3e5780e38f42eaa3be318564c0def6f658f48be Mon Sep 17 00:00:00 2001 From: cshapiro <cshapiro> Date: Sun, 15 Jul 2007 09:24:57 +0000 Subject: [PATCH] Use POSIX signals on FreeBSD. --- lisp/FreeBSD-os.c | 57 +++++++++++++++++++++++---------------------- lisp/FreeBSD-os.h | 18 ++++++-------- lisp/interrupt.c | 10 ++++---- lisp/x86-arch.c | 6 ++--- lisp/x86-lispregs.h | 6 ++--- 5 files changed, 47 insertions(+), 50 deletions(-) diff --git a/lisp/FreeBSD-os.c b/lisp/FreeBSD-os.c index 27bc76d04..5007df7b0 100644 --- a/lisp/FreeBSD-os.c +++ b/lisp/FreeBSD-os.c @@ -12,7 +12,7 @@ * Much hacked by Paul Werkowski * GENCGC support by Douglas Crosher, 1996, 1997. * - * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.c,v 1.15 2007/06/12 03:21:46 cshapiro Exp $ + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.c,v 1.16 2007/07/15 09:24:57 cshapiro Exp $ * */ @@ -53,25 +53,25 @@ os_init(void) } int * -sc_reg(struct sigcontext *c, int offset) +sc_reg(ucontext_t *context, int offset) { switch (offset) { case 0: - return &c->sc_eax; + return &context->uc_mcontext.mc_eax; case 2: - return &c->sc_ecx; + return &context->uc_mcontext.mc_ecx; case 4: - return &c->sc_edx; + return &context->uc_mcontext.mc_edx; case 6: - return &c->sc_ebx; + return &context->uc_mcontext.mc_ebx; case 8: - return &c->sc_esp; + return &context->uc_mcontext.mc_esp; case 10: - return &c->sc_ebp; + return &context->uc_mcontext.mc_ebp; case 12: - return &c->sc_esi; + return &context->uc_mcontext.mc_esi; case 14: - return &c->sc_edi; + return &context->uc_mcontext.mc_edi; } return (int *) 0; @@ -169,43 +169,44 @@ boolean valid_addr(os_vm_address_t addr) static void -sigbus_handler(int signal, int code, struct sigcontext *context, - void *fault_addr) +sigbus_handler(int signal, siginfo_t *info, ucontext_t *context) { int page_index; #ifdef RED_ZONE_HIT - if (os_control_stack_overflow(fault_addr, context)) + if (os_control_stack_overflow(info->si_addr, context)) return; #endif #if defined GENCGC - page_index = find_page_index(fault_addr); + if (info->si_code == BUS_PAGE_FAULT) { + page_index = find_page_index(info->si_addr); - /* Check if the fault is within the dynamic space. */ - if (page_index != -1) { - /* Un-protect the page */ + /* Check if the fault is within the dynamic space. */ + if (page_index != -1) { + /* Un-protect the page */ - /* The page should have been marked write protected */ - if (!PAGE_WRITE_PROTECTED(page_index)) - fprintf(stderr, - "*** Sigbus in page not marked as write protected\n"); + /* The page should have been marked write protected */ + if (!PAGE_WRITE_PROTECTED(page_index)) + fprintf(stderr, + "*** Sigbus in page not marked as write protected\n"); - os_protect(page_address(page_index), 4096, OS_VM_PROT_ALL); - page_table[page_index].flags &= ~PAGE_WRITE_PROTECTED_MASK; - page_table[page_index].flags |= PAGE_WRITE_PROTECT_CLEARED_MASK; + os_protect(page_address(page_index), 4096, OS_VM_PROT_ALL); + page_table[page_index].flags &= ~PAGE_WRITE_PROTECTED_MASK; + page_table[page_index].flags |= PAGE_WRITE_PROTECT_CLEARED_MASK; - return; + return; + } } #endif /* GENCGC */ - interrupt_handle_now(signal, code, context); + interrupt_handle_now(signal, info, context); } static void -sigsegv_handler(int signal, int code, struct sigcontext *context) +sigsegv_handler(int signal, siginfo_t *info, ucontext_t *context) { - interrupt_handle_now(signal, code, context); + interrupt_handle_now(signal, info, context); } void diff --git a/lisp/FreeBSD-os.h b/lisp/FreeBSD-os.h index fa4706090..d89625263 100644 --- a/lisp/FreeBSD-os.h +++ b/lisp/FreeBSD-os.h @@ -1,6 +1,6 @@ /* - $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.h,v 1.16 2007/07/09 16:03:47 fgilham Exp $ + $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.h,v 1.17 2007/07/15 09:24:57 cshapiro Exp $ This code was written as part of the CMU Common Lisp project at Carnegie Mellon University, and has been placed in the public domain. @@ -19,13 +19,14 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> - +#include <ucontext.h> #include <libgen.h> typedef caddr_t os_vm_address_t; typedef vm_size_t os_vm_size_t; typedef off_t os_vm_offset_t; typedef int os_vm_prot_t; +#define os_context_t ucontext_t #define OS_VM_PROT_READ PROT_READ #define OS_VM_PROT_WRITE PROT_WRITE @@ -33,16 +34,11 @@ typedef int os_vm_prot_t; #define OS_VM_DEFAULT_PAGESIZE 4096 -int *sc_reg(struct sigcontext *, int); -void os_save_context(void); +#define HANDLER_ARGS int signal, siginfo_t *code, ucontext_t *context +#define CODE(code) ((code) ? code->si_code : 0) -/* If we used SA_SIGINFO in sigaction() the third argument to signal - handlers would be a struct ucontext_t. (The manpage for - sigaction(2) is wrong!) Sigcontext and ucontext_t are - "compatible", but access to registers in a ucontext_t goes through - the uc_mcontext field, so we just won't bother. */ -#define USE_SA_SIGINFO 0 -#define uc_sigmask sc_mask +int *sc_reg(ucontext_t *, int); +void os_save_context(void); #define PROTECTION_VIOLATION_SIGNAL SIGBUS diff --git a/lisp/interrupt.c b/lisp/interrupt.c index ecbaaea86..731595c16 100644 --- a/lisp/interrupt.c +++ b/lisp/interrupt.c @@ -1,4 +1,4 @@ -/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interrupt.c,v 1.47 2007/07/06 08:04:39 cshapiro Exp $ */ +/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interrupt.c,v 1.48 2007/07/15 09:24:57 cshapiro Exp $ */ /* Interrupt handling magic. */ @@ -32,7 +32,7 @@ void (*interrupt_low_level_handlers[NSIG]) (HANDLER_ARGS) = { static int pending_signal = 0; -#if defined(SOLARIS) || defined(__OpenBSD__) || defined(__NetBSD__) +#if defined(SOLARIS) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) static siginfo_t *pending_code; #define PASSCODE(code) ((code)) @@ -170,7 +170,7 @@ interrupt_internal_error(HANDLER_ARGS, boolean continuable) /* Allocate the SAP object while the interrupts are still disabled. */ if (internal_errors_enabled) -#if defined(DARWIN) && defined(__i386__) +#if (defined(DARWIN) || defined(__FreeBSD__)) && defined(__i386__) context_sap = alloc_sap(&context->uc_mcontext); #else context_sap = alloc_sap(context); @@ -227,7 +227,7 @@ interrupt_handle_pending(os_context_t * context) if (pending_signal) { int signal; -#if defined(SOLARIS) || defined(__OpenBSD__) || defined(__NetBSD__) +#if defined(SOLARIS) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) siginfo_t *code; #else int code; @@ -310,7 +310,7 @@ interrupt_handle_now(HANDLER_ARGS) else if (LowtagOf(handler.lisp) == type_FunctionPointer) { /* Allocate the SAP object while the interrupts are still disabled. */ -#if defined(DARWIN) && defined(__i386__) +#if (defined(DARWIN) || defined(__FreeBSD__)) && defined(__i386__) lispobj context_sap = alloc_sap(&context->uc_mcontext); #else lispobj context_sap = alloc_sap(context); diff --git a/lisp/x86-arch.c b/lisp/x86-arch.c index f18785fc2..04f346cbe 100644 --- a/lisp/x86-arch.c +++ b/lisp/x86-arch.c @@ -1,6 +1,6 @@ /* x86-arch.c -*- Mode: C; comment-column: 40 -*- * - * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-arch.c,v 1.26 2007/07/06 08:04:39 cshapiro Exp $ + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-arch.c,v 1.27 2007/07/15 09:24:57 cshapiro Exp $ * */ @@ -263,7 +263,7 @@ sigtrap_handler(HANDLER_ARGS) #ifdef __linux__ interrupt_internal_error(signal, contextstruct, code == trap_Cerror); #else - interrupt_internal_error(signal, code, context, code == trap_Cerror); + interrupt_internal_error(signal, code, context, CODE(code) == trap_Cerror); #endif break; @@ -301,7 +301,7 @@ sigtrap_handler(HANDLER_ARGS) #endif default: DPRINTF(0, - (stderr, "[C--trap default %d %d %p]\n", signal, code, + (stderr, "[C--trap default %d %d %p]\n", signal, CODE(code), context)); #ifdef __linux__ interrupt_handle_now(signal, contextstruct); diff --git a/lisp/x86-lispregs.h b/lisp/x86-lispregs.h index c28d7baf8..d3ec2bd53 100644 --- a/lisp/x86-lispregs.h +++ b/lisp/x86-lispregs.h @@ -1,5 +1,5 @@ /* x86-lispregs.h -*- Mode: C; -*- - * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-lispregs.h,v 1.6 2007/07/06 08:04:39 cshapiro Exp $ + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-lispregs.h,v 1.7 2007/07/15 09:24:57 cshapiro Exp $ */ #ifndef _X86_LISPREGS_H_ @@ -53,8 +53,8 @@ #define SC_PC(sc) ((sc)->uc_mcontext->ss.eip) #define SC_SP(sc) SC_REG(sc, reg_ESP) #else -#define SC_PC(sc) ((sc)->sc_eip) -#define SC_SP(sc) ((sc)->sc_esp) +#define SC_PC(sc) ((sc)->uc_mcontext.mc_eip) +#define SC_SP(sc) SC_REG(sc, reg_ESP) #endif #endif /* _X86_LISPREGS_H_ */ -- GitLab