1cce27316SThomas Weißschuh /* SPDX-License-Identifier: LGPL-2.1 OR MIT */
2cce27316SThomas Weißschuh /*
3cce27316SThomas Weißschuh * mm definition for NOLIBC
4cce27316SThomas Weißschuh * Copyright (C) 2017-2021 Willy Tarreau <w@1wt.eu>
5cce27316SThomas Weißschuh */
6cce27316SThomas Weißschuh
73785289fSThomas Weißschuh /* make sure to include all global symbols */
83785289fSThomas Weißschuh #include "../nolibc.h"
93785289fSThomas Weißschuh
10cce27316SThomas Weißschuh #ifndef _NOLIBC_SYS_MMAN_H
11cce27316SThomas Weißschuh #define _NOLIBC_SYS_MMAN_H
12cce27316SThomas Weißschuh
13cce27316SThomas Weißschuh #include "../arch.h"
14cce27316SThomas Weißschuh #include "../sys.h"
15cce27316SThomas Weißschuh
16cce27316SThomas Weißschuh #ifndef sys_mmap
17cce27316SThomas Weißschuh static __attribute__((unused))
sys_mmap(void * addr,size_t length,int prot,int flags,int fd,off_t offset)18cce27316SThomas Weißschuh void *sys_mmap(void *addr, size_t length, int prot, int flags, int fd,
19cce27316SThomas Weißschuh off_t offset)
20cce27316SThomas Weißschuh {
21cce27316SThomas Weißschuh int n;
22cce27316SThomas Weißschuh
23cce27316SThomas Weißschuh #if defined(__NR_mmap2)
24cce27316SThomas Weißschuh n = __NR_mmap2;
25cce27316SThomas Weißschuh offset >>= 12;
26cce27316SThomas Weißschuh #else
27cce27316SThomas Weißschuh n = __NR_mmap;
28cce27316SThomas Weißschuh #endif
29cce27316SThomas Weißschuh
30cce27316SThomas Weißschuh return (void *)my_syscall6(n, addr, length, prot, flags, fd, offset);
31cce27316SThomas Weißschuh }
32cce27316SThomas Weißschuh #endif
33cce27316SThomas Weißschuh
34cce27316SThomas Weißschuh /* Note that on Linux, MAP_FAILED is -1 so we can use the generic __sysret()
35cce27316SThomas Weißschuh * which returns -1 upon error and still satisfy user land that checks for
36cce27316SThomas Weißschuh * MAP_FAILED.
37cce27316SThomas Weißschuh */
38cce27316SThomas Weißschuh
39cce27316SThomas Weißschuh static __attribute__((unused))
mmap(void * addr,size_t length,int prot,int flags,int fd,off_t offset)40cce27316SThomas Weißschuh void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
41cce27316SThomas Weißschuh {
42cce27316SThomas Weißschuh void *ret = sys_mmap(addr, length, prot, flags, fd, offset);
43cce27316SThomas Weißschuh
44cce27316SThomas Weißschuh if ((unsigned long)ret >= -4095UL) {
45cce27316SThomas Weißschuh SET_ERRNO(-(long)ret);
46cce27316SThomas Weißschuh ret = MAP_FAILED;
47cce27316SThomas Weißschuh }
48cce27316SThomas Weißschuh return ret;
49cce27316SThomas Weißschuh }
50cce27316SThomas Weißschuh
51cce27316SThomas Weißschuh static __attribute__((unused))
sys_mremap(void * old_address,size_t old_size,size_t new_size,int flags,void * new_address)52*55175d86SThomas Weißschuh void *sys_mremap(void *old_address, size_t old_size, size_t new_size, int flags, void *new_address)
53*55175d86SThomas Weißschuh {
54*55175d86SThomas Weißschuh return (void *)my_syscall5(__NR_mremap, old_address, old_size,
55*55175d86SThomas Weißschuh new_size, flags, new_address);
56*55175d86SThomas Weißschuh }
57*55175d86SThomas Weißschuh
58*55175d86SThomas Weißschuh static __attribute__((unused))
mremap(void * old_address,size_t old_size,size_t new_size,int flags,void * new_address)59*55175d86SThomas Weißschuh void *mremap(void *old_address, size_t old_size, size_t new_size, int flags, void *new_address)
60*55175d86SThomas Weißschuh {
61*55175d86SThomas Weißschuh void *ret = sys_mremap(old_address, old_size, new_size, flags, new_address);
62*55175d86SThomas Weißschuh
63*55175d86SThomas Weißschuh if ((unsigned long)ret >= -4095UL) {
64*55175d86SThomas Weißschuh SET_ERRNO(-(long)ret);
65*55175d86SThomas Weißschuh ret = MAP_FAILED;
66*55175d86SThomas Weißschuh }
67*55175d86SThomas Weißschuh return ret;
68*55175d86SThomas Weißschuh }
69*55175d86SThomas Weißschuh
70*55175d86SThomas Weißschuh static __attribute__((unused))
sys_munmap(void * addr,size_t length)71cce27316SThomas Weißschuh int sys_munmap(void *addr, size_t length)
72cce27316SThomas Weißschuh {
73cce27316SThomas Weißschuh return my_syscall2(__NR_munmap, addr, length);
74cce27316SThomas Weißschuh }
75cce27316SThomas Weißschuh
76cce27316SThomas Weißschuh static __attribute__((unused))
munmap(void * addr,size_t length)77cce27316SThomas Weißschuh int munmap(void *addr, size_t length)
78cce27316SThomas Weißschuh {
79cce27316SThomas Weißschuh return __sysret(sys_munmap(addr, length));
80cce27316SThomas Weißschuh }
81cce27316SThomas Weißschuh
82cce27316SThomas Weißschuh #endif /* _NOLIBC_SYS_MMAN_H */
83