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