1 #define _SYSTEM 1
2 #define _MINIX_SYSTEM 1
3 #include <sys/cdefs.h>
4 #include "namespace.h"
5 #include <lib.h>
6 #include <minix/u64.h>
7 #include <minix/vm.h>
8
9 /* INCLUDES HERE */
10
11 #include <sys/mman.h>
12 #include <stdarg.h>
13 #include <string.h>
14 #include <errno.h>
15
16 #ifdef __weak_alias
__weak_alias(mmap,_mmap)17 __weak_alias(mmap, _mmap)
18 __weak_alias(munmap, _munmap)
19 #endif
20
21 void *minix_mmap_for(endpoint_t forwhom,
22 void *addr, size_t len, int prot, int flags, int fd, off_t offset)
23 {
24 message m;
25 int r;
26
27 memset(&m, 0, sizeof(m));
28 m.m_mmap.addr = addr;
29 m.m_mmap.len = len;
30 m.m_mmap.prot = prot;
31 m.m_mmap.flags = flags;
32 m.m_mmap.fd = fd;
33 m.m_mmap.offset = offset;
34 m.m_mmap.forwhom = forwhom;
35
36 if(forwhom != SELF) {
37 m.m_mmap.flags |= MAP_THIRDPARTY;
38 }
39
40 r = _syscall(VM_PROC_NR, VM_MMAP, &m);
41
42 if(r != OK) {
43 return MAP_FAILED;
44 }
45
46 return m.m_mmap.retaddr;
47 }
48
minix_vfs_mmap(endpoint_t who,off_t offset,size_t len,dev_t dev,ino_t ino,int fd,u32_t vaddr,u16_t clearend,u16_t flags)49 int minix_vfs_mmap(endpoint_t who, off_t offset, size_t len,
50 dev_t dev, ino_t ino, int fd, u32_t vaddr, u16_t clearend,
51 u16_t flags)
52 {
53 message m;
54
55 memset(&m, 0, sizeof(message));
56
57 m.m_vm_vfs_mmap.who = who;
58 m.m_vm_vfs_mmap.offset = offset;
59 m.m_vm_vfs_mmap.dev = dev;
60 m.m_vm_vfs_mmap.ino = ino;
61 m.m_vm_vfs_mmap.vaddr = vaddr;
62 m.m_vm_vfs_mmap.len = len;
63 m.m_vm_vfs_mmap.fd = fd;
64 m.m_vm_vfs_mmap.clearend = clearend;
65 m.m_vm_vfs_mmap.flags = flags;
66
67 return _syscall(VM_PROC_NR, VM_VFS_MMAP, &m);
68 }
69
mmap(void * addr,size_t len,int prot,int flags,int fd,off_t offset)70 void *mmap(void *addr, size_t len, int prot, int flags,
71 int fd, off_t offset)
72 {
73 return minix_mmap_for(SELF, addr, len, prot, flags, fd, offset);
74 }
75
munmap(void * addr,size_t len)76 int munmap(void *addr, size_t len)
77 {
78 message m;
79
80 memset(&m, 0, sizeof(m));
81 m.VMUM_ADDR = addr;
82 m.VMUM_LEN = len;
83
84 return _syscall(VM_PROC_NR, VM_MUNMAP, &m);
85 }
86
87
vm_remap(endpoint_t d,endpoint_t s,void * da,void * sa,size_t size)88 void *vm_remap(endpoint_t d,
89 endpoint_t s,
90 void *da,
91 void *sa,
92 size_t size)
93 {
94 message m;
95 int r;
96
97 memset(&m, 0, sizeof(m));
98 m.m_lsys_vm_vmremap.destination = d;
99 m.m_lsys_vm_vmremap.source = s;
100 m.m_lsys_vm_vmremap.dest_addr = da;
101 m.m_lsys_vm_vmremap.src_addr = sa;
102 m.m_lsys_vm_vmremap.size = size;
103
104 r = _syscall(VM_PROC_NR, VM_REMAP, &m);
105 if (r != OK)
106 return MAP_FAILED;
107 return m.m_lsys_vm_vmremap.ret_addr;
108 }
109
vm_remap_ro(endpoint_t d,endpoint_t s,void * da,void * sa,size_t size)110 void *vm_remap_ro(endpoint_t d,
111 endpoint_t s,
112 void *da,
113 void *sa,
114 size_t size)
115 {
116 message m;
117 int r;
118
119 memset(&m, 0, sizeof(m));
120 m.m_lsys_vm_vmremap.destination = d;
121 m.m_lsys_vm_vmremap.source = s;
122 m.m_lsys_vm_vmremap.dest_addr = da;
123 m.m_lsys_vm_vmremap.src_addr = sa;
124 m.m_lsys_vm_vmremap.size = size;
125
126 r = _syscall(VM_PROC_NR, VM_REMAP_RO, &m);
127 if (r != OK)
128 return MAP_FAILED;
129 return m.m_lsys_vm_vmremap.ret_addr;
130 }
131
vm_unmap(endpoint_t endpt,void * addr)132 int vm_unmap(endpoint_t endpt, void *addr)
133 {
134 message m;
135
136 memset(&m, 0, sizeof(m));
137 m.m_lc_vm_shm_unmap.forwhom = endpt;
138 m.m_lc_vm_shm_unmap.addr = addr;
139
140 return _syscall(VM_PROC_NR, VM_SHM_UNMAP, &m);
141 }
142
vm_getphys(endpoint_t endpt,void * addr)143 unsigned long vm_getphys(endpoint_t endpt, void *addr)
144 {
145 message m;
146 int r;
147
148 memset(&m, 0, sizeof(m));
149 m.m_lc_vm_getphys.endpt = endpt;
150 m.m_lc_vm_getphys.addr = addr;
151
152 r = _syscall(VM_PROC_NR, VM_GETPHYS, &m);
153 if (r != OK)
154 return 0;
155 return (unsigned long) m.m_lc_vm_getphys.ret_addr;
156 }
157
vm_getrefcount(endpoint_t endpt,void * addr)158 u8_t vm_getrefcount(endpoint_t endpt, void *addr)
159 {
160 message m;
161 int r;
162
163 memset(&m, 0, sizeof(m));
164 m.m_lsys_vm_getref.endpt = endpt;
165 m.m_lsys_vm_getref.addr = addr;
166
167 r = _syscall(VM_PROC_NR, VM_GETREF, &m);
168 if (r != OK)
169 return (u8_t) -1;
170 return (u8_t) m.m_lsys_vm_getref.retc;
171 }
172
173