| /* |
| * mmap.c |
| */ |
| |
| #include <stdint.h> |
| #include <errno.h> |
| #include <sys/syscall.h> |
| #include <sys/mman.h> |
| #include <asm/page.h> /* For PAGE_SHIFT */ |
| |
| #if defined(__sparc__) |
| # define MMAP2_SHIFT 12 /* Fixed by syscall definition */ |
| #else |
| # define MMAP2_SHIFT PAGE_SHIFT |
| #endif |
| #define MMAP2_MASK ((1UL << MMAP2_SHIFT)-1) |
| |
| /* |
| * Prefer mmap2() over mmap(), except on the architectures listed |
| */ |
| |
| #if defined(__NR_mmap2) && !defined(__sparc__) && !defined(__ia64__) |
| |
| /* This architecture uses mmap2() */ |
| |
| static inline _syscall6(void *,mmap2,void *,start,size_t,length,int,prot,int,flags,int,fd,off_t,offset); |
| |
| /* The Linux mmap2() system call takes a page offset as the offset argument. |
| We need to make sure we have the proper conversion in place. */ |
| |
| void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) |
| { |
| if ( offset & MMAP2_MASK ) { |
| errno = EINVAL; |
| return MAP_FAILED; |
| } |
| |
| return mmap2(start, length, prot, flags, fd, offset >> MMAP2_SHIFT); |
| } |
| |
| #else |
| |
| /* This architecture uses a plain mmap() system call */ |
| /* Only use this for architectures where mmap() is a real 6-argument system call! */ |
| |
| _syscall6(void *,mmap,void *,start,size_t,length,int,prot,int,flags,int,fd,off_t,offset); |
| |
| #endif |
| |
| |
| |