• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <unistd.h>
2 #include <stdio.h>
3 #include <errno.h>
4 #include <sys/mman.h>
5 
6 /* Derived from development/ndk/platforms/android-3/include/asm-generic/mman.h */
7 #define PROT_READ_PORTABLE     0x1
8 #define PROT_WRITE_PORTABLE    0x2
9 #define PROT_EXEC_PORTABLE     0x4
10 #define PROT_SEM_PORTABLE      0x8
11 #define PROT_NONE_PORTABLE     0x0
12 #define PROT_GROWSDOWN_PORTABLE        0x01000000
13 #define PROT_GROWSUP_PORTABLE  0x02000000
14 
15 #define MAP_SHARED_PORTABLE    0x01
16 #define MAP_PRIVATE_PORTABLE   0x02
17 #define MAP_TYPE_PORTABLE      0x0f
18 #define MAP_FIXED_PORTABLE     0x10
19 #define MAP_ANONYMOUS_PORTABLE 0x20
20 
21 #define MS_ASYNC_PORTABLE      1
22 #define MS_INVALIDATE_PORTABLE 2
23 #define MS_SYNC_PORTABLE       4
24 
25 #define MADV_NORMAL_PORTABLE   0
26 #define MADV_RANDOM_PORTABLE   1
27 #define MADV_SEQUENTIAL_PORTABLE 2
28 #define MADV_WILLNEED_PORTABLE 3
29 #define MADV_DONTNEED_PORTABLE 4
30 
31 #define MADV_REMOVE_PORTABLE   9
32 #define MADV_DONTFORK_PORTABLE 10
33 #define MADV_DOFORK_PORTABLE   11
34 
35 #define MAP_ANON_PORTABLE      MAP_ANONYMOUS_PORTABLE
36 #define MAP_FILE_PORTABLE      0
37 
38 /* Derived from development/ndk/platforms/android-3/include/asm-generic/mman.h */
39 #define MAP_GROWSDOWN_PORTABLE 0x0100
40 #define MAP_DENYWRITE_PORTABLE 0x0800
41 #define MAP_EXECUTABLE_PORTABLE        0x1000
42 #define MAP_LOCKED_PORTABLE    0x2000
43 #define MAP_NORESERVE_PORTABLE 0x4000
44 #define MAP_POPULATE_PORTABLE  0x8000
45 #define MAP_NONBLOCK_PORTABLE  0x10000
46 
47 #define MCL_CURRENT_PORTABLE   1
48 #define MCL_FUTURE_PORTABLE    2
49 
50 
51 #if MAP_ANONYMOUS_PORTABLE==MAP_ANONYMOUS
52 #error Bad build environment
53 #endif
54 
mips_change_prot(int prot)55 static inline int mips_change_prot(int prot)
56 {
57     /* Only PROT_SEM is different */
58     if (prot & PROT_SEM_PORTABLE) {
59         prot &= ~PROT_SEM_PORTABLE;
60         prot |= PROT_SEM;
61     }
62 
63     return prot;
64 }
65 
mips_change_flags(int flags)66 static inline int mips_change_flags(int flags)
67 {
68     int mipsflags = 0;
69     /* These are the documented flags for mmap */
70     if (flags & MAP_SHARED_PORTABLE)
71        mipsflags |= MAP_SHARED;
72     if (flags & MAP_PRIVATE_PORTABLE)
73        mipsflags |= MAP_PRIVATE;
74 #if defined(MAP_32BIT_PORTABLE) && defined(MAP_32BIT)
75     if (flags & MAP_32BIT_PORTABLE)
76        mipsflags |= MAP_32BIT;
77 #endif
78     if (flags & MAP_ANONYMOUS_PORTABLE)
79        mipsflags |= MAP_ANONYMOUS;
80     if (flags & MAP_FIXED_PORTABLE)
81        mipsflags |= MAP_FIXED;
82     if (flags & MAP_GROWSDOWN_PORTABLE)
83        mipsflags |= MAP_GROWSDOWN;
84 #if defined(MAP_HUGETLB_PORTABLE) && defined(MAP_HUGETLB)
85     if (flags & MAP_HUGETLB_PORTABLE)
86        mipsflags |= MAP_HUGETLB;
87 #endif
88     if (flags & MAP_LOCKED_PORTABLE)
89        mipsflags |= MAP_LOCKED;
90     if (flags & MAP_NONBLOCK_PORTABLE)
91        mipsflags |= MAP_NONBLOCK;
92     if (flags & MAP_NORESERVE_PORTABLE)
93        mipsflags |= MAP_NORESERVE;
94     if (flags & MAP_POPULATE_PORTABLE)
95        mipsflags |= MAP_POPULATE;
96 #if defined(MAP_STACK_PORTABLE) && defined(MAP_STACK)
97     if (flags & MAP_STACK_PORTABLE)
98        mipsflags |= MAP_STACK;
99 #endif
100 
101     return mipsflags;
102 }
103 
104 #define  MMAP2_SHIFT  12
105 extern void *__mmap2(void *, size_t, int, int, int, size_t);
mmap(void * addr,size_t size,int prot,int flags,int fd,long offset)106 void *mmap(void *addr, size_t size, int prot, int flags, int fd, long offset)
107 {
108     if ( offset & ((1UL << MMAP2_SHIFT)-1) ) {
109         errno = EINVAL;
110         return MAP_FAILED;
111     }
112 
113     return __mmap2(addr, size, mips_change_prot(prot), mips_change_flags(flags),
114                    fd, (size_t)offset >> MMAP2_SHIFT);
115 }
116