|
@@ -135,30 +135,6 @@ static __always_inline _syscall2(int, _dl_gettimeofday, struct timeval *, tv,
|
|
|
# endif
|
|
|
#endif
|
|
|
|
|
|
-
|
|
|
-/* handle all the fun mmap intricacies */
|
|
|
-#define MAP_FAILED ((void *) -1)
|
|
|
-#if (defined(__UCLIBC_MMAP_HAS_6_ARGS__) && defined(__NR_mmap)) || !defined(__NR_mmap2)
|
|
|
-# define _dl_MAX_ERRNO 4096
|
|
|
-# define _dl_mmap_check_error(__res) \
|
|
|
- (((long)__res) < 0 && ((long)__res) >= -_dl_MAX_ERRNO)
|
|
|
-#else
|
|
|
-# define _dl_mmap_check_error(X) (((void *)X) == MAP_FAILED)
|
|
|
-#endif
|
|
|
-
|
|
|
-/* first try mmap(), syscall6() style */
|
|
|
-#if defined(__UCLIBC_MMAP_HAS_6_ARGS__) && defined(__NR_mmap)
|
|
|
-
|
|
|
-# define __NR__dl_mmap __NR_mmap
|
|
|
-static __always_inline _syscall6(void *, _dl_mmap, void *, start, size_t, length,
|
|
|
- int, prot, int, flags, int, fd, off_t, offset);
|
|
|
-/* then try mmap2() */
|
|
|
-#elif defined(__NR_mmap2) && !defined (__mcoldfire__)
|
|
|
-
|
|
|
-# define __NR___syscall_mmap2 __NR_mmap2
|
|
|
-static __always_inline _syscall6(__ptr_t, __syscall_mmap2, __ptr_t, addr, size_t, len,
|
|
|
- int, prot, int, flags, int, fd, off_t, offset);
|
|
|
-
|
|
|
/* Some architectures always use 12 as page shift for mmap2() eventhough the
|
|
|
* real PAGE_SHIFT != 12. Other architectures use the same value as
|
|
|
* PAGE_SHIFT...
|
|
@@ -167,35 +143,41 @@ static __always_inline _syscall6(__ptr_t, __syscall_mmap2, __ptr_t, addr, size_t
|
|
|
# define MMAP2_PAGE_SHIFT 12
|
|
|
#endif
|
|
|
|
|
|
-static __always_inline void * _dl_mmap(void * addr, unsigned long size, int prot,
|
|
|
- int flags, int fd, unsigned long offset)
|
|
|
+#define MAP_FAILED ((void *) -1)
|
|
|
+#define _dl_mmap_check_error(X) (((void *)X) == MAP_FAILED)
|
|
|
+
|
|
|
+static __always_inline
|
|
|
+void *_dl_mmap(void *addr, unsigned long size, int prot,
|
|
|
+ int flags, int fd, unsigned long offset)
|
|
|
{
|
|
|
+#if defined(__UCLIBC_MMAP_HAS_6_ARGS__) && defined(__NR_mmap)
|
|
|
+ /* first try mmap(), syscall6() style */
|
|
|
+ return (void *)INLINE_SYSCALL(mmap, 6, addr, size, prot, flags, fd, offset);
|
|
|
+
|
|
|
+#elif defined(__NR_mmap2) && !defined (__mcoldfire__)
|
|
|
+ /* then try mmap2() */
|
|
|
+ unsigned long shifted;
|
|
|
+
|
|
|
if (offset & ((1 << MMAP2_PAGE_SHIFT) - 1))
|
|
|
return MAP_FAILED;
|
|
|
- return __syscall_mmap2(addr, size, prot, flags,
|
|
|
- fd, (off_t) (offset >> MMAP2_PAGE_SHIFT));
|
|
|
-}
|
|
|
-/* finally, fall back to mmap(), syscall1() style */
|
|
|
-#elif defined(__NR_mmap)
|
|
|
|
|
|
-# define __NR__dl_mmap_real __NR_mmap
|
|
|
-static __always_inline _syscall1(void *, _dl_mmap_real, unsigned long *, buffer);
|
|
|
-static __always_inline void * _dl_mmap(void * addr, unsigned long size, int prot,
|
|
|
- int flags, int fd, unsigned long offset)
|
|
|
-{
|
|
|
- unsigned long buffer[6];
|
|
|
+ /* gcc needs help with putting things onto the stack */
|
|
|
+ shifted = offset >> MMAP2_PAGE_SHIFT;
|
|
|
+ return (void *)INLINE_SYSCALL(mmap2, 6, addr, size, prot, flags, fd, shifted);
|
|
|
|
|
|
+#elif defined(__NR_mmap)
|
|
|
+ /* finally, fall back to mmap(), syscall1() style */
|
|
|
+ unsigned long buffer[6];
|
|
|
buffer[0] = (unsigned long) addr;
|
|
|
buffer[1] = (unsigned long) size;
|
|
|
buffer[2] = (unsigned long) prot;
|
|
|
buffer[3] = (unsigned long) flags;
|
|
|
buffer[4] = (unsigned long) fd;
|
|
|
buffer[5] = (unsigned long) offset;
|
|
|
- return (void *) _dl_mmap_real(buffer);
|
|
|
-}
|
|
|
-
|
|
|
+ return (void *)INLINE_SYSCALL(mmap, 1, buffer);
|
|
|
#else
|
|
|
# error "Your architecture doesn't seem to provide mmap() !?"
|
|
|
#endif
|
|
|
+}
|
|
|
|
|
|
#endif /* _LD_SYSCALL_H_ */
|