mmap.c 860 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #include <unistd.h>
  2. #include <sys/mman.h>
  3. #include <errno.h>
  4. #include <stdint.h>
  5. #include <limits.h>
  6. #include "syscall.h"
  7. #include "libc.h"
  8. static void dummy1(int x) { }
  9. static void dummy0(void) { }
  10. weak_alias(dummy1, __vm_lock);
  11. weak_alias(dummy0, __vm_unlock);
  12. #define OFF_MASK ((-0x2000ULL << (8*sizeof(long)-1)) | 0xfff)
  13. void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off)
  14. {
  15. void *ret;
  16. if (off & OFF_MASK) {
  17. errno = EINVAL;
  18. return MAP_FAILED;
  19. }
  20. if (len >= PTRDIFF_MAX) {
  21. errno = ENOMEM;
  22. return MAP_FAILED;
  23. }
  24. if (flags & MAP_FIXED) __vm_lock(-1);
  25. #ifdef SYS_mmap2
  26. ret = (void *)syscall(SYS_mmap2, start, len, prot, flags, fd, off>>12);
  27. #else
  28. ret = (void *)syscall(SYS_mmap, start, len, prot, flags, fd, off);
  29. #endif
  30. if (flags & MAP_FIXED) __vm_unlock();
  31. return ret;
  32. }
  33. weak_alias(__mmap, mmap);
  34. LFS64(mmap);