2 * OS-dependent routines. This file (along with os.h) exports an
3 * OS-independent interface to the operating system VM facilities.
4 * Suprisingly, this interface looks a lot like the Mach interface
5 * (but simpler in some places). For some operating systems, a subset
6 * of these functions will have to be emulated.
8 * This is the IRIX version. By Sean Hallgren.
18 #include "interrupt.h"
20 #include <sys/types.h>
21 #include <sys/sysinfo.h>
26 os_vm_size_t os_vm_page_size = (-1);
31 os_init0(const char *argv[], const char *envp[])
35 os_init(const char *argv[], const char *envp[])
37 zero_fd = open("/dev/zero", O_RDONLY);
38 os_vm_page_size = getpagesize();
41 os_vm_address_t os_validate(os_vm_address_t addr, os_vm_size_t len)
43 int flags = MAP_PRIVATE | MAP_AUTORESRV;
46 printf("os_validate: addr = %x, len = %x\n", addr, len);
52 if ((addr = mmap(addr, len, OS_VM_PROT_ALL, flags, zero_fd, 0)) ==
53 (os_vm_address_t) - 1)
60 os_invalidate(os_vm_address_t addr, os_vm_size_t len)
63 printf("os_invalidate: addr = %x, len = %x\n", addr, len);
66 if (munmap(addr, len) == -1)
71 os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len)
74 printf("os_map: fd = %d, offset = %d, addr = %x, len = %x\n", fd, offset,
78 if ((addr = mmap(addr, len, OS_VM_PROT_ALL, MAP_PRIVATE | MAP_FIXED, fd,
79 (off_t) offset)) == (os_vm_address_t) - 1)
86 sanctify_for_execution(os_vm_address_t addr, os_vm_size_t len)
88 char *end_addr = addr + len;
90 addr = os_trunc_to_page(addr);
91 len = end_addr - addr;
93 if (mprotect(addr, len, OS_VM_PROT_ALL) == -1)
98 os_flush_icache(os_vm_address_t address, os_vm_size_t length)
100 sanctify_for_execution(address, length);
104 os_protect(os_vm_address_t addr, os_vm_size_t len, os_vm_prot_t prot)
106 if (mprotect(addr, len, prot) == -1)
110 boolean valid_addr(os_vm_address_t addr)
115 sigbus_handler(int signal, int code, struct sigcontext *context)
117 if (!interrupt_maybe_gc(signal, code, context))
118 interrupt_handle_now(signal, code, context);
122 sigsegv_handler(int signal, int code, struct sigcontext *context)
124 if (!interrupt_maybe_gc(signal, code, context))
125 interrupt_handle_now(signal, code, context);
129 os_install_interrupt_handlers(void)
131 interrupt_install_low_level_handler(SIGSEGV, sigsegv_handler);
132 interrupt_install_low_level_handler(SIGBUS, sigbus_handler);