blob: ab444c92e1679e723a3e7381815334d571be75d2 [file] [log] [blame]
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <sys/mman.h>
/* May integate into one header file */
#define MAP_ANONYMOUS_PORTABLE 0x20
#define PROT_SEM_PORTABLE 0x8
extern void* __mmap2(void*, size_t, int, int, int, size_t);
static inline int mips_change_prot(int prot) {
if (prot & PROT_SEM_PORTABLE) {
prot &= ~PROT_SEM_PORTABLE;
prot |= PROT_SEM;
}
return prot;
}
static inline int mips_change_flags(int flags) {
if (flags & MAP_ANONYMOUS_PORTABLE) {
flags &= ~MAP_ANONYMOUS_PORTABLE;
flags |= MAP_ANONYMOUS;
}
return flags;
}
#define MMAP2_SHIFT 12
void* mmap(void* addr, size_t size, int prot, int flags, int fd, long offset) {
if ( offset & ((1UL << MMAP2_SHIFT)-1) ) {
errno = EINVAL;
return MAP_FAILED;
}
prot = mips_change_prot(prot);
flags = mips_change_flags(flags);
return __mmap2(addr, size, prot, flags, fd, (size_t)offset >> MMAP2_SHIFT);
}