Clean up RCS ids
[projects/cmucl/cmucl.git] / src / lisp / irix-os.c
1 /*
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.
7  *
8  * This is the IRIX version.  By Sean Hallgren.
9  *
10  */
11
12 #include <stdio.h>
13 #include <sys/file.h>
14 #include <errno.h>
15 #include <signal.h>
16 #include "os.h"
17 #include "arch.h"
18 #include "interrupt.h"
19 #include "lispregs.h"
20 #include <sys/types.h>
21 #include <sys/sysinfo.h>
22 #include <sys/proc.h>
23
24 /* #define DEBUG */
25
26 os_vm_size_t os_vm_page_size = (-1);
27
28 int zero_fd;
29
30 void
31 os_init0(const char *argv[], const char *envp[])
32 {}
33
34 void
35 os_init(const char *argv[], const char *envp[])
36 {
37     zero_fd = open("/dev/zero", O_RDONLY);
38     os_vm_page_size = getpagesize();
39 }
40
41 os_vm_address_t os_validate(os_vm_address_t addr, os_vm_size_t len)
42 {
43     int flags = MAP_PRIVATE | MAP_AUTORESRV;
44
45 #ifdef DEBUG
46     printf("os_validate: addr = %x, len = %x\n", addr, len);
47 #endif
48
49     if (addr)
50         flags |= MAP_FIXED;
51
52     if ((addr = mmap(addr, len, OS_VM_PROT_ALL, flags, zero_fd, 0)) ==
53         (os_vm_address_t) - 1)
54         perror("mmap");
55
56     return addr;
57 }
58
59 void
60 os_invalidate(os_vm_address_t addr, os_vm_size_t len)
61 {
62 #ifdef DEBUG
63     printf("os_invalidate: addr = %x, len = %x\n", addr, len);
64 #endif
65
66     if (munmap(addr, len) == -1)
67         perror("munmap");
68 }
69
70 os_vm_address_t
71 os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len)
72 {
73 #ifdef DEBUG
74     printf("os_map: fd = %d, offset = %d, addr = %x, len = %x\n", fd, offset,
75            addr, len);
76 #endif
77
78     if ((addr = mmap(addr, len, OS_VM_PROT_ALL, MAP_PRIVATE | MAP_FIXED, fd,
79                      (off_t) offset)) == (os_vm_address_t) - 1)
80         perror("mmap");
81
82     return addr;
83 }
84
85 void
86 sanctify_for_execution(os_vm_address_t addr, os_vm_size_t len)
87 {
88     char *end_addr = addr + len;
89
90     addr = os_trunc_to_page(addr);
91     len = end_addr - addr;
92
93     if (mprotect(addr, len, OS_VM_PROT_ALL) == -1)
94         perror("mprotect");
95 }
96
97 void
98 os_flush_icache(os_vm_address_t address, os_vm_size_t length)
99 {
100     sanctify_for_execution(address, length);
101 }
102
103 void
104 os_protect(os_vm_address_t addr, os_vm_size_t len, os_vm_prot_t prot)
105 {
106     if (mprotect(addr, len, prot) == -1)
107         perror("mprotect");
108 }
109
110 boolean valid_addr(os_vm_address_t addr)
111 {
112 }
113
114 static void
115 sigbus_handler(int signal, int code, struct sigcontext *context)
116 {
117     if (!interrupt_maybe_gc(signal, code, context))
118         interrupt_handle_now(signal, code, context);
119 }
120
121 static void
122 sigsegv_handler(int signal, int code, struct sigcontext *context)
123 {
124     if (!interrupt_maybe_gc(signal, code, context))
125         interrupt_handle_now(signal, code, context);
126 }
127
128 void
129 os_install_interrupt_handlers(void)
130 {
131     interrupt_install_low_level_handler(SIGSEGV, sigsegv_handler);
132     interrupt_install_low_level_handler(SIGBUS, sigbus_handler);
133 }