Print this page
rev 6871 : 8058715: stability issues when being launched as an embedded JVM via JNI
Summary: Use mmap call without MAP_FIXED so we avoid corrupting already allocated memory
Reviewed-by: coleenp, dsimms
Split |
Split |
Close |
Expand all |
Collapse all |
--- old/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
+++ new/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
1 1 /*
2 2 * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
3 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 4 *
5 5 * This code is free software; you can redistribute it and/or modify it
6 6 * under the terms of the GNU General Public License version 2 only, as
7 7 * published by the Free Software Foundation.
8 8 *
9 9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 12 * version 2 for more details (a copy is included in the LICENSE file that
13 13 * accompanied this code).
14 14 *
15 15 * You should have received a copy of the GNU General Public License version
16 16 * 2 along with this work; if not, write to the Free Software Foundation,
17 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 18 *
19 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 20 * or visit www.oracle.com if you need additional information or have any
21 21 * questions.
22 22 *
23 23 */
24 24
25 25 // no precompiled headers
26 26 #include "asm/macroAssembler.hpp"
27 27 #include "classfile/classLoader.hpp"
28 28 #include "classfile/systemDictionary.hpp"
29 29 #include "classfile/vmSymbols.hpp"
30 30 #include "code/icBuffer.hpp"
31 31 #include "code/vtableStubs.hpp"
32 32 #include "interpreter/interpreter.hpp"
33 33 #include "jvm_linux.h"
34 34 #include "memory/allocation.inline.hpp"
35 35 #include "mutex_linux.inline.hpp"
36 36 #include "os_share_linux.hpp"
37 37 #include "prims/jniFastGetField.hpp"
38 38 #include "prims/jvm.h"
39 39 #include "prims/jvm_misc.hpp"
40 40 #include "runtime/arguments.hpp"
41 41 #include "runtime/extendedPC.hpp"
42 42 #include "runtime/frame.inline.hpp"
43 43 #include "runtime/interfaceSupport.hpp"
44 44 #include "runtime/java.hpp"
45 45 #include "runtime/javaCalls.hpp"
46 46 #include "runtime/mutexLocker.hpp"
47 47 #include "runtime/osThread.hpp"
48 48 #include "runtime/sharedRuntime.hpp"
49 49 #include "runtime/stubRoutines.hpp"
50 50 #include "runtime/thread.inline.hpp"
51 51 #include "runtime/timer.hpp"
52 52 #include "utilities/events.hpp"
53 53 #include "utilities/vmError.hpp"
54 54
55 55 // put OS-includes here
56 56 # include <sys/types.h>
57 57 # include <sys/mman.h>
58 58 # include <pthread.h>
59 59 # include <signal.h>
60 60 # include <errno.h>
61 61 # include <dlfcn.h>
62 62 # include <stdlib.h>
63 63 # include <stdio.h>
64 64 # include <unistd.h>
65 65 # include <sys/resource.h>
66 66 # include <pthread.h>
67 67 # include <sys/stat.h>
68 68 # include <sys/time.h>
69 69 # include <sys/utsname.h>
70 70 # include <sys/socket.h>
71 71 # include <sys/wait.h>
72 72 # include <pwd.h>
73 73 # include <poll.h>
74 74 # include <ucontext.h>
75 75 # include <fpu_control.h>
76 76
77 77 #ifdef AMD64
78 78 #define REG_SP REG_RSP
79 79 #define REG_PC REG_RIP
80 80 #define REG_FP REG_RBP
81 81 #define SPELL_REG_SP "rsp"
82 82 #define SPELL_REG_FP "rbp"
83 83 #else
84 84 #define REG_SP REG_UESP
85 85 #define REG_PC REG_EIP
86 86 #define REG_FP REG_EBP
87 87 #define SPELL_REG_SP "esp"
88 88 #define SPELL_REG_FP "ebp"
89 89 #endif // AMD64
90 90
91 91 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
92 92
93 93 address os::current_stack_pointer() {
94 94 #ifdef SPARC_WORKS
95 95 register void *esp;
96 96 __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
97 97 return (address) ((char*)esp + sizeof(long)*2);
98 98 #elif defined(__clang__)
99 99 intptr_t* esp;
100 100 __asm__ __volatile__ ("mov %%"SPELL_REG_SP", %0":"=r"(esp):);
101 101 return (address) esp;
102 102 #else
103 103 register void *esp __asm__ (SPELL_REG_SP);
104 104 return (address) esp;
105 105 #endif
106 106 }
107 107
108 108 char* os::non_memory_address_word() {
109 109 // Must never look like an address returned by reserve_memory,
110 110 // even in its subfields (as defined by the CPU immediate fields,
111 111 // if the CPU splits constants across multiple instructions).
112 112
113 113 return (char*) -1;
114 114 }
115 115
116 116 void os::initialize_thread(Thread* thr) {
117 117 // Nothing to do.
118 118 }
119 119
120 120 address os::Linux::ucontext_get_pc(ucontext_t * uc) {
121 121 return (address)uc->uc_mcontext.gregs[REG_PC];
122 122 }
123 123
124 124 intptr_t* os::Linux::ucontext_get_sp(ucontext_t * uc) {
125 125 return (intptr_t*)uc->uc_mcontext.gregs[REG_SP];
126 126 }
127 127
128 128 intptr_t* os::Linux::ucontext_get_fp(ucontext_t * uc) {
129 129 return (intptr_t*)uc->uc_mcontext.gregs[REG_FP];
130 130 }
131 131
132 132 // For Forte Analyzer AsyncGetCallTrace profiling support - thread
133 133 // is currently interrupted by SIGPROF.
134 134 // os::Solaris::fetch_frame_from_ucontext() tries to skip nested signal
135 135 // frames. Currently we don't do that on Linux, so it's the same as
136 136 // os::fetch_frame_from_context().
137 137 ExtendedPC os::Linux::fetch_frame_from_ucontext(Thread* thread,
138 138 ucontext_t* uc, intptr_t** ret_sp, intptr_t** ret_fp) {
139 139
140 140 assert(thread != NULL, "just checking");
141 141 assert(ret_sp != NULL, "just checking");
142 142 assert(ret_fp != NULL, "just checking");
143 143
144 144 return os::fetch_frame_from_context(uc, ret_sp, ret_fp);
145 145 }
146 146
147 147 ExtendedPC os::fetch_frame_from_context(void* ucVoid,
148 148 intptr_t** ret_sp, intptr_t** ret_fp) {
149 149
150 150 ExtendedPC epc;
151 151 ucontext_t* uc = (ucontext_t*)ucVoid;
152 152
153 153 if (uc != NULL) {
154 154 epc = ExtendedPC(os::Linux::ucontext_get_pc(uc));
155 155 if (ret_sp) *ret_sp = os::Linux::ucontext_get_sp(uc);
156 156 if (ret_fp) *ret_fp = os::Linux::ucontext_get_fp(uc);
157 157 } else {
158 158 // construct empty ExtendedPC for return value checking
159 159 epc = ExtendedPC(NULL);
160 160 if (ret_sp) *ret_sp = (intptr_t *)NULL;
161 161 if (ret_fp) *ret_fp = (intptr_t *)NULL;
162 162 }
163 163
164 164 return epc;
165 165 }
166 166
167 167 frame os::fetch_frame_from_context(void* ucVoid) {
168 168 intptr_t* sp;
169 169 intptr_t* fp;
170 170 ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp);
171 171 return frame(sp, fp, epc.pc());
172 172 }
173 173
174 174 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
175 175 // turned off by -fomit-frame-pointer,
176 176 frame os::get_sender_for_C_frame(frame* fr) {
177 177 return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
178 178 }
179 179
180 180 intptr_t* _get_previous_fp() {
181 181 #ifdef SPARC_WORKS
182 182 register intptr_t **ebp;
183 183 __asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp));
184 184 #elif defined(__clang__)
185 185 intptr_t **ebp;
186 186 __asm__ __volatile__ ("mov %%"SPELL_REG_FP", %0":"=r"(ebp):);
187 187 #else
188 188 register intptr_t **ebp __asm__ (SPELL_REG_FP);
189 189 #endif
190 190 return (intptr_t*) *ebp; // we want what it points to.
191 191 }
192 192
193 193
194 194 frame os::current_frame() {
195 195 intptr_t* fp = _get_previous_fp();
196 196 frame myframe((intptr_t*)os::current_stack_pointer(),
197 197 (intptr_t*)fp,
198 198 CAST_FROM_FN_PTR(address, os::current_frame));
199 199 if (os::is_first_C_frame(&myframe)) {
200 200 // stack is not walkable
201 201 return frame();
202 202 } else {
203 203 return os::get_sender_for_C_frame(&myframe);
204 204 }
205 205 }
206 206
207 207 // Utility functions
208 208
209 209 // From IA32 System Programming Guide
210 210 enum {
211 211 trap_page_fault = 0xE
212 212 };
213 213
214 214 extern "C" JNIEXPORT int
215 215 JVM_handle_linux_signal(int sig,
216 216 siginfo_t* info,
217 217 void* ucVoid,
218 218 int abort_if_unrecognized) {
219 219 ucontext_t* uc = (ucontext_t*) ucVoid;
220 220
221 221 Thread* t = ThreadLocalStorage::get_thread_slow();
222 222
223 223 // Must do this before SignalHandlerMark, if crash protection installed we will longjmp away
224 224 // (no destructors can be run)
225 225 os::WatcherThreadCrashProtection::check_crash_protection(sig, t);
226 226
227 227 SignalHandlerMark shm(t);
228 228
229 229 // Note: it's not uncommon that JNI code uses signal/sigset to install
230 230 // then restore certain signal handler (e.g. to temporarily block SIGPIPE,
231 231 // or have a SIGILL handler when detecting CPU type). When that happens,
232 232 // JVM_handle_linux_signal() might be invoked with junk info/ucVoid. To
233 233 // avoid unnecessary crash when libjsig is not preloaded, try handle signals
234 234 // that do not require siginfo/ucontext first.
235 235
236 236 if (sig == SIGPIPE || sig == SIGXFSZ) {
237 237 // allow chained handler to go first
238 238 if (os::Linux::chained_handler(sig, info, ucVoid)) {
239 239 return true;
240 240 } else {
241 241 if (PrintMiscellaneous && (WizardMode || Verbose)) {
242 242 char buf[64];
243 243 warning("Ignoring %s - see bugs 4229104 or 646499219",
244 244 os::exception_name(sig, buf, sizeof(buf)));
245 245 }
246 246 return true;
247 247 }
248 248 }
249 249
250 250 JavaThread* thread = NULL;
251 251 VMThread* vmthread = NULL;
252 252 if (os::Linux::signal_handlers_are_installed) {
253 253 if (t != NULL ){
254 254 if(t->is_Java_thread()) {
255 255 thread = (JavaThread*)t;
256 256 }
257 257 else if(t->is_VM_thread()){
258 258 vmthread = (VMThread *)t;
259 259 }
260 260 }
261 261 }
262 262 /*
263 263 NOTE: does not seem to work on linux.
264 264 if (info == NULL || info->si_code <= 0 || info->si_code == SI_NOINFO) {
265 265 // can't decode this kind of signal
266 266 info = NULL;
267 267 } else {
268 268 assert(sig == info->si_signo, "bad siginfo");
269 269 }
270 270 */
271 271 // decide if this trap can be handled by a stub
272 272 address stub = NULL;
273 273
274 274 address pc = NULL;
275 275
276 276 //%note os_trap_1
277 277 if (info != NULL && uc != NULL && thread != NULL) {
278 278 pc = (address) os::Linux::ucontext_get_pc(uc);
279 279
280 280 if (StubRoutines::is_safefetch_fault(pc)) {
281 281 uc->uc_mcontext.gregs[REG_PC] = intptr_t(StubRoutines::continuation_for_safefetch_fault(pc));
282 282 return 1;
283 283 }
284 284
285 285 #ifndef AMD64
286 286 // Halt if SI_KERNEL before more crashes get misdiagnosed as Java bugs
287 287 // This can happen in any running code (currently more frequently in
288 288 // interpreter code but has been seen in compiled code)
289 289 if (sig == SIGSEGV && info->si_addr == 0 && info->si_code == SI_KERNEL) {
290 290 fatal("An irrecoverable SI_KERNEL SIGSEGV has occurred due "
291 291 "to unstable signal handling in this distribution.");
292 292 }
293 293 #endif // AMD64
294 294
295 295 // Handle ALL stack overflow variations here
296 296 if (sig == SIGSEGV) {
297 297 address addr = (address) info->si_addr;
298 298
299 299 // check if fault address is within thread stack
300 300 if (addr < thread->stack_base() &&
301 301 addr >= thread->stack_base() - thread->stack_size()) {
302 302 // stack overflow
303 303 if (thread->in_stack_yellow_zone(addr)) {
304 304 thread->disable_stack_yellow_zone();
305 305 if (thread->thread_state() == _thread_in_Java) {
306 306 // Throw a stack overflow exception. Guard pages will be reenabled
307 307 // while unwinding the stack.
308 308 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW);
309 309 } else {
310 310 // Thread was in the vm or native code. Return and try to finish.
311 311 return 1;
312 312 }
313 313 } else if (thread->in_stack_red_zone(addr)) {
314 314 // Fatal red zone violation. Disable the guard pages and fall through
315 315 // to handle_unexpected_exception way down below.
316 316 thread->disable_stack_red_zone();
317 317 tty->print_raw_cr("An irrecoverable stack overflow has occurred.");
318 318
319 319 // This is a likely cause, but hard to verify. Let's just print
320 320 // it as a hint.
321 321 tty->print_raw_cr("Please check if any of your loaded .so files has "
322 322 "enabled executable stack (see man page execstack(8))");
323 323 } else {
324 324 // Accessing stack address below sp may cause SEGV if current
325 325 // thread has MAP_GROWSDOWN stack. This should only happen when
326 326 // current thread was created by user code with MAP_GROWSDOWN flag
327 327 // and then attached to VM. See notes in os_linux.cpp.
328 328 if (thread->osthread()->expanding_stack() == 0) {
329 329 thread->osthread()->set_expanding_stack();
330 330 if (os::Linux::manually_expand_stack(thread, addr)) {
331 331 thread->osthread()->clear_expanding_stack();
332 332 return 1;
333 333 }
334 334 thread->osthread()->clear_expanding_stack();
335 335 } else {
336 336 fatal("recursive segv. expanding stack.");
337 337 }
338 338 }
339 339 }
340 340 }
341 341
342 342 if ((sig == SIGSEGV) && VM_Version::is_cpuinfo_segv_addr(pc)) {
343 343 // Verify that OS save/restore AVX registers.
344 344 stub = VM_Version::cpuinfo_cont_addr();
345 345 }
346 346
347 347 if (thread->thread_state() == _thread_in_Java) {
348 348 // Java thread running in Java code => find exception handler if any
349 349 // a fault inside compiled code, the interpreter, or a stub
350 350
351 351 if (sig == SIGSEGV && os::is_poll_address((address)info->si_addr)) {
352 352 stub = SharedRuntime::get_poll_stub(pc);
353 353 } else if (sig == SIGBUS /* && info->si_code == BUS_OBJERR */) {
354 354 // BugId 4454115: A read from a MappedByteBuffer can fault
355 355 // here if the underlying file has been truncated.
356 356 // Do not crash the VM in such a case.
357 357 CodeBlob* cb = CodeCache::find_blob_unsafe(pc);
358 358 nmethod* nm = (cb != NULL && cb->is_nmethod()) ? (nmethod*)cb : NULL;
359 359 if (nm != NULL && nm->has_unsafe_access()) {
360 360 stub = StubRoutines::handler_for_unsafe_access();
361 361 }
362 362 }
363 363 else
364 364
365 365 #ifdef AMD64
366 366 if (sig == SIGFPE &&
367 367 (info->si_code == FPE_INTDIV || info->si_code == FPE_FLTDIV)) {
368 368 stub =
369 369 SharedRuntime::
370 370 continuation_for_implicit_exception(thread,
371 371 pc,
372 372 SharedRuntime::
373 373 IMPLICIT_DIVIDE_BY_ZERO);
374 374 #else
375 375 if (sig == SIGFPE /* && info->si_code == FPE_INTDIV */) {
376 376 // HACK: si_code does not work on linux 2.2.12-20!!!
377 377 int op = pc[0];
378 378 if (op == 0xDB) {
379 379 // FIST
380 380 // TODO: The encoding of D2I in i486.ad can cause an exception
381 381 // prior to the fist instruction if there was an invalid operation
382 382 // pending. We want to dismiss that exception. From the win_32
383 383 // side it also seems that if it really was the fist causing
384 384 // the exception that we do the d2i by hand with different
385 385 // rounding. Seems kind of weird.
386 386 // NOTE: that we take the exception at the NEXT floating point instruction.
387 387 assert(pc[0] == 0xDB, "not a FIST opcode");
388 388 assert(pc[1] == 0x14, "not a FIST opcode");
389 389 assert(pc[2] == 0x24, "not a FIST opcode");
390 390 return true;
391 391 } else if (op == 0xF7) {
392 392 // IDIV
393 393 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO);
394 394 } else {
395 395 // TODO: handle more cases if we are using other x86 instructions
396 396 // that can generate SIGFPE signal on linux.
397 397 tty->print_cr("unknown opcode 0x%X with SIGFPE.", op);
398 398 fatal("please update this code.");
399 399 }
400 400 #endif // AMD64
401 401 } else if (sig == SIGSEGV &&
402 402 !MacroAssembler::needs_explicit_null_check((intptr_t)info->si_addr)) {
403 403 // Determination of interpreter/vtable stub/compiled code null exception
404 404 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
405 405 }
406 406 } else if (thread->thread_state() == _thread_in_vm &&
407 407 sig == SIGBUS && /* info->si_code == BUS_OBJERR && */
408 408 thread->doing_unsafe_access()) {
409 409 stub = StubRoutines::handler_for_unsafe_access();
410 410 }
411 411
412 412 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in
413 413 // and the heap gets shrunk before the field access.
414 414 if ((sig == SIGSEGV) || (sig == SIGBUS)) {
415 415 address addr = JNI_FastGetField::find_slowcase_pc(pc);
416 416 if (addr != (address)-1) {
417 417 stub = addr;
418 418 }
419 419 }
420 420
421 421 // Check to see if we caught the safepoint code in the
422 422 // process of write protecting the memory serialization page.
423 423 // It write enables the page immediately after protecting it
424 424 // so we can just return to retry the write.
425 425 if ((sig == SIGSEGV) &&
426 426 os::is_memory_serialize_page(thread, (address) info->si_addr)) {
427 427 // Block current thread until the memory serialize page permission restored.
428 428 os::block_on_serialize_page_trap();
429 429 return true;
430 430 }
431 431 }
432 432
433 433 #ifndef AMD64
434 434 // Execution protection violation
435 435 //
436 436 // This should be kept as the last step in the triage. We don't
437 437 // have a dedicated trap number for a no-execute fault, so be
438 438 // conservative and allow other handlers the first shot.
439 439 //
440 440 // Note: We don't test that info->si_code == SEGV_ACCERR here.
441 441 // this si_code is so generic that it is almost meaningless; and
442 442 // the si_code for this condition may change in the future.
443 443 // Furthermore, a false-positive should be harmless.
444 444 if (UnguardOnExecutionViolation > 0 &&
445 445 (sig == SIGSEGV || sig == SIGBUS) &&
446 446 uc->uc_mcontext.gregs[REG_TRAPNO] == trap_page_fault) {
447 447 int page_size = os::vm_page_size();
448 448 address addr = (address) info->si_addr;
449 449 address pc = os::Linux::ucontext_get_pc(uc);
450 450 // Make sure the pc and the faulting address are sane.
451 451 //
452 452 // If an instruction spans a page boundary, and the page containing
453 453 // the beginning of the instruction is executable but the following
454 454 // page is not, the pc and the faulting address might be slightly
455 455 // different - we still want to unguard the 2nd page in this case.
456 456 //
457 457 // 15 bytes seems to be a (very) safe value for max instruction size.
458 458 bool pc_is_near_addr =
459 459 (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15);
460 460 bool instr_spans_page_boundary =
461 461 (align_size_down((intptr_t) pc ^ (intptr_t) addr,
462 462 (intptr_t) page_size) > 0);
463 463
464 464 if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) {
465 465 static volatile address last_addr =
466 466 (address) os::non_memory_address_word();
467 467
468 468 // In conservative mode, don't unguard unless the address is in the VM
469 469 if (addr != last_addr &&
470 470 (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) {
471 471
472 472 // Set memory to RWX and retry
473 473 address page_start =
474 474 (address) align_size_down((intptr_t) addr, (intptr_t) page_size);
475 475 bool res = os::protect_memory((char*) page_start, page_size,
476 476 os::MEM_PROT_RWX);
477 477
478 478 if (PrintMiscellaneous && Verbose) {
479 479 char buf[256];
480 480 jio_snprintf(buf, sizeof(buf), "Execution protection violation "
481 481 "at " INTPTR_FORMAT
482 482 ", unguarding " INTPTR_FORMAT ": %s, errno=%d", addr,
483 483 page_start, (res ? "success" : "failed"), errno);
484 484 tty->print_raw_cr(buf);
485 485 }
486 486 stub = pc;
487 487
488 488 // Set last_addr so if we fault again at the same address, we don't end
489 489 // up in an endless loop.
490 490 //
491 491 // There are two potential complications here. Two threads trapping at
492 492 // the same address at the same time could cause one of the threads to
493 493 // think it already unguarded, and abort the VM. Likely very rare.
494 494 //
495 495 // The other race involves two threads alternately trapping at
496 496 // different addresses and failing to unguard the page, resulting in
497 497 // an endless loop. This condition is probably even more unlikely than
498 498 // the first.
499 499 //
500 500 // Although both cases could be avoided by using locks or thread local
501 501 // last_addr, these solutions are unnecessary complication: this
502 502 // handler is a best-effort safety net, not a complete solution. It is
503 503 // disabled by default and should only be used as a workaround in case
504 504 // we missed any no-execute-unsafe VM code.
505 505
506 506 last_addr = addr;
507 507 }
508 508 }
509 509 }
510 510 #endif // !AMD64
511 511
512 512 if (stub != NULL) {
513 513 // save all thread context in case we need to restore it
514 514 if (thread != NULL) thread->set_saved_exception_pc(pc);
515 515
516 516 uc->uc_mcontext.gregs[REG_PC] = (greg_t)stub;
517 517 return true;
518 518 }
519 519
520 520 // signal-chaining
521 521 if (os::Linux::chained_handler(sig, info, ucVoid)) {
522 522 return true;
523 523 }
524 524
525 525 if (!abort_if_unrecognized) {
526 526 // caller wants another chance, so give it to him
527 527 return false;
528 528 }
529 529
530 530 if (pc == NULL && uc != NULL) {
531 531 pc = os::Linux::ucontext_get_pc(uc);
532 532 }
533 533
534 534 // unmask current signal
535 535 sigset_t newset;
536 536 sigemptyset(&newset);
537 537 sigaddset(&newset, sig);
538 538 sigprocmask(SIG_UNBLOCK, &newset, NULL);
539 539
540 540 VMError err(t, sig, pc, info, ucVoid);
541 541 err.report_and_die();
542 542
543 543 ShouldNotReachHere();
544 544 }
545 545
546 546 void os::Linux::init_thread_fpu_state(void) {
547 547 #ifndef AMD64
548 548 // set fpu to 53 bit precision
549 549 set_fpu_control_word(0x27f);
550 550 #endif // !AMD64
551 551 }
552 552
553 553 int os::Linux::get_fpu_control_word(void) {
554 554 #ifdef AMD64
555 555 return 0;
556 556 #else
557 557 int fpu_control;
558 558 _FPU_GETCW(fpu_control);
559 559 return fpu_control & 0xffff;
560 560 #endif // AMD64
561 561 }
562 562
563 563 void os::Linux::set_fpu_control_word(int fpu_control) {
564 564 #ifndef AMD64
565 565 _FPU_SETCW(fpu_control);
566 566 #endif // !AMD64
567 567 }
568 568
569 569 // Check that the linux kernel version is 2.4 or higher since earlier
570 570 // versions do not support SSE without patches.
571 571 bool os::supports_sse() {
572 572 #ifdef AMD64
573 573 return true;
574 574 #else
575 575 struct utsname uts;
576 576 if( uname(&uts) != 0 ) return false; // uname fails?
577 577 char *minor_string;
578 578 int major = strtol(uts.release,&minor_string,10);
579 579 int minor = strtol(minor_string+1,NULL,10);
580 580 bool result = (major > 2 || (major==2 && minor >= 4));
581 581 #ifndef PRODUCT
582 582 if (PrintMiscellaneous && Verbose) {
583 583 tty->print("OS version is %d.%d, which %s support SSE/SSE2\n",
584 584 major,minor, result ? "DOES" : "does NOT");
585 585 }
586 586 #endif
587 587 return result;
588 588 #endif // AMD64
589 589 }
590 590
591 591 bool os::is_allocatable(size_t bytes) {
592 592 #ifdef AMD64
593 593 // unused on amd64?
594 594 return true;
595 595 #else
596 596
597 597 if (bytes < 2 * G) {
598 598 return true;
599 599 }
600 600
601 601 char* addr = reserve_memory(bytes, NULL);
602 602
603 603 if (addr != NULL) {
604 604 release_memory(addr, bytes);
605 605 }
606 606
607 607 return addr != NULL;
608 608 #endif // AMD64
609 609 }
610 610
611 611 ////////////////////////////////////////////////////////////////////////////////
612 612 // thread stack
613 613
614 614 #ifdef AMD64
615 615 size_t os::Linux::min_stack_allowed = 64 * K;
616 616
617 617 // amd64: pthread on amd64 is always in floating stack mode
618 618 bool os::Linux::supports_variable_stack_size() { return true; }
619 619 #else
620 620 size_t os::Linux::min_stack_allowed = (48 DEBUG_ONLY(+4))*K;
621 621
622 622 #ifdef __GNUC__
623 623 #define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;})
624 624 #endif
625 625
626 626 // Test if pthread library can support variable thread stack size. LinuxThreads
627 627 // in fixed stack mode allocates 2M fixed slot for each thread. LinuxThreads
628 628 // in floating stack mode and NPTL support variable stack size.
629 629 bool os::Linux::supports_variable_stack_size() {
630 630 if (os::Linux::is_NPTL()) {
631 631 // NPTL, yes
632 632 return true;
633 633
634 634 } else {
635 635 // Note: We can't control default stack size when creating a thread.
636 636 // If we use non-default stack size (pthread_attr_setstacksize), both
637 637 // floating stack and non-floating stack LinuxThreads will return the
638 638 // same value. This makes it impossible to implement this function by
639 639 // detecting thread stack size directly.
640 640 //
641 641 // An alternative approach is to check %gs. Fixed-stack LinuxThreads
642 642 // do not use %gs, so its value is 0. Floating-stack LinuxThreads use
643 643 // %gs (either as LDT selector or GDT selector, depending on kernel)
644 644 // to access thread specific data.
645 645 //
646 646 // Note that %gs is a reserved glibc register since early 2001, so
647 647 // applications are not allowed to change its value (Ulrich Drepper from
648 648 // Redhat confirmed that all known offenders have been modified to use
649 649 // either %fs or TSD). In the worst case scenario, when VM is embedded in
650 650 // a native application that plays with %gs, we might see non-zero %gs
651 651 // even LinuxThreads is running in fixed stack mode. As the result, we'll
652 652 // return true and skip _thread_safety_check(), so we may not be able to
653 653 // detect stack-heap collisions. But otherwise it's harmless.
654 654 //
655 655 #ifdef __GNUC__
656 656 return (GET_GS() != 0);
657 657 #else
658 658 return false;
659 659 #endif
660 660 }
661 661 }
662 662 #endif // AMD64
663 663
664 664 // return default stack size for thr_type
665 665 size_t os::Linux::default_stack_size(os::ThreadType thr_type) {
666 666 // default stack size (compiler thread needs larger stack)
667 667 #ifdef AMD64
668 668 size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M);
669 669 #else
670 670 size_t s = (thr_type == os::compiler_thread ? 2 * M : 512 * K);
671 671 #endif // AMD64
672 672 return s;
673 673 }
674 674
675 675 size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
676 676 // Creating guard page is very expensive. Java thread has HotSpot
677 677 // guard page, only enable glibc guard page for non-Java threads.
678 678 return (thr_type == java_thread ? 0 : page_size());
679 679 }
680 680
681 681 // Java thread:
682 682 //
683 683 // Low memory addresses
684 684 // +------------------------+
685 685 // | |\ JavaThread created by VM does not have glibc
686 686 // | glibc guard page | - guard, attached Java thread usually has
687 687 // | |/ 1 page glibc guard.
688 688 // P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
689 689 // | |\
690 690 // | HotSpot Guard Pages | - red and yellow pages
691 691 // | |/
692 692 // +------------------------+ JavaThread::stack_yellow_zone_base()
693 693 // | |\
694 694 // | Normal Stack | -
695 695 // | |/
696 696 // P2 +------------------------+ Thread::stack_base()
697 697 //
698 698 // Non-Java thread:
699 699 //
700 700 // Low memory addresses
701 701 // +------------------------+
702 702 // | |\
703 703 // | glibc guard page | - usually 1 page
704 704 // | |/
705 705 // P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
706 706 // | |\
707 707 // | Normal Stack | -
708 708 // | |/
709 709 // P2 +------------------------+ Thread::stack_base()
710 710 //
711 711 // ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from
712 712 // pthread_attr_getstack()
713 713
714 714 static void current_stack_region(address * bottom, size_t * size) {
715 715 if (os::Linux::is_initial_thread()) {
716 716 // initial thread needs special handling because pthread_getattr_np()
717 717 // may return bogus value.
718 718 *bottom = os::Linux::initial_thread_stack_bottom();
719 719 *size = os::Linux::initial_thread_stack_size();
720 720 } else {
721 721 pthread_attr_t attr;
722 722
723 723 int rslt = pthread_getattr_np(pthread_self(), &attr);
724 724
725 725 // JVM needs to know exact stack location, abort if it fails
726 726 if (rslt != 0) {
727 727 if (rslt == ENOMEM) {
728 728 vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
729 729 } else {
730 730 fatal(err_msg("pthread_getattr_np failed with errno = %d", rslt));
731 731 }
732 732 }
733 733
734 734 if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
735 735 fatal("Can not locate current stack attributes!");
736 736 }
737 737
738 738 pthread_attr_destroy(&attr);
739 739
740 740 }
741 741 assert(os::current_stack_pointer() >= *bottom &&
742 742 os::current_stack_pointer() < *bottom + *size, "just checking");
743 743 }
744 744
745 745 address os::current_stack_base() {
746 746 address bottom;
747 747 size_t size;
748 748 current_stack_region(&bottom, &size);
749 749 return (bottom + size);
750 750 }
751 751
752 752 size_t os::current_stack_size() {
753 753 // stack size includes normal stack and HotSpot guard pages
754 754 address bottom;
755 755 size_t size;
756 756 current_stack_region(&bottom, &size);
757 757 return size;
758 758 }
759 759
760 760 /////////////////////////////////////////////////////////////////////////////
761 761 // helper functions for fatal error handler
762 762
763 763 void os::print_context(outputStream *st, void *context) {
764 764 if (context == NULL) return;
765 765
766 766 ucontext_t *uc = (ucontext_t*)context;
767 767 st->print_cr("Registers:");
768 768 #ifdef AMD64
769 769 st->print( "RAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RAX]);
770 770 st->print(", RBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBX]);
771 771 st->print(", RCX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RCX]);
772 772 st->print(", RDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDX]);
773 773 st->cr();
774 774 st->print( "RSP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RSP]);
775 775 st->print(", RBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBP]);
776 776 st->print(", RSI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RSI]);
777 777 st->print(", RDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDI]);
778 778 st->cr();
779 779 st->print( "R8 =" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R8]);
780 780 st->print(", R9 =" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R9]);
781 781 st->print(", R10=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R10]);
782 782 st->print(", R11=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R11]);
783 783 st->cr();
784 784 st->print( "R12=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R12]);
785 785 st->print(", R13=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R13]);
786 786 st->print(", R14=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R14]);
787 787 st->print(", R15=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R15]);
788 788 st->cr();
789 789 st->print( "RIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RIP]);
790 790 st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]);
791 791 st->print(", CSGSFS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_CSGSFS]);
792 792 st->print(", ERR=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ERR]);
793 793 st->cr();
794 794 st->print(" TRAPNO=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_TRAPNO]);
795 795 #else
796 796 st->print( "EAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EAX]);
797 797 st->print(", EBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBX]);
798 798 st->print(", ECX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ECX]);
799 799 st->print(", EDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDX]);
800 800 st->cr();
801 801 st->print( "ESP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_UESP]);
802 802 st->print(", EBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBP]);
803 803 st->print(", ESI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ESI]);
804 804 st->print(", EDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDI]);
805 805 st->cr();
806 806 st->print( "EIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EIP]);
807 807 st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]);
808 808 st->print(", CR2=" INTPTR_FORMAT, uc->uc_mcontext.cr2);
809 809 #endif // AMD64
810 810 st->cr();
811 811 st->cr();
812 812
813 813 intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc);
814 814 st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", sp);
815 815 print_hex_dump(st, (address)sp, (address)(sp + 8*sizeof(intptr_t)), sizeof(intptr_t));
816 816 st->cr();
817 817
818 818 // Note: it may be unsafe to inspect memory near pc. For example, pc may
819 819 // point to garbage if entry point in an nmethod is corrupted. Leave
820 820 // this at the end, and hope for the best.
821 821 address pc = os::Linux::ucontext_get_pc(uc);
822 822 st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc);
823 823 print_hex_dump(st, pc - 32, pc + 32, sizeof(char));
824 824 }
825 825
826 826 void os::print_register_info(outputStream *st, void *context) {
827 827 if (context == NULL) return;
828 828
829 829 ucontext_t *uc = (ucontext_t*)context;
830 830
831 831 st->print_cr("Register to memory mapping:");
832 832 st->cr();
833 833
834 834 // this is horrendously verbose but the layout of the registers in the
835 835 // context does not match how we defined our abstract Register set, so
836 836 // we can't just iterate through the gregs area
837 837
838 838 // this is only for the "general purpose" registers
839 839
840 840 #ifdef AMD64
841 841 st->print("RAX="); print_location(st, uc->uc_mcontext.gregs[REG_RAX]);
842 842 st->print("RBX="); print_location(st, uc->uc_mcontext.gregs[REG_RBX]);
843 843 st->print("RCX="); print_location(st, uc->uc_mcontext.gregs[REG_RCX]);
844 844 st->print("RDX="); print_location(st, uc->uc_mcontext.gregs[REG_RDX]);
845 845 st->print("RSP="); print_location(st, uc->uc_mcontext.gregs[REG_RSP]);
846 846 st->print("RBP="); print_location(st, uc->uc_mcontext.gregs[REG_RBP]);
847 847 st->print("RSI="); print_location(st, uc->uc_mcontext.gregs[REG_RSI]);
848 848 st->print("RDI="); print_location(st, uc->uc_mcontext.gregs[REG_RDI]);
849 849 st->print("R8 ="); print_location(st, uc->uc_mcontext.gregs[REG_R8]);
850 850 st->print("R9 ="); print_location(st, uc->uc_mcontext.gregs[REG_R9]);
851 851 st->print("R10="); print_location(st, uc->uc_mcontext.gregs[REG_R10]);
852 852 st->print("R11="); print_location(st, uc->uc_mcontext.gregs[REG_R11]);
853 853 st->print("R12="); print_location(st, uc->uc_mcontext.gregs[REG_R12]);
854 854 st->print("R13="); print_location(st, uc->uc_mcontext.gregs[REG_R13]);
855 855 st->print("R14="); print_location(st, uc->uc_mcontext.gregs[REG_R14]);
856 856 st->print("R15="); print_location(st, uc->uc_mcontext.gregs[REG_R15]);
857 857 #else
858 858 st->print("EAX="); print_location(st, uc->uc_mcontext.gregs[REG_EAX]);
859 859 st->print("EBX="); print_location(st, uc->uc_mcontext.gregs[REG_EBX]);
860 860 st->print("ECX="); print_location(st, uc->uc_mcontext.gregs[REG_ECX]);
861 861 st->print("EDX="); print_location(st, uc->uc_mcontext.gregs[REG_EDX]);
862 862 st->print("ESP="); print_location(st, uc->uc_mcontext.gregs[REG_ESP]);
863 863 st->print("EBP="); print_location(st, uc->uc_mcontext.gregs[REG_EBP]);
864 864 st->print("ESI="); print_location(st, uc->uc_mcontext.gregs[REG_ESI]);
865 865 st->print("EDI="); print_location(st, uc->uc_mcontext.gregs[REG_EDI]);
866 866 #endif // AMD64
867 867
868 868 st->cr();
869 869 }
870 870
871 871 void os::setup_fpu() {
872 872 #ifndef AMD64
873 873 address fpu_cntrl = StubRoutines::addr_fpu_cntrl_wrd_std();
874 874 __asm__ volatile ( "fldcw (%0)" :
875 875 : "r" (fpu_cntrl) : "memory");
876 876 #endif // !AMD64
877 877 }
878 878
879 879 #ifndef PRODUCT
880 880 void os::verify_stack_alignment() {
881 881 #ifdef AMD64
882 882 assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment");
883 883 #endif
884 884 }
885 885 #endif
886 886
887 887
888 888 /*
889 889 * IA32 only: execute code at a high address in case buggy NX emulation is present. I.e. avoid CS limit
890 890 * updates (JDK-8023956).
891 891 */
892 892 void os::workaround_expand_exec_shield_cs_limit() {
893 893 #if defined(IA32)
894 894 size_t page_size = os::vm_page_size();
895 895 /*
896 896 * Take the highest VA the OS will give us and exec
897 897 *
898 898 * Although using -(pagesz) as mmap hint works on newer kernel as you would
899 899 * think, older variants affected by this work-around don't (search forward only).
900 900 *
901 901 * On the affected distributions, we understand the memory layout to be:
↓ open down ↓ |
901 lines elided |
↑ open up ↑ |
902 902 *
903 903 * TASK_LIMIT= 3G, main stack base close to TASK_LIMT.
904 904 *
905 905 * A few pages south main stack will do it.
906 906 *
907 907 * If we are embedded in an app other than launcher (initial != main stack),
908 908 * we don't have much control or understanding of the address space, just let it slide.
909 909 */
910 910 char* hint = (char*) (Linux::initial_thread_stack_bottom() -
911 911 ((StackYellowPages + StackRedPages + 1) * page_size));
912 - char* codebuf = os::reserve_memory(page_size, hint);
912 + char* codebuf = os::attempt_reserve_memory_at(page_size, hint);
913 913 if ( (codebuf == NULL) || (!os::commit_memory(codebuf, page_size, true)) ) {
914 914 return; // No matter, we tried, best effort.
915 915 }
916 916 if (PrintMiscellaneous && (Verbose || WizardMode)) {
917 917 tty->print_cr("[CS limit NX emulation work-around, exec code at: %p]", codebuf);
918 918 }
919 919
920 920 // Some code to exec: the 'ret' instruction
921 921 codebuf[0] = 0xC3;
922 922
923 923 // Call the code in the codebuf
924 924 __asm__ volatile("call *%0" : : "r"(codebuf));
925 925
926 926 // keep the page mapped so CS limit isn't reduced.
927 927 #endif
928 928 }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX