Commit 95fc991c authored by jan.koester's avatar jan.koester
Browse files

new mapping method for example aarch64

parent dd75a532
Loading
Loading
Loading
Loading
+49 −2
Original line number Diff line number Diff line
@@ -48,11 +48,58 @@ __attribute__((visibility("hidden"))) uint32_t string2uint32_t(const char* str,i
    return res;
};

#if defined(__LP64__) && !defined(__x86_64__)
   __attribute__((visibility("hidden"))) static uintptr_t next_mem_pos_;
#endif

__attribute__((visibility("hidden"))) uint32_t map32(uint32_t size){
#ifdef X86_64
    return mmap(0,size,PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
#else
    return mmap(0,size,PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
#endif

#if defined(__LP64__) && !defined(__x86_64__)
  // MAP_32BIT only available on x86_64.
  void* actual = MAP_FAILED;
  std::string strerr;
  if (low_4gb && expected == nullptr) {
    flags |= MAP_FIXED;

    for (uintptr_t ptr = next_mem_pos; ptr < 4 * GB; ptr += kPageSize) {
      uintptr_t tail_ptr;

      // Check pages are free.
      bool safe = true;
      for (tail_ptr = ptr; tail_ptr < ptr + page_aligned_byte_count; tail_ptr += kPageSize) {
        if (msync(reinterpret_cast<void*>(tail_ptr), kPageSize, 0) == 0) {
          safe = false;
          break;
        } else {
          DCHECK_EQ(errno, ENOMEM);
        }
      }

      next_mem_pos_ = tail_ptr;  // update early, as we break out when we found and mapped a region

      if (safe == true) {
        actual = mmap(reinterpret_cast<void*>(ptr), page_aligned_byte_count, prot, flags, fd.get(),
                      0);
        if (actual != MAP_FAILED) {
          break;
        }
      } else {
        // Skip over last page.
        ptr = tail_ptr;
      }
    }

    if (actual == MAP_FAILED) {
      strerr = "Could not find contiguous low-memory space.";
    }
  } else {
        actual = mmap(expected, page_aligned_byte_count, prot, flags, fd.get(), 0);
        strerr = strerror(errno);
  }
  return actual;
#endif
};