]> 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 {
32   void *resptr;
33   int r = L4B(mmap2(addr, length, prot, flags, fd, pgoffset, &resptr));
34   if (r < 0)
35     {
36       errno = -r;
37       return MAP_FAILED;
38     }
39
40   return resptr;
41 }
42
43
44 /* Other versions of mmap */
45 void *mmap64(void *addr, size_t length, int prot, int flags,
46              int fd, off64_t offset) L4_NOTHROW
47 {
48   if (offset & ~L4_PAGEMASK)
49     {
50       errno = EINVAL;
51       return MAP_FAILED;
52     }
53   return mmap2(addr, length, prot, flags, fd, offset >> L4_PAGESHIFT);
54 }
55
56 void *mmap(void *addr, size_t length, int prot, int flags,
57            int fd, off_t offset) L4_NOTHROW
58 {
59   return mmap64(addr, length, prot, flags, fd, offset);
60 }
61
62 L4B_REDIRECT_2(int, munmap, void*, size_t)
63 L4B_REDIRECT_3(int, mprotect, void *, size_t, int);
64 L4B_REDIRECT_3(int, madvise, void *, size_t, int);
65 L4B_REDIRECT_3(int, msync, void *, size_t, int);
66
67 void *mremap(void *old_addr, size_t old_size, size_t new_size,
68              int flags, ...) L4_NOTHROW
69 {
70   void *resptr;
71   if (flags & MREMAP_FIXED)
72     {
73       va_list a;
74       va_start(a, flags);
75       resptr = va_arg(a, void *);
76       va_end(a);
77     }
78
79   int r = L4B(mremap(old_addr, old_size, new_size, flags, &resptr));
80   if (r < 0)
81     {
82       errno = -r;
83       return MAP_FAILED;
84     }
85
86   return resptr;
87 }