diff --git a/lisp/FreeBSD-os.c b/lisp/FreeBSD-os.c index 8d27f66e320dd8ffad74c0a1acd2685830df0f60..13b409f3ec11e508954d4218ad8e1931b557b0c7 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.4 1999/08/25 14:25:06 dtc Exp $ + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.c,v 1.5 1999/11/29 17:04:07 dtc Exp $ * */ @@ -34,39 +34,20 @@ #include <sys/proc.h> #include "validate.h" vm_size_t os_vm_page_size; -#define DPRINTF(t,a) {if(t)fprintf a;} - -#define HAVE_SIGVEC /* defined - now obsolete */ -#define HAVE_SIGACTION /* replacement for SIGVEC */ -/* SIGSTKSZ == 40Kb */ -#define SIG_STACK_SIZE (SIGSTKSZ/sizeof(double)) -/* make sure the stack is 8 byte aligned */ -#if defined USE_SIG_STACK -static double estack_buf[SIG_STACK_SIZE]; -#endif + +#define DPRINTF(t,a) {if (t) fprintf a;} #if defined GENCGC #include "gencgc.h" #endif -void -os_init() +void os_init(void) { - -#if defined USE_SIG_STACK - static struct sigaltstack estack; - estack.ss_base = (char*)estack_buf; /* this should be ss_sp */ - estack.ss_size = SIGSTKSZ; - estack.ss_flags = 0; - if (sigaltstack(&estack, 0) < 0) - perror("sigaltstack"); -#endif - os_vm_page_size=OS_VM_DEFAULT_PAGESIZE; + os_vm_page_size = OS_VM_DEFAULT_PAGESIZE; } -int -sc_reg(struct sigcontext *c, int offset) +int sc_reg(struct sigcontext *c, int offset) { switch(offset) { @@ -81,135 +62,141 @@ sc_reg(struct sigcontext *c, int offset) } return 0; } -void -os_save_context() + +void os_save_context(void) { - /* Called from interrupt handlers so C stuff knows things set in Lisp + /* + * Called from interrupt handlers so C stuff knows things set in Lisp. */ } -void -os_set_context() + +void os_set_context(void) { } -os_vm_address_t -os_validate(os_vm_address_t addr, os_vm_size_t len) +os_vm_address_t os_validate(os_vm_address_t addr, os_vm_size_t len) { - int flags = MAP_PRIVATE|MAP_ANONYMOUS; + int flags = MAP_PRIVATE | MAP_ANONYMOUS; + + if (addr) + flags |= MAP_FIXED; + else + flags |= MAP_VARIABLE; - if(addr) flags|=MAP_FIXED; - else flags|=MAP_VARIABLE; + DPRINTF(0, (stderr, "os_validate %x %d => ", addr, len)); - DPRINTF(0,(stderr,"os_validate %x %d => ",addr,len)); - if((addr=mmap(addr,len,OS_VM_PROT_ALL,flags,-1,0)) == (os_vm_address_t) -1) + addr = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0); + + if (addr == (os_vm_address_t) -1) { perror("mmap"); return NULL; } - DPRINTF(0,(stderr,"%x\n",addr)); + + DPRINTF(0, (stderr, "%x\n", addr)); return addr; } -void -os_invalidate(os_vm_address_t addr, os_vm_size_t len) +void os_invalidate(os_vm_address_t addr, os_vm_size_t len) { - DPRINTF(0,(stderr,"os_invalidate %x %d\n",addr,len)); - if(munmap(addr,len) == -1) { - fprintf(stderr,"munmap(0x%x,%d)==-1\n",addr,len); + DPRINTF(0, (stderr, "os_invalidate %x %d\n", addr, len)); + + if (munmap(addr, len) == -1) perror("munmap"); - } } -os_vm_address_t -os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len) +os_vm_address_t os_map(int fd, int offset, os_vm_address_t addr, + os_vm_size_t len) { - if((addr=mmap(addr,len,OS_VM_PROT_ALL,MAP_PRIVATE|MAP_FILE|MAP_FIXED,fd, - (off_t) offset)) == (os_vm_address_t) -1) + addr = mmap(addr, len, + OS_VM_PROT_ALL, + MAP_PRIVATE | MAP_FILE | MAP_FIXED, + fd, (off_t) offset); + + if (addr == (os_vm_address_t) -1) perror("mmap"); - + return addr; } -void -os_flush_icache(os_vm_address_t address, os_vm_size_t length) +void os_flush_icache(os_vm_address_t address, os_vm_size_t length) { } -void -os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) +void os_protect(os_vm_address_t address, os_vm_size_t length, + os_vm_prot_t prot) { - if(mprotect(address, length, prot) == -1) + if (mprotect(address, length, prot) == -1) perror("mprotect"); } + -static boolean -in_range_p(os_vm_address_t a, lispobj sbeg, size_t slen) + +static boolean in_range_p(os_vm_address_t a, lispobj sbeg, size_t slen) { - char* beg = (char*)sbeg; - char* end = (char*)sbeg + slen; - char* adr = (char*)a; + char* beg = (char*) sbeg; + char* end = (char*) sbeg + slen; + char* adr = (char*) a; return (adr >= beg && adr < end); } -boolean -valid_addr(os_vm_address_t addr) + +boolean valid_addr(os_vm_address_t addr) { int ret; os_vm_address_t newaddr; - newaddr=os_trunc_to_page(addr); - - if( in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE) - || in_range_p(addr, STATIC_SPACE_START , STATIC_SPACE_SIZE ) - || 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, CONTROL_STACK_START , CONTROL_STACK_SIZE ) - || in_range_p(addr, BINDING_STACK_START , BINDING_STACK_SIZE )) + newaddr = os_trunc_to_page(addr); + + if ( in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE) + || in_range_p(addr, STATIC_SPACE_START , STATIC_SPACE_SIZE ) + || 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, CONTROL_STACK_START , CONTROL_STACK_SIZE ) + || in_range_p(addr, BINDING_STACK_START , BINDING_STACK_SIZE )) return TRUE; return FALSE; } -static void -sigbus_handler(int signal, int code, struct sigcontext *context, - void *fault_addr) +static void sigbus_handler(int signal, int code, struct sigcontext *context, + void *fault_addr) { #if defined GENCGC int page_index = find_page_index(fault_addr); #if SIGBUS_VERBOSE fprintf(stderr,"Signal %d, fault_addr=%x, page_index=%d:\n", - signal,fault_addr,page_index); + signal, fault_addr, page_index); #endif /* 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 */ + /* The page should have been marked write protected */ if (!PAGE_WRITE_PROTECTED(page_index)) - fprintf(stderr,"*** Sigbus in page not marked as write protected"); + 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; - + return; } #endif - DPRINTF(0,(stderr,"sigbus:\n")); + DPRINTF(0, (stderr, "sigbus:\n")); interrupt_handle_now(signal, code, context); } -static void -sigsegv_handler(int signal, int code, struct sigcontext *context) + +static void sigsegv_handler(int signal, int code, struct sigcontext *context) { - DPRINTF(0,(stderr,"os_sigsegv\n")); + DPRINTF(0, (stderr, "os_sigsegv\n")); interrupt_handle_now(signal, code, context); } -void -os_install_interrupt_handlers(void) +void os_install_interrupt_handlers(void) { - interrupt_install_low_level_handler(SIGSEGV,sigsegv_handler); - interrupt_install_low_level_handler(SIGBUS,sigbus_handler); + interrupt_install_low_level_handler(SIGSEGV, sigsegv_handler); + interrupt_install_low_level_handler(SIGBUS, sigbus_handler); } diff --git a/lisp/Linux-os.c b/lisp/Linux-os.c index 67080dfd0bf62670d0528a8885f5af43e4fbac83..f56f47a764fe996dc895d7cec6acaa04b044597f 100644 --- a/lisp/Linux-os.c +++ b/lisp/Linux-os.c @@ -15,7 +15,7 @@ * GENCGC support by Douglas Crosher, 1996, 1997. * Alpha support by Julian Dolby, 1999. * - * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.8 1999/08/25 14:25:06 dtc Exp $ + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.9 1999/11/29 17:04:07 dtc Exp $ * */ @@ -46,16 +46,7 @@ #include "validate.h" size_t os_vm_page_size; -#define DPRINTF(t,a) {if(t)fprintf a;} - -#undef HAVE_SIGVEC /* defined - now obsolete */ -#undef HAVE_SIGACTION /* replacement for SIGVEC */ -/* SIGSTKSZ == 40Kb */ -#define SIG_STACK_SIZE (SIGSTKSZ/sizeof(double)) -/* make sure the stack is 8 byte aligned */ -#if defined USE_SIG_STACK -static double estack_buf[SIG_STACK_SIZE]; -#endif +#define DPRINTF(t,a) {if (t) fprintf a;} #if defined GENCGC #include "gencgc.h" @@ -73,45 +64,32 @@ void update_errno (void) #endif -void -os_init(void) +void os_init(void) { struct utsname name; uname(&name); -/* we need this for mmap */ + /* We need this for mmap */ - if ((name.release[0]) < '2') + if (name.release[0] < '2') { printf("Linux version must be later then 2.0.0!\n"); exit(2); } -#if defined USE_SIG_STACK - static struct sigaltstack estack; - estack.ss_base = (char*)estack_buf; /* this should be ss_sp */ - estack.ss_size = SIGSTKSZ; - estack.ss_flags = 0; - if (sigaltstack(&estack, 0) < 0) - perror("sigaltstack"); -#endif -#if 0 - os_vm_page_size=OS_VM_DEFAULT_PAGESIZE; -#else - os_vm_page_size=getpagesize(); -#endif + os_vm_page_size = getpagesize(); + #ifdef i386 - setfpucw(0x1372|4|8|16|32); /*no interrupts */ + setfpucw(0x1372|4|8|16|32); /* No interrupts */ #endif } #ifdef i386 -int #if (LINUX_VERSION_CODE >= linuxversion(2,1,0)) || (__GNU_LIBRARY__ >= 6) -sc_reg(struct sigcontext *c, int offset) +int sc_reg(struct sigcontext *c, int offset) #else -sc_reg(struct sigcontext_struct *c, int offset) +int sc_reg(struct sigcontext_struct *c, int offset) #endif { switch(offset) @@ -129,27 +107,25 @@ sc_reg(struct sigcontext_struct *c, int offset) } #endif -void -os_save_context(void) +void os_save_context(void) { - /* Called from interrupt handlers so C stuff knows things set in Lisp + /* + * Called from interrupt handlers so C stuff knows things set in Lisp. */ } -void -os_set_context(void) +void os_set_context(void) { } -int do_mmap(os_vm_address_t *addr, os_vm_size_t len, - int flags) +int do_mmap(os_vm_address_t *addr, os_vm_size_t len, int flags) { - /* we _must_ have the memory where we want it...*/ - os_vm_address_t old_addr=*addr; + /* We _must_ have the memory where we want it... */ + os_vm_address_t old_addr = *addr; - *addr=mmap(*addr,len,OS_VM_PROT_ALL,flags,-1,0); - if (((old_addr != NULL) && (*addr != old_addr)) || - (*addr == (os_vm_address_t) -1)) + *addr = mmap(*addr, len, OS_VM_PROT_ALL, flags, -1, 0); + if ((old_addr != NULL && *addr != old_addr) || + *addr == (os_vm_address_t) -1) { fprintf(stderr, "Error in allocating memory, do you have more then 16MB of memory+swap?\n"); perror("mmap"); @@ -158,97 +134,102 @@ int do_mmap(os_vm_address_t *addr, os_vm_size_t len, return 0; } -os_vm_address_t -os_validate(os_vm_address_t addr, os_vm_size_t len) +os_vm_address_t os_validate(os_vm_address_t addr, os_vm_size_t len) { - int flags = MAP_PRIVATE|MAP_ANONYMOUS; + int flags = MAP_PRIVATE | MAP_ANONYMOUS; os_vm_address_t oa = addr; os_vm_size_t olen = len; - if(addr) flags|=MAP_FIXED; - else flags|=MAP_VARIABLE; + if (addr) + flags |= MAP_FIXED; + else + flags |= MAP_VARIABLE; - DPRINTF(0,(stderr,"os_validate %x %d => ",addr,len)); + DPRINTF(0, (stderr, "os_validate %x %d => ", addr, len)); if (addr) { do { if (len <= 0x1000000 ) { - if (do_mmap(&addr,len,flags)) + if (do_mmap(&addr, len, flags)) return NULL; - len=0; + len = 0; } else { - len = len-0x1000000; - if (do_mmap(&addr,0x1000000,flags)) + len = len - 0x1000000; + if (do_mmap(&addr, 0x1000000, flags)) return NULL; - addr+=0x1000000; + addr += 0x1000000; } } - while (len>0); + while (len > 0); } else { - if(do_mmap(&addr,len,flags)) + if (do_mmap(&addr, len, flags)) return NULL; return addr; } - DPRINTF(0,(stderr,"%x\n",addr)); + DPRINTF(0, (stderr, "%x\n", addr)); return oa; } -void -os_invalidate(os_vm_address_t addr, os_vm_size_t len) +void os_invalidate(os_vm_address_t addr, os_vm_size_t len) { - DPRINTF(0,(stderr,"os_invalidate %x %d\n",addr,len)); - if(munmap(addr,len) == -1) + DPRINTF(0, (stderr, "os_invalidate %x %d\n", addr, len)); + + if (munmap(addr, len) == -1) perror("munmap"); } -os_vm_address_t -os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len) +os_vm_address_t os_map(int fd, int offset, os_vm_address_t addr, + os_vm_size_t len) { - if((addr=mmap(addr,len,OS_VM_PROT_ALL,MAP_PRIVATE|MAP_FILE|MAP_FIXED,fd, - (off_t) offset)) == (os_vm_address_t) -1) + addr = mmap(addr, len, + OS_VM_PROT_ALL, + MAP_PRIVATE | MAP_FILE | MAP_FIXED, + fd, (off_t) offset); + + if (addr == (os_vm_address_t) -1) perror("mmap"); - + return addr; } -void -os_flush_icache(os_vm_address_t address, os_vm_size_t length) +void os_flush_icache(os_vm_address_t address, os_vm_size_t length) { } -void -os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) +void os_protect(os_vm_address_t address, os_vm_size_t length, + os_vm_prot_t prot) { - if(mprotect(address, length, prot) == -1) + if (mprotect(address, length, prot) == -1) perror("mprotect"); } + -static boolean -in_range_p(os_vm_address_t a, lispobj sbeg, size_t slen) + +static boolean in_range_p(os_vm_address_t a, lispobj sbeg, size_t slen) { - char* beg = (char*)sbeg; - char* end = (char*)sbeg + slen; - char* adr = (char*)a; + char* beg = (char*) sbeg; + char* end = (char*) sbeg + slen; + char* adr = (char*) a; return (adr >= beg && adr < end); } -boolean -valid_addr(os_vm_address_t addr) + +boolean valid_addr(os_vm_address_t addr) { int ret; os_vm_address_t newaddr; - newaddr=os_trunc_to_page(addr); - - if( in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE) - || in_range_p(addr, STATIC_SPACE_START , STATIC_SPACE_SIZE ) - || 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, CONTROL_STACK_START , CONTROL_STACK_SIZE ) - || in_range_p(addr, BINDING_STACK_START , BINDING_STACK_SIZE )) + newaddr = os_trunc_to_page(addr); + + if ( in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE) + || in_range_p(addr, STATIC_SPACE_START , STATIC_SPACE_SIZE ) + || 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, CONTROL_STACK_START , CONTROL_STACK_SIZE ) + || in_range_p(addr, BINDING_STACK_START , BINDING_STACK_SIZE )) return TRUE; return FALSE; } @@ -260,30 +241,28 @@ void sigsegv_handler(HANDLER_ARGS) { GET_CONTEXT - int fault_addr = ((struct sigcontext_struct *)(&contextstruct))->cr2; - int page_index = find_page_index((void *)fault_addr); - - /*signal(sig,sigsegv_handler); /* Re-install; necessary? */ + int fault_addr = ((struct sigcontext_struct *) (&contextstruct))->cr2; + int page_index = find_page_index((void *) fault_addr); /* Check if the fault is within the dynamic space. */ - if ( page_index!=-1 ) { + if (page_index != -1) { /* Un-protect the page */ + /* The page should have been marked write protected */ if (!PAGE_WRITE_PROTECTED(page_index)) - fprintf(stderr,"*** Sigsegv in page not marked as write protected"); + fprintf(stderr, "*** Sigsegv 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; + return; } DPRINTF(0,(stderr,"sigsegv: eip: %p\n",context->eip)); interrupt_handle_now(signal, contextstruct); - return; } #else -static void -sigsegv_handler(HANDLER_ARGS) +static void sigsegv_handler(HANDLER_ARGS) { os_vm_address_t addr; @@ -291,23 +270,23 @@ sigsegv_handler(HANDLER_ARGS) GET_CONTEXT #endif - DPRINTF(0,(stderr,"sigsegv\n")); + DPRINTF(0, (stderr, "sigsegv\n")); #ifdef i386 - interrupt_handle_now(signal,contextstruct); + interrupt_handle_now(signal, contextstruct); #else -#define CONTROL_STACK_TOP (((char*)CONTROL_STACK_START)+CONTROL_STACK_SIZE) +#define CONTROL_STACK_TOP (((char*) CONTROL_STACK_START) + CONTROL_STACK_SIZE) addr = arch_get_bad_addr(signal,code,context); - if(addr != NULL && context->sc_regs[reg_ALLOC] & (1<<63)) { - context->sc_regs[reg_ALLOC] -= (1<<63); + if (addr != NULL && context->sc_regs[reg_ALLOC] & (1 << 63)) { + context->sc_regs[reg_ALLOC] -= (1 << 63); interrupt_handle_pending(context); } else if (addr > CONTROL_STACK_TOP && addr < BINDING_STACK_START) { fprintf(stderr, "Possible stack overflow at 0x%08lX!\n", addr); /* try to fix control frame pointer */ - while ( ! (CONTROL_STACK_START <= *current_control_frame_pointer && - *current_control_frame_pointer <= CONTROL_STACK_TOP)) - ((char*)current_control_frame_pointer) -= sizeof(lispobj); + while (!(CONTROL_STACK_START <= *current_control_frame_pointer && + *current_control_frame_pointer <= CONTROL_STACK_TOP)) + ((char*) current_control_frame_pointer) -= sizeof(lispobj); ldb_monitor(); } else if (!interrupt_maybe_gc(signal, code, context)) interrupt_handle_now(signal, code, context); @@ -315,24 +294,22 @@ sigsegv_handler(HANDLER_ARGS) } #endif -static void -sigbus_handler(HANDLER_ARGS) +static void sigbus_handler(HANDLER_ARGS) { #ifdef i386 GET_CONTEXT #endif - DPRINTF(1,(stderr,"sigbus:\n")); /* there is no sigbus in linux??? */ + DPRINTF(1, (stderr, "sigbus:\n")); /* there is no sigbus in linux??? */ #ifdef i386 - interrupt_handle_now(signal,contextstruct); + interrupt_handle_now(signal, contextstruct); #else - interrupt_handle_now(signal,code,context); + interrupt_handle_now(signal, code, context); #endif } -void -os_install_interrupt_handlers(void) +void os_install_interrupt_handlers(void) { - interrupt_install_low_level_handler(SIGSEGV,sigsegv_handler); - interrupt_install_low_level_handler(SIGBUS,sigbus_handler); + interrupt_install_low_level_handler(SIGSEGV, sigsegv_handler); + interrupt_install_low_level_handler(SIGBUS, sigbus_handler); }