1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
/* vi: set sw=4 ts=4: */
/*
* _mmap() for uClibc
*
* Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org>
*
* GNU Library General Public License (LGPL) version 2 or later.
*/
#include <errno.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#if defined (__NR_mmap) || defined (__NR_mmap2)
libc_hidden_proto (mmap)
#if defined (__UCLIBC_MMAP_HAS_6_ARGS__) && defined (__NR_mmap)
#define __NR__mmap __NR_mmap
static inline _syscall6 (__ptr_t, _mmap, __ptr_t, addr, size_t, len,
int, prot, int, flags, int, fd, __off_t, offset);
__ptr_t mmap(__ptr_t addr, size_t len, int prot,
int flags, int fd, __off_t offset)
{
return (__ptr_t) _mmap (addr, len, prot, flags,
fd, offset);
}
#elif defined (__NR_mmap2)
#define __NR__mmap __NR_mmap2
#ifndef MMAP2_PAGE_SHIFT
# define MMAP2_PAGE_SHIFT 12
#endif
static inline _syscall6 (__ptr_t, _mmap, __ptr_t, addr, size_t, len,
int, prot, int, flags, int, fd, __off_t, offset);
__ptr_t mmap(__ptr_t addr, size_t len, int prot,
int flags, int fd, __off_t offset)
{
/* check if offset is page aligned */
if (offset & ((1 << MMAP2_PAGE_SHIFT) - 1))
{
__set_errno(EINVAL);
return MAP_FAILED;
}
#ifdef __USE_FILE_OFFSET64
return (__ptr_t) _mmap (addr, len, prot, flags,
fd, ((__u_quad_t) offset >> MMAP2_PAGE_SHIFT));
#else
return (__ptr_t) _mmap (addr, len, prot, flags,
fd, ((__u_long) offset >> MMAP2_PAGE_SHIFT));
#endif
}
#elif defined (__NR_mmap)
# define __NR__mmap __NR_mmap
static inline _syscall1(__ptr_t, _mmap, unsigned long *, buffer);
__ptr_t mmap(__ptr_t addr, size_t len, int prot,
int flags, int fd, __off_t offset)
{
unsigned long buffer[6];
buffer[0] = (unsigned long) addr;
buffer[1] = (unsigned long) len;
buffer[2] = (unsigned long) prot;
buffer[3] = (unsigned long) flags;
buffer[4] = (unsigned long) fd;
buffer[5] = (unsigned long) offset;
return (__ptr_t) _mmap(buffer);
}
#endif
libc_hidden_def (mmap)
#else
# error "Your architecture doesn't seem to provide mmap() !?"
#endif
|