3 * From FreeBSD-os.c 1.6 2000/10/24 13:32:30 dtc Exp
5 * OS-dependent routines. This file (along with os.h) exports an
6 * OS-independent interface to the operating system VM facilities.
7 * Suprisingly, this interface looks a lot like the Mach interface
8 * (but simpler in some places). For some operating systems, a subset
9 * of these functions will have to be emulated.
11 * This is the OSF1 version. By Sean Hallgren.
12 * Much hacked by Paul Werkowski
13 * GENCGC support by Douglas Crosher, 1996, 1997.
14 * Frobbed for OpenBSD by Pierre R. Mai, 2001.
16 * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/OpenBSD-os.c,v 1.11 2011/09/01 05:18:26 rtoy Exp $
21 #include <sys/param.h>
27 #include "interrupt.h"
29 #include "internals.h"
31 #include <sys/types.h>
33 /* #include <sys/sysinfo.h> */
36 vm_size_t os_vm_page_size;
44 os_init0(const char *argv[], const char *envp[])
48 os_init(const char *argv[], const char *envp[])
50 os_vm_page_size = OS_VM_DEFAULT_PAGESIZE;
54 sc_reg(struct sigcontext *c, int offset)
78 os_validate(os_vm_address_t addr, os_vm_size_t len)
80 int flags = MAP_PRIVATE | MAP_ANON;
85 DPRINTF(0, (stderr, "os_validate %x %d => ", addr, len));
87 addr = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0);
89 if (addr == (os_vm_address_t) - 1) {
94 DPRINTF(0, (stderr, "%x\n", addr));
100 os_invalidate(os_vm_address_t addr, os_vm_size_t len)
102 DPRINTF(0, (stderr, "os_invalidate %x %d\n", addr, len));
104 if (munmap(addr, len) == -1)
109 os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len)
111 addr = mmap(addr, len,
113 MAP_PRIVATE | MAP_FILE | MAP_FIXED, fd, (off_t) offset);
115 if (addr == (os_vm_address_t) - 1)
122 os_flush_icache(os_vm_address_t address, os_vm_size_t length)
127 os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot)
129 if (mprotect(address, length, prot) == -1)
136 in_range_p(os_vm_address_t a, lispobj sbeg, size_t slen)
138 char *beg = (char *) sbeg;
139 char *end = (char *) sbeg + slen;
140 char *adr = (char *) a;
142 return (adr >= beg && adr < end);
146 valid_addr(os_vm_address_t addr)
149 os_vm_address_t newaddr;
151 newaddr = os_trunc_to_page(addr);
153 if (in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE)
154 || in_range_p(addr, STATIC_SPACE_START, STATIC_SPACE_SIZE)
155 || in_range_p(addr, DYNAMIC_0_SPACE_START, dynamic_space_size)
156 || in_range_p(addr, DYNAMIC_1_SPACE_START, dynamic_space_size)
157 || in_range_p(addr, CONTROL_STACK_START, CONTROL_STACK_SIZE)
158 || in_range_p(addr, BINDING_STACK_START, BINDING_STACK_SIZE))
165 sigsegv_handler(HANDLER_ARGS)
168 caddr_t fault_addr = code->si_addr;
171 fprintf(stderr, "Signal %d, fault_addr=%x, page_index=%d:\n",
172 signal, fault_addr, page_index);
175 if (gc_write_barrier(code->si_addr))
181 DPRINTF(0, (stderr, "sigsegv:\n"));
182 interrupt_handle_now(signal, code, context);
186 sigbus_handler(HANDLER_ARGS)
190 DPRINTF(0, (stderr, "sigbus:\n"));
191 interrupt_handle_now(signal, code, context);
195 os_install_interrupt_handlers(void)
197 interrupt_install_low_level_handler(SIGSEGV, sigsegv_handler);
198 interrupt_install_low_level_handler(SIGBUS, sigbus_handler);