]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/libc_backends/lib/l4re_file/mmap.cc
update
[l4.git] / l4 / pkg / libc_backends / lib / l4re_file / mmap.cc
1 /*
2  * (c) 2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3  *          Alexander Warg <warg@os.inf.tu-dresden.de>
4  *     economic rights: Technische Universität Dresden (Germany)
5  * This file is part of TUD:OS and distributed under the terms of the
6  * GNU Lesser General Public License 2.1.
7  * Please see the COPYING-LGPL-2.1 file for details.
8  */
9
10 #include <l4/sys/compiler.h>
11 #include <l4/re/rm>
12 #include <l4/re/dataspace>
13 #include <l4/re/env>
14 #include <l4/re/util/cap_alloc>
15 #include <sys/mman.h>
16 #include <unistd.h>
17 #include <cstdio>
18 #include <errno.h>
19 #include <l4/l4re_vfs/backend>
20 #include "redirect.h"
21
22 #define L4B_REDIRECT(ret, func, ptlist, plist) \
23   ret func ptlist L4_NOTHROW                                    \
24   {                          \
25     ret r = L4B(func plist); \
26     POST();                  \
27   }
28
29 void *mmap2(void *addr, size_t length, int prot, int flags,
30             int fd, off_t pgoffset) L4_NOTHROW;
31 void *mmap2(void *addr, size_t length, int prot, int flags,
32             int fd, off_t pgoffset) L4_NOTHROW
33 {
34   void *resptr;
35   int r = L4B(mmap2(addr, length, prot, flags, fd, pgoffset, &resptr));
36   if (r < 0)
37     {
38       errno = -r;
39       return MAP_FAILED;
40     }
41
42   return resptr;
43 }
44
45
46 /* Other versions of mmap */
47 void *mmap64(void *addr, size_t length, int prot, int flags,
48              int fd, off64_t offset) L4_NOTHROW
49 {
50   if (offset & ~L4_PAGEMASK)
51     {
52       errno = EINVAL;
53       return MAP_FAILED;
54     }
55   return mmap2(addr, length, prot, flags, fd, offset >> L4_PAGESHIFT);
56 }
57
58 void *mmap(void *addr, size_t length, int prot, int flags,
59            int fd, off_t offset) L4_NOTHROW
60 {
61   return mmap64(addr, length, prot, flags, fd, offset);
62 }
63
64 L4B_REDIRECT_2(int, munmap, void*, size_t)
65 L4B_REDIRECT_3(int, mprotect, void *, size_t, int);
66 L4B_REDIRECT_3(int, madvise, void *, size_t, int);
67 L4B_REDIRECT_3(int, msync, void *, size_t, int);
68
69 void *mremap(void *old_addr, size_t old_size, size_t new_size,
70              int flags, ...) L4_NOTHROW
71 {
72   void *resptr;
73   if (flags & MREMAP_FIXED)
74     {
75       va_list a;
76       va_start(a, flags);
77       resptr = va_arg(a, void *);
78       va_end(a);
79     }
80
81   int r = L4B(mremap(old_addr, old_size, new_size, flags, &resptr));
82   if (r < 0)
83     {
84       errno = -r;
85       return MAP_FAILED;
86     }
87
88   return resptr;
89 }