Skip to content
Snippets Groups Projects
Commit a18df860 authored by dtc's avatar dtc
Browse files

Source cleanup.

parent aefdc91f
No related branches found
No related tags found
No related merge requests found
......@@ -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);
}
......@@ -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);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment