OSDN Git Service

- fix inline keyword
[uclinux-h8/uClibc.git] / libc / sysdeps / linux / arm / mmap.c
1 /* 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
16 libc_hidden_proto (mmap)
17 #if defined (__UCLIBC_MMAP_HAS_6_ARGS__) && defined (__NR_mmap)
18 #define __NR__mmap __NR_mmap
19 static __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
35 static __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
56 static __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
71 libc_hidden_def (mmap)
72 #else
73 # error "Your architecture doesn't seem to provide mmap() !?"
74 #endif