author | Wolfgang Rosenauer <wr@rosenauer.org> |
Tue, 14 Jun 2016 22:13:50 +0200 | |
branch | firefox47 |
changeset 919 | 6838f0c032f8 |
permissions | -rw-r--r-- |
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 |