X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fsunos-os.c;h=3bd9f45d93ab757cc85be137614a7d89b59543fc;hb=ccc6c35c6d30b2c600c1388052b36f3a7dc08361;hp=2501edd1359b41a852a63cf4cfc8289ea3c71629;hpb=79cc569a97e444389350ea3f5b1017374fe16bec;p=sbcl.git diff --git a/src/runtime/sunos-os.c b/src/runtime/sunos-os.c index 2501edd..3bd9f45 100644 --- a/src/runtime/sunos-os.c +++ b/src/runtime/sunos-os.c @@ -17,7 +17,22 @@ #include "validate.h" #include "target-arch-os.h" +#ifdef LISP_FEATURE_X86 +#include "genesis/static-symbols.h" +#include "genesis/fdefn.h" +#endif + +#ifdef LISP_FEATURE_GENCGC +#include "gencgc-internal.h" +#endif + +#if defined LISP_FEATURE_SPARC #define OS_VM_DEFAULT_PAGESIZE 8192 +#elif defined LISP_FEATURE_X86 +#define OS_VM_DEFAULT_PAGESIZE 4096 +#else +#error "Don't know OS_VM_DEFAULT_PAGESIZE" +#endif long os_vm_page_size=(-1); static long os_real_page_size=(-1); @@ -38,7 +53,8 @@ static os_vm_size_t real_page_size_difference=0; int KLUDGE_MAYBE_MAP_ANON = 0x0; int kludge_mmap_fd = -1; /* default for MAP_ANON */ -void os_init(void) +void +os_init(char *argv[], char *envp[]) { struct utsname name; int major_version; @@ -161,8 +177,13 @@ boolean is_valid_lisp_addr(os_vm_address_t addr) struct thread *th; if(in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE) || in_range_p(addr, STATIC_SPACE_START , STATIC_SPACE_SIZE) || +#ifdef LISP_FEATURE_GENCGC + in_range_p(addr, DYNAMIC_SPACE_START, DYNAMIC_SPACE_SIZE) +#else in_range_p(addr, DYNAMIC_0_SPACE_START, DYNAMIC_SPACE_SIZE) || - in_range_p(addr, DYNAMIC_1_SPACE_START, DYNAMIC_SPACE_SIZE)) + in_range_p(addr, DYNAMIC_1_SPACE_START, DYNAMIC_SPACE_SIZE) +#endif + ) return 1; for_each_thread(th) { if((th->control_stack_start <= addr) && (addr < th->control_stack_end)) @@ -174,6 +195,30 @@ boolean is_valid_lisp_addr(os_vm_address_t addr) } +#if defined LISP_FEATURE_GENCGC + +void +sigsegv_handler(int signal, siginfo_t *info, void* void_context) +{ + os_context_t *context = arch_os_get_context(&void_context); + void* fault_addr = (void*)info->si_addr; + if(info->si_code == 1) + { + perror("error: SEGV_MAPERR\n"); + exit(1); + } + + if (!gencgc_handle_wp_violation(fault_addr)) + if(!handle_guard_page_triggered(context, fault_addr)) +#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK + arrange_return_to_lisp_function(context, + SymbolFunction(MEMORY_FAULT_ERROR)); +#else + interrupt_handle_now(signal, info, context); +#endif +} + +#else static void sigsegv_handler(int signal, siginfo_t *info, void* void_context) @@ -188,6 +233,8 @@ sigsegv_handler(int signal, siginfo_t *info, void* void_context) } } +#endif + void os_install_interrupt_handlers() {