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