* 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 ...
*/
#include <stdio.h>
#include <sys/param.h>
#include <sys/file.h>
+#include "sbcl.h"
#include "./signal.h"
#include "os.h"
#include "arch.h"
#include "interrupt.h"
#include "interr.h"
#include "lispregs.h"
-#include "sbcl.h"
#include <sys/socket.h>
#include <sys/utsname.h>
#include <errno.h>
#include "validate.h"
size_t os_vm_page_size;
-#if defined GENCGC
-#include "gencgc.h"
-#endif
\f
-void os_init(void)
+void
+os_init(char *argv[], char *envp[])
{
-
- os_vm_page_size = getpagesize();
-
+ os_vm_page_size = BACKEND_PAGE_BYTES;
}
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;
}
os_invalidate(os_vm_address_t addr, os_vm_size_t len)
{
if (munmap(addr,len) == -1) {
- perror("munmap");
+ perror("munmap");
}
}
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;
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");
}
}
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;
}
\f
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(((addr>=DYNAMIC_0_SPACE_END) && (addr<DYNAMIC_1_SPACE_START)) ||
- ((addr>=DYNAMIC_1_SPACE_END) && (addr<CONTROL_STACK_START))){
- /* there's empty gap between these spaces. This clause needs
- review if the spaces are ever juggled to make this untrue */
- fprintf(stderr, "bad address 0x%p\n",addr);
- lose("ran off end of dynamic space");
- } else if (!interrupt_maybe_gc(signal, info, context)) {
- 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);
}
}
void
os_install_interrupt_handlers(void)
{
- undoably_install_low_level_interrupt_handler(SIGSEGV, sigsegv_handler);
+ undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT,
+ sigsegv_handler);
}
+char *
+os_get_runtime_executable_path(int external)
+{
+ return NULL;
+}