X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fosf1-os.c;h=fc6a1f8a7d5e680d5a363a191a9654d258ac0659;hb=961c6bf2eda5d492d5dbb7e275fe4e0931f7adf8;hp=5dd0d46938d3c6025bce17a2eaa24860e7d108cc;hpb=34dcb46f78a01d543756703d7ccdf3d999a134d0;p=sbcl.git diff --git a/src/runtime/osf1-os.c b/src/runtime/osf1-os.c index 5dd0d46..fc6a1f8 100644 --- a/src/runtime/osf1-os.c +++ b/src/runtime/osf1-os.c @@ -4,9 +4,9 @@ * interface looks a lot like the Mach interface (but simpler in some * places). For some operating systems, a subset of these functions * will have to be emulated. - * + * * This is the OSF/1 version, based on the Linux version, itself based - * on the OSF1 version from CMUCL by Sean Hallgren. Now _there's_ + * on the OSF1 version from CMUCL by Sean Hallgren. Now _there's_ * a metacircularity for you ... */ @@ -24,6 +24,7 @@ #include #include #include +#include "sbcl.h" #include "./signal.h" #include "os.h" #include "arch.h" @@ -31,7 +32,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include "sbcl.h" #include #include #include @@ -51,9 +51,10 @@ size_t os_vm_page_size; -void os_init(void) +void +os_init(char *argv[], char *envp[]) { - os_vm_page_size = getpagesize(); + os_vm_page_size = BACKEND_PAGE_BYTES; } @@ -65,8 +66,8 @@ os_validate(os_vm_address_t addr, os_vm_size_t len) else flags |= MAP_VARIABLE; if((addr=mmap(addr,len,OS_VM_PROT_ALL,flags,-1,0)) == (os_vm_address_t) -1) - perror("mmap"); - + perror("mmap"); + return addr; } @@ -74,7 +75,7 @@ void os_invalidate(os_vm_address_t addr, os_vm_size_t len) { if (munmap(addr,len) == -1) { - perror("munmap"); + perror("munmap"); } } @@ -82,13 +83,13 @@ os_vm_address_t os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len) { addr = mmap(addr, len, - OS_VM_PROT_ALL, - MAP_PRIVATE | MAP_FILE | MAP_FIXED, - fd, (off_t) offset); + OS_VM_PROT_ALL, + MAP_PRIVATE | MAP_FILE | MAP_FIXED, + fd, (off_t) offset); if (addr == MAP_FAILED) { - perror("mmap"); - lose("unexpected mmap(..) failure"); + perror("mmap"); + lose("unexpected mmap(..) failure\n"); } return addr; @@ -98,7 +99,7 @@ void os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) { if (mprotect(address, length, prot) == -1) { - perror("mprotect"); + perror("mprotect"); } } @@ -109,9 +110,9 @@ is_valid_lisp_addr(os_vm_address_t addr) os_vm_address_t newaddr; newaddr=os_trunc_to_page(addr); if((ret=mvalid(newaddr,newaddr-addr+4,OS_VM_PROT_ALL)) == 0) - return TRUE; + return TRUE; else if(errno==EINVAL) - perror("mvalid"); + perror("mvalid"); return FALSE; } @@ -121,20 +122,18 @@ is_valid_lisp_addr(os_vm_address_t addr) static void -sigsegv_handler(int signal, siginfo_t *info, void* void_context) +sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) { - os_context_t *context = arch_os_get_context(&void_context); - os_vm_address_t addr = arch_get_bad_addr(signal,info,context); - - if (addr != NULL && - *os_context_register_addr(context,reg_ALLOC) & (1L<<63)){ - /* this is lifted from linux-os.c, so violates OOAO */ - *os_context_register_addr(context,reg_ALLOC) -= (1L<<63); - interrupt_handle_pending(context); - } else if (!interrupt_maybe_gc(signal, info, context)) { - if(!handle_control_stack_guard_triggered(context,addr)) - interrupt_handle_now(signal, info, context); + + if (addr != NULL && + *os_context_register_addr(context,reg_ALLOC) & (1L<<63)){ + /* this is lifted from linux-os.c, so violates OOAO */ + *os_context_register_addr(context,reg_ALLOC) -= (1L<<63); + interrupt_handle_pending(context); + } else if (!cheneygc_handle_wp_violation(context, addr)) { + if(!handle_guard_page_triggered(context,addr)) + lisp_memory_fault_error(context, addr); } } @@ -143,6 +142,11 @@ void os_install_interrupt_handlers(void) { undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT, - sigsegv_handler); + sigsegv_handler); } +char * +os_get_runtime_executable_path(int external) +{ + return NULL; +}