Mercurial > hg > graal-compiler
annotate src/share/vm/runtime/virtualspace.cpp @ 14418:cfd05ec74089
8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
Summary: Some platforms, as ppc and s390x/zArch require that 32-bit ints are passed as 64-bit values to C functions. This change adds support to adapt the signature and to issue proper casts to c2-compiled stubs. The functions are used in generate_native_wrapper(). Adapt signature used by the compiler as in PhaseIdealLoop::intrinsify_fill().
Reviewed-by: kvn
author | goetz |
---|---|
date | Wed, 18 Sep 2013 14:34:56 -0700 |
parents | e2722a66aba7 |
children | 2b8e28fdf503 |
rev | line source |
---|---|
0 | 1 /* |
7623
203f64878aab
7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents:
7433
diff
changeset
|
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "oops/markOop.hpp" | |
27 #include "oops/oop.inline.hpp" | |
28 #include "runtime/virtualspace.hpp" | |
6197 | 29 #include "services/memTracker.hpp" |
1972 | 30 #ifdef TARGET_OS_FAMILY_linux |
31 # include "os_linux.inline.hpp" | |
32 #endif | |
33 #ifdef TARGET_OS_FAMILY_solaris | |
34 # include "os_solaris.inline.hpp" | |
35 #endif | |
36 #ifdef TARGET_OS_FAMILY_windows | |
37 # include "os_windows.inline.hpp" | |
38 #endif | |
14411 | 39 #ifdef TARGET_OS_FAMILY_aix |
40 # include "os_aix.inline.hpp" | |
41 #endif | |
3960 | 42 #ifdef TARGET_OS_FAMILY_bsd |
43 # include "os_bsd.inline.hpp" | |
44 #endif | |
0 | 45 |
46 | |
47 // ReservedSpace | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
48 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
49 // Dummy constructor |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
50 ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0), |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
51 _alignment(0), _special(false), _executable(false) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
52 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
53 |
0 | 54 ReservedSpace::ReservedSpace(size_t size) { |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
55 size_t page_size = os::page_size_for_region(size, size, 1); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
56 bool large_pages = page_size != (size_t)os::vm_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
57 // Don't force the alignment to be large page aligned, |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
58 // since that will waste memory. |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
59 size_t alignment = os::vm_allocation_granularity(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
60 initialize(size, alignment, large_pages, NULL, 0, false); |
0 | 61 } |
62 | |
63 ReservedSpace::ReservedSpace(size_t size, size_t alignment, | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
64 bool large, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
65 char* requested_address, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
66 const size_t noaccess_prefix) { |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
67 initialize(size+noaccess_prefix, alignment, large, requested_address, |
656 | 68 noaccess_prefix, false); |
69 } | |
70 | |
71 ReservedSpace::ReservedSpace(size_t size, size_t alignment, | |
72 bool large, | |
73 bool executable) { | |
74 initialize(size, alignment, large, NULL, 0, executable); | |
0 | 75 } |
76 | |
1618 | 77 // Helper method. |
78 static bool failed_to_reserve_as_requested(char* base, char* requested_address, | |
79 const size_t size, bool special) | |
80 { | |
81 if (base == requested_address || requested_address == NULL) | |
82 return false; // did not fail | |
83 | |
84 if (base != NULL) { | |
85 // Different reserve address may be acceptable in other cases | |
86 // but for compressed oops heap should be at requested address. | |
87 assert(UseCompressedOops, "currently requested address used only for compressed oops"); | |
88 if (PrintCompressedOopsMode) { | |
89 tty->cr(); | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
90 tty->print_cr("Reserved memory not at requested address: " PTR_FORMAT " vs " PTR_FORMAT, base, requested_address); |
1618 | 91 } |
92 // OS ignored requested address. Try different address. | |
93 if (special) { | |
94 if (!os::release_memory_special(base, size)) { | |
95 fatal("os::release_memory_special failed"); | |
96 } | |
97 } else { | |
98 if (!os::release_memory(base, size)) { | |
99 fatal("os::release_memory failed"); | |
100 } | |
101 } | |
102 } | |
103 return true; | |
104 } | |
105 | |
0 | 106 void ReservedSpace::initialize(size_t size, size_t alignment, bool large, |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
107 char* requested_address, |
656 | 108 const size_t noaccess_prefix, |
109 bool executable) { | |
0 | 110 const size_t granularity = os::vm_allocation_granularity(); |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
111 assert((size & (granularity - 1)) == 0, |
0 | 112 "size not aligned to os::vm_allocation_granularity()"); |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
113 assert((alignment & (granularity - 1)) == 0, |
0 | 114 "alignment not aligned to os::vm_allocation_granularity()"); |
115 assert(alignment == 0 || is_power_of_2((intptr_t)alignment), | |
116 "not a power of 2"); | |
117 | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
118 alignment = MAX2(alignment, (size_t)os::vm_page_size()); |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
119 |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
120 // Assert that if noaccess_prefix is used, it is the same as alignment. |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
121 assert(noaccess_prefix == 0 || |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
122 noaccess_prefix == alignment, "noaccess prefix wrong"); |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
123 |
0 | 124 _base = NULL; |
125 _size = 0; | |
126 _special = false; | |
656 | 127 _executable = executable; |
0 | 128 _alignment = 0; |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
129 _noaccess_prefix = 0; |
0 | 130 if (size == 0) { |
131 return; | |
132 } | |
133 | |
134 // If OS doesn't support demand paging for large page memory, we need | |
135 // to use reserve_memory_special() to reserve and pin the entire region. | |
136 bool special = large && !os::can_commit_large_page_memory(); | |
137 char* base = NULL; | |
138 | |
1618 | 139 if (requested_address != 0) { |
140 requested_address -= noaccess_prefix; // adjust requested address | |
141 assert(requested_address != NULL, "huge noaccess prefix?"); | |
142 } | |
143 | |
0 | 144 if (special) { |
145 | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
146 base = os::reserve_memory_special(size, alignment, requested_address, executable); |
0 | 147 |
148 if (base != NULL) { | |
1618 | 149 if (failed_to_reserve_as_requested(base, requested_address, size, true)) { |
150 // OS ignored requested address. Try different address. | |
151 return; | |
152 } | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
153 // Check alignment constraints. |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
154 assert((uintptr_t) base % alignment == 0, |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
155 err_msg("Large pages returned a non-aligned address, base: " |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
156 PTR_FORMAT " alignment: " PTR_FORMAT, |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
157 base, (void*)(uintptr_t)alignment)); |
0 | 158 _special = true; |
159 } else { | |
160 // failed; try to reserve regular memory below | |
1618 | 161 if (UseLargePages && (!FLAG_IS_DEFAULT(UseLargePages) || |
162 !FLAG_IS_DEFAULT(LargePageSizeInBytes))) { | |
163 if (PrintCompressedOopsMode) { | |
164 tty->cr(); | |
165 tty->print_cr("Reserve regular memory without large pages."); | |
166 } | |
167 } | |
0 | 168 } |
169 } | |
170 | |
171 if (base == NULL) { | |
172 // Optimistically assume that the OSes returns an aligned base pointer. | |
173 // When reserving a large address range, most OSes seem to align to at | |
174 // least 64K. | |
175 | |
176 // If the memory was requested at a particular address, use | |
177 // os::attempt_reserve_memory_at() to avoid over mapping something | |
178 // important. If available space is not detected, return NULL. | |
179 | |
180 if (requested_address != 0) { | |
1618 | 181 base = os::attempt_reserve_memory_at(size, requested_address); |
182 if (failed_to_reserve_as_requested(base, requested_address, size, false)) { | |
183 // OS ignored requested address. Try different address. | |
184 base = NULL; | |
185 } | |
0 | 186 } else { |
187 base = os::reserve_memory(size, NULL, alignment); | |
188 } | |
189 | |
190 if (base == NULL) return; | |
191 | |
192 // Check alignment constraints | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
193 if ((((size_t)base + noaccess_prefix) & (alignment - 1)) != 0) { |
0 | 194 // Base not aligned, retry |
195 if (!os::release_memory(base, size)) fatal("os::release_memory failed"); | |
7433
730cc4ddd550
7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents:
6725
diff
changeset
|
196 // Make sure that size is aligned |
0 | 197 size = align_size_up(size, alignment); |
7433
730cc4ddd550
7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents:
6725
diff
changeset
|
198 base = os::reserve_memory_aligned(size, alignment); |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
199 |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
200 if (requested_address != 0 && |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
201 failed_to_reserve_as_requested(base, requested_address, size, false)) { |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
202 // As a result of the alignment constraints, the allocated base differs |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
203 // from the requested address. Return back to the caller who can |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
204 // take remedial action (like try again without a requested address). |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
205 assert(_base == NULL, "should be"); |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
206 return; |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
207 } |
0 | 208 } |
209 } | |
210 // Done | |
211 _base = base; | |
212 _size = size; | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
213 _alignment = alignment; |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
214 _noaccess_prefix = noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
215 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
216 // Assert that if noaccess_prefix is used, it is the same as alignment. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
217 assert(noaccess_prefix == 0 || |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
218 noaccess_prefix == _alignment, "noaccess prefix wrong"); |
0 | 219 |
220 assert(markOopDesc::encode_pointer_as_mark(_base)->decode_pointer() == _base, | |
221 "area must be distinguisable from marks for mark-sweep"); | |
222 assert(markOopDesc::encode_pointer_as_mark(&_base[size])->decode_pointer() == &_base[size], | |
223 "area must be distinguisable from marks for mark-sweep"); | |
224 } | |
225 | |
226 | |
227 ReservedSpace::ReservedSpace(char* base, size_t size, size_t alignment, | |
656 | 228 bool special, bool executable) { |
0 | 229 assert((size % os::vm_allocation_granularity()) == 0, |
230 "size not allocation aligned"); | |
231 _base = base; | |
232 _size = size; | |
233 _alignment = alignment; | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
234 _noaccess_prefix = 0; |
0 | 235 _special = special; |
656 | 236 _executable = executable; |
0 | 237 } |
238 | |
239 | |
240 ReservedSpace ReservedSpace::first_part(size_t partition_size, size_t alignment, | |
241 bool split, bool realloc) { | |
242 assert(partition_size <= size(), "partition failed"); | |
243 if (split) { | |
656 | 244 os::split_reserved_memory(base(), size(), partition_size, realloc); |
0 | 245 } |
656 | 246 ReservedSpace result(base(), partition_size, alignment, special(), |
247 executable()); | |
0 | 248 return result; |
249 } | |
250 | |
251 | |
252 ReservedSpace | |
253 ReservedSpace::last_part(size_t partition_size, size_t alignment) { | |
254 assert(partition_size <= size(), "partition failed"); | |
255 ReservedSpace result(base() + partition_size, size() - partition_size, | |
656 | 256 alignment, special(), executable()); |
0 | 257 return result; |
258 } | |
259 | |
260 | |
261 size_t ReservedSpace::page_align_size_up(size_t size) { | |
262 return align_size_up(size, os::vm_page_size()); | |
263 } | |
264 | |
265 | |
266 size_t ReservedSpace::page_align_size_down(size_t size) { | |
267 return align_size_down(size, os::vm_page_size()); | |
268 } | |
269 | |
270 | |
271 size_t ReservedSpace::allocation_align_size_up(size_t size) { | |
272 return align_size_up(size, os::vm_allocation_granularity()); | |
273 } | |
274 | |
275 | |
276 size_t ReservedSpace::allocation_align_size_down(size_t size) { | |
277 return align_size_down(size, os::vm_allocation_granularity()); | |
278 } | |
279 | |
280 | |
281 void ReservedSpace::release() { | |
282 if (is_reserved()) { | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
283 char *real_base = _base - _noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
284 const size_t real_size = _size + _noaccess_prefix; |
0 | 285 if (special()) { |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
286 os::release_memory_special(real_base, real_size); |
0 | 287 } else{ |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
288 os::release_memory(real_base, real_size); |
0 | 289 } |
290 _base = NULL; | |
291 _size = 0; | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
292 _noaccess_prefix = 0; |
0 | 293 _special = false; |
656 | 294 _executable = false; |
0 | 295 } |
296 } | |
297 | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
298 void ReservedSpace::protect_noaccess_prefix(const size_t size) { |
1618 | 299 assert( (_noaccess_prefix != 0) == (UseCompressedOops && _base != NULL && |
4934
7df3125953cb
7146354: Re-enable Compressed OOPs after 7118647 is resolved
coleenp
parents:
3960
diff
changeset
|
300 (Universe::narrow_oop_base() != NULL) && |
1618 | 301 Universe::narrow_oop_use_implicit_null_checks()), |
302 "noaccess_prefix should be used only with non zero based compressed oops"); | |
303 | |
304 // If there is no noaccess prefix, return. | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
305 if (_noaccess_prefix == 0) return; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
306 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
307 assert(_noaccess_prefix >= (size_t)os::vm_page_size(), |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
308 "must be at least page size big"); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
309 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
310 // Protect memory at the base of the allocated region. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
311 // If special, the page was committed (only matters on windows) |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
312 if (!os::protect_memory(_base, _noaccess_prefix, os::MEM_PROT_NONE, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
313 _special)) { |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
314 fatal("cannot protect protection page"); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
315 } |
1618 | 316 if (PrintCompressedOopsMode) { |
317 tty->cr(); | |
318 tty->print_cr("Protected page at the reserved heap base: " PTR_FORMAT " / " INTX_FORMAT " bytes", _base, _noaccess_prefix); | |
319 } | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
320 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
321 _base += _noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
322 _size -= _noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
323 assert((size == _size) && ((uintptr_t)_base % _alignment == 0), |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
324 "must be exactly of required size and alignment"); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
325 } |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
326 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
327 ReservedHeapSpace::ReservedHeapSpace(size_t size, size_t alignment, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
328 bool large, char* requested_address) : |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
329 ReservedSpace(size, alignment, large, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
330 requested_address, |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
380
diff
changeset
|
331 (UseCompressedOops && (Universe::narrow_oop_base() != NULL) && |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
380
diff
changeset
|
332 Universe::narrow_oop_use_implicit_null_checks()) ? |
325
93befa083681
6741004: UseLargePages + UseCompressedOops breaks implicit null checking guard page
coleenp
parents:
237
diff
changeset
|
333 lcm(os::vm_page_size(), alignment) : 0) { |
6197 | 334 if (base() > 0) { |
335 MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap); | |
336 } | |
337 | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
338 // Only reserved space for the java heap should have a noaccess_prefix |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
339 // if using compressed oops. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
340 protect_noaccess_prefix(size); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
341 } |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
342 |
656 | 343 // Reserve space for code segment. Same as Java heap only we mark this as |
344 // executable. | |
345 ReservedCodeSpace::ReservedCodeSpace(size_t r_size, | |
346 size_t rs_align, | |
347 bool large) : | |
348 ReservedSpace(r_size, rs_align, large, /*executable*/ true) { | |
6197 | 349 MemTracker::record_virtual_memory_type((address)base(), mtCode); |
656 | 350 } |
351 | |
0 | 352 // VirtualSpace |
353 | |
354 VirtualSpace::VirtualSpace() { | |
355 _low_boundary = NULL; | |
356 _high_boundary = NULL; | |
357 _low = NULL; | |
358 _high = NULL; | |
359 _lower_high = NULL; | |
360 _middle_high = NULL; | |
361 _upper_high = NULL; | |
362 _lower_high_boundary = NULL; | |
363 _middle_high_boundary = NULL; | |
364 _upper_high_boundary = NULL; | |
365 _lower_alignment = 0; | |
366 _middle_alignment = 0; | |
367 _upper_alignment = 0; | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
368 _special = false; |
656 | 369 _executable = false; |
0 | 370 } |
371 | |
372 | |
373 bool VirtualSpace::initialize(ReservedSpace rs, size_t committed_size) { | |
374 if(!rs.is_reserved()) return false; // allocation failed. | |
375 assert(_low_boundary == NULL, "VirtualSpace already initialized"); | |
376 _low_boundary = rs.base(); | |
377 _high_boundary = low_boundary() + rs.size(); | |
378 | |
379 _low = low_boundary(); | |
380 _high = low(); | |
381 | |
382 _special = rs.special(); | |
656 | 383 _executable = rs.executable(); |
0 | 384 |
385 // When a VirtualSpace begins life at a large size, make all future expansion | |
386 // and shrinking occur aligned to a granularity of large pages. This avoids | |
387 // fragmentation of physical addresses that inhibits the use of large pages | |
388 // by the OS virtual memory system. Empirically, we see that with a 4MB | |
389 // page size, the only spaces that get handled this way are codecache and | |
390 // the heap itself, both of which provide a substantial performance | |
391 // boost in many benchmarks when covered by large pages. | |
392 // | |
393 // No attempt is made to force large page alignment at the very top and | |
394 // bottom of the space if they are not aligned so already. | |
395 _lower_alignment = os::vm_page_size(); | |
396 _middle_alignment = os::page_size_for_region(rs.size(), rs.size(), 1); | |
397 _upper_alignment = os::vm_page_size(); | |
398 | |
399 // End of each region | |
400 _lower_high_boundary = (char*) round_to((intptr_t) low_boundary(), middle_alignment()); | |
401 _middle_high_boundary = (char*) round_down((intptr_t) high_boundary(), middle_alignment()); | |
402 _upper_high_boundary = high_boundary(); | |
403 | |
404 // High address of each region | |
405 _lower_high = low_boundary(); | |
406 _middle_high = lower_high_boundary(); | |
407 _upper_high = middle_high_boundary(); | |
408 | |
409 // commit to initial size | |
410 if (committed_size > 0) { | |
411 if (!expand_by(committed_size)) { | |
412 return false; | |
413 } | |
414 } | |
415 return true; | |
416 } | |
417 | |
418 | |
419 VirtualSpace::~VirtualSpace() { | |
420 release(); | |
421 } | |
422 | |
423 | |
424 void VirtualSpace::release() { | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
425 // This does not release memory it never reserved. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
426 // Caller must release via rs.release(); |
0 | 427 _low_boundary = NULL; |
428 _high_boundary = NULL; | |
429 _low = NULL; | |
430 _high = NULL; | |
431 _lower_high = NULL; | |
432 _middle_high = NULL; | |
433 _upper_high = NULL; | |
434 _lower_high_boundary = NULL; | |
435 _middle_high_boundary = NULL; | |
436 _upper_high_boundary = NULL; | |
437 _lower_alignment = 0; | |
438 _middle_alignment = 0; | |
439 _upper_alignment = 0; | |
440 _special = false; | |
656 | 441 _executable = false; |
0 | 442 } |
443 | |
444 | |
445 size_t VirtualSpace::committed_size() const { | |
446 return pointer_delta(high(), low(), sizeof(char)); | |
447 } | |
448 | |
449 | |
450 size_t VirtualSpace::reserved_size() const { | |
451 return pointer_delta(high_boundary(), low_boundary(), sizeof(char)); | |
452 } | |
453 | |
454 | |
455 size_t VirtualSpace::uncommitted_size() const { | |
456 return reserved_size() - committed_size(); | |
457 } | |
458 | |
459 | |
460 bool VirtualSpace::contains(const void* p) const { | |
461 return low() <= (const char*) p && (const char*) p < high(); | |
462 } | |
463 | |
464 /* | |
465 First we need to determine if a particular virtual space is using large | |
466 pages. This is done at the initialize function and only virtual spaces | |
467 that are larger than LargePageSizeInBytes use large pages. Once we | |
468 have determined this, all expand_by and shrink_by calls must grow and | |
469 shrink by large page size chunks. If a particular request | |
470 is within the current large page, the call to commit and uncommit memory | |
471 can be ignored. In the case that the low and high boundaries of this | |
472 space is not large page aligned, the pages leading to the first large | |
473 page address and the pages after the last large page address must be | |
474 allocated with default pages. | |
475 */ | |
476 bool VirtualSpace::expand_by(size_t bytes, bool pre_touch) { | |
477 if (uncommitted_size() < bytes) return false; | |
478 | |
479 if (special()) { | |
480 // don't commit memory if the entire space is pinned in memory | |
481 _high += bytes; | |
482 return true; | |
483 } | |
484 | |
485 char* previous_high = high(); | |
486 char* unaligned_new_high = high() + bytes; | |
487 assert(unaligned_new_high <= high_boundary(), | |
488 "cannot expand by more than upper boundary"); | |
489 | |
490 // Calculate where the new high for each of the regions should be. If | |
491 // the low_boundary() and high_boundary() are LargePageSizeInBytes aligned | |
492 // then the unaligned lower and upper new highs would be the | |
493 // lower_high() and upper_high() respectively. | |
494 char* unaligned_lower_new_high = | |
495 MIN2(unaligned_new_high, lower_high_boundary()); | |
496 char* unaligned_middle_new_high = | |
497 MIN2(unaligned_new_high, middle_high_boundary()); | |
498 char* unaligned_upper_new_high = | |
499 MIN2(unaligned_new_high, upper_high_boundary()); | |
500 | |
501 // Align the new highs based on the regions alignment. lower and upper | |
502 // alignment will always be default page size. middle alignment will be | |
503 // LargePageSizeInBytes if the actual size of the virtual space is in | |
504 // fact larger than LargePageSizeInBytes. | |
505 char* aligned_lower_new_high = | |
506 (char*) round_to((intptr_t) unaligned_lower_new_high, lower_alignment()); | |
507 char* aligned_middle_new_high = | |
508 (char*) round_to((intptr_t) unaligned_middle_new_high, middle_alignment()); | |
509 char* aligned_upper_new_high = | |
510 (char*) round_to((intptr_t) unaligned_upper_new_high, upper_alignment()); | |
511 | |
512 // Determine which regions need to grow in this expand_by call. | |
513 // If you are growing in the lower region, high() must be in that | |
514 // region so calcuate the size based on high(). For the middle and | |
515 // upper regions, determine the starting point of growth based on the | |
516 // location of high(). By getting the MAX of the region's low address | |
517 // (or the prevoius region's high address) and high(), we can tell if it | |
518 // is an intra or inter region growth. | |
519 size_t lower_needs = 0; | |
520 if (aligned_lower_new_high > lower_high()) { | |
521 lower_needs = | |
522 pointer_delta(aligned_lower_new_high, lower_high(), sizeof(char)); | |
523 } | |
524 size_t middle_needs = 0; | |
525 if (aligned_middle_new_high > middle_high()) { | |
526 middle_needs = | |
527 pointer_delta(aligned_middle_new_high, middle_high(), sizeof(char)); | |
528 } | |
529 size_t upper_needs = 0; | |
530 if (aligned_upper_new_high > upper_high()) { | |
531 upper_needs = | |
532 pointer_delta(aligned_upper_new_high, upper_high(), sizeof(char)); | |
533 } | |
534 | |
535 // Check contiguity. | |
536 assert(low_boundary() <= lower_high() && | |
537 lower_high() <= lower_high_boundary(), | |
538 "high address must be contained within the region"); | |
539 assert(lower_high_boundary() <= middle_high() && | |
540 middle_high() <= middle_high_boundary(), | |
541 "high address must be contained within the region"); | |
542 assert(middle_high_boundary() <= upper_high() && | |
543 upper_high() <= upper_high_boundary(), | |
544 "high address must be contained within the region"); | |
545 | |
546 // Commit regions | |
547 if (lower_needs > 0) { | |
548 assert(low_boundary() <= lower_high() && | |
549 lower_high() + lower_needs <= lower_high_boundary(), | |
550 "must not expand beyond region"); | |
656 | 551 if (!os::commit_memory(lower_high(), lower_needs, _executable)) { |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
552 debug_only(warning("INFO: os::commit_memory(" PTR_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
553 ", lower_needs=" SIZE_FORMAT ", %d) failed", |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
554 lower_high(), lower_needs, _executable);) |
0 | 555 return false; |
556 } else { | |
557 _lower_high += lower_needs; | |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
558 } |
0 | 559 } |
560 if (middle_needs > 0) { | |
561 assert(lower_high_boundary() <= middle_high() && | |
562 middle_high() + middle_needs <= middle_high_boundary(), | |
563 "must not expand beyond region"); | |
656 | 564 if (!os::commit_memory(middle_high(), middle_needs, middle_alignment(), |
565 _executable)) { | |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
566 debug_only(warning("INFO: os::commit_memory(" PTR_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
567 ", middle_needs=" SIZE_FORMAT ", " SIZE_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
568 ", %d) failed", middle_high(), middle_needs, |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
569 middle_alignment(), _executable);) |
0 | 570 return false; |
571 } | |
572 _middle_high += middle_needs; | |
573 } | |
574 if (upper_needs > 0) { | |
575 assert(middle_high_boundary() <= upper_high() && | |
576 upper_high() + upper_needs <= upper_high_boundary(), | |
577 "must not expand beyond region"); | |
656 | 578 if (!os::commit_memory(upper_high(), upper_needs, _executable)) { |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
579 debug_only(warning("INFO: os::commit_memory(" PTR_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
580 ", upper_needs=" SIZE_FORMAT ", %d) failed", |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
581 upper_high(), upper_needs, _executable);) |
0 | 582 return false; |
583 } else { | |
584 _upper_high += upper_needs; | |
585 } | |
586 } | |
587 | |
588 if (pre_touch || AlwaysPreTouch) { | |
589 int vm_ps = os::vm_page_size(); | |
590 for (char* curr = previous_high; | |
591 curr < unaligned_new_high; | |
592 curr += vm_ps) { | |
593 // Note the use of a write here; originally we tried just a read, but | |
594 // since the value read was unused, the optimizer removed the read. | |
595 // If we ever have a concurrent touchahead thread, we'll want to use | |
596 // a read, to avoid the potential of overwriting data (if a mutator | |
597 // thread beats the touchahead thread to a page). There are various | |
598 // ways of making sure this read is not optimized away: for example, | |
599 // generating the code for a read procedure at runtime. | |
600 *curr = 0; | |
601 } | |
602 } | |
603 | |
604 _high += bytes; | |
605 return true; | |
606 } | |
607 | |
608 // A page is uncommitted if the contents of the entire page is deemed unusable. | |
609 // Continue to decrement the high() pointer until it reaches a page boundary | |
610 // in which case that particular page can now be uncommitted. | |
611 void VirtualSpace::shrink_by(size_t size) { | |
612 if (committed_size() < size) | |
613 fatal("Cannot shrink virtual space to negative size"); | |
614 | |
615 if (special()) { | |
616 // don't uncommit if the entire space is pinned in memory | |
617 _high -= size; | |
618 return; | |
619 } | |
620 | |
621 char* unaligned_new_high = high() - size; | |
622 assert(unaligned_new_high >= low_boundary(), "cannot shrink past lower boundary"); | |
623 | |
624 // Calculate new unaligned address | |
625 char* unaligned_upper_new_high = | |
626 MAX2(unaligned_new_high, middle_high_boundary()); | |
627 char* unaligned_middle_new_high = | |
628 MAX2(unaligned_new_high, lower_high_boundary()); | |
629 char* unaligned_lower_new_high = | |
630 MAX2(unaligned_new_high, low_boundary()); | |
631 | |
632 // Align address to region's alignment | |
633 char* aligned_upper_new_high = | |
634 (char*) round_to((intptr_t) unaligned_upper_new_high, upper_alignment()); | |
635 char* aligned_middle_new_high = | |
636 (char*) round_to((intptr_t) unaligned_middle_new_high, middle_alignment()); | |
637 char* aligned_lower_new_high = | |
638 (char*) round_to((intptr_t) unaligned_lower_new_high, lower_alignment()); | |
639 | |
640 // Determine which regions need to shrink | |
641 size_t upper_needs = 0; | |
642 if (aligned_upper_new_high < upper_high()) { | |
643 upper_needs = | |
644 pointer_delta(upper_high(), aligned_upper_new_high, sizeof(char)); | |
645 } | |
646 size_t middle_needs = 0; | |
647 if (aligned_middle_new_high < middle_high()) { | |
648 middle_needs = | |
649 pointer_delta(middle_high(), aligned_middle_new_high, sizeof(char)); | |
650 } | |
651 size_t lower_needs = 0; | |
652 if (aligned_lower_new_high < lower_high()) { | |
653 lower_needs = | |
654 pointer_delta(lower_high(), aligned_lower_new_high, sizeof(char)); | |
655 } | |
656 | |
657 // Check contiguity. | |
658 assert(middle_high_boundary() <= upper_high() && | |
659 upper_high() <= upper_high_boundary(), | |
660 "high address must be contained within the region"); | |
661 assert(lower_high_boundary() <= middle_high() && | |
662 middle_high() <= middle_high_boundary(), | |
663 "high address must be contained within the region"); | |
664 assert(low_boundary() <= lower_high() && | |
665 lower_high() <= lower_high_boundary(), | |
666 "high address must be contained within the region"); | |
667 | |
668 // Uncommit | |
669 if (upper_needs > 0) { | |
670 assert(middle_high_boundary() <= aligned_upper_new_high && | |
671 aligned_upper_new_high + upper_needs <= upper_high_boundary(), | |
672 "must not shrink beyond region"); | |
673 if (!os::uncommit_memory(aligned_upper_new_high, upper_needs)) { | |
674 debug_only(warning("os::uncommit_memory failed")); | |
675 return; | |
676 } else { | |
677 _upper_high -= upper_needs; | |
678 } | |
679 } | |
680 if (middle_needs > 0) { | |
681 assert(lower_high_boundary() <= aligned_middle_new_high && | |
682 aligned_middle_new_high + middle_needs <= middle_high_boundary(), | |
683 "must not shrink beyond region"); | |
684 if (!os::uncommit_memory(aligned_middle_new_high, middle_needs)) { | |
685 debug_only(warning("os::uncommit_memory failed")); | |
686 return; | |
687 } else { | |
688 _middle_high -= middle_needs; | |
689 } | |
690 } | |
691 if (lower_needs > 0) { | |
692 assert(low_boundary() <= aligned_lower_new_high && | |
693 aligned_lower_new_high + lower_needs <= lower_high_boundary(), | |
694 "must not shrink beyond region"); | |
695 if (!os::uncommit_memory(aligned_lower_new_high, lower_needs)) { | |
696 debug_only(warning("os::uncommit_memory failed")); | |
697 return; | |
698 } else { | |
699 _lower_high -= lower_needs; | |
700 } | |
701 } | |
702 | |
703 _high -= size; | |
704 } | |
705 | |
706 #ifndef PRODUCT | |
707 void VirtualSpace::check_for_contiguity() { | |
708 // Check contiguity. | |
709 assert(low_boundary() <= lower_high() && | |
710 lower_high() <= lower_high_boundary(), | |
711 "high address must be contained within the region"); | |
712 assert(lower_high_boundary() <= middle_high() && | |
713 middle_high() <= middle_high_boundary(), | |
714 "high address must be contained within the region"); | |
715 assert(middle_high_boundary() <= upper_high() && | |
716 upper_high() <= upper_high_boundary(), | |
717 "high address must be contained within the region"); | |
718 assert(low() >= low_boundary(), "low"); | |
719 assert(low_boundary() <= lower_high_boundary(), "lower high boundary"); | |
720 assert(upper_high_boundary() <= high_boundary(), "upper high boundary"); | |
721 assert(high() <= upper_high(), "upper high"); | |
722 } | |
723 | |
724 void VirtualSpace::print() { | |
725 tty->print ("Virtual space:"); | |
726 if (special()) tty->print(" (pinned in memory)"); | |
727 tty->cr(); | |
7623
203f64878aab
7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents:
7433
diff
changeset
|
728 tty->print_cr(" - committed: " SIZE_FORMAT, committed_size()); |
203f64878aab
7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents:
7433
diff
changeset
|
729 tty->print_cr(" - reserved: " SIZE_FORMAT, reserved_size()); |
0 | 730 tty->print_cr(" - [low, high]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]", low(), high()); |
731 tty->print_cr(" - [low_b, high_b]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]", low_boundary(), high_boundary()); | |
732 } | |
733 | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
734 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
735 /////////////// Unit tests /////////////// |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
736 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
737 #ifndef PRODUCT |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
738 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
739 #define test_log(...) \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
740 do {\ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
741 if (VerboseInternalVMTests) { \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
742 tty->print_cr(__VA_ARGS__); \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
743 tty->flush(); \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
744 }\ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
745 } while (false) |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
746 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
747 class TestReservedSpace : AllStatic { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
748 public: |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
749 static void small_page_write(void* addr, size_t size) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
750 size_t page_size = os::vm_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
751 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
752 char* end = (char*)addr + size; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
753 for (char* p = (char*)addr; p < end; p += page_size) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
754 *p = 1; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
755 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
756 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
757 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
758 static void release_memory_for_test(ReservedSpace rs) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
759 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
760 guarantee(os::release_memory_special(rs.base(), rs.size()), "Shouldn't fail"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
761 } else { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
762 guarantee(os::release_memory(rs.base(), rs.size()), "Shouldn't fail"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
763 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
764 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
765 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
766 static void test_reserved_space1(size_t size, size_t alignment) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
767 test_log("test_reserved_space1(%p)", (void*) (uintptr_t) size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
768 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
769 assert(is_size_aligned(size, alignment), "Incorrect input parameters"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
770 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
771 ReservedSpace rs(size, // size |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
772 alignment, // alignment |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
773 UseLargePages, // large |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
774 NULL, // requested_address |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
775 0); // noacces_prefix |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
776 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
777 test_log(" rs.special() == %d", rs.special()); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
778 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
779 assert(rs.base() != NULL, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
780 assert(rs.size() == size, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
781 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
782 assert(is_ptr_aligned(rs.base(), alignment), "aligned sizes should always give aligned addresses"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
783 assert(is_size_aligned(rs.size(), alignment), "aligned sizes should always give aligned addresses"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
784 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
785 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
786 small_page_write(rs.base(), size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
787 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
788 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
789 release_memory_for_test(rs); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
790 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
791 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
792 static void test_reserved_space2(size_t size) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
793 test_log("test_reserved_space2(%p)", (void*)(uintptr_t)size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
794 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
795 assert(is_size_aligned(size, os::vm_allocation_granularity()), "Must be at least AG aligned"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
796 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
797 ReservedSpace rs(size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
798 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
799 test_log(" rs.special() == %d", rs.special()); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
800 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
801 assert(rs.base() != NULL, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
802 assert(rs.size() == size, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
803 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
804 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
805 small_page_write(rs.base(), size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
806 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
807 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
808 release_memory_for_test(rs); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
809 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
810 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
811 static void test_reserved_space3(size_t size, size_t alignment, bool maybe_large) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
812 test_log("test_reserved_space3(%p, %p, %d)", |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
813 (void*)(uintptr_t)size, (void*)(uintptr_t)alignment, maybe_large); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
814 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
815 assert(is_size_aligned(size, os::vm_allocation_granularity()), "Must be at least AG aligned"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
816 assert(is_size_aligned(size, alignment), "Must be at least aligned against alignment"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
817 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
818 bool large = maybe_large && UseLargePages && size >= os::large_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
819 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
820 ReservedSpace rs(size, alignment, large, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
821 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
822 test_log(" rs.special() == %d", rs.special()); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
823 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
824 assert(rs.base() != NULL, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
825 assert(rs.size() == size, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
826 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
827 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
828 small_page_write(rs.base(), size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
829 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
830 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
831 release_memory_for_test(rs); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
832 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
833 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
834 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
835 static void test_reserved_space1() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
836 size_t size = 2 * 1024 * 1024; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
837 size_t ag = os::vm_allocation_granularity(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
838 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
839 test_reserved_space1(size, ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
840 test_reserved_space1(size * 2, ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
841 test_reserved_space1(size * 10, ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
842 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
843 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
844 static void test_reserved_space2() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
845 size_t size = 2 * 1024 * 1024; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
846 size_t ag = os::vm_allocation_granularity(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
847 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
848 test_reserved_space2(size * 1); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
849 test_reserved_space2(size * 2); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
850 test_reserved_space2(size * 10); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
851 test_reserved_space2(ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
852 test_reserved_space2(size - ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
853 test_reserved_space2(size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
854 test_reserved_space2(size + ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
855 test_reserved_space2(size * 2); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
856 test_reserved_space2(size * 2 - ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
857 test_reserved_space2(size * 2 + ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
858 test_reserved_space2(size * 3); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
859 test_reserved_space2(size * 3 - ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
860 test_reserved_space2(size * 3 + ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
861 test_reserved_space2(size * 10); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
862 test_reserved_space2(size * 10 + size / 2); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
863 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
864 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
865 static void test_reserved_space3() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
866 size_t ag = os::vm_allocation_granularity(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
867 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
868 test_reserved_space3(ag, ag , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
869 test_reserved_space3(ag * 2, ag , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
870 test_reserved_space3(ag * 3, ag , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
871 test_reserved_space3(ag * 2, ag * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
872 test_reserved_space3(ag * 4, ag * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
873 test_reserved_space3(ag * 8, ag * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
874 test_reserved_space3(ag * 4, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
875 test_reserved_space3(ag * 8, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
876 test_reserved_space3(ag * 16, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
877 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
878 if (UseLargePages) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
879 size_t lp = os::large_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
880 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
881 // Without large pages |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
882 test_reserved_space3(lp, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
883 test_reserved_space3(lp * 2, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
884 test_reserved_space3(lp * 4, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
885 test_reserved_space3(lp, lp , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
886 test_reserved_space3(lp * 2, lp , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
887 test_reserved_space3(lp * 3, lp , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
888 test_reserved_space3(lp * 2, lp * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
889 test_reserved_space3(lp * 4, lp * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
890 test_reserved_space3(lp * 8, lp * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
891 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
892 // With large pages |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
893 test_reserved_space3(lp, ag * 4 , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
894 test_reserved_space3(lp * 2, ag * 4, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
895 test_reserved_space3(lp * 4, ag * 4, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
896 test_reserved_space3(lp, lp , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
897 test_reserved_space3(lp * 2, lp , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
898 test_reserved_space3(lp * 3, lp , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
899 test_reserved_space3(lp * 2, lp * 2, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
900 test_reserved_space3(lp * 4, lp * 2, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
901 test_reserved_space3(lp * 8, lp * 2, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
902 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
903 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
904 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
905 static void test_reserved_space() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
906 test_reserved_space1(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
907 test_reserved_space2(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
908 test_reserved_space3(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
909 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
910 }; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
911 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
912 void TestReservedSpace_test() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
913 TestReservedSpace::test_reserved_space(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
914 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
915 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
916 #endif // PRODUCT |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
917 |
0 | 918 #endif |