xref: /minix/minix/lib/libc/sys/mmap.c (revision 83133719)
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
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 
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 
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 
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 
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 
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 
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 
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 
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