18 #ifndef ABSL_BASE_INTERNAL_DIRECT_MMAP_H_
19 #define ABSL_BASE_INTERNAL_DIRECT_MMAP_H_
21 #include "absl/base/config.h"
29 #include <sys/types.h>
31 #include <sys/syscall.h>
36 #include <linux/unistd.h>
44 #if defined(__BIONIC__) || !defined(__GLIBC__)
47 #include <asm/sgidefs.h>
50 #endif // __BIONIC__ || !__GLIBC__
55 extern "C" void* __mmap2(
void*,
size_t,
int,
int,
int,
size_t);
56 #if defined(__NR_mmap) && !defined(SYS_mmap)
57 #define SYS_mmap __NR_mmap
60 #define SYS_munmap __NR_munmap
64 #if defined(__NR_mmap2) && !defined(SYS_mmap2)
65 #define SYS_mmap2 __NR_mmap2
70 namespace base_internal {
74 inline void* DirectMmap(
void*
start,
size_t length,
int prot,
int flags,
int fd,
76 #if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || \
77 defined(__m68k__) || defined(__sh__) || \
78 (defined(__hppa__) && !defined(__LP64__)) || \
79 (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || \
80 (defined(__PPC__) && !defined(__PPC64__)) || \
81 (defined(__riscv) && __riscv_xlen == 32) || \
82 (defined(__s390__) && !defined(__s390x__)) || \
83 (defined(__sparc__) && !defined(__arch64__))
85 static int pagesize = 0;
87 #if defined(__wasm__) || defined(__asmjs__)
88 pagesize = getpagesize();
90 pagesize = sysconf(_SC_PAGESIZE);
102 return reinterpret_cast<void*
>(
104 static_cast<off_t
>(
offset / pagesize)));
106 #elif defined(__s390x__)
108 unsigned long buf[6] = {
reinterpret_cast<unsigned long>(
start),
109 static_cast<unsigned long>(
length),
110 static_cast<unsigned long>(prot),
111 static_cast<unsigned long>(
flags),
112 static_cast<unsigned long>(fd),
113 static_cast<unsigned long>(
offset)};
114 return reinterpret_cast<void*
>(
syscall(SYS_mmap,
buf));
115 #elif defined(__x86_64__)
122 #define MMAP_SYSCALL_ARG(x) ((uint64_t)(uintptr_t)(x))
123 return reinterpret_cast<void*
>(
125 MMAP_SYSCALL_ARG(prot), MMAP_SYSCALL_ARG(
flags),
127 #undef MMAP_SYSCALL_ARG
128 #else // Remaining 64-bit aritectures.
129 static_assert(
sizeof(
unsigned long) == 8,
"Platform is not 64-bit");
130 return reinterpret_cast<void*
>(
135 inline int DirectMunmap(
void*
start,
size_t length) {
150 namespace base_internal {
152 inline void* DirectMmap(
void*
start,
size_t length,
int prot,
int flags,
int fd,
157 inline int DirectMunmap(
void*
start,
size_t length) {
167 #endif // ABSL_HAVE_MMAP
169 #endif // ABSL_BASE_INTERNAL_DIRECT_MMAP_H_