mozilla-aarch64-48bit-va.patch
author Wolfgang Rosenauer <wr@rosenauer.org>
Mon, 01 Aug 2016 14:45:11 +0200
changeset 923 3cc9f17ca9bb
parent 919 6838f0c032f8
permissions -rw-r--r--
prepare FF48
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
919
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     1
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     2
# HG changeset patch
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     3
# User Zheng Xu <zheng.xu@linaro.org>
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     4
# Date 1464657720 -7200
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     5
# Node ID dfaafbaaa2919a033c4c0abdd5830f4ea413bed6
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     6
# Parent  499f16ca85ec48d1896a1633730715f32bd62140
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     7
Bug 1143022 - Manually mmap on arm64 to ensure high 17 bits are clear. r=ehoogeveen
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     8
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     9
There might be 48-bit VA on arm64 depending on kernel configuration.
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    10
Manually mmap heap memory to align with the assumption made by JS engine.
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    11
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    12
diff --git a/js/src/gc/Memory.cpp b/js/src/gc/Memory.cpp
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    13
--- a/js/src/gc/Memory.cpp
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    14
+++ b/js/src/gc/Memory.cpp
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    15
@@ -430,17 +430,17 @@ InitMemorySubsystem()
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    16
     if (pageSize == 0)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    17
         pageSize = allocGranularity = size_t(sysconf(_SC_PAGESIZE));
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    18
 }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    19
 
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    20
 static inline void*
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    21
 MapMemoryAt(void* desired, size_t length, int prot = PROT_READ | PROT_WRITE,
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    22
             int flags = MAP_PRIVATE | MAP_ANON, int fd = -1, off_t offset = 0)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    23
 {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    24
-#if defined(__ia64__) || (defined(__sparc64__) && defined(__NetBSD__))
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    25
+#if defined(__ia64__) || (defined(__sparc64__) && defined(__NetBSD__)) || defined(__aarch64__)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    26
     MOZ_ASSERT(0xffff800000000000ULL & (uintptr_t(desired) + length - 1) == 0);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    27
 #endif
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    28
     void* region = mmap(desired, length, prot, flags, fd, offset);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    29
     if (region == MAP_FAILED)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    30
         return nullptr;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    31
     /*
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    32
      * mmap treats the given address as a hint unless the MAP_FIXED flag is
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    33
      * used (which isn't usually what you want, as this overrides existing
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    34
@@ -480,16 +480,51 @@ MapMemory(size_t length, int prot = PROT
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    35
      * as out of memory.
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    36
      */
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    37
     if ((uintptr_t(region) + (length - 1)) & 0xffff800000000000) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    38
         if (munmap(region, length))
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    39
             MOZ_ASSERT(errno == ENOMEM);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    40
         return nullptr;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    41
     }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    42
     return region;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    43
+#elif defined(__aarch64__)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    44
+   /*
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    45
+    * There might be similar virtual address issue on arm64 which depends on
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    46
+    * hardware and kernel configurations. But the work around is slightly
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    47
+    * different due to the different mmap behavior.
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    48
+    *
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    49
+    * TODO: Merge with the above code block if this implementation works for
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    50
+    * ia64 and sparc64.
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    51
+    */
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    52
+    const uintptr_t start = UINT64_C(0x0000070000000000);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    53
+    const uintptr_t end   = UINT64_C(0x0000800000000000);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    54
+    const uintptr_t step  = ChunkSize;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    55
+   /*
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    56
+    * Optimization options if there are too many retries in practice:
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    57
+    * 1. Examine /proc/self/maps to find an available address. This file is
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    58
+    *    not always available, however. In addition, even if we examine
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    59
+    *    /proc/self/maps, we may still need to retry several times due to
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    60
+    *    racing with other threads.
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    61
+    * 2. Use a global/static variable with lock to track the addresses we have
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    62
+    *    allocated or tried.
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    63
+    */
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    64
+    uintptr_t hint;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    65
+    void* region = MAP_FAILED;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    66
+    for (hint = start; region == MAP_FAILED && hint + length <= end; hint += step) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    67
+        region = mmap((void*)hint, length, prot, flags, fd, offset);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    68
+        if (region != MAP_FAILED) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    69
+            if ((uintptr_t(region) + (length - 1)) & 0xffff800000000000) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    70
+                if (munmap(region, length)) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    71
+                    MOZ_ASSERT(errno == ENOMEM);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    72
+                }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    73
+                region = MAP_FAILED;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    74
+            }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    75
+        }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    76
+    }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    77
+    return region == MAP_FAILED ? nullptr : region;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    78
 #else
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    79
     void* region = MozTaggedAnonymousMmap(nullptr, length, prot, flags, fd, offset, "js-gc-heap");
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    80
     if (region == MAP_FAILED)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    81
         return nullptr;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    82
     return region;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    83
 #endif
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    84
 }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    85
 
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    86
diff --git a/js/src/jsapi-tests/testGCAllocator.cpp b/js/src/jsapi-tests/testGCAllocator.cpp
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    87
--- a/js/src/jsapi-tests/testGCAllocator.cpp
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    88
+++ b/js/src/jsapi-tests/testGCAllocator.cpp
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    89
@@ -307,48 +307,72 @@ void* mapMemoryAt(void* desired, size_t 
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    90
 void* mapMemory(size_t length) { return nullptr; }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    91
 void unmapPages(void* p, size_t size) { }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    92
 
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    93
 #elif defined(XP_UNIX)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    94
 
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    95
 void*
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    96
 mapMemoryAt(void* desired, size_t length)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    97
 {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    98
-#if defined(__ia64__) || (defined(__sparc64__) && defined(__NetBSD__))
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    99
+#if defined(__ia64__) || (defined(__sparc64__) && defined(__NetBSD__)) || defined(__aarch64__)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   100
     MOZ_RELEASE_ASSERT(0xffff800000000000ULL & (uintptr_t(desired) + length - 1) == 0);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   101
 #endif
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   102
     void* region = mmap(desired, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   103
     if (region == MAP_FAILED)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   104
         return nullptr;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   105
     if (region != desired) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   106
         if (munmap(region, length))
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   107
             MOZ_RELEASE_ASSERT(errno == ENOMEM);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   108
         return nullptr;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   109
     }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   110
     return region;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   111
 }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   112
 
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   113
 void*
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   114
 mapMemory(size_t length)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   115
 {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   116
-    void* hint = nullptr;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   117
+    int prot = PROT_READ | PROT_WRITE;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   118
+    int flags = MAP_PRIVATE | MAP_ANON;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   119
+    int fd = -1;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   120
+    off_t offset = 0;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   121
+    // The test code must be aligned with the implementation in gc/Memory.cpp.
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   122
 #if defined(__ia64__) || (defined(__sparc64__) && defined(__NetBSD__))
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   123
-    hint = (void*)0x0000070000000000ULL;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   124
-#endif
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   125
-    void* region = mmap(hint, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   126
+    void* region = mmap((void*)0x0000070000000000, length, prot, flags, fd, offset);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   127
     if (region == MAP_FAILED)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   128
         return nullptr;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   129
-#if defined(__ia64__) || (defined(__sparc64__) && defined(__NetBSD__))
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   130
-    if ((uintptr_t(region) + (length - 1)) & 0xffff800000000000ULL) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   131
+    if ((uintptr_t(region) + (length - 1)) & 0xffff800000000000) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   132
         if (munmap(region, length))
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   133
             MOZ_RELEASE_ASSERT(errno == ENOMEM);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   134
         return nullptr;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   135
     }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   136
+    return region;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   137
+#elif defined(__aarch64__)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   138
+    const uintptr_t start = UINT64_C(0x0000070000000000);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   139
+    const uintptr_t end   = UINT64_C(0x0000800000000000);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   140
+    const uintptr_t step  = ChunkSize;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   141
+    uintptr_t hint;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   142
+    void* region = MAP_FAILED;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   143
+    for (hint = start; region == MAP_FAILED && hint + length <= end; hint += step) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   144
+        region = mmap((void*)hint, length, prot, flags, fd, offset);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   145
+        if (region != MAP_FAILED) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   146
+            if ((uintptr_t(region) + (length - 1)) & 0xffff800000000000) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   147
+                if (munmap(region, length)) {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   148
+                    MOZ_RELEASE_ASSERT(errno == ENOMEM);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   149
+                }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   150
+                region = MAP_FAILED;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   151
+            }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   152
+        }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   153
+    }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   154
+    return region == MAP_FAILED ? nullptr : region;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   155
+#else
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   156
+    void* region = mmap(nullptr, length, prot, flags, fd, offset);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   157
+    if (region == MAP_FAILED)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   158
+        return nullptr;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   159
+    return region;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   160
 #endif
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   161
-    return region;
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   162
 }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   163
 
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   164
 void
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   165
 unmapPages(void* p, size_t size)
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   166
 {
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   167
     if (munmap(p, size))
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   168
         MOZ_RELEASE_ASSERT(errno == ENOMEM);
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   169
 }
6838f0c032f8 -------------------------------------------------------------------
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   170