1 /* 2 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. 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 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 // Must be at least Windows Vista or Server 2008 to use InitOnceExecuteOnce 26 #define _WIN32_WINNT 0x0600 27 28 // no precompiled headers 29 #include "classfile/classLoader.hpp" 30 #include "classfile/systemDictionary.hpp" 31 #include "classfile/vmSymbols.hpp" 32 #include "code/icBuffer.hpp" 33 #include "code/vtableStubs.hpp" 34 #include "compiler/compileBroker.hpp" 35 #include "compiler/disassembler.hpp" 36 #include "interpreter/interpreter.hpp" 37 #include "jvm_windows.h" 38 #include "logging/log.hpp" 39 #include "memory/allocation.inline.hpp" 40 #include "memory/filemap.hpp" 41 #include "mutex_windows.inline.hpp" 42 #include "oops/oop.inline.hpp" 43 #include "os_share_windows.hpp" 44 #include "os_windows.inline.hpp" 45 #include "prims/jniFastGetField.hpp" 46 #include "prims/jvm.h" 47 #include "prims/jvm_misc.hpp" 48 #include "runtime/arguments.hpp" 49 #include "runtime/atomic.inline.hpp" 50 #include "runtime/extendedPC.hpp" 51 #include "runtime/globals.hpp" 52 #include "runtime/interfaceSupport.hpp" 53 #include "runtime/java.hpp" 54 #include "runtime/javaCalls.hpp" 55 #include "runtime/mutexLocker.hpp" 56 #include "runtime/objectMonitor.hpp" 57 #include "runtime/orderAccess.inline.hpp" 58 #include "runtime/osThread.hpp" 59 #include "runtime/perfMemory.hpp" 60 #include "runtime/sharedRuntime.hpp" 61 #include "runtime/statSampler.hpp" 62 #include "runtime/stubRoutines.hpp" 63 #include "runtime/thread.inline.hpp" 64 #include "runtime/threadCritical.hpp" 65 #include "runtime/timer.hpp" 66 #include "runtime/vm_version.hpp" 67 #include "semaphore_windows.hpp" 68 #include "services/attachListener.hpp" 69 #include "services/memTracker.hpp" 70 #include "services/runtimeService.hpp" 71 #include "utilities/decoder.hpp" 72 #include "utilities/defaultStream.hpp" 73 #include "utilities/events.hpp" 74 #include "utilities/growableArray.hpp" 75 #include "utilities/macros.hpp" 76 #include "utilities/vmError.hpp" 77 78 #ifdef _DEBUG 79 #include <crtdbg.h> 80 #endif 81 82 83 #include <windows.h> 84 #include <sys/types.h> 85 #include <sys/stat.h> 86 #include <sys/timeb.h> 87 #include <objidl.h> 88 #include <shlobj.h> 89 90 #include <malloc.h> 91 #include <signal.h> 92 #include <direct.h> 93 #include <errno.h> 94 #include <fcntl.h> 95 #include <io.h> 96 #include <process.h> // For _beginthreadex(), _endthreadex() 97 #include <imagehlp.h> // For os::dll_address_to_function_name 98 // for enumerating dll libraries 99 #include <vdmdbg.h> 100 101 // for timer info max values which include all bits 102 #define ALL_64_BITS CONST64(-1) 103 104 // For DLL loading/load error detection 105 // Values of PE COFF 106 #define IMAGE_FILE_PTR_TO_SIGNATURE 0x3c 107 #define IMAGE_FILE_SIGNATURE_LENGTH 4 108 109 static HANDLE main_process; 110 static HANDLE main_thread; 111 static int main_thread_id; 112 113 static FILETIME process_creation_time; 114 static FILETIME process_exit_time; 115 static FILETIME process_user_time; 116 static FILETIME process_kernel_time; 117 118 #ifdef _M_IA64 119 #define __CPU__ ia64 120 #else 121 #ifdef _M_AMD64 122 #define __CPU__ amd64 123 #else 124 #define __CPU__ i486 125 #endif 126 #endif 127 128 // save DLL module handle, used by GetModuleFileName 129 130 HINSTANCE vm_lib_handle; 131 132 BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) { 133 switch (reason) { 134 case DLL_PROCESS_ATTACH: 135 vm_lib_handle = hinst; 136 if (ForceTimeHighResolution) { 137 timeBeginPeriod(1L); 138 } 139 break; 140 case DLL_PROCESS_DETACH: 141 if (ForceTimeHighResolution) { 142 timeEndPeriod(1L); 143 } 144 break; 145 default: 146 break; 147 } 148 return true; 149 } 150 151 static inline double fileTimeAsDouble(FILETIME* time) { 152 const double high = (double) ((unsigned int) ~0); 153 const double split = 10000000.0; 154 double result = (time->dwLowDateTime / split) + 155 time->dwHighDateTime * (high/split); 156 return result; 157 } 158 159 // Implementation of os 160 161 bool os::unsetenv(const char* name) { 162 assert(name != NULL, "Null pointer"); 163 return (SetEnvironmentVariable(name, NULL) == TRUE); 164 } 165 166 // No setuid programs under Windows. 167 bool os::have_special_privileges() { 168 return false; 169 } 170 171 172 // This method is a periodic task to check for misbehaving JNI applications 173 // under CheckJNI, we can add any periodic checks here. 174 // For Windows at the moment does nothing 175 void os::run_periodic_checks() { 176 return; 177 } 178 179 // previous UnhandledExceptionFilter, if there is one 180 static LPTOP_LEVEL_EXCEPTION_FILTER prev_uef_handler = NULL; 181 182 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo); 183 184 void os::init_system_properties_values() { 185 // sysclasspath, java_home, dll_dir 186 { 187 char *home_path; 188 char *dll_path; 189 char *pslash; 190 char *bin = "\\bin"; 191 char home_dir[MAX_PATH + 1]; 192 char *alt_home_dir = ::getenv("_ALT_JAVA_HOME_DIR"); 193 194 if (alt_home_dir != NULL) { 195 strncpy(home_dir, alt_home_dir, MAX_PATH + 1); 196 home_dir[MAX_PATH] = '\0'; 197 } else { 198 os::jvm_path(home_dir, sizeof(home_dir)); 199 // Found the full path to jvm.dll. 200 // Now cut the path to <java_home>/jre if we can. 201 *(strrchr(home_dir, '\\')) = '\0'; // get rid of \jvm.dll 202 pslash = strrchr(home_dir, '\\'); 203 if (pslash != NULL) { 204 *pslash = '\0'; // get rid of \{client|server} 205 pslash = strrchr(home_dir, '\\'); 206 if (pslash != NULL) { 207 *pslash = '\0'; // get rid of \bin 208 } 209 } 210 } 211 212 home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1, mtInternal); 213 if (home_path == NULL) { 214 return; 215 } 216 strcpy(home_path, home_dir); 217 Arguments::set_java_home(home_path); 218 FREE_C_HEAP_ARRAY(char, home_path); 219 220 dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1, 221 mtInternal); 222 if (dll_path == NULL) { 223 return; 224 } 225 strcpy(dll_path, home_dir); 226 strcat(dll_path, bin); 227 Arguments::set_dll_dir(dll_path); 228 FREE_C_HEAP_ARRAY(char, dll_path); 229 230 if (!set_boot_path('\\', ';')) { 231 return; 232 } 233 } 234 235 // library_path 236 #define EXT_DIR "\\lib\\ext" 237 #define BIN_DIR "\\bin" 238 #define PACKAGE_DIR "\\Sun\\Java" 239 { 240 // Win32 library search order (See the documentation for LoadLibrary): 241 // 242 // 1. The directory from which application is loaded. 243 // 2. The system wide Java Extensions directory (Java only) 244 // 3. System directory (GetSystemDirectory) 245 // 4. Windows directory (GetWindowsDirectory) 246 // 5. The PATH environment variable 247 // 6. The current directory 248 249 char *library_path; 250 char tmp[MAX_PATH]; 251 char *path_str = ::getenv("PATH"); 252 253 library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) + 254 sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10, mtInternal); 255 256 library_path[0] = '\0'; 257 258 GetModuleFileName(NULL, tmp, sizeof(tmp)); 259 *(strrchr(tmp, '\\')) = '\0'; 260 strcat(library_path, tmp); 261 262 GetWindowsDirectory(tmp, sizeof(tmp)); 263 strcat(library_path, ";"); 264 strcat(library_path, tmp); 265 strcat(library_path, PACKAGE_DIR BIN_DIR); 266 267 GetSystemDirectory(tmp, sizeof(tmp)); 268 strcat(library_path, ";"); 269 strcat(library_path, tmp); 270 271 GetWindowsDirectory(tmp, sizeof(tmp)); 272 strcat(library_path, ";"); 273 strcat(library_path, tmp); 274 275 if (path_str) { 276 strcat(library_path, ";"); 277 strcat(library_path, path_str); 278 } 279 280 strcat(library_path, ";."); 281 282 Arguments::set_library_path(library_path); 283 FREE_C_HEAP_ARRAY(char, library_path); 284 } 285 286 // Default extensions directory 287 { 288 char path[MAX_PATH]; 289 char buf[2 * MAX_PATH + 2 * sizeof(EXT_DIR) + sizeof(PACKAGE_DIR) + 1]; 290 GetWindowsDirectory(path, MAX_PATH); 291 sprintf(buf, "%s%s;%s%s%s", Arguments::get_java_home(), EXT_DIR, 292 path, PACKAGE_DIR, EXT_DIR); 293 Arguments::set_ext_dirs(buf); 294 } 295 #undef EXT_DIR 296 #undef BIN_DIR 297 #undef PACKAGE_DIR 298 299 #ifndef _WIN64 300 // set our UnhandledExceptionFilter and save any previous one 301 prev_uef_handler = SetUnhandledExceptionFilter(Handle_FLT_Exception); 302 #endif 303 304 // Done 305 return; 306 } 307 308 void os::breakpoint() { 309 DebugBreak(); 310 } 311 312 // Invoked from the BREAKPOINT Macro 313 extern "C" void breakpoint() { 314 os::breakpoint(); 315 } 316 317 // RtlCaptureStackBackTrace Windows API may not exist prior to Windows XP. 318 // So far, this method is only used by Native Memory Tracking, which is 319 // only supported on Windows XP or later. 320 // 321 int os::get_native_stack(address* stack, int frames, int toSkip) { 322 #ifdef _NMT_NOINLINE_ 323 toSkip++; 324 #endif 325 int captured = RtlCaptureStackBackTrace(toSkip + 1, frames, (PVOID*)stack, NULL); 326 for (int index = captured; index < frames; index ++) { 327 stack[index] = NULL; 328 } 329 return captured; 330 } 331 332 333 // os::current_stack_base() 334 // 335 // Returns the base of the stack, which is the stack's 336 // starting address. This function must be called 337 // while running on the stack of the thread being queried. 338 339 address os::current_stack_base() { 340 MEMORY_BASIC_INFORMATION minfo; 341 address stack_bottom; 342 size_t stack_size; 343 344 VirtualQuery(&minfo, &minfo, sizeof(minfo)); 345 stack_bottom = (address)minfo.AllocationBase; 346 stack_size = minfo.RegionSize; 347 348 // Add up the sizes of all the regions with the same 349 // AllocationBase. 350 while (1) { 351 VirtualQuery(stack_bottom+stack_size, &minfo, sizeof(minfo)); 352 if (stack_bottom == (address)minfo.AllocationBase) { 353 stack_size += minfo.RegionSize; 354 } else { 355 break; 356 } 357 } 358 359 #ifdef _M_IA64 360 // IA64 has memory and register stacks 361 // 362 // This is the stack layout you get on NT/IA64 if you specify 1MB stack limit 363 // at thread creation (1MB backing store growing upwards, 1MB memory stack 364 // growing downwards, 2MB summed up) 365 // 366 // ... 367 // ------- top of stack (high address) ----- 368 // | 369 // | 1MB 370 // | Backing Store (Register Stack) 371 // | 372 // | / \ 373 // | | 374 // | | 375 // | | 376 // ------------------------ stack base ----- 377 // | 1MB 378 // | Memory Stack 379 // | 380 // | | 381 // | | 382 // | | 383 // | \ / 384 // | 385 // ----- bottom of stack (low address) ----- 386 // ... 387 388 stack_size = stack_size / 2; 389 #endif 390 return stack_bottom + stack_size; 391 } 392 393 size_t os::current_stack_size() { 394 size_t sz; 395 MEMORY_BASIC_INFORMATION minfo; 396 VirtualQuery(&minfo, &minfo, sizeof(minfo)); 397 sz = (size_t)os::current_stack_base() - (size_t)minfo.AllocationBase; 398 return sz; 399 } 400 401 struct tm* os::localtime_pd(const time_t* clock, struct tm* res) { 402 const struct tm* time_struct_ptr = localtime(clock); 403 if (time_struct_ptr != NULL) { 404 *res = *time_struct_ptr; 405 return res; 406 } 407 return NULL; 408 } 409 410 LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo); 411 412 // Thread start routine for all new Java threads 413 static unsigned __stdcall java_start(Thread* thread) { 414 // Try to randomize the cache line index of hot stack frames. 415 // This helps when threads of the same stack traces evict each other's 416 // cache lines. The threads can be either from the same JVM instance, or 417 // from different JVM instances. The benefit is especially true for 418 // processors with hyperthreading technology. 419 static int counter = 0; 420 int pid = os::current_process_id(); 421 _alloca(((pid ^ counter++) & 7) * 128); 422 423 thread->initialize_thread_current(); 424 425 OSThread* osthr = thread->osthread(); 426 assert(osthr->get_state() == RUNNABLE, "invalid os thread state"); 427 428 if (UseNUMA) { 429 int lgrp_id = os::numa_get_group_id(); 430 if (lgrp_id != -1) { 431 thread->set_lgrp_id(lgrp_id); 432 } 433 } 434 435 // Diagnostic code to investigate JDK-6573254 436 int res = 30115; // non-java thread 437 if (thread->is_Java_thread()) { 438 res = 20115; // java thread 439 } 440 441 log_info(os, thread)("Thread is alive (tid: " UINTX_FORMAT ").", os::current_thread_id()); 442 443 // Install a win32 structured exception handler around every thread created 444 // by VM, so VM can generate error dump when an exception occurred in non- 445 // Java thread (e.g. VM thread). 446 __try { 447 thread->run(); 448 } __except(topLevelExceptionFilter( 449 (_EXCEPTION_POINTERS*)_exception_info())) { 450 // Nothing to do. 451 } 452 453 log_info(os, thread)("Thread finished (tid: " UINTX_FORMAT ").", os::current_thread_id()); 454 455 // One less thread is executing 456 // When the VMThread gets here, the main thread may have already exited 457 // which frees the CodeHeap containing the Atomic::add code 458 if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) { 459 Atomic::dec_ptr((intptr_t*)&os::win32::_os_thread_count); 460 } 461 462 // Thread must not return from exit_process_or_thread(), but if it does, 463 // let it proceed to exit normally 464 return (unsigned)os::win32::exit_process_or_thread(os::win32::EPT_THREAD, res); 465 } 466 467 static OSThread* create_os_thread(Thread* thread, HANDLE thread_handle, 468 int thread_id) { 469 // Allocate the OSThread object 470 OSThread* osthread = new OSThread(NULL, NULL); 471 if (osthread == NULL) return NULL; 472 473 // Initialize support for Java interrupts 474 HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL); 475 if (interrupt_event == NULL) { 476 delete osthread; 477 return NULL; 478 } 479 osthread->set_interrupt_event(interrupt_event); 480 481 // Store info on the Win32 thread into the OSThread 482 osthread->set_thread_handle(thread_handle); 483 osthread->set_thread_id(thread_id); 484 485 if (UseNUMA) { 486 int lgrp_id = os::numa_get_group_id(); 487 if (lgrp_id != -1) { 488 thread->set_lgrp_id(lgrp_id); 489 } 490 } 491 492 // Initial thread state is INITIALIZED, not SUSPENDED 493 osthread->set_state(INITIALIZED); 494 495 return osthread; 496 } 497 498 499 bool os::create_attached_thread(JavaThread* thread) { 500 #ifdef ASSERT 501 thread->verify_not_published(); 502 #endif 503 HANDLE thread_h; 504 if (!DuplicateHandle(main_process, GetCurrentThread(), GetCurrentProcess(), 505 &thread_h, THREAD_ALL_ACCESS, false, 0)) { 506 fatal("DuplicateHandle failed\n"); 507 } 508 OSThread* osthread = create_os_thread(thread, thread_h, 509 (int)current_thread_id()); 510 if (osthread == NULL) { 511 return false; 512 } 513 514 // Initial thread state is RUNNABLE 515 osthread->set_state(RUNNABLE); 516 517 thread->set_osthread(osthread); 518 519 log_info(os, thread)("Thread attached (tid: " UINTX_FORMAT ").", 520 os::current_thread_id()); 521 522 return true; 523 } 524 525 bool os::create_main_thread(JavaThread* thread) { 526 #ifdef ASSERT 527 thread->verify_not_published(); 528 #endif 529 if (_starting_thread == NULL) { 530 _starting_thread = create_os_thread(thread, main_thread, main_thread_id); 531 if (_starting_thread == NULL) { 532 return false; 533 } 534 } 535 536 // The primordial thread is runnable from the start) 537 _starting_thread->set_state(RUNNABLE); 538 539 thread->set_osthread(_starting_thread); 540 return true; 541 } 542 543 // Helper function to trace _beginthreadex attributes, 544 // similar to os::Posix::describe_pthread_attr() 545 static char* describe_beginthreadex_attributes(char* buf, size_t buflen, 546 size_t stacksize, unsigned initflag) { 547 stringStream ss(buf, buflen); 548 if (stacksize == 0) { 549 ss.print("stacksize: default, "); 550 } else { 551 ss.print("stacksize: " SIZE_FORMAT "k, ", stacksize / 1024); 552 } 553 ss.print("flags: "); 554 #define PRINT_FLAG(f) if (initflag & f) ss.print( #f " "); 555 #define ALL(X) \ 556 X(CREATE_SUSPENDED) \ 557 X(STACK_SIZE_PARAM_IS_A_RESERVATION) 558 ALL(PRINT_FLAG) 559 #undef ALL 560 #undef PRINT_FLAG 561 return buf; 562 } 563 564 // Allocate and initialize a new OSThread 565 bool os::create_thread(Thread* thread, ThreadType thr_type, 566 size_t stack_size) { 567 unsigned thread_id; 568 569 // Allocate the OSThread object 570 OSThread* osthread = new OSThread(NULL, NULL); 571 if (osthread == NULL) { 572 return false; 573 } 574 575 // Initialize support for Java interrupts 576 HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL); 577 if (interrupt_event == NULL) { 578 delete osthread; 579 return NULL; 580 } 581 osthread->set_interrupt_event(interrupt_event); 582 osthread->set_interrupted(false); 583 584 thread->set_osthread(osthread); 585 586 if (stack_size == 0) { 587 switch (thr_type) { 588 case os::java_thread: 589 // Java threads use ThreadStackSize which default value can be changed with the flag -Xss 590 if (JavaThread::stack_size_at_create() > 0) { 591 stack_size = JavaThread::stack_size_at_create(); 592 } 593 break; 594 case os::compiler_thread: 595 if (CompilerThreadStackSize > 0) { 596 stack_size = (size_t)(CompilerThreadStackSize * K); 597 break; 598 } // else fall through: 599 // use VMThreadStackSize if CompilerThreadStackSize is not defined 600 case os::vm_thread: 601 case os::pgc_thread: 602 case os::cgc_thread: 603 case os::watcher_thread: 604 if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K); 605 break; 606 } 607 } 608 609 // Create the Win32 thread 610 // 611 // Contrary to what MSDN document says, "stack_size" in _beginthreadex() 612 // does not specify stack size. Instead, it specifies the size of 613 // initially committed space. The stack size is determined by 614 // PE header in the executable. If the committed "stack_size" is larger 615 // than default value in the PE header, the stack is rounded up to the 616 // nearest multiple of 1MB. For example if the launcher has default 617 // stack size of 320k, specifying any size less than 320k does not 618 // affect the actual stack size at all, it only affects the initial 619 // commitment. On the other hand, specifying 'stack_size' larger than 620 // default value may cause significant increase in memory usage, because 621 // not only the stack space will be rounded up to MB, but also the 622 // entire space is committed upfront. 623 // 624 // Finally Windows XP added a new flag 'STACK_SIZE_PARAM_IS_A_RESERVATION' 625 // for CreateThread() that can treat 'stack_size' as stack size. However we 626 // are not supposed to call CreateThread() directly according to MSDN 627 // document because JVM uses C runtime library. The good news is that the 628 // flag appears to work with _beginthredex() as well. 629 630 const unsigned initflag = CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION; 631 HANDLE thread_handle = 632 (HANDLE)_beginthreadex(NULL, 633 (unsigned)stack_size, 634 (unsigned (__stdcall *)(void*)) java_start, 635 thread, 636 initflag, 637 &thread_id); 638 639 char buf[64]; 640 if (thread_handle != NULL) { 641 log_info(os, thread)("Thread started (tid: %u, attributes: %s)", 642 thread_id, describe_beginthreadex_attributes(buf, sizeof(buf), stack_size, initflag)); 643 } else { 644 log_warning(os, thread)("Failed to start thread - _beginthreadex failed (%s) for attributes: %s.", 645 strerror(errno), describe_beginthreadex_attributes(buf, sizeof(buf), stack_size, initflag)); 646 } 647 648 if (thread_handle == NULL) { 649 // Need to clean up stuff we've allocated so far 650 CloseHandle(osthread->interrupt_event()); 651 thread->set_osthread(NULL); 652 delete osthread; 653 return NULL; 654 } 655 656 Atomic::inc_ptr((intptr_t*)&os::win32::_os_thread_count); 657 658 // Store info on the Win32 thread into the OSThread 659 osthread->set_thread_handle(thread_handle); 660 osthread->set_thread_id(thread_id); 661 662 // Initial thread state is INITIALIZED, not SUSPENDED 663 osthread->set_state(INITIALIZED); 664 665 // The thread is returned suspended (in state INITIALIZED), and is started higher up in the call chain 666 return true; 667 } 668 669 670 // Free Win32 resources related to the OSThread 671 void os::free_thread(OSThread* osthread) { 672 assert(osthread != NULL, "osthread not set"); 673 CloseHandle(osthread->thread_handle()); 674 CloseHandle(osthread->interrupt_event()); 675 delete osthread; 676 } 677 678 static jlong first_filetime; 679 static jlong initial_performance_count; 680 static jlong performance_frequency; 681 682 683 jlong as_long(LARGE_INTEGER x) { 684 jlong result = 0; // initialization to avoid warning 685 set_high(&result, x.HighPart); 686 set_low(&result, x.LowPart); 687 return result; 688 } 689 690 691 jlong os::elapsed_counter() { 692 LARGE_INTEGER count; 693 QueryPerformanceCounter(&count); 694 return as_long(count) - initial_performance_count; 695 } 696 697 698 jlong os::elapsed_frequency() { 699 return performance_frequency; 700 } 701 702 703 julong os::available_memory() { 704 return win32::available_memory(); 705 } 706 707 julong os::win32::available_memory() { 708 // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect 709 // value if total memory is larger than 4GB 710 MEMORYSTATUSEX ms; 711 ms.dwLength = sizeof(ms); 712 GlobalMemoryStatusEx(&ms); 713 714 return (julong)ms.ullAvailPhys; 715 } 716 717 julong os::physical_memory() { 718 return win32::physical_memory(); 719 } 720 721 bool os::has_allocatable_memory_limit(julong* limit) { 722 MEMORYSTATUSEX ms; 723 ms.dwLength = sizeof(ms); 724 GlobalMemoryStatusEx(&ms); 725 #ifdef _LP64 726 *limit = (julong)ms.ullAvailVirtual; 727 return true; 728 #else 729 // Limit to 1400m because of the 2gb address space wall 730 *limit = MIN2((julong)1400*M, (julong)ms.ullAvailVirtual); 731 return true; 732 #endif 733 } 734 735 int os::active_processor_count() { 736 DWORD_PTR lpProcessAffinityMask = 0; 737 DWORD_PTR lpSystemAffinityMask = 0; 738 int proc_count = processor_count(); 739 if (proc_count <= sizeof(UINT_PTR) * BitsPerByte && 740 GetProcessAffinityMask(GetCurrentProcess(), &lpProcessAffinityMask, &lpSystemAffinityMask)) { 741 // Nof active processors is number of bits in process affinity mask 742 int bitcount = 0; 743 while (lpProcessAffinityMask != 0) { 744 lpProcessAffinityMask = lpProcessAffinityMask & (lpProcessAffinityMask-1); 745 bitcount++; 746 } 747 return bitcount; 748 } else { 749 return proc_count; 750 } 751 } 752 753 void os::set_native_thread_name(const char *name) { 754 755 // See: http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx 756 // 757 // Note that unfortunately this only works if the process 758 // is already attached to a debugger; debugger must observe 759 // the exception below to show the correct name. 760 761 const DWORD MS_VC_EXCEPTION = 0x406D1388; 762 struct { 763 DWORD dwType; // must be 0x1000 764 LPCSTR szName; // pointer to name (in user addr space) 765 DWORD dwThreadID; // thread ID (-1=caller thread) 766 DWORD dwFlags; // reserved for future use, must be zero 767 } info; 768 769 info.dwType = 0x1000; 770 info.szName = name; 771 info.dwThreadID = -1; 772 info.dwFlags = 0; 773 774 __try { 775 RaiseException (MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(DWORD), (const ULONG_PTR*)&info ); 776 } __except(EXCEPTION_CONTINUE_EXECUTION) {} 777 } 778 779 bool os::distribute_processes(uint length, uint* distribution) { 780 // Not yet implemented. 781 return false; 782 } 783 784 bool os::bind_to_processor(uint processor_id) { 785 // Not yet implemented. 786 return false; 787 } 788 789 void os::win32::initialize_performance_counter() { 790 LARGE_INTEGER count; 791 QueryPerformanceFrequency(&count); 792 performance_frequency = as_long(count); 793 QueryPerformanceCounter(&count); 794 initial_performance_count = as_long(count); 795 } 796 797 798 double os::elapsedTime() { 799 return (double) elapsed_counter() / (double) elapsed_frequency(); 800 } 801 802 803 // Windows format: 804 // The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601. 805 // Java format: 806 // Java standards require the number of milliseconds since 1/1/1970 807 808 // Constant offset - calculated using offset() 809 static jlong _offset = 116444736000000000; 810 // Fake time counter for reproducible results when debugging 811 static jlong fake_time = 0; 812 813 #ifdef ASSERT 814 // Just to be safe, recalculate the offset in debug mode 815 static jlong _calculated_offset = 0; 816 static int _has_calculated_offset = 0; 817 818 jlong offset() { 819 if (_has_calculated_offset) return _calculated_offset; 820 SYSTEMTIME java_origin; 821 java_origin.wYear = 1970; 822 java_origin.wMonth = 1; 823 java_origin.wDayOfWeek = 0; // ignored 824 java_origin.wDay = 1; 825 java_origin.wHour = 0; 826 java_origin.wMinute = 0; 827 java_origin.wSecond = 0; 828 java_origin.wMilliseconds = 0; 829 FILETIME jot; 830 if (!SystemTimeToFileTime(&java_origin, &jot)) { 831 fatal("Error = %d\nWindows error", GetLastError()); 832 } 833 _calculated_offset = jlong_from(jot.dwHighDateTime, jot.dwLowDateTime); 834 _has_calculated_offset = 1; 835 assert(_calculated_offset == _offset, "Calculated and constant time offsets must be equal"); 836 return _calculated_offset; 837 } 838 #else 839 jlong offset() { 840 return _offset; 841 } 842 #endif 843 844 jlong windows_to_java_time(FILETIME wt) { 845 jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime); 846 return (a - offset()) / 10000; 847 } 848 849 // Returns time ticks in (10th of micro seconds) 850 jlong windows_to_time_ticks(FILETIME wt) { 851 jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime); 852 return (a - offset()); 853 } 854 855 FILETIME java_to_windows_time(jlong l) { 856 jlong a = (l * 10000) + offset(); 857 FILETIME result; 858 result.dwHighDateTime = high(a); 859 result.dwLowDateTime = low(a); 860 return result; 861 } 862 863 bool os::supports_vtime() { return true; } 864 bool os::enable_vtime() { return false; } 865 bool os::vtime_enabled() { return false; } 866 867 double os::elapsedVTime() { 868 FILETIME created; 869 FILETIME exited; 870 FILETIME kernel; 871 FILETIME user; 872 if (GetThreadTimes(GetCurrentThread(), &created, &exited, &kernel, &user) != 0) { 873 // the resolution of windows_to_java_time() should be sufficient (ms) 874 return (double) (windows_to_java_time(kernel) + windows_to_java_time(user)) / MILLIUNITS; 875 } else { 876 return elapsedTime(); 877 } 878 } 879 880 jlong os::javaTimeMillis() { 881 if (UseFakeTimers) { 882 return fake_time++; 883 } else { 884 FILETIME wt; 885 GetSystemTimeAsFileTime(&wt); 886 return windows_to_java_time(wt); 887 } 888 } 889 890 void os::javaTimeSystemUTC(jlong &seconds, jlong &nanos) { 891 FILETIME wt; 892 GetSystemTimeAsFileTime(&wt); 893 jlong ticks = windows_to_time_ticks(wt); // 10th of micros 894 jlong secs = jlong(ticks / 10000000); // 10000 * 1000 895 seconds = secs; 896 nanos = jlong(ticks - (secs*10000000)) * 100; 897 } 898 899 jlong os::javaTimeNanos() { 900 LARGE_INTEGER current_count; 901 QueryPerformanceCounter(¤t_count); 902 double current = as_long(current_count); 903 double freq = performance_frequency; 904 jlong time = (jlong)((current/freq) * NANOSECS_PER_SEC); 905 return time; 906 } 907 908 void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) { 909 jlong freq = performance_frequency; 910 if (freq < NANOSECS_PER_SEC) { 911 // the performance counter is 64 bits and we will 912 // be multiplying it -- so no wrap in 64 bits 913 info_ptr->max_value = ALL_64_BITS; 914 } else if (freq > NANOSECS_PER_SEC) { 915 // use the max value the counter can reach to 916 // determine the max value which could be returned 917 julong max_counter = (julong)ALL_64_BITS; 918 info_ptr->max_value = (jlong)(max_counter / (freq / NANOSECS_PER_SEC)); 919 } else { 920 // the performance counter is 64 bits and we will 921 // be using it directly -- so no wrap in 64 bits 922 info_ptr->max_value = ALL_64_BITS; 923 } 924 925 // using a counter, so no skipping 926 info_ptr->may_skip_backward = false; 927 info_ptr->may_skip_forward = false; 928 929 info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time 930 } 931 932 char* os::local_time_string(char *buf, size_t buflen) { 933 SYSTEMTIME st; 934 GetLocalTime(&st); 935 jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d", 936 st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); 937 return buf; 938 } 939 940 bool os::getTimesSecs(double* process_real_time, 941 double* process_user_time, 942 double* process_system_time) { 943 HANDLE h_process = GetCurrentProcess(); 944 FILETIME create_time, exit_time, kernel_time, user_time; 945 BOOL result = GetProcessTimes(h_process, 946 &create_time, 947 &exit_time, 948 &kernel_time, 949 &user_time); 950 if (result != 0) { 951 FILETIME wt; 952 GetSystemTimeAsFileTime(&wt); 953 jlong rtc_millis = windows_to_java_time(wt); 954 *process_real_time = ((double) rtc_millis) / ((double) MILLIUNITS); 955 *process_user_time = 956 (double) jlong_from(user_time.dwHighDateTime, user_time.dwLowDateTime) / (10 * MICROUNITS); 957 *process_system_time = 958 (double) jlong_from(kernel_time.dwHighDateTime, kernel_time.dwLowDateTime) / (10 * MICROUNITS); 959 return true; 960 } else { 961 return false; 962 } 963 } 964 965 void os::shutdown() { 966 // allow PerfMemory to attempt cleanup of any persistent resources 967 perfMemory_exit(); 968 969 // flush buffered output, finish log files 970 ostream_abort(); 971 972 // Check for abort hook 973 abort_hook_t abort_hook = Arguments::abort_hook(); 974 if (abort_hook != NULL) { 975 abort_hook(); 976 } 977 } 978 979 980 static BOOL (WINAPI *_MiniDumpWriteDump)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, 981 PMINIDUMP_EXCEPTION_INFORMATION, 982 PMINIDUMP_USER_STREAM_INFORMATION, 983 PMINIDUMP_CALLBACK_INFORMATION); 984 985 static HANDLE dumpFile = NULL; 986 987 // Check if dump file can be created. 988 void os::check_dump_limit(char* buffer, size_t buffsz) { 989 bool status = true; 990 if (!FLAG_IS_DEFAULT(CreateCoredumpOnCrash) && !CreateCoredumpOnCrash) { 991 jio_snprintf(buffer, buffsz, "CreateCoredumpOnCrash is disabled from command line"); 992 status = false; 993 } 994 995 #ifndef ASSERT 996 if (!os::win32::is_windows_server() && FLAG_IS_DEFAULT(CreateCoredumpOnCrash)) { 997 jio_snprintf(buffer, buffsz, "Minidumps are not enabled by default on client versions of Windows"); 998 status = false; 999 } 1000 #endif 1001 1002 if (status) { 1003 const char* cwd = get_current_directory(NULL, 0); 1004 int pid = current_process_id(); 1005 if (cwd != NULL) { 1006 jio_snprintf(buffer, buffsz, "%s\\hs_err_pid%u.mdmp", cwd, pid); 1007 } else { 1008 jio_snprintf(buffer, buffsz, ".\\hs_err_pid%u.mdmp", pid); 1009 } 1010 1011 if (dumpFile == NULL && 1012 (dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) 1013 == INVALID_HANDLE_VALUE) { 1014 jio_snprintf(buffer, buffsz, "Failed to create minidump file (0x%x).", GetLastError()); 1015 status = false; 1016 } 1017 } 1018 VMError::record_coredump_status(buffer, status); 1019 } 1020 1021 void os::abort(bool dump_core, void* siginfo, const void* context) { 1022 HINSTANCE dbghelp; 1023 EXCEPTION_POINTERS ep; 1024 MINIDUMP_EXCEPTION_INFORMATION mei; 1025 MINIDUMP_EXCEPTION_INFORMATION* pmei; 1026 1027 HANDLE hProcess = GetCurrentProcess(); 1028 DWORD processId = GetCurrentProcessId(); 1029 MINIDUMP_TYPE dumpType; 1030 1031 shutdown(); 1032 if (!dump_core || dumpFile == NULL) { 1033 if (dumpFile != NULL) { 1034 CloseHandle(dumpFile); 1035 } 1036 win32::exit_process_or_thread(win32::EPT_PROCESS, 1); 1037 } 1038 1039 dbghelp = os::win32::load_Windows_dll("DBGHELP.DLL", NULL, 0); 1040 1041 if (dbghelp == NULL) { 1042 jio_fprintf(stderr, "Failed to load dbghelp.dll\n"); 1043 CloseHandle(dumpFile); 1044 win32::exit_process_or_thread(win32::EPT_PROCESS, 1); 1045 } 1046 1047 _MiniDumpWriteDump = 1048 CAST_TO_FN_PTR(BOOL(WINAPI *)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, 1049 PMINIDUMP_EXCEPTION_INFORMATION, 1050 PMINIDUMP_USER_STREAM_INFORMATION, 1051 PMINIDUMP_CALLBACK_INFORMATION), 1052 GetProcAddress(dbghelp, 1053 "MiniDumpWriteDump")); 1054 1055 if (_MiniDumpWriteDump == NULL) { 1056 jio_fprintf(stderr, "Failed to find MiniDumpWriteDump() in module dbghelp.dll.\n"); 1057 CloseHandle(dumpFile); 1058 win32::exit_process_or_thread(win32::EPT_PROCESS, 1); 1059 } 1060 1061 dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData | 1062 MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules); 1063 1064 if (siginfo != NULL && context != NULL) { 1065 ep.ContextRecord = (PCONTEXT) context; 1066 ep.ExceptionRecord = (PEXCEPTION_RECORD) siginfo; 1067 1068 mei.ThreadId = GetCurrentThreadId(); 1069 mei.ExceptionPointers = &ep; 1070 pmei = &mei; 1071 } else { 1072 pmei = NULL; 1073 } 1074 1075 // Older versions of dbghelp.dll (the one shipped with Win2003 for example) may not support all 1076 // the dump types we really want. If first call fails, lets fall back to just use MiniDumpWithFullMemory then. 1077 if (_MiniDumpWriteDump(hProcess, processId, dumpFile, dumpType, pmei, NULL, NULL) == false && 1078 _MiniDumpWriteDump(hProcess, processId, dumpFile, (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, NULL, NULL) == false) { 1079 jio_fprintf(stderr, "Call to MiniDumpWriteDump() failed (Error 0x%x)\n", GetLastError()); 1080 } 1081 CloseHandle(dumpFile); 1082 win32::exit_process_or_thread(win32::EPT_PROCESS, 1); 1083 } 1084 1085 // Die immediately, no exit hook, no abort hook, no cleanup. 1086 void os::die() { 1087 win32::exit_process_or_thread(win32::EPT_PROCESS_DIE, -1); 1088 } 1089 1090 // Directory routines copied from src/win32/native/java/io/dirent_md.c 1091 // * dirent_md.c 1.15 00/02/02 1092 // 1093 // The declarations for DIR and struct dirent are in jvm_win32.h. 1094 1095 // Caller must have already run dirname through JVM_NativePath, which removes 1096 // duplicate slashes and converts all instances of '/' into '\\'. 1097 1098 DIR * os::opendir(const char *dirname) { 1099 assert(dirname != NULL, "just checking"); // hotspot change 1100 DIR *dirp = (DIR *)malloc(sizeof(DIR), mtInternal); 1101 DWORD fattr; // hotspot change 1102 char alt_dirname[4] = { 0, 0, 0, 0 }; 1103 1104 if (dirp == 0) { 1105 errno = ENOMEM; 1106 return 0; 1107 } 1108 1109 // Win32 accepts "\" in its POSIX stat(), but refuses to treat it 1110 // as a directory in FindFirstFile(). We detect this case here and 1111 // prepend the current drive name. 1112 // 1113 if (dirname[1] == '\0' && dirname[0] == '\\') { 1114 alt_dirname[0] = _getdrive() + 'A' - 1; 1115 alt_dirname[1] = ':'; 1116 alt_dirname[2] = '\\'; 1117 alt_dirname[3] = '\0'; 1118 dirname = alt_dirname; 1119 } 1120 1121 dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal); 1122 if (dirp->path == 0) { 1123 free(dirp); 1124 errno = ENOMEM; 1125 return 0; 1126 } 1127 strcpy(dirp->path, dirname); 1128 1129 fattr = GetFileAttributes(dirp->path); 1130 if (fattr == 0xffffffff) { 1131 free(dirp->path); 1132 free(dirp); 1133 errno = ENOENT; 1134 return 0; 1135 } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) { 1136 free(dirp->path); 1137 free(dirp); 1138 errno = ENOTDIR; 1139 return 0; 1140 } 1141 1142 // Append "*.*", or possibly "\\*.*", to path 1143 if (dirp->path[1] == ':' && 1144 (dirp->path[2] == '\0' || 1145 (dirp->path[2] == '\\' && dirp->path[3] == '\0'))) { 1146 // No '\\' needed for cases like "Z:" or "Z:\" 1147 strcat(dirp->path, "*.*"); 1148 } else { 1149 strcat(dirp->path, "\\*.*"); 1150 } 1151 1152 dirp->handle = FindFirstFile(dirp->path, &dirp->find_data); 1153 if (dirp->handle == INVALID_HANDLE_VALUE) { 1154 if (GetLastError() != ERROR_FILE_NOT_FOUND) { 1155 free(dirp->path); 1156 free(dirp); 1157 errno = EACCES; 1158 return 0; 1159 } 1160 } 1161 return dirp; 1162 } 1163 1164 // parameter dbuf unused on Windows 1165 struct dirent * os::readdir(DIR *dirp, dirent *dbuf) { 1166 assert(dirp != NULL, "just checking"); // hotspot change 1167 if (dirp->handle == INVALID_HANDLE_VALUE) { 1168 return 0; 1169 } 1170 1171 strcpy(dirp->dirent.d_name, dirp->find_data.cFileName); 1172 1173 if (!FindNextFile(dirp->handle, &dirp->find_data)) { 1174 if (GetLastError() == ERROR_INVALID_HANDLE) { 1175 errno = EBADF; 1176 return 0; 1177 } 1178 FindClose(dirp->handle); 1179 dirp->handle = INVALID_HANDLE_VALUE; 1180 } 1181 1182 return &dirp->dirent; 1183 } 1184 1185 int os::closedir(DIR *dirp) { 1186 assert(dirp != NULL, "just checking"); // hotspot change 1187 if (dirp->handle != INVALID_HANDLE_VALUE) { 1188 if (!FindClose(dirp->handle)) { 1189 errno = EBADF; 1190 return -1; 1191 } 1192 dirp->handle = INVALID_HANDLE_VALUE; 1193 } 1194 free(dirp->path); 1195 free(dirp); 1196 return 0; 1197 } 1198 1199 // This must be hard coded because it's the system's temporary 1200 // directory not the java application's temp directory, ala java.io.tmpdir. 1201 const char* os::get_temp_directory() { 1202 static char path_buf[MAX_PATH]; 1203 if (GetTempPath(MAX_PATH, path_buf) > 0) { 1204 return path_buf; 1205 } else { 1206 path_buf[0] = '\0'; 1207 return path_buf; 1208 } 1209 } 1210 1211 static bool file_exists(const char* filename) { 1212 if (filename == NULL || strlen(filename) == 0) { 1213 return false; 1214 } 1215 return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES; 1216 } 1217 1218 bool os::dll_build_name(char *buffer, size_t buflen, 1219 const char* pname, const char* fname) { 1220 bool retval = false; 1221 const size_t pnamelen = pname ? strlen(pname) : 0; 1222 const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0; 1223 1224 // Return error on buffer overflow. 1225 if (pnamelen + strlen(fname) + 10 > buflen) { 1226 return retval; 1227 } 1228 1229 if (pnamelen == 0) { 1230 jio_snprintf(buffer, buflen, "%s.dll", fname); 1231 retval = true; 1232 } else if (c == ':' || c == '\\') { 1233 jio_snprintf(buffer, buflen, "%s%s.dll", pname, fname); 1234 retval = true; 1235 } else if (strchr(pname, *os::path_separator()) != NULL) { 1236 int n; 1237 char** pelements = split_path(pname, &n); 1238 if (pelements == NULL) { 1239 return false; 1240 } 1241 for (int i = 0; i < n; i++) { 1242 char* path = pelements[i]; 1243 // Really shouldn't be NULL, but check can't hurt 1244 size_t plen = (path == NULL) ? 0 : strlen(path); 1245 if (plen == 0) { 1246 continue; // skip the empty path values 1247 } 1248 const char lastchar = path[plen - 1]; 1249 if (lastchar == ':' || lastchar == '\\') { 1250 jio_snprintf(buffer, buflen, "%s%s.dll", path, fname); 1251 } else { 1252 jio_snprintf(buffer, buflen, "%s\\%s.dll", path, fname); 1253 } 1254 if (file_exists(buffer)) { 1255 retval = true; 1256 break; 1257 } 1258 } 1259 // release the storage 1260 for (int i = 0; i < n; i++) { 1261 if (pelements[i] != NULL) { 1262 FREE_C_HEAP_ARRAY(char, pelements[i]); 1263 } 1264 } 1265 if (pelements != NULL) { 1266 FREE_C_HEAP_ARRAY(char*, pelements); 1267 } 1268 } else { 1269 jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname); 1270 retval = true; 1271 } 1272 return retval; 1273 } 1274 1275 // Needs to be in os specific directory because windows requires another 1276 // header file <direct.h> 1277 const char* os::get_current_directory(char *buf, size_t buflen) { 1278 int n = static_cast<int>(buflen); 1279 if (buflen > INT_MAX) n = INT_MAX; 1280 return _getcwd(buf, n); 1281 } 1282 1283 //----------------------------------------------------------- 1284 // Helper functions for fatal error handler 1285 #ifdef _WIN64 1286 // Helper routine which returns true if address in 1287 // within the NTDLL address space. 1288 // 1289 static bool _addr_in_ntdll(address addr) { 1290 HMODULE hmod; 1291 MODULEINFO minfo; 1292 1293 hmod = GetModuleHandle("NTDLL.DLL"); 1294 if (hmod == NULL) return false; 1295 if (!GetModuleInformation(GetCurrentProcess(), hmod, 1296 &minfo, sizeof(MODULEINFO))) { 1297 return false; 1298 } 1299 1300 if ((addr >= minfo.lpBaseOfDll) && 1301 (addr < (address)((uintptr_t)minfo.lpBaseOfDll + (uintptr_t)minfo.SizeOfImage))) { 1302 return true; 1303 } else { 1304 return false; 1305 } 1306 } 1307 #endif 1308 1309 struct _modinfo { 1310 address addr; 1311 char* full_path; // point to a char buffer 1312 int buflen; // size of the buffer 1313 address base_addr; 1314 }; 1315 1316 static int _locate_module_by_addr(const char * mod_fname, address base_addr, 1317 address top_address, void * param) { 1318 struct _modinfo *pmod = (struct _modinfo *)param; 1319 if (!pmod) return -1; 1320 1321 if (base_addr <= pmod->addr && 1322 top_address > pmod->addr) { 1323 // if a buffer is provided, copy path name to the buffer 1324 if (pmod->full_path) { 1325 jio_snprintf(pmod->full_path, pmod->buflen, "%s", mod_fname); 1326 } 1327 pmod->base_addr = base_addr; 1328 return 1; 1329 } 1330 return 0; 1331 } 1332 1333 bool os::dll_address_to_library_name(address addr, char* buf, 1334 int buflen, int* offset) { 1335 // buf is not optional, but offset is optional 1336 assert(buf != NULL, "sanity check"); 1337 1338 // NOTE: the reason we don't use SymGetModuleInfo() is it doesn't always 1339 // return the full path to the DLL file, sometimes it returns path 1340 // to the corresponding PDB file (debug info); sometimes it only 1341 // returns partial path, which makes life painful. 1342 1343 struct _modinfo mi; 1344 mi.addr = addr; 1345 mi.full_path = buf; 1346 mi.buflen = buflen; 1347 if (get_loaded_modules_info(_locate_module_by_addr, (void *)&mi)) { 1348 // buf already contains path name 1349 if (offset) *offset = addr - mi.base_addr; 1350 return true; 1351 } 1352 1353 buf[0] = '\0'; 1354 if (offset) *offset = -1; 1355 return false; 1356 } 1357 1358 bool os::dll_address_to_function_name(address addr, char *buf, 1359 int buflen, int *offset, 1360 bool demangle) { 1361 // buf is not optional, but offset is optional 1362 assert(buf != NULL, "sanity check"); 1363 1364 if (Decoder::decode(addr, buf, buflen, offset, demangle)) { 1365 return true; 1366 } 1367 if (offset != NULL) *offset = -1; 1368 buf[0] = '\0'; 1369 return false; 1370 } 1371 1372 // save the start and end address of jvm.dll into param[0] and param[1] 1373 static int _locate_jvm_dll(const char* mod_fname, address base_addr, 1374 address top_address, void * param) { 1375 if (!param) return -1; 1376 1377 if (base_addr <= (address)_locate_jvm_dll && 1378 top_address > (address)_locate_jvm_dll) { 1379 ((address*)param)[0] = base_addr; 1380 ((address*)param)[1] = top_address; 1381 return 1; 1382 } 1383 return 0; 1384 } 1385 1386 address vm_lib_location[2]; // start and end address of jvm.dll 1387 1388 // check if addr is inside jvm.dll 1389 bool os::address_is_in_vm(address addr) { 1390 if (!vm_lib_location[0] || !vm_lib_location[1]) { 1391 if (!get_loaded_modules_info(_locate_jvm_dll, (void *)vm_lib_location)) { 1392 assert(false, "Can't find jvm module."); 1393 return false; 1394 } 1395 } 1396 1397 return (vm_lib_location[0] <= addr) && (addr < vm_lib_location[1]); 1398 } 1399 1400 // print module info; param is outputStream* 1401 static int _print_module(const char* fname, address base_address, 1402 address top_address, void* param) { 1403 if (!param) return -1; 1404 1405 outputStream* st = (outputStream*)param; 1406 1407 st->print(PTR_FORMAT " - " PTR_FORMAT " \t%s\n", base_address, top_address, fname); 1408 return 0; 1409 } 1410 1411 // Loads .dll/.so and 1412 // in case of error it checks if .dll/.so was built for the 1413 // same architecture as Hotspot is running on 1414 void * os::dll_load(const char *name, char *ebuf, int ebuflen) { 1415 void * result = LoadLibrary(name); 1416 if (result != NULL) { 1417 return result; 1418 } 1419 1420 DWORD errcode = GetLastError(); 1421 if (errcode == ERROR_MOD_NOT_FOUND) { 1422 strncpy(ebuf, "Can't find dependent libraries", ebuflen - 1); 1423 ebuf[ebuflen - 1] = '\0'; 1424 return NULL; 1425 } 1426 1427 // Parsing dll below 1428 // If we can read dll-info and find that dll was built 1429 // for an architecture other than Hotspot is running in 1430 // - then print to buffer "DLL was built for a different architecture" 1431 // else call os::lasterror to obtain system error message 1432 1433 // Read system error message into ebuf 1434 // It may or may not be overwritten below (in the for loop and just above) 1435 lasterror(ebuf, (size_t) ebuflen); 1436 ebuf[ebuflen - 1] = '\0'; 1437 int fd = ::open(name, O_RDONLY | O_BINARY, 0); 1438 if (fd < 0) { 1439 return NULL; 1440 } 1441 1442 uint32_t signature_offset; 1443 uint16_t lib_arch = 0; 1444 bool failed_to_get_lib_arch = 1445 ( // Go to position 3c in the dll 1446 (os::seek_to_file_offset(fd, IMAGE_FILE_PTR_TO_SIGNATURE) < 0) 1447 || 1448 // Read location of signature 1449 (sizeof(signature_offset) != 1450 (os::read(fd, (void*)&signature_offset, sizeof(signature_offset)))) 1451 || 1452 // Go to COFF File Header in dll 1453 // that is located after "signature" (4 bytes long) 1454 (os::seek_to_file_offset(fd, 1455 signature_offset + IMAGE_FILE_SIGNATURE_LENGTH) < 0) 1456 || 1457 // Read field that contains code of architecture 1458 // that dll was built for 1459 (sizeof(lib_arch) != (os::read(fd, (void*)&lib_arch, sizeof(lib_arch)))) 1460 ); 1461 1462 ::close(fd); 1463 if (failed_to_get_lib_arch) { 1464 // file i/o error - report os::lasterror(...) msg 1465 return NULL; 1466 } 1467 1468 typedef struct { 1469 uint16_t arch_code; 1470 char* arch_name; 1471 } arch_t; 1472 1473 static const arch_t arch_array[] = { 1474 {IMAGE_FILE_MACHINE_I386, (char*)"IA 32"}, 1475 {IMAGE_FILE_MACHINE_AMD64, (char*)"AMD 64"}, 1476 {IMAGE_FILE_MACHINE_IA64, (char*)"IA 64"} 1477 }; 1478 #if (defined _M_IA64) 1479 static const uint16_t running_arch = IMAGE_FILE_MACHINE_IA64; 1480 #elif (defined _M_AMD64) 1481 static const uint16_t running_arch = IMAGE_FILE_MACHINE_AMD64; 1482 #elif (defined _M_IX86) 1483 static const uint16_t running_arch = IMAGE_FILE_MACHINE_I386; 1484 #else 1485 #error Method os::dll_load requires that one of following \ 1486 is defined :_M_IA64,_M_AMD64 or _M_IX86 1487 #endif 1488 1489 1490 // Obtain a string for printf operation 1491 // lib_arch_str shall contain string what platform this .dll was built for 1492 // running_arch_str shall string contain what platform Hotspot was built for 1493 char *running_arch_str = NULL, *lib_arch_str = NULL; 1494 for (unsigned int i = 0; i < ARRAY_SIZE(arch_array); i++) { 1495 if (lib_arch == arch_array[i].arch_code) { 1496 lib_arch_str = arch_array[i].arch_name; 1497 } 1498 if (running_arch == arch_array[i].arch_code) { 1499 running_arch_str = arch_array[i].arch_name; 1500 } 1501 } 1502 1503 assert(running_arch_str, 1504 "Didn't find running architecture code in arch_array"); 1505 1506 // If the architecture is right 1507 // but some other error took place - report os::lasterror(...) msg 1508 if (lib_arch == running_arch) { 1509 return NULL; 1510 } 1511 1512 if (lib_arch_str != NULL) { 1513 ::_snprintf(ebuf, ebuflen - 1, 1514 "Can't load %s-bit .dll on a %s-bit platform", 1515 lib_arch_str, running_arch_str); 1516 } else { 1517 // don't know what architecture this dll was build for 1518 ::_snprintf(ebuf, ebuflen - 1, 1519 "Can't load this .dll (machine code=0x%x) on a %s-bit platform", 1520 lib_arch, running_arch_str); 1521 } 1522 1523 return NULL; 1524 } 1525 1526 void os::print_dll_info(outputStream *st) { 1527 st->print_cr("Dynamic libraries:"); 1528 get_loaded_modules_info(_print_module, (void *)st); 1529 } 1530 1531 int os::get_loaded_modules_info(os::LoadedModulesCallbackFunc callback, void *param) { 1532 HANDLE hProcess; 1533 1534 # define MAX_NUM_MODULES 128 1535 HMODULE modules[MAX_NUM_MODULES]; 1536 static char filename[MAX_PATH]; 1537 int result = 0; 1538 1539 int pid = os::current_process_id(); 1540 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 1541 FALSE, pid); 1542 if (hProcess == NULL) return 0; 1543 1544 DWORD size_needed; 1545 if (!EnumProcessModules(hProcess, modules, sizeof(modules), &size_needed)) { 1546 CloseHandle(hProcess); 1547 return 0; 1548 } 1549 1550 // number of modules that are currently loaded 1551 int num_modules = size_needed / sizeof(HMODULE); 1552 1553 for (int i = 0; i < MIN2(num_modules, MAX_NUM_MODULES); i++) { 1554 // Get Full pathname: 1555 if (!GetModuleFileNameEx(hProcess, modules[i], filename, sizeof(filename))) { 1556 filename[0] = '\0'; 1557 } 1558 1559 MODULEINFO modinfo; 1560 if (!GetModuleInformation(hProcess, modules[i], &modinfo, sizeof(modinfo))) { 1561 modinfo.lpBaseOfDll = NULL; 1562 modinfo.SizeOfImage = 0; 1563 } 1564 1565 // Invoke callback function 1566 result = callback(filename, (address)modinfo.lpBaseOfDll, 1567 (address)((u8)modinfo.lpBaseOfDll + (u8)modinfo.SizeOfImage), param); 1568 if (result) break; 1569 } 1570 1571 CloseHandle(hProcess); 1572 return result; 1573 } 1574 1575 bool os::get_host_name(char* buf, size_t buflen) { 1576 DWORD size = (DWORD)buflen; 1577 return (GetComputerNameEx(ComputerNameDnsHostname, buf, &size) == TRUE); 1578 } 1579 1580 void os::get_summary_os_info(char* buf, size_t buflen) { 1581 stringStream sst(buf, buflen); 1582 os::win32::print_windows_version(&sst); 1583 // chop off newline character 1584 char* nl = strchr(buf, '\n'); 1585 if (nl != NULL) *nl = '\0'; 1586 } 1587 1588 int os::log_vsnprintf(char* buf, size_t len, const char* fmt, va_list args) { 1589 int ret = vsnprintf(buf, len, fmt, args); 1590 // Get the correct buffer size if buf is too small 1591 if (ret < 0) { 1592 return _vscprintf(fmt, args); 1593 } 1594 return ret; 1595 } 1596 1597 void os::print_os_info_brief(outputStream* st) { 1598 os::print_os_info(st); 1599 } 1600 1601 void os::print_os_info(outputStream* st) { 1602 #ifdef ASSERT 1603 char buffer[1024]; 1604 st->print("HostName: "); 1605 if (get_host_name(buffer, sizeof(buffer))) { 1606 st->print("%s ", buffer); 1607 } else { 1608 st->print("N/A "); 1609 } 1610 #endif 1611 st->print("OS:"); 1612 os::win32::print_windows_version(st); 1613 } 1614 1615 void os::win32::print_windows_version(outputStream* st) { 1616 OSVERSIONINFOEX osvi; 1617 VS_FIXEDFILEINFO *file_info; 1618 TCHAR kernel32_path[MAX_PATH]; 1619 UINT len, ret; 1620 1621 // Use the GetVersionEx information to see if we're on a server or 1622 // workstation edition of Windows. Starting with Windows 8.1 we can't 1623 // trust the OS version information returned by this API. 1624 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 1625 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 1626 if (!GetVersionEx((OSVERSIONINFO *)&osvi)) { 1627 st->print_cr("Call to GetVersionEx failed"); 1628 return; 1629 } 1630 bool is_workstation = (osvi.wProductType == VER_NT_WORKSTATION); 1631 1632 // Get the full path to \Windows\System32\kernel32.dll and use that for 1633 // determining what version of Windows we're running on. 1634 len = MAX_PATH - (UINT)strlen("\\kernel32.dll") - 1; 1635 ret = GetSystemDirectory(kernel32_path, len); 1636 if (ret == 0 || ret > len) { 1637 st->print_cr("Call to GetSystemDirectory failed"); 1638 return; 1639 } 1640 strncat(kernel32_path, "\\kernel32.dll", MAX_PATH - ret); 1641 1642 DWORD version_size = GetFileVersionInfoSize(kernel32_path, NULL); 1643 if (version_size == 0) { 1644 st->print_cr("Call to GetFileVersionInfoSize failed"); 1645 return; 1646 } 1647 1648 LPTSTR version_info = (LPTSTR)os::malloc(version_size, mtInternal); 1649 if (version_info == NULL) { 1650 st->print_cr("Failed to allocate version_info"); 1651 return; 1652 } 1653 1654 if (!GetFileVersionInfo(kernel32_path, NULL, version_size, version_info)) { 1655 os::free(version_info); 1656 st->print_cr("Call to GetFileVersionInfo failed"); 1657 return; 1658 } 1659 1660 if (!VerQueryValue(version_info, TEXT("\\"), (LPVOID*)&file_info, &len)) { 1661 os::free(version_info); 1662 st->print_cr("Call to VerQueryValue failed"); 1663 return; 1664 } 1665 1666 int major_version = HIWORD(file_info->dwProductVersionMS); 1667 int minor_version = LOWORD(file_info->dwProductVersionMS); 1668 int build_number = HIWORD(file_info->dwProductVersionLS); 1669 int build_minor = LOWORD(file_info->dwProductVersionLS); 1670 int os_vers = major_version * 1000 + minor_version; 1671 os::free(version_info); 1672 1673 st->print(" Windows "); 1674 switch (os_vers) { 1675 1676 case 6000: 1677 if (is_workstation) { 1678 st->print("Vista"); 1679 } else { 1680 st->print("Server 2008"); 1681 } 1682 break; 1683 1684 case 6001: 1685 if (is_workstation) { 1686 st->print("7"); 1687 } else { 1688 st->print("Server 2008 R2"); 1689 } 1690 break; 1691 1692 case 6002: 1693 if (is_workstation) { 1694 st->print("8"); 1695 } else { 1696 st->print("Server 2012"); 1697 } 1698 break; 1699 1700 case 6003: 1701 if (is_workstation) { 1702 st->print("8.1"); 1703 } else { 1704 st->print("Server 2012 R2"); 1705 } 1706 break; 1707 1708 case 10000: 1709 if (is_workstation) { 1710 st->print("10"); 1711 } else { 1712 st->print("Server 2016"); 1713 } 1714 break; 1715 1716 default: 1717 // Unrecognized windows, print out its major and minor versions 1718 st->print("%d.%d", major_version, minor_version); 1719 break; 1720 } 1721 1722 // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could 1723 // find out whether we are running on 64 bit processor or not 1724 SYSTEM_INFO si; 1725 ZeroMemory(&si, sizeof(SYSTEM_INFO)); 1726 GetNativeSystemInfo(&si); 1727 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { 1728 st->print(" , 64 bit"); 1729 } 1730 1731 st->print(" Build %d", build_number); 1732 st->print(" (%d.%d.%d.%d)", major_version, minor_version, build_number, build_minor); 1733 st->cr(); 1734 } 1735 1736 void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) { 1737 // Nothing to do for now. 1738 } 1739 1740 void os::get_summary_cpu_info(char* buf, size_t buflen) { 1741 HKEY key; 1742 DWORD status = RegOpenKey(HKEY_LOCAL_MACHINE, 1743 "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", &key); 1744 if (status == ERROR_SUCCESS) { 1745 DWORD size = (DWORD)buflen; 1746 status = RegQueryValueEx(key, "ProcessorNameString", NULL, NULL, (byte*)buf, &size); 1747 if (status != ERROR_SUCCESS) { 1748 strncpy(buf, "## __CPU__", buflen); 1749 } 1750 RegCloseKey(key); 1751 } else { 1752 // Put generic cpu info to return 1753 strncpy(buf, "## __CPU__", buflen); 1754 } 1755 } 1756 1757 void os::print_memory_info(outputStream* st) { 1758 st->print("Memory:"); 1759 st->print(" %dk page", os::vm_page_size()>>10); 1760 1761 // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect 1762 // value if total memory is larger than 4GB 1763 MEMORYSTATUSEX ms; 1764 ms.dwLength = sizeof(ms); 1765 GlobalMemoryStatusEx(&ms); 1766 1767 st->print(", physical %uk", os::physical_memory() >> 10); 1768 st->print("(%uk free)", os::available_memory() >> 10); 1769 1770 st->print(", swap %uk", ms.ullTotalPageFile >> 10); 1771 st->print("(%uk free)", ms.ullAvailPageFile >> 10); 1772 st->cr(); 1773 } 1774 1775 void os::print_siginfo(outputStream *st, const void* siginfo) { 1776 const EXCEPTION_RECORD* const er = (EXCEPTION_RECORD*)siginfo; 1777 st->print("siginfo:"); 1778 1779 char tmp[64]; 1780 if (os::exception_name(er->ExceptionCode, tmp, sizeof(tmp)) == NULL) { 1781 strcpy(tmp, "EXCEPTION_??"); 1782 } 1783 st->print(" %s (0x%x)", tmp, er->ExceptionCode); 1784 1785 if ((er->ExceptionCode == EXCEPTION_ACCESS_VIOLATION || 1786 er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR) && 1787 er->NumberParameters >= 2) { 1788 switch (er->ExceptionInformation[0]) { 1789 case 0: st->print(", reading address"); break; 1790 case 1: st->print(", writing address"); break; 1791 case 8: st->print(", data execution prevention violation at address"); break; 1792 default: st->print(", ExceptionInformation=" INTPTR_FORMAT, 1793 er->ExceptionInformation[0]); 1794 } 1795 st->print(" " INTPTR_FORMAT, er->ExceptionInformation[1]); 1796 } else { 1797 int num = er->NumberParameters; 1798 if (num > 0) { 1799 st->print(", ExceptionInformation="); 1800 for (int i = 0; i < num; i++) { 1801 st->print(INTPTR_FORMAT " ", er->ExceptionInformation[i]); 1802 } 1803 } 1804 } 1805 st->cr(); 1806 } 1807 1808 void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) { 1809 // do nothing 1810 } 1811 1812 static char saved_jvm_path[MAX_PATH] = {0}; 1813 1814 // Find the full path to the current module, jvm.dll 1815 void os::jvm_path(char *buf, jint buflen) { 1816 // Error checking. 1817 if (buflen < MAX_PATH) { 1818 assert(false, "must use a large-enough buffer"); 1819 buf[0] = '\0'; 1820 return; 1821 } 1822 // Lazy resolve the path to current module. 1823 if (saved_jvm_path[0] != 0) { 1824 strcpy(buf, saved_jvm_path); 1825 return; 1826 } 1827 1828 buf[0] = '\0'; 1829 if (Arguments::sun_java_launcher_is_altjvm()) { 1830 // Support for the java launcher's '-XXaltjvm=<path>' option. Check 1831 // for a JAVA_HOME environment variable and fix up the path so it 1832 // looks like jvm.dll is installed there (append a fake suffix 1833 // hotspot/jvm.dll). 1834 char* java_home_var = ::getenv("JAVA_HOME"); 1835 if (java_home_var != NULL && java_home_var[0] != 0 && 1836 strlen(java_home_var) < (size_t)buflen) { 1837 strncpy(buf, java_home_var, buflen); 1838 1839 // determine if this is a legacy image or modules image 1840 // modules image doesn't have "jre" subdirectory 1841 size_t len = strlen(buf); 1842 char* jrebin_p = buf + len; 1843 jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\"); 1844 if (0 != _access(buf, 0)) { 1845 jio_snprintf(jrebin_p, buflen-len, "\\bin\\"); 1846 } 1847 len = strlen(buf); 1848 jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll"); 1849 } 1850 } 1851 1852 if (buf[0] == '\0') { 1853 GetModuleFileName(vm_lib_handle, buf, buflen); 1854 } 1855 strncpy(saved_jvm_path, buf, MAX_PATH); 1856 saved_jvm_path[MAX_PATH - 1] = '\0'; 1857 } 1858 1859 1860 void os::print_jni_name_prefix_on(outputStream* st, int args_size) { 1861 #ifndef _WIN64 1862 st->print("_"); 1863 #endif 1864 } 1865 1866 1867 void os::print_jni_name_suffix_on(outputStream* st, int args_size) { 1868 #ifndef _WIN64 1869 st->print("@%d", args_size * sizeof(int)); 1870 #endif 1871 } 1872 1873 // This method is a copy of JDK's sysGetLastErrorString 1874 // from src/windows/hpi/src/system_md.c 1875 1876 size_t os::lasterror(char* buf, size_t len) { 1877 DWORD errval; 1878 1879 if ((errval = GetLastError()) != 0) { 1880 // DOS error 1881 size_t n = (size_t)FormatMessage( 1882 FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 1883 NULL, 1884 errval, 1885 0, 1886 buf, 1887 (DWORD)len, 1888 NULL); 1889 if (n > 3) { 1890 // Drop final '.', CR, LF 1891 if (buf[n - 1] == '\n') n--; 1892 if (buf[n - 1] == '\r') n--; 1893 if (buf[n - 1] == '.') n--; 1894 buf[n] = '\0'; 1895 } 1896 return n; 1897 } 1898 1899 if (errno != 0) { 1900 // C runtime error that has no corresponding DOS error code 1901 const char* s = strerror(errno); 1902 size_t n = strlen(s); 1903 if (n >= len) n = len - 1; 1904 strncpy(buf, s, n); 1905 buf[n] = '\0'; 1906 return n; 1907 } 1908 1909 return 0; 1910 } 1911 1912 int os::get_last_error() { 1913 DWORD error = GetLastError(); 1914 if (error == 0) { 1915 error = errno; 1916 } 1917 return (int)error; 1918 } 1919 1920 WindowsSemaphore::WindowsSemaphore(uint value) { 1921 _semaphore = ::CreateSemaphore(NULL, value, LONG_MAX, NULL); 1922 1923 guarantee(_semaphore != NULL, "CreateSemaphore failed with error code: %lu", GetLastError()); 1924 } 1925 1926 WindowsSemaphore::~WindowsSemaphore() { 1927 ::CloseHandle(_semaphore); 1928 } 1929 1930 void WindowsSemaphore::signal(uint count) { 1931 if (count > 0) { 1932 BOOL ret = ::ReleaseSemaphore(_semaphore, count, NULL); 1933 1934 assert(ret != 0, "ReleaseSemaphore failed with error code: %lu", GetLastError()); 1935 } 1936 } 1937 1938 void WindowsSemaphore::wait() { 1939 DWORD ret = ::WaitForSingleObject(_semaphore, INFINITE); 1940 assert(ret != WAIT_FAILED, "WaitForSingleObject failed with error code: %lu", GetLastError()); 1941 assert(ret == WAIT_OBJECT_0, "WaitForSingleObject failed with return value: %lu", ret); 1942 } 1943 1944 // sun.misc.Signal 1945 // NOTE that this is a workaround for an apparent kernel bug where if 1946 // a signal handler for SIGBREAK is installed then that signal handler 1947 // takes priority over the console control handler for CTRL_CLOSE_EVENT. 1948 // See bug 4416763. 1949 static void (*sigbreakHandler)(int) = NULL; 1950 1951 static void UserHandler(int sig, void *siginfo, void *context) { 1952 os::signal_notify(sig); 1953 // We need to reinstate the signal handler each time... 1954 os::signal(sig, (void*)UserHandler); 1955 } 1956 1957 void* os::user_handler() { 1958 return (void*) UserHandler; 1959 } 1960 1961 void* os::signal(int signal_number, void* handler) { 1962 if ((signal_number == SIGBREAK) && (!ReduceSignalUsage)) { 1963 void (*oldHandler)(int) = sigbreakHandler; 1964 sigbreakHandler = (void (*)(int)) handler; 1965 return (void*) oldHandler; 1966 } else { 1967 return (void*)::signal(signal_number, (void (*)(int))handler); 1968 } 1969 } 1970 1971 void os::signal_raise(int signal_number) { 1972 raise(signal_number); 1973 } 1974 1975 // The Win32 C runtime library maps all console control events other than ^C 1976 // into SIGBREAK, which makes it impossible to distinguish ^BREAK from close, 1977 // logoff, and shutdown events. We therefore install our own console handler 1978 // that raises SIGTERM for the latter cases. 1979 // 1980 static BOOL WINAPI consoleHandler(DWORD event) { 1981 switch (event) { 1982 case CTRL_C_EVENT: 1983 if (is_error_reported()) { 1984 // Ctrl-C is pressed during error reporting, likely because the error 1985 // handler fails to abort. Let VM die immediately. 1986 os::die(); 1987 } 1988 1989 os::signal_raise(SIGINT); 1990 return TRUE; 1991 break; 1992 case CTRL_BREAK_EVENT: 1993 if (sigbreakHandler != NULL) { 1994 (*sigbreakHandler)(SIGBREAK); 1995 } 1996 return TRUE; 1997 break; 1998 case CTRL_LOGOFF_EVENT: { 1999 // Don't terminate JVM if it is running in a non-interactive session, 2000 // such as a service process. 2001 USEROBJECTFLAGS flags; 2002 HANDLE handle = GetProcessWindowStation(); 2003 if (handle != NULL && 2004 GetUserObjectInformation(handle, UOI_FLAGS, &flags, 2005 sizeof(USEROBJECTFLAGS), NULL)) { 2006 // If it is a non-interactive session, let next handler to deal 2007 // with it. 2008 if ((flags.dwFlags & WSF_VISIBLE) == 0) { 2009 return FALSE; 2010 } 2011 } 2012 } 2013 case CTRL_CLOSE_EVENT: 2014 case CTRL_SHUTDOWN_EVENT: 2015 os::signal_raise(SIGTERM); 2016 return TRUE; 2017 break; 2018 default: 2019 break; 2020 } 2021 return FALSE; 2022 } 2023 2024 // The following code is moved from os.cpp for making this 2025 // code platform specific, which it is by its very nature. 2026 2027 // Return maximum OS signal used + 1 for internal use only 2028 // Used as exit signal for signal_thread 2029 int os::sigexitnum_pd() { 2030 return NSIG; 2031 } 2032 2033 // a counter for each possible signal value, including signal_thread exit signal 2034 static volatile jint pending_signals[NSIG+1] = { 0 }; 2035 static HANDLE sig_sem = NULL; 2036 2037 void os::signal_init_pd() { 2038 // Initialize signal structures 2039 memset((void*)pending_signals, 0, sizeof(pending_signals)); 2040 2041 sig_sem = ::CreateSemaphore(NULL, 0, NSIG+1, NULL); 2042 2043 // Programs embedding the VM do not want it to attempt to receive 2044 // events like CTRL_LOGOFF_EVENT, which are used to implement the 2045 // shutdown hooks mechanism introduced in 1.3. For example, when 2046 // the VM is run as part of a Windows NT service (i.e., a servlet 2047 // engine in a web server), the correct behavior is for any console 2048 // control handler to return FALSE, not TRUE, because the OS's 2049 // "final" handler for such events allows the process to continue if 2050 // it is a service (while terminating it if it is not a service). 2051 // To make this behavior uniform and the mechanism simpler, we 2052 // completely disable the VM's usage of these console events if -Xrs 2053 // (=ReduceSignalUsage) is specified. This means, for example, that 2054 // the CTRL-BREAK thread dump mechanism is also disabled in this 2055 // case. See bugs 4323062, 4345157, and related bugs. 2056 2057 if (!ReduceSignalUsage) { 2058 // Add a CTRL-C handler 2059 SetConsoleCtrlHandler(consoleHandler, TRUE); 2060 } 2061 } 2062 2063 void os::signal_notify(int signal_number) { 2064 BOOL ret; 2065 if (sig_sem != NULL) { 2066 Atomic::inc(&pending_signals[signal_number]); 2067 ret = ::ReleaseSemaphore(sig_sem, 1, NULL); 2068 assert(ret != 0, "ReleaseSemaphore() failed"); 2069 } 2070 } 2071 2072 static int check_pending_signals(bool wait_for_signal) { 2073 DWORD ret; 2074 while (true) { 2075 for (int i = 0; i < NSIG + 1; i++) { 2076 jint n = pending_signals[i]; 2077 if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) { 2078 return i; 2079 } 2080 } 2081 if (!wait_for_signal) { 2082 return -1; 2083 } 2084 2085 JavaThread *thread = JavaThread::current(); 2086 2087 ThreadBlockInVM tbivm(thread); 2088 2089 bool threadIsSuspended; 2090 do { 2091 thread->set_suspend_equivalent(); 2092 // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() 2093 ret = ::WaitForSingleObject(sig_sem, INFINITE); 2094 assert(ret == WAIT_OBJECT_0, "WaitForSingleObject() failed"); 2095 2096 // were we externally suspended while we were waiting? 2097 threadIsSuspended = thread->handle_special_suspend_equivalent_condition(); 2098 if (threadIsSuspended) { 2099 // The semaphore has been incremented, but while we were waiting 2100 // another thread suspended us. We don't want to continue running 2101 // while suspended because that would surprise the thread that 2102 // suspended us. 2103 ret = ::ReleaseSemaphore(sig_sem, 1, NULL); 2104 assert(ret != 0, "ReleaseSemaphore() failed"); 2105 2106 thread->java_suspend_self(); 2107 } 2108 } while (threadIsSuspended); 2109 } 2110 } 2111 2112 int os::signal_lookup() { 2113 return check_pending_signals(false); 2114 } 2115 2116 int os::signal_wait() { 2117 return check_pending_signals(true); 2118 } 2119 2120 // Implicit OS exception handling 2121 2122 LONG Handle_Exception(struct _EXCEPTION_POINTERS* exceptionInfo, 2123 address handler) { 2124 JavaThread* thread = (JavaThread*) Thread::current_or_null(); 2125 // Save pc in thread 2126 #ifdef _M_IA64 2127 // Do not blow up if no thread info available. 2128 if (thread) { 2129 // Saving PRECISE pc (with slot information) in thread. 2130 uint64_t precise_pc = (uint64_t) exceptionInfo->ExceptionRecord->ExceptionAddress; 2131 // Convert precise PC into "Unix" format 2132 precise_pc = (precise_pc & 0xFFFFFFFFFFFFFFF0) | ((precise_pc & 0xF) >> 2); 2133 thread->set_saved_exception_pc((address)precise_pc); 2134 } 2135 // Set pc to handler 2136 exceptionInfo->ContextRecord->StIIP = (DWORD64)handler; 2137 // Clear out psr.ri (= Restart Instruction) in order to continue 2138 // at the beginning of the target bundle. 2139 exceptionInfo->ContextRecord->StIPSR &= 0xFFFFF9FFFFFFFFFF; 2140 assert(((DWORD64)handler & 0xF) == 0, "Target address must point to the beginning of a bundle!"); 2141 #else 2142 #ifdef _M_AMD64 2143 // Do not blow up if no thread info available. 2144 if (thread) { 2145 thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Rip); 2146 } 2147 // Set pc to handler 2148 exceptionInfo->ContextRecord->Rip = (DWORD64)handler; 2149 #else 2150 // Do not blow up if no thread info available. 2151 if (thread) { 2152 thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Eip); 2153 } 2154 // Set pc to handler 2155 exceptionInfo->ContextRecord->Eip = (DWORD)(DWORD_PTR)handler; 2156 #endif 2157 #endif 2158 2159 // Continue the execution 2160 return EXCEPTION_CONTINUE_EXECUTION; 2161 } 2162 2163 2164 // Used for PostMortemDump 2165 extern "C" void safepoints(); 2166 extern "C" void find(int x); 2167 extern "C" void events(); 2168 2169 // According to Windows API documentation, an illegal instruction sequence should generate 2170 // the 0xC000001C exception code. However, real world experience shows that occasionnaly 2171 // the execution of an illegal instruction can generate the exception code 0xC000001E. This 2172 // seems to be an undocumented feature of Win NT 4.0 (and probably other Windows systems). 2173 2174 #define EXCEPTION_ILLEGAL_INSTRUCTION_2 0xC000001E 2175 2176 // From "Execution Protection in the Windows Operating System" draft 0.35 2177 // Once a system header becomes available, the "real" define should be 2178 // included or copied here. 2179 #define EXCEPTION_INFO_EXEC_VIOLATION 0x08 2180 2181 // Handle NAT Bit consumption on IA64. 2182 #ifdef _M_IA64 2183 #define EXCEPTION_REG_NAT_CONSUMPTION STATUS_REG_NAT_CONSUMPTION 2184 #endif 2185 2186 // Windows Vista/2008 heap corruption check 2187 #define EXCEPTION_HEAP_CORRUPTION 0xC0000374 2188 2189 #define def_excpt(val) #val, val 2190 2191 struct siglabel { 2192 char *name; 2193 int number; 2194 }; 2195 2196 // All Visual C++ exceptions thrown from code generated by the Microsoft Visual 2197 // C++ compiler contain this error code. Because this is a compiler-generated 2198 // error, the code is not listed in the Win32 API header files. 2199 // The code is actually a cryptic mnemonic device, with the initial "E" 2200 // standing for "exception" and the final 3 bytes (0x6D7363) representing the 2201 // ASCII values of "msc". 2202 2203 #define EXCEPTION_UNCAUGHT_CXX_EXCEPTION 0xE06D7363 2204 2205 2206 struct siglabel exceptlabels[] = { 2207 def_excpt(EXCEPTION_ACCESS_VIOLATION), 2208 def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT), 2209 def_excpt(EXCEPTION_BREAKPOINT), 2210 def_excpt(EXCEPTION_SINGLE_STEP), 2211 def_excpt(EXCEPTION_ARRAY_BOUNDS_EXCEEDED), 2212 def_excpt(EXCEPTION_FLT_DENORMAL_OPERAND), 2213 def_excpt(EXCEPTION_FLT_DIVIDE_BY_ZERO), 2214 def_excpt(EXCEPTION_FLT_INEXACT_RESULT), 2215 def_excpt(EXCEPTION_FLT_INVALID_OPERATION), 2216 def_excpt(EXCEPTION_FLT_OVERFLOW), 2217 def_excpt(EXCEPTION_FLT_STACK_CHECK), 2218 def_excpt(EXCEPTION_FLT_UNDERFLOW), 2219 def_excpt(EXCEPTION_INT_DIVIDE_BY_ZERO), 2220 def_excpt(EXCEPTION_INT_OVERFLOW), 2221 def_excpt(EXCEPTION_PRIV_INSTRUCTION), 2222 def_excpt(EXCEPTION_IN_PAGE_ERROR), 2223 def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION), 2224 def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION_2), 2225 def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION), 2226 def_excpt(EXCEPTION_STACK_OVERFLOW), 2227 def_excpt(EXCEPTION_INVALID_DISPOSITION), 2228 def_excpt(EXCEPTION_GUARD_PAGE), 2229 def_excpt(EXCEPTION_INVALID_HANDLE), 2230 def_excpt(EXCEPTION_UNCAUGHT_CXX_EXCEPTION), 2231 def_excpt(EXCEPTION_HEAP_CORRUPTION), 2232 #ifdef _M_IA64 2233 def_excpt(EXCEPTION_REG_NAT_CONSUMPTION), 2234 #endif 2235 NULL, 0 2236 }; 2237 2238 const char* os::exception_name(int exception_code, char *buf, size_t size) { 2239 for (int i = 0; exceptlabels[i].name != NULL; i++) { 2240 if (exceptlabels[i].number == exception_code) { 2241 jio_snprintf(buf, size, "%s", exceptlabels[i].name); 2242 return buf; 2243 } 2244 } 2245 2246 return NULL; 2247 } 2248 2249 //----------------------------------------------------------------------------- 2250 LONG Handle_IDiv_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) { 2251 // handle exception caused by idiv; should only happen for -MinInt/-1 2252 // (division by zero is handled explicitly) 2253 #ifdef _M_IA64 2254 assert(0, "Fix Handle_IDiv_Exception"); 2255 #else 2256 #ifdef _M_AMD64 2257 PCONTEXT ctx = exceptionInfo->ContextRecord; 2258 address pc = (address)ctx->Rip; 2259 assert(pc[0] >= Assembler::REX && pc[0] <= Assembler::REX_WRXB && pc[1] == 0xF7 || pc[0] == 0xF7, "not an idiv opcode"); 2260 assert(pc[0] >= Assembler::REX && pc[0] <= Assembler::REX_WRXB && (pc[2] & ~0x7) == 0xF8 || (pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands"); 2261 if (pc[0] == 0xF7) { 2262 // set correct result values and continue after idiv instruction 2263 ctx->Rip = (DWORD64)pc + 2; // idiv reg, reg is 2 bytes 2264 } else { 2265 ctx->Rip = (DWORD64)pc + 3; // REX idiv reg, reg is 3 bytes 2266 } 2267 // Do not set ctx->Rax as it already contains the correct value (either 32 or 64 bit, depending on the operation) 2268 // this is the case because the exception only happens for -MinValue/-1 and -MinValue is always in rax because of the 2269 // idiv opcode (0xF7). 2270 ctx->Rdx = (DWORD)0; // remainder 2271 // Continue the execution 2272 #else 2273 PCONTEXT ctx = exceptionInfo->ContextRecord; 2274 address pc = (address)ctx->Eip; 2275 assert(pc[0] == 0xF7, "not an idiv opcode"); 2276 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands"); 2277 assert(ctx->Eax == min_jint, "unexpected idiv exception"); 2278 // set correct result values and continue after idiv instruction 2279 ctx->Eip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes 2280 ctx->Eax = (DWORD)min_jint; // result 2281 ctx->Edx = (DWORD)0; // remainder 2282 // Continue the execution 2283 #endif 2284 #endif 2285 return EXCEPTION_CONTINUE_EXECUTION; 2286 } 2287 2288 //----------------------------------------------------------------------------- 2289 LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) { 2290 PCONTEXT ctx = exceptionInfo->ContextRecord; 2291 #ifndef _WIN64 2292 // handle exception caused by native method modifying control word 2293 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; 2294 2295 switch (exception_code) { 2296 case EXCEPTION_FLT_DENORMAL_OPERAND: 2297 case EXCEPTION_FLT_DIVIDE_BY_ZERO: 2298 case EXCEPTION_FLT_INEXACT_RESULT: 2299 case EXCEPTION_FLT_INVALID_OPERATION: 2300 case EXCEPTION_FLT_OVERFLOW: 2301 case EXCEPTION_FLT_STACK_CHECK: 2302 case EXCEPTION_FLT_UNDERFLOW: 2303 jint fp_control_word = (* (jint*) StubRoutines::addr_fpu_cntrl_wrd_std()); 2304 if (fp_control_word != ctx->FloatSave.ControlWord) { 2305 // Restore FPCW and mask out FLT exceptions 2306 ctx->FloatSave.ControlWord = fp_control_word | 0xffffffc0; 2307 // Mask out pending FLT exceptions 2308 ctx->FloatSave.StatusWord &= 0xffffff00; 2309 return EXCEPTION_CONTINUE_EXECUTION; 2310 } 2311 } 2312 2313 if (prev_uef_handler != NULL) { 2314 // We didn't handle this exception so pass it to the previous 2315 // UnhandledExceptionFilter. 2316 return (prev_uef_handler)(exceptionInfo); 2317 } 2318 #else // !_WIN64 2319 // On Windows, the mxcsr control bits are non-volatile across calls 2320 // See also CR 6192333 2321 // 2322 jint MxCsr = INITIAL_MXCSR; 2323 // we can't use StubRoutines::addr_mxcsr_std() 2324 // because in Win64 mxcsr is not saved there 2325 if (MxCsr != ctx->MxCsr) { 2326 ctx->MxCsr = MxCsr; 2327 return EXCEPTION_CONTINUE_EXECUTION; 2328 } 2329 #endif // !_WIN64 2330 2331 return EXCEPTION_CONTINUE_SEARCH; 2332 } 2333 2334 static inline void report_error(Thread* t, DWORD exception_code, 2335 address addr, void* siginfo, void* context) { 2336 VMError::report_and_die(t, exception_code, addr, siginfo, context); 2337 2338 // If UseOsErrorReporting, this will return here and save the error file 2339 // somewhere where we can find it in the minidump. 2340 } 2341 2342 bool os::win32::get_frame_at_stack_banging_point(JavaThread* thread, 2343 struct _EXCEPTION_POINTERS* exceptionInfo, address pc, frame* fr) { 2344 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2345 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2346 if (Interpreter::contains(pc)) { 2347 *fr = os::fetch_frame_from_context((void*)exceptionInfo->ContextRecord); 2348 if (!fr->is_first_java_frame()) { 2349 assert(fr->safe_for_sender(thread), "Safety check"); 2350 *fr = fr->java_sender(); 2351 } 2352 } else { 2353 // more complex code with compiled code 2354 assert(!Interpreter::contains(pc), "Interpreted methods should have been handled above"); 2355 CodeBlob* cb = CodeCache::find_blob(pc); 2356 if (cb == NULL || !cb->is_nmethod() || cb->is_frame_complete_at(pc)) { 2357 // Not sure where the pc points to, fallback to default 2358 // stack overflow handling 2359 return false; 2360 } else { 2361 *fr = os::fetch_frame_from_context((void*)exceptionInfo->ContextRecord); 2362 // in compiled code, the stack banging is performed just after the return pc 2363 // has been pushed on the stack 2364 *fr = frame(fr->sp() + 1, fr->fp(), (address)*(fr->sp())); 2365 if (!fr->is_java_frame()) { 2366 assert(fr->safe_for_sender(thread), "Safety check"); 2367 *fr = fr->java_sender(); 2368 } 2369 } 2370 } 2371 assert(fr->is_java_frame(), "Safety check"); 2372 return true; 2373 } 2374 2375 //----------------------------------------------------------------------------- 2376 LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { 2377 if (InterceptOSException) return EXCEPTION_CONTINUE_SEARCH; 2378 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; 2379 #ifdef _M_IA64 2380 // On Itanium, we need the "precise pc", which has the slot number coded 2381 // into the least 4 bits: 0000=slot0, 0100=slot1, 1000=slot2 (Windows format). 2382 address pc = (address) exceptionInfo->ExceptionRecord->ExceptionAddress; 2383 // Convert the pc to "Unix format", which has the slot number coded 2384 // into the least 2 bits: 0000=slot0, 0001=slot1, 0010=slot2 2385 // This is needed for IA64 because "relocation" / "implicit null check" / "poll instruction" 2386 // information is saved in the Unix format. 2387 address pc_unix_format = (address) ((((uint64_t)pc) & 0xFFFFFFFFFFFFFFF0) | ((((uint64_t)pc) & 0xF) >> 2)); 2388 #else 2389 #ifdef _M_AMD64 2390 address pc = (address) exceptionInfo->ContextRecord->Rip; 2391 #else 2392 address pc = (address) exceptionInfo->ContextRecord->Eip; 2393 #endif 2394 #endif 2395 Thread* t = Thread::current_or_null_safe(); 2396 2397 // Handle SafeFetch32 and SafeFetchN exceptions. 2398 if (StubRoutines::is_safefetch_fault(pc)) { 2399 return Handle_Exception(exceptionInfo, StubRoutines::continuation_for_safefetch_fault(pc)); 2400 } 2401 2402 #ifndef _WIN64 2403 // Execution protection violation - win32 running on AMD64 only 2404 // Handled first to avoid misdiagnosis as a "normal" access violation; 2405 // This is safe to do because we have a new/unique ExceptionInformation 2406 // code for this condition. 2407 if (exception_code == EXCEPTION_ACCESS_VIOLATION) { 2408 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2409 int exception_subcode = (int) exceptionRecord->ExceptionInformation[0]; 2410 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2411 2412 if (exception_subcode == EXCEPTION_INFO_EXEC_VIOLATION) { 2413 int page_size = os::vm_page_size(); 2414 2415 // Make sure the pc and the faulting address are sane. 2416 // 2417 // If an instruction spans a page boundary, and the page containing 2418 // the beginning of the instruction is executable but the following 2419 // page is not, the pc and the faulting address might be slightly 2420 // different - we still want to unguard the 2nd page in this case. 2421 // 2422 // 15 bytes seems to be a (very) safe value for max instruction size. 2423 bool pc_is_near_addr = 2424 (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15); 2425 bool instr_spans_page_boundary = 2426 (align_size_down((intptr_t) pc ^ (intptr_t) addr, 2427 (intptr_t) page_size) > 0); 2428 2429 if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) { 2430 static volatile address last_addr = 2431 (address) os::non_memory_address_word(); 2432 2433 // In conservative mode, don't unguard unless the address is in the VM 2434 if (UnguardOnExecutionViolation > 0 && addr != last_addr && 2435 (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) { 2436 2437 // Set memory to RWX and retry 2438 address page_start = 2439 (address) align_size_down((intptr_t) addr, (intptr_t) page_size); 2440 bool res = os::protect_memory((char*) page_start, page_size, 2441 os::MEM_PROT_RWX); 2442 2443 if (PrintMiscellaneous && Verbose) { 2444 char buf[256]; 2445 jio_snprintf(buf, sizeof(buf), "Execution protection violation " 2446 "at " INTPTR_FORMAT 2447 ", unguarding " INTPTR_FORMAT ": %s", addr, 2448 page_start, (res ? "success" : strerror(errno))); 2449 tty->print_raw_cr(buf); 2450 } 2451 2452 // Set last_addr so if we fault again at the same address, we don't 2453 // end up in an endless loop. 2454 // 2455 // There are two potential complications here. Two threads trapping 2456 // at the same address at the same time could cause one of the 2457 // threads to think it already unguarded, and abort the VM. Likely 2458 // very rare. 2459 // 2460 // The other race involves two threads alternately trapping at 2461 // different addresses and failing to unguard the page, resulting in 2462 // an endless loop. This condition is probably even more unlikely 2463 // than the first. 2464 // 2465 // Although both cases could be avoided by using locks or thread 2466 // local last_addr, these solutions are unnecessary complication: 2467 // this handler is a best-effort safety net, not a complete solution. 2468 // It is disabled by default and should only be used as a workaround 2469 // in case we missed any no-execute-unsafe VM code. 2470 2471 last_addr = addr; 2472 2473 return EXCEPTION_CONTINUE_EXECUTION; 2474 } 2475 } 2476 2477 // Last unguard failed or not unguarding 2478 tty->print_raw_cr("Execution protection violation"); 2479 report_error(t, exception_code, addr, exceptionInfo->ExceptionRecord, 2480 exceptionInfo->ContextRecord); 2481 return EXCEPTION_CONTINUE_SEARCH; 2482 } 2483 } 2484 #endif // _WIN64 2485 2486 // Check to see if we caught the safepoint code in the 2487 // process of write protecting the memory serialization page. 2488 // It write enables the page immediately after protecting it 2489 // so just return. 2490 if (exception_code == EXCEPTION_ACCESS_VIOLATION) { 2491 JavaThread* thread = (JavaThread*) t; 2492 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2493 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2494 if (os::is_memory_serialize_page(thread, addr)) { 2495 // Block current thread until the memory serialize page permission restored. 2496 os::block_on_serialize_page_trap(); 2497 return EXCEPTION_CONTINUE_EXECUTION; 2498 } 2499 } 2500 2501 if ((exception_code == EXCEPTION_ACCESS_VIOLATION) && 2502 VM_Version::is_cpuinfo_segv_addr(pc)) { 2503 // Verify that OS save/restore AVX registers. 2504 return Handle_Exception(exceptionInfo, VM_Version::cpuinfo_cont_addr()); 2505 } 2506 2507 if (t != NULL && t->is_Java_thread()) { 2508 JavaThread* thread = (JavaThread*) t; 2509 bool in_java = thread->thread_state() == _thread_in_Java; 2510 2511 // Handle potential stack overflows up front. 2512 if (exception_code == EXCEPTION_STACK_OVERFLOW) { 2513 #ifdef _M_IA64 2514 // Use guard page for register stack. 2515 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2516 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2517 // Check for a register stack overflow on Itanium 2518 if (thread->addr_inside_register_stack_red_zone(addr)) { 2519 // Fatal red zone violation happens if the Java program 2520 // catches a StackOverflow error and does so much processing 2521 // that it runs beyond the unprotected yellow guard zone. As 2522 // a result, we are out of here. 2523 fatal("ERROR: Unrecoverable stack overflow happened. JVM will exit."); 2524 } else if(thread->addr_inside_register_stack(addr)) { 2525 // Disable the yellow zone which sets the state that 2526 // we've got a stack overflow problem. 2527 if (thread->stack_yellow_reserved_zone_enabled()) { 2528 thread->disable_stack_yellow_reserved_zone(); 2529 } 2530 // Give us some room to process the exception. 2531 thread->disable_register_stack_guard(); 2532 // Tracing with +Verbose. 2533 if (Verbose) { 2534 tty->print_cr("SOF Compiled Register Stack overflow at " INTPTR_FORMAT " (SIGSEGV)", pc); 2535 tty->print_cr("Register Stack access at " INTPTR_FORMAT, addr); 2536 tty->print_cr("Register Stack base " INTPTR_FORMAT, thread->register_stack_base()); 2537 tty->print_cr("Register Stack [" INTPTR_FORMAT "," INTPTR_FORMAT "]", 2538 thread->register_stack_base(), 2539 thread->register_stack_base() + thread->stack_size()); 2540 } 2541 2542 // Reguard the permanent register stack red zone just to be sure. 2543 // We saw Windows silently disabling this without telling us. 2544 thread->enable_register_stack_red_zone(); 2545 2546 return Handle_Exception(exceptionInfo, 2547 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW)); 2548 } 2549 #endif 2550 if (thread->stack_guards_enabled()) { 2551 if (_thread_in_Java) { 2552 frame fr; 2553 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2554 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2555 if (os::win32::get_frame_at_stack_banging_point(thread, exceptionInfo, pc, &fr)) { 2556 assert(fr.is_java_frame(), "Must be a Java frame"); 2557 SharedRuntime::look_for_reserved_stack_annotated_method(thread, fr); 2558 } 2559 } 2560 // Yellow zone violation. The o/s has unprotected the first yellow 2561 // zone page for us. Note: must call disable_stack_yellow_zone to 2562 // update the enabled status, even if the zone contains only one page. 2563 thread->disable_stack_yellow_reserved_zone(); 2564 // If not in java code, return and hope for the best. 2565 return in_java 2566 ? Handle_Exception(exceptionInfo, SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW)) 2567 : EXCEPTION_CONTINUE_EXECUTION; 2568 } else { 2569 // Fatal red zone violation. 2570 thread->disable_stack_red_zone(); 2571 tty->print_raw_cr("An unrecoverable stack overflow has occurred."); 2572 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2573 exceptionInfo->ContextRecord); 2574 return EXCEPTION_CONTINUE_SEARCH; 2575 } 2576 } else if (exception_code == EXCEPTION_ACCESS_VIOLATION) { 2577 // Either stack overflow or null pointer exception. 2578 if (in_java) { 2579 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2580 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2581 address stack_end = thread->stack_end(); 2582 if (addr < stack_end && addr >= stack_end - os::vm_page_size()) { 2583 // Stack overflow. 2584 assert(!os::uses_stack_guard_pages(), 2585 "should be caught by red zone code above."); 2586 return Handle_Exception(exceptionInfo, 2587 SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW)); 2588 } 2589 // Check for safepoint polling and implicit null 2590 // We only expect null pointers in the stubs (vtable) 2591 // the rest are checked explicitly now. 2592 CodeBlob* cb = CodeCache::find_blob(pc); 2593 if (cb != NULL) { 2594 if (os::is_poll_address(addr)) { 2595 address stub = SharedRuntime::get_poll_stub(pc); 2596 return Handle_Exception(exceptionInfo, stub); 2597 } 2598 } 2599 { 2600 #ifdef _WIN64 2601 // If it's a legal stack address map the entire region in 2602 // 2603 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord; 2604 address addr = (address) exceptionRecord->ExceptionInformation[1]; 2605 if (addr > thread->stack_reserved_zone_base() && addr < thread->stack_base()) { 2606 addr = (address)((uintptr_t)addr & 2607 (~((uintptr_t)os::vm_page_size() - (uintptr_t)1))); 2608 os::commit_memory((char *)addr, thread->stack_base() - addr, 2609 !ExecMem); 2610 return EXCEPTION_CONTINUE_EXECUTION; 2611 } else 2612 #endif 2613 { 2614 // Null pointer exception. 2615 #ifdef _M_IA64 2616 // Process implicit null checks in compiled code. Note: Implicit null checks 2617 // can happen even if "ImplicitNullChecks" is disabled, e.g. in vtable stubs. 2618 if (CodeCache::contains((void*) pc_unix_format) && !MacroAssembler::needs_explicit_null_check((intptr_t) addr)) { 2619 CodeBlob *cb = CodeCache::find_blob_unsafe(pc_unix_format); 2620 // Handle implicit null check in UEP method entry 2621 if (cb && (cb->is_frame_complete_at(pc) || 2622 (cb->is_nmethod() && ((nmethod *)cb)->inlinecache_check_contains(pc)))) { 2623 if (Verbose) { 2624 intptr_t *bundle_start = (intptr_t*) ((intptr_t) pc_unix_format & 0xFFFFFFFFFFFFFFF0); 2625 tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", pc_unix_format); 2626 tty->print_cr(" to addr " INTPTR_FORMAT, addr); 2627 tty->print_cr(" bundle is " INTPTR_FORMAT " (high), " INTPTR_FORMAT " (low)", 2628 *(bundle_start + 1), *bundle_start); 2629 } 2630 return Handle_Exception(exceptionInfo, 2631 SharedRuntime::continuation_for_implicit_exception(thread, pc_unix_format, SharedRuntime::IMPLICIT_NULL)); 2632 } 2633 } 2634 2635 // Implicit null checks were processed above. Hence, we should not reach 2636 // here in the usual case => die! 2637 if (Verbose) tty->print_raw_cr("Access violation, possible null pointer exception"); 2638 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2639 exceptionInfo->ContextRecord); 2640 return EXCEPTION_CONTINUE_SEARCH; 2641 2642 #else // !IA64 2643 2644 if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr)) { 2645 address stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL); 2646 if (stub != NULL) return Handle_Exception(exceptionInfo, stub); 2647 } 2648 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2649 exceptionInfo->ContextRecord); 2650 return EXCEPTION_CONTINUE_SEARCH; 2651 #endif 2652 } 2653 } 2654 } 2655 2656 #ifdef _WIN64 2657 // Special care for fast JNI field accessors. 2658 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks 2659 // in and the heap gets shrunk before the field access. 2660 if (exception_code == EXCEPTION_ACCESS_VIOLATION) { 2661 address addr = JNI_FastGetField::find_slowcase_pc(pc); 2662 if (addr != (address)-1) { 2663 return Handle_Exception(exceptionInfo, addr); 2664 } 2665 } 2666 #endif 2667 2668 // Stack overflow or null pointer exception in native code. 2669 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2670 exceptionInfo->ContextRecord); 2671 return EXCEPTION_CONTINUE_SEARCH; 2672 } // /EXCEPTION_ACCESS_VIOLATION 2673 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2674 #if defined _M_IA64 2675 else if ((exception_code == EXCEPTION_ILLEGAL_INSTRUCTION || 2676 exception_code == EXCEPTION_ILLEGAL_INSTRUCTION_2)) { 2677 M37 handle_wrong_method_break(0, NativeJump::HANDLE_WRONG_METHOD, PR0); 2678 2679 // Compiled method patched to be non entrant? Following conditions must apply: 2680 // 1. must be first instruction in bundle 2681 // 2. must be a break instruction with appropriate code 2682 if ((((uint64_t) pc & 0x0F) == 0) && 2683 (((IPF_Bundle*) pc)->get_slot0() == handle_wrong_method_break.bits())) { 2684 return Handle_Exception(exceptionInfo, 2685 (address)SharedRuntime::get_handle_wrong_method_stub()); 2686 } 2687 } // /EXCEPTION_ILLEGAL_INSTRUCTION 2688 #endif 2689 2690 2691 if (in_java) { 2692 switch (exception_code) { 2693 case EXCEPTION_INT_DIVIDE_BY_ZERO: 2694 return Handle_Exception(exceptionInfo, SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO)); 2695 2696 case EXCEPTION_INT_OVERFLOW: 2697 return Handle_IDiv_Exception(exceptionInfo); 2698 2699 } // switch 2700 } 2701 if (((thread->thread_state() == _thread_in_Java) || 2702 (thread->thread_state() == _thread_in_native)) && 2703 exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION) { 2704 LONG result=Handle_FLT_Exception(exceptionInfo); 2705 if (result==EXCEPTION_CONTINUE_EXECUTION) return result; 2706 } 2707 } 2708 2709 if (exception_code != EXCEPTION_BREAKPOINT) { 2710 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2711 exceptionInfo->ContextRecord); 2712 } 2713 return EXCEPTION_CONTINUE_SEARCH; 2714 } 2715 2716 #ifndef _WIN64 2717 // Special care for fast JNI accessors. 2718 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in and 2719 // the heap gets shrunk before the field access. 2720 // Need to install our own structured exception handler since native code may 2721 // install its own. 2722 LONG WINAPI fastJNIAccessorExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { 2723 DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode; 2724 if (exception_code == EXCEPTION_ACCESS_VIOLATION) { 2725 address pc = (address) exceptionInfo->ContextRecord->Eip; 2726 address addr = JNI_FastGetField::find_slowcase_pc(pc); 2727 if (addr != (address)-1) { 2728 return Handle_Exception(exceptionInfo, addr); 2729 } 2730 } 2731 return EXCEPTION_CONTINUE_SEARCH; 2732 } 2733 2734 #define DEFINE_FAST_GETFIELD(Return, Fieldname, Result) \ 2735 Return JNICALL jni_fast_Get##Result##Field_wrapper(JNIEnv *env, \ 2736 jobject obj, \ 2737 jfieldID fieldID) { \ 2738 __try { \ 2739 return (*JNI_FastGetField::jni_fast_Get##Result##Field_fp)(env, \ 2740 obj, \ 2741 fieldID); \ 2742 } __except(fastJNIAccessorExceptionFilter((_EXCEPTION_POINTERS*) \ 2743 _exception_info())) { \ 2744 } \ 2745 return 0; \ 2746 } 2747 2748 DEFINE_FAST_GETFIELD(jboolean, bool, Boolean) 2749 DEFINE_FAST_GETFIELD(jbyte, byte, Byte) 2750 DEFINE_FAST_GETFIELD(jchar, char, Char) 2751 DEFINE_FAST_GETFIELD(jshort, short, Short) 2752 DEFINE_FAST_GETFIELD(jint, int, Int) 2753 DEFINE_FAST_GETFIELD(jlong, long, Long) 2754 DEFINE_FAST_GETFIELD(jfloat, float, Float) 2755 DEFINE_FAST_GETFIELD(jdouble, double, Double) 2756 2757 address os::win32::fast_jni_accessor_wrapper(BasicType type) { 2758 switch (type) { 2759 case T_BOOLEAN: return (address)jni_fast_GetBooleanField_wrapper; 2760 case T_BYTE: return (address)jni_fast_GetByteField_wrapper; 2761 case T_CHAR: return (address)jni_fast_GetCharField_wrapper; 2762 case T_SHORT: return (address)jni_fast_GetShortField_wrapper; 2763 case T_INT: return (address)jni_fast_GetIntField_wrapper; 2764 case T_LONG: return (address)jni_fast_GetLongField_wrapper; 2765 case T_FLOAT: return (address)jni_fast_GetFloatField_wrapper; 2766 case T_DOUBLE: return (address)jni_fast_GetDoubleField_wrapper; 2767 default: ShouldNotReachHere(); 2768 } 2769 return (address)-1; 2770 } 2771 #endif 2772 2773 // Virtual Memory 2774 2775 int os::vm_page_size() { return os::win32::vm_page_size(); } 2776 int os::vm_allocation_granularity() { 2777 return os::win32::vm_allocation_granularity(); 2778 } 2779 2780 // Windows large page support is available on Windows 2003. In order to use 2781 // large page memory, the administrator must first assign additional privilege 2782 // to the user: 2783 // + select Control Panel -> Administrative Tools -> Local Security Policy 2784 // + select Local Policies -> User Rights Assignment 2785 // + double click "Lock pages in memory", add users and/or groups 2786 // + reboot 2787 // Note the above steps are needed for administrator as well, as administrators 2788 // by default do not have the privilege to lock pages in memory. 2789 // 2790 // Note about Windows 2003: although the API supports committing large page 2791 // memory on a page-by-page basis and VirtualAlloc() returns success under this 2792 // scenario, I found through experiment it only uses large page if the entire 2793 // memory region is reserved and committed in a single VirtualAlloc() call. 2794 // This makes Windows large page support more or less like Solaris ISM, in 2795 // that the entire heap must be committed upfront. This probably will change 2796 // in the future, if so the code below needs to be revisited. 2797 2798 #ifndef MEM_LARGE_PAGES 2799 #define MEM_LARGE_PAGES 0x20000000 2800 #endif 2801 2802 static HANDLE _hProcess; 2803 static HANDLE _hToken; 2804 2805 // Container for NUMA node list info 2806 class NUMANodeListHolder { 2807 private: 2808 int *_numa_used_node_list; // allocated below 2809 int _numa_used_node_count; 2810 2811 void free_node_list() { 2812 if (_numa_used_node_list != NULL) { 2813 FREE_C_HEAP_ARRAY(int, _numa_used_node_list); 2814 } 2815 } 2816 2817 public: 2818 NUMANodeListHolder() { 2819 _numa_used_node_count = 0; 2820 _numa_used_node_list = NULL; 2821 // do rest of initialization in build routine (after function pointers are set up) 2822 } 2823 2824 ~NUMANodeListHolder() { 2825 free_node_list(); 2826 } 2827 2828 bool build() { 2829 DWORD_PTR proc_aff_mask; 2830 DWORD_PTR sys_aff_mask; 2831 if (!GetProcessAffinityMask(GetCurrentProcess(), &proc_aff_mask, &sys_aff_mask)) return false; 2832 ULONG highest_node_number; 2833 if (!GetNumaHighestNodeNumber(&highest_node_number)) return false; 2834 free_node_list(); 2835 _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1, mtInternal); 2836 for (unsigned int i = 0; i <= highest_node_number; i++) { 2837 ULONGLONG proc_mask_numa_node; 2838 if (!GetNumaNodeProcessorMask(i, &proc_mask_numa_node)) return false; 2839 if ((proc_aff_mask & proc_mask_numa_node)!=0) { 2840 _numa_used_node_list[_numa_used_node_count++] = i; 2841 } 2842 } 2843 return (_numa_used_node_count > 1); 2844 } 2845 2846 int get_count() { return _numa_used_node_count; } 2847 int get_node_list_entry(int n) { 2848 // for indexes out of range, returns -1 2849 return (n < _numa_used_node_count ? _numa_used_node_list[n] : -1); 2850 } 2851 2852 } numa_node_list_holder; 2853 2854 2855 2856 static size_t _large_page_size = 0; 2857 2858 static bool request_lock_memory_privilege() { 2859 _hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, 2860 os::current_process_id()); 2861 2862 LUID luid; 2863 if (_hProcess != NULL && 2864 OpenProcessToken(_hProcess, TOKEN_ADJUST_PRIVILEGES, &_hToken) && 2865 LookupPrivilegeValue(NULL, "SeLockMemoryPrivilege", &luid)) { 2866 2867 TOKEN_PRIVILEGES tp; 2868 tp.PrivilegeCount = 1; 2869 tp.Privileges[0].Luid = luid; 2870 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 2871 2872 // AdjustTokenPrivileges() may return TRUE even when it couldn't change the 2873 // privilege. Check GetLastError() too. See MSDN document. 2874 if (AdjustTokenPrivileges(_hToken, false, &tp, sizeof(tp), NULL, NULL) && 2875 (GetLastError() == ERROR_SUCCESS)) { 2876 return true; 2877 } 2878 } 2879 2880 return false; 2881 } 2882 2883 static void cleanup_after_large_page_init() { 2884 if (_hProcess) CloseHandle(_hProcess); 2885 _hProcess = NULL; 2886 if (_hToken) CloseHandle(_hToken); 2887 _hToken = NULL; 2888 } 2889 2890 static bool numa_interleaving_init() { 2891 bool success = false; 2892 bool use_numa_interleaving_specified = !FLAG_IS_DEFAULT(UseNUMAInterleaving); 2893 2894 // print a warning if UseNUMAInterleaving flag is specified on command line 2895 bool warn_on_failure = use_numa_interleaving_specified; 2896 #define WARN(msg) if (warn_on_failure) { warning(msg); } 2897 2898 // NUMAInterleaveGranularity cannot be less than vm_allocation_granularity (or _large_page_size if using large pages) 2899 size_t min_interleave_granularity = UseLargePages ? _large_page_size : os::vm_allocation_granularity(); 2900 NUMAInterleaveGranularity = align_size_up(NUMAInterleaveGranularity, min_interleave_granularity); 2901 2902 if (numa_node_list_holder.build()) { 2903 if (PrintMiscellaneous && Verbose) { 2904 tty->print("NUMA UsedNodeCount=%d, namely ", numa_node_list_holder.get_count()); 2905 for (int i = 0; i < numa_node_list_holder.get_count(); i++) { 2906 tty->print("%d ", numa_node_list_holder.get_node_list_entry(i)); 2907 } 2908 tty->print("\n"); 2909 } 2910 success = true; 2911 } else { 2912 WARN("Process does not cover multiple NUMA nodes."); 2913 } 2914 if (!success) { 2915 if (use_numa_interleaving_specified) WARN("...Ignoring UseNUMAInterleaving flag."); 2916 } 2917 return success; 2918 #undef WARN 2919 } 2920 2921 // this routine is used whenever we need to reserve a contiguous VA range 2922 // but we need to make separate VirtualAlloc calls for each piece of the range 2923 // Reasons for doing this: 2924 // * UseLargePagesIndividualAllocation was set (normally only needed on WS2003 but possible to be set otherwise) 2925 // * UseNUMAInterleaving requires a separate node for each piece 2926 static char* allocate_pages_individually(size_t bytes, char* addr, DWORD flags, 2927 DWORD prot, 2928 bool should_inject_error = false) { 2929 char * p_buf; 2930 // note: at setup time we guaranteed that NUMAInterleaveGranularity was aligned up to a page size 2931 size_t page_size = UseLargePages ? _large_page_size : os::vm_allocation_granularity(); 2932 size_t chunk_size = UseNUMAInterleaving ? NUMAInterleaveGranularity : page_size; 2933 2934 // first reserve enough address space in advance since we want to be 2935 // able to break a single contiguous virtual address range into multiple 2936 // large page commits but WS2003 does not allow reserving large page space 2937 // so we just use 4K pages for reserve, this gives us a legal contiguous 2938 // address space. then we will deallocate that reservation, and re alloc 2939 // using large pages 2940 const size_t size_of_reserve = bytes + chunk_size; 2941 if (bytes > size_of_reserve) { 2942 // Overflowed. 2943 return NULL; 2944 } 2945 p_buf = (char *) VirtualAlloc(addr, 2946 size_of_reserve, // size of Reserve 2947 MEM_RESERVE, 2948 PAGE_READWRITE); 2949 // If reservation failed, return NULL 2950 if (p_buf == NULL) return NULL; 2951 MemTracker::record_virtual_memory_reserve((address)p_buf, size_of_reserve, CALLER_PC); 2952 os::release_memory(p_buf, bytes + chunk_size); 2953 2954 // we still need to round up to a page boundary (in case we are using large pages) 2955 // but not to a chunk boundary (in case InterleavingGranularity doesn't align with page size) 2956 // instead we handle this in the bytes_to_rq computation below 2957 p_buf = (char *) align_size_up((size_t)p_buf, page_size); 2958 2959 // now go through and allocate one chunk at a time until all bytes are 2960 // allocated 2961 size_t bytes_remaining = bytes; 2962 // An overflow of align_size_up() would have been caught above 2963 // in the calculation of size_of_reserve. 2964 char * next_alloc_addr = p_buf; 2965 HANDLE hProc = GetCurrentProcess(); 2966 2967 #ifdef ASSERT 2968 // Variable for the failure injection 2969 long ran_num = os::random(); 2970 size_t fail_after = ran_num % bytes; 2971 #endif 2972 2973 int count=0; 2974 while (bytes_remaining) { 2975 // select bytes_to_rq to get to the next chunk_size boundary 2976 2977 size_t bytes_to_rq = MIN2(bytes_remaining, chunk_size - ((size_t)next_alloc_addr % chunk_size)); 2978 // Note allocate and commit 2979 char * p_new; 2980 2981 #ifdef ASSERT 2982 bool inject_error_now = should_inject_error && (bytes_remaining <= fail_after); 2983 #else 2984 const bool inject_error_now = false; 2985 #endif 2986 2987 if (inject_error_now) { 2988 p_new = NULL; 2989 } else { 2990 if (!UseNUMAInterleaving) { 2991 p_new = (char *) VirtualAlloc(next_alloc_addr, 2992 bytes_to_rq, 2993 flags, 2994 prot); 2995 } else { 2996 // get the next node to use from the used_node_list 2997 assert(numa_node_list_holder.get_count() > 0, "Multiple NUMA nodes expected"); 2998 DWORD node = numa_node_list_holder.get_node_list_entry(count % numa_node_list_holder.get_count()); 2999 p_new = (char *)VirtualAllocExNuma(hProc, next_alloc_addr, bytes_to_rq, flags, prot, node); 3000 } 3001 } 3002 3003 if (p_new == NULL) { 3004 // Free any allocated pages 3005 if (next_alloc_addr > p_buf) { 3006 // Some memory was committed so release it. 3007 size_t bytes_to_release = bytes - bytes_remaining; 3008 // NMT has yet to record any individual blocks, so it 3009 // need to create a dummy 'reserve' record to match 3010 // the release. 3011 MemTracker::record_virtual_memory_reserve((address)p_buf, 3012 bytes_to_release, CALLER_PC); 3013 os::release_memory(p_buf, bytes_to_release); 3014 } 3015 #ifdef ASSERT 3016 if (should_inject_error) { 3017 if (TracePageSizes && Verbose) { 3018 tty->print_cr("Reserving pages individually failed."); 3019 } 3020 } 3021 #endif 3022 return NULL; 3023 } 3024 3025 bytes_remaining -= bytes_to_rq; 3026 next_alloc_addr += bytes_to_rq; 3027 count++; 3028 } 3029 // Although the memory is allocated individually, it is returned as one. 3030 // NMT records it as one block. 3031 if ((flags & MEM_COMMIT) != 0) { 3032 MemTracker::record_virtual_memory_reserve_and_commit((address)p_buf, bytes, CALLER_PC); 3033 } else { 3034 MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, CALLER_PC); 3035 } 3036 3037 // made it this far, success 3038 return p_buf; 3039 } 3040 3041 3042 3043 void os::large_page_init() { 3044 if (!UseLargePages) return; 3045 3046 // print a warning if any large page related flag is specified on command line 3047 bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) || 3048 !FLAG_IS_DEFAULT(LargePageSizeInBytes); 3049 bool success = false; 3050 3051 #define WARN(msg) if (warn_on_failure) { warning(msg); } 3052 if (request_lock_memory_privilege()) { 3053 size_t s = GetLargePageMinimum(); 3054 if (s) { 3055 #if defined(IA32) || defined(AMD64) 3056 if (s > 4*M || LargePageSizeInBytes > 4*M) { 3057 WARN("JVM cannot use large pages bigger than 4mb."); 3058 } else { 3059 #endif 3060 if (LargePageSizeInBytes && LargePageSizeInBytes % s == 0) { 3061 _large_page_size = LargePageSizeInBytes; 3062 } else { 3063 _large_page_size = s; 3064 } 3065 success = true; 3066 #if defined(IA32) || defined(AMD64) 3067 } 3068 #endif 3069 } else { 3070 WARN("Large page is not supported by the processor."); 3071 } 3072 } else { 3073 WARN("JVM cannot use large page memory because it does not have enough privilege to lock pages in memory."); 3074 } 3075 #undef WARN 3076 3077 const size_t default_page_size = (size_t) vm_page_size(); 3078 if (success && _large_page_size > default_page_size) { 3079 _page_sizes[0] = _large_page_size; 3080 _page_sizes[1] = default_page_size; 3081 _page_sizes[2] = 0; 3082 } 3083 3084 cleanup_after_large_page_init(); 3085 UseLargePages = success; 3086 } 3087 3088 // On win32, one cannot release just a part of reserved memory, it's an 3089 // all or nothing deal. When we split a reservation, we must break the 3090 // reservation into two reservations. 3091 void os::pd_split_reserved_memory(char *base, size_t size, size_t split, 3092 bool realloc) { 3093 if (size > 0) { 3094 release_memory(base, size); 3095 if (realloc) { 3096 reserve_memory(split, base); 3097 } 3098 if (size != split) { 3099 reserve_memory(size - split, base + split); 3100 } 3101 } 3102 } 3103 3104 char* os::reserve_memory_with_backing_file(size_t bytes, char* addr, size_t alignment_hint, const char* backingFile) { 3105 VMError::report_and_die("Allocating object heap with backing file is not supported for Windows"); 3106 return NULL; 3107 } 3108 3109 // Multiple threads can race in this code but it's not possible to unmap small sections of 3110 // virtual space to get requested alignment, like posix-like os's. 3111 // Windows prevents multiple thread from remapping over each other so this loop is thread-safe. 3112 char* os::reserve_memory_aligned(size_t size, size_t alignment) { 3113 assert((alignment & (os::vm_allocation_granularity() - 1)) == 0, 3114 "Alignment must be a multiple of allocation granularity (page size)"); 3115 assert((size & (alignment -1)) == 0, "size must be 'alignment' aligned"); 3116 3117 size_t extra_size = size + alignment; 3118 assert(extra_size >= size, "overflow, size is too large to allow alignment"); 3119 3120 char* aligned_base = NULL; 3121 3122 do { 3123 char* extra_base = os::reserve_memory(extra_size, NULL, alignment); 3124 if (extra_base == NULL) { 3125 return NULL; 3126 } 3127 // Do manual alignment 3128 aligned_base = (char*) align_size_up((uintptr_t) extra_base, alignment); 3129 3130 os::release_memory(extra_base, extra_size); 3131 3132 aligned_base = os::reserve_memory(size, aligned_base); 3133 3134 } while (aligned_base == NULL); 3135 3136 return aligned_base; 3137 } 3138 3139 char* os::pd_reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { 3140 assert((size_t)addr % os::vm_allocation_granularity() == 0, 3141 "reserve alignment"); 3142 assert(bytes % os::vm_page_size() == 0, "reserve page size"); 3143 char* res; 3144 // note that if UseLargePages is on, all the areas that require interleaving 3145 // will go thru reserve_memory_special rather than thru here. 3146 bool use_individual = (UseNUMAInterleaving && !UseLargePages); 3147 if (!use_individual) { 3148 res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE); 3149 } else { 3150 elapsedTimer reserveTimer; 3151 if (Verbose && PrintMiscellaneous) reserveTimer.start(); 3152 // in numa interleaving, we have to allocate pages individually 3153 // (well really chunks of NUMAInterleaveGranularity size) 3154 res = allocate_pages_individually(bytes, addr, MEM_RESERVE, PAGE_READWRITE); 3155 if (res == NULL) { 3156 warning("NUMA page allocation failed"); 3157 } 3158 if (Verbose && PrintMiscellaneous) { 3159 reserveTimer.stop(); 3160 tty->print_cr("reserve_memory of %Ix bytes took " JLONG_FORMAT " ms (" JLONG_FORMAT " ticks)", bytes, 3161 reserveTimer.milliseconds(), reserveTimer.ticks()); 3162 } 3163 } 3164 assert(res == NULL || addr == NULL || addr == res, 3165 "Unexpected address from reserve."); 3166 3167 return res; 3168 } 3169 3170 // Reserve memory at an arbitrary address, only if that area is 3171 // available (and not reserved for something else). 3172 char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { 3173 // Windows os::reserve_memory() fails of the requested address range is 3174 // not avilable. 3175 return reserve_memory(bytes, requested_addr); 3176 } 3177 3178 size_t os::large_page_size() { 3179 return _large_page_size; 3180 } 3181 3182 bool os::can_commit_large_page_memory() { 3183 // Windows only uses large page memory when the entire region is reserved 3184 // and committed in a single VirtualAlloc() call. This may change in the 3185 // future, but with Windows 2003 it's not possible to commit on demand. 3186 return false; 3187 } 3188 3189 bool os::can_execute_large_page_memory() { 3190 return true; 3191 } 3192 3193 char* os::reserve_memory_special(size_t bytes, size_t alignment, char* addr, 3194 bool exec) { 3195 assert(UseLargePages, "only for large pages"); 3196 3197 if (!is_size_aligned(bytes, os::large_page_size()) || alignment > os::large_page_size()) { 3198 return NULL; // Fallback to small pages. 3199 } 3200 3201 const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; 3202 const DWORD flags = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES; 3203 3204 // with large pages, there are two cases where we need to use Individual Allocation 3205 // 1) the UseLargePagesIndividualAllocation flag is set (set by default on WS2003) 3206 // 2) NUMA Interleaving is enabled, in which case we use a different node for each page 3207 if (UseLargePagesIndividualAllocation || UseNUMAInterleaving) { 3208 if (TracePageSizes && Verbose) { 3209 tty->print_cr("Reserving large pages individually."); 3210 } 3211 char * p_buf = allocate_pages_individually(bytes, addr, flags, prot, LargePagesIndividualAllocationInjectError); 3212 if (p_buf == NULL) { 3213 // give an appropriate warning message 3214 if (UseNUMAInterleaving) { 3215 warning("NUMA large page allocation failed, UseLargePages flag ignored"); 3216 } 3217 if (UseLargePagesIndividualAllocation) { 3218 warning("Individually allocated large pages failed, " 3219 "use -XX:-UseLargePagesIndividualAllocation to turn off"); 3220 } 3221 return NULL; 3222 } 3223 3224 return p_buf; 3225 3226 } else { 3227 if (TracePageSizes && Verbose) { 3228 tty->print_cr("Reserving large pages in a single large chunk."); 3229 } 3230 // normal policy just allocate it all at once 3231 DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES; 3232 char * res = (char *)VirtualAlloc(addr, bytes, flag, prot); 3233 if (res != NULL) { 3234 MemTracker::record_virtual_memory_reserve_and_commit((address)res, bytes, CALLER_PC); 3235 } 3236 3237 return res; 3238 } 3239 } 3240 3241 bool os::release_memory_special(char* base, size_t bytes) { 3242 assert(base != NULL, "Sanity check"); 3243 return release_memory(base, bytes); 3244 } 3245 3246 void os::print_statistics() { 3247 } 3248 3249 static void warn_fail_commit_memory(char* addr, size_t bytes, bool exec) { 3250 int err = os::get_last_error(); 3251 char buf[256]; 3252 size_t buf_len = os::lasterror(buf, sizeof(buf)); 3253 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT 3254 ", %d) failed; error='%s' (DOS error/errno=%d)", addr, bytes, 3255 exec, buf_len != 0 ? buf : "<no_error_string>", err); 3256 } 3257 3258 bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) { 3259 if (bytes == 0) { 3260 // Don't bother the OS with noops. 3261 return true; 3262 } 3263 assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries"); 3264 assert(bytes % os::vm_page_size() == 0, "commit in page-sized chunks"); 3265 // Don't attempt to print anything if the OS call fails. We're 3266 // probably low on resources, so the print itself may cause crashes. 3267 3268 // unless we have NUMAInterleaving enabled, the range of a commit 3269 // is always within a reserve covered by a single VirtualAlloc 3270 // in that case we can just do a single commit for the requested size 3271 if (!UseNUMAInterleaving) { 3272 if (VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) == NULL) { 3273 NOT_PRODUCT(warn_fail_commit_memory(addr, bytes, exec);) 3274 return false; 3275 } 3276 if (exec) { 3277 DWORD oldprot; 3278 // Windows doc says to use VirtualProtect to get execute permissions 3279 if (!VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &oldprot)) { 3280 NOT_PRODUCT(warn_fail_commit_memory(addr, bytes, exec);) 3281 return false; 3282 } 3283 } 3284 return true; 3285 } else { 3286 3287 // when NUMAInterleaving is enabled, the commit might cover a range that 3288 // came from multiple VirtualAlloc reserves (using allocate_pages_individually). 3289 // VirtualQuery can help us determine that. The RegionSize that VirtualQuery 3290 // returns represents the number of bytes that can be committed in one step. 3291 size_t bytes_remaining = bytes; 3292 char * next_alloc_addr = addr; 3293 while (bytes_remaining > 0) { 3294 MEMORY_BASIC_INFORMATION alloc_info; 3295 VirtualQuery(next_alloc_addr, &alloc_info, sizeof(alloc_info)); 3296 size_t bytes_to_rq = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize); 3297 if (VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_COMMIT, 3298 PAGE_READWRITE) == NULL) { 3299 NOT_PRODUCT(warn_fail_commit_memory(next_alloc_addr, bytes_to_rq, 3300 exec);) 3301 return false; 3302 } 3303 if (exec) { 3304 DWORD oldprot; 3305 if (!VirtualProtect(next_alloc_addr, bytes_to_rq, 3306 PAGE_EXECUTE_READWRITE, &oldprot)) { 3307 NOT_PRODUCT(warn_fail_commit_memory(next_alloc_addr, bytes_to_rq, 3308 exec);) 3309 return false; 3310 } 3311 } 3312 bytes_remaining -= bytes_to_rq; 3313 next_alloc_addr += bytes_to_rq; 3314 } 3315 } 3316 // if we made it this far, return true 3317 return true; 3318 } 3319 3320 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, 3321 bool exec) { 3322 // alignment_hint is ignored on this OS 3323 return pd_commit_memory(addr, size, exec); 3324 } 3325 3326 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec, 3327 const char* mesg) { 3328 assert(mesg != NULL, "mesg must be specified"); 3329 if (!pd_commit_memory(addr, size, exec)) { 3330 warn_fail_commit_memory(addr, size, exec); 3331 vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "%s", mesg); 3332 } 3333 } 3334 3335 void os::pd_commit_memory_or_exit(char* addr, size_t size, 3336 size_t alignment_hint, bool exec, 3337 const char* mesg) { 3338 // alignment_hint is ignored on this OS 3339 pd_commit_memory_or_exit(addr, size, exec, mesg); 3340 } 3341 3342 bool os::pd_uncommit_memory(char* addr, size_t bytes) { 3343 if (bytes == 0) { 3344 // Don't bother the OS with noops. 3345 return true; 3346 } 3347 assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries"); 3348 assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks"); 3349 return (VirtualFree(addr, bytes, MEM_DECOMMIT) != 0); 3350 } 3351 3352 bool os::pd_release_memory(char* addr, size_t bytes) { 3353 return VirtualFree(addr, 0, MEM_RELEASE) != 0; 3354 } 3355 3356 bool os::pd_create_stack_guard_pages(char* addr, size_t size) { 3357 return os::commit_memory(addr, size, !ExecMem); 3358 } 3359 3360 bool os::remove_stack_guard_pages(char* addr, size_t size) { 3361 return os::uncommit_memory(addr, size); 3362 } 3363 3364 static bool protect_pages_individually(char* addr, size_t bytes, unsigned int p, DWORD *old_status) { 3365 uint count = 0; 3366 bool ret = false; 3367 size_t bytes_remaining = bytes; 3368 char * next_protect_addr = addr; 3369 3370 // Use VirtualQuery() to get the chunk size. 3371 while (bytes_remaining) { 3372 MEMORY_BASIC_INFORMATION alloc_info; 3373 if (VirtualQuery(next_protect_addr, &alloc_info, sizeof(alloc_info)) == 0) { 3374 return false; 3375 } 3376 3377 size_t bytes_to_protect = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize); 3378 // We used different API at allocate_pages_individually() based on UseNUMAInterleaving, 3379 // but we don't distinguish here as both cases are protected by same API. 3380 ret = VirtualProtect(next_protect_addr, bytes_to_protect, p, old_status) != 0; 3381 warning("Failed protecting pages individually for chunk #%u", count); 3382 if (!ret) { 3383 return false; 3384 } 3385 3386 bytes_remaining -= bytes_to_protect; 3387 next_protect_addr += bytes_to_protect; 3388 count++; 3389 } 3390 return ret; 3391 } 3392 3393 // Set protections specified 3394 bool os::protect_memory(char* addr, size_t bytes, ProtType prot, 3395 bool is_committed) { 3396 unsigned int p = 0; 3397 switch (prot) { 3398 case MEM_PROT_NONE: p = PAGE_NOACCESS; break; 3399 case MEM_PROT_READ: p = PAGE_READONLY; break; 3400 case MEM_PROT_RW: p = PAGE_READWRITE; break; 3401 case MEM_PROT_RWX: p = PAGE_EXECUTE_READWRITE; break; 3402 default: 3403 ShouldNotReachHere(); 3404 } 3405 3406 DWORD old_status; 3407 3408 // Strange enough, but on Win32 one can change protection only for committed 3409 // memory, not a big deal anyway, as bytes less or equal than 64K 3410 if (!is_committed) { 3411 commit_memory_or_exit(addr, bytes, prot == MEM_PROT_RWX, 3412 "cannot commit protection page"); 3413 } 3414 // One cannot use os::guard_memory() here, as on Win32 guard page 3415 // have different (one-shot) semantics, from MSDN on PAGE_GUARD: 3416 // 3417 // Pages in the region become guard pages. Any attempt to access a guard page 3418 // causes the system to raise a STATUS_GUARD_PAGE exception and turn off 3419 // the guard page status. Guard pages thus act as a one-time access alarm. 3420 bool ret; 3421 if (UseNUMAInterleaving) { 3422 // If UseNUMAInterleaving is enabled, the pages may have been allocated a chunk at a time, 3423 // so we must protect the chunks individually. 3424 ret = protect_pages_individually(addr, bytes, p, &old_status); 3425 } else { 3426 ret = VirtualProtect(addr, bytes, p, &old_status) != 0; 3427 } 3428 #ifdef ASSERT 3429 if (!ret) { 3430 int err = os::get_last_error(); 3431 char buf[256]; 3432 size_t buf_len = os::lasterror(buf, sizeof(buf)); 3433 warning("INFO: os::protect_memory(" PTR_FORMAT ", " SIZE_FORMAT 3434 ") failed; error='%s' (DOS error/errno=%d)", addr, bytes, 3435 buf_len != 0 ? buf : "<no_error_string>", err); 3436 } 3437 #endif 3438 return ret; 3439 } 3440 3441 bool os::guard_memory(char* addr, size_t bytes) { 3442 DWORD old_status; 3443 return VirtualProtect(addr, bytes, PAGE_READWRITE | PAGE_GUARD, &old_status) != 0; 3444 } 3445 3446 bool os::unguard_memory(char* addr, size_t bytes) { 3447 DWORD old_status; 3448 return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0; 3449 } 3450 3451 void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } 3452 void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { } 3453 void os::numa_make_global(char *addr, size_t bytes) { } 3454 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { } 3455 bool os::numa_topology_changed() { return false; } 3456 size_t os::numa_get_groups_num() { return MAX2(numa_node_list_holder.get_count(), 1); } 3457 int os::numa_get_group_id() { return 0; } 3458 size_t os::numa_get_leaf_groups(int *ids, size_t size) { 3459 if (numa_node_list_holder.get_count() == 0 && size > 0) { 3460 // Provide an answer for UMA systems 3461 ids[0] = 0; 3462 return 1; 3463 } else { 3464 // check for size bigger than actual groups_num 3465 size = MIN2(size, numa_get_groups_num()); 3466 for (int i = 0; i < (int)size; i++) { 3467 ids[i] = numa_node_list_holder.get_node_list_entry(i); 3468 } 3469 return size; 3470 } 3471 } 3472 3473 bool os::get_page_info(char *start, page_info* info) { 3474 return false; 3475 } 3476 3477 char *os::scan_pages(char *start, char* end, page_info* page_expected, 3478 page_info* page_found) { 3479 return end; 3480 } 3481 3482 char* os::non_memory_address_word() { 3483 // Must never look like an address returned by reserve_memory, 3484 // even in its subfields (as defined by the CPU immediate fields, 3485 // if the CPU splits constants across multiple instructions). 3486 return (char*)-1; 3487 } 3488 3489 #define MAX_ERROR_COUNT 100 3490 #define SYS_THREAD_ERROR 0xffffffffUL 3491 3492 void os::pd_start_thread(Thread* thread) { 3493 DWORD ret = ResumeThread(thread->osthread()->thread_handle()); 3494 // Returns previous suspend state: 3495 // 0: Thread was not suspended 3496 // 1: Thread is running now 3497 // >1: Thread is still suspended. 3498 assert(ret != SYS_THREAD_ERROR, "StartThread failed"); // should propagate back 3499 } 3500 3501 class HighResolutionInterval : public CHeapObj<mtThread> { 3502 // The default timer resolution seems to be 10 milliseconds. 3503 // (Where is this written down?) 3504 // If someone wants to sleep for only a fraction of the default, 3505 // then we set the timer resolution down to 1 millisecond for 3506 // the duration of their interval. 3507 // We carefully set the resolution back, since otherwise we 3508 // seem to incur an overhead (3%?) that we don't need. 3509 // CONSIDER: if ms is small, say 3, then we should run with a high resolution time. 3510 // Buf if ms is large, say 500, or 503, we should avoid the call to timeBeginPeriod(). 3511 // Alternatively, we could compute the relative error (503/500 = .6%) and only use 3512 // timeBeginPeriod() if the relative error exceeded some threshold. 3513 // timeBeginPeriod() has been linked to problems with clock drift on win32 systems and 3514 // to decreased efficiency related to increased timer "tick" rates. We want to minimize 3515 // (a) calls to timeBeginPeriod() and timeEndPeriod() and (b) time spent with high 3516 // resolution timers running. 3517 private: 3518 jlong resolution; 3519 public: 3520 HighResolutionInterval(jlong ms) { 3521 resolution = ms % 10L; 3522 if (resolution != 0) { 3523 MMRESULT result = timeBeginPeriod(1L); 3524 } 3525 } 3526 ~HighResolutionInterval() { 3527 if (resolution != 0) { 3528 MMRESULT result = timeEndPeriod(1L); 3529 } 3530 resolution = 0L; 3531 } 3532 }; 3533 3534 int os::sleep(Thread* thread, jlong ms, bool interruptable) { 3535 jlong limit = (jlong) MAXDWORD; 3536 3537 while (ms > limit) { 3538 int res; 3539 if ((res = sleep(thread, limit, interruptable)) != OS_TIMEOUT) { 3540 return res; 3541 } 3542 ms -= limit; 3543 } 3544 3545 assert(thread == Thread::current(), "thread consistency check"); 3546 OSThread* osthread = thread->osthread(); 3547 OSThreadWaitState osts(osthread, false /* not Object.wait() */); 3548 int result; 3549 if (interruptable) { 3550 assert(thread->is_Java_thread(), "must be java thread"); 3551 JavaThread *jt = (JavaThread *) thread; 3552 ThreadBlockInVM tbivm(jt); 3553 3554 jt->set_suspend_equivalent(); 3555 // cleared by handle_special_suspend_equivalent_condition() or 3556 // java_suspend_self() via check_and_wait_while_suspended() 3557 3558 HANDLE events[1]; 3559 events[0] = osthread->interrupt_event(); 3560 HighResolutionInterval *phri=NULL; 3561 if (!ForceTimeHighResolution) { 3562 phri = new HighResolutionInterval(ms); 3563 } 3564 if (WaitForMultipleObjects(1, events, FALSE, (DWORD)ms) == WAIT_TIMEOUT) { 3565 result = OS_TIMEOUT; 3566 } else { 3567 ResetEvent(osthread->interrupt_event()); 3568 osthread->set_interrupted(false); 3569 result = OS_INTRPT; 3570 } 3571 delete phri; //if it is NULL, harmless 3572 3573 // were we externally suspended while we were waiting? 3574 jt->check_and_wait_while_suspended(); 3575 } else { 3576 assert(!thread->is_Java_thread(), "must not be java thread"); 3577 Sleep((long) ms); 3578 result = OS_TIMEOUT; 3579 } 3580 return result; 3581 } 3582 3583 // Short sleep, direct OS call. 3584 // 3585 // ms = 0, means allow others (if any) to run. 3586 // 3587 void os::naked_short_sleep(jlong ms) { 3588 assert(ms < 1000, "Un-interruptable sleep, short time use only"); 3589 Sleep(ms); 3590 } 3591 3592 // Sleep forever; naked call to OS-specific sleep; use with CAUTION 3593 void os::infinite_sleep() { 3594 while (true) { // sleep forever ... 3595 Sleep(100000); // ... 100 seconds at a time 3596 } 3597 } 3598 3599 typedef BOOL (WINAPI * STTSignature)(void); 3600 3601 void os::naked_yield() { 3602 // Consider passing back the return value from SwitchToThread(). 3603 SwitchToThread(); 3604 } 3605 3606 // Win32 only gives you access to seven real priorities at a time, 3607 // so we compress Java's ten down to seven. It would be better 3608 // if we dynamically adjusted relative priorities. 3609 3610 int os::java_to_os_priority[CriticalPriority + 1] = { 3611 THREAD_PRIORITY_IDLE, // 0 Entry should never be used 3612 THREAD_PRIORITY_LOWEST, // 1 MinPriority 3613 THREAD_PRIORITY_LOWEST, // 2 3614 THREAD_PRIORITY_BELOW_NORMAL, // 3 3615 THREAD_PRIORITY_BELOW_NORMAL, // 4 3616 THREAD_PRIORITY_NORMAL, // 5 NormPriority 3617 THREAD_PRIORITY_NORMAL, // 6 3618 THREAD_PRIORITY_ABOVE_NORMAL, // 7 3619 THREAD_PRIORITY_ABOVE_NORMAL, // 8 3620 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority 3621 THREAD_PRIORITY_HIGHEST, // 10 MaxPriority 3622 THREAD_PRIORITY_HIGHEST // 11 CriticalPriority 3623 }; 3624 3625 int prio_policy1[CriticalPriority + 1] = { 3626 THREAD_PRIORITY_IDLE, // 0 Entry should never be used 3627 THREAD_PRIORITY_LOWEST, // 1 MinPriority 3628 THREAD_PRIORITY_LOWEST, // 2 3629 THREAD_PRIORITY_BELOW_NORMAL, // 3 3630 THREAD_PRIORITY_BELOW_NORMAL, // 4 3631 THREAD_PRIORITY_NORMAL, // 5 NormPriority 3632 THREAD_PRIORITY_ABOVE_NORMAL, // 6 3633 THREAD_PRIORITY_ABOVE_NORMAL, // 7 3634 THREAD_PRIORITY_HIGHEST, // 8 3635 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority 3636 THREAD_PRIORITY_TIME_CRITICAL, // 10 MaxPriority 3637 THREAD_PRIORITY_TIME_CRITICAL // 11 CriticalPriority 3638 }; 3639 3640 static int prio_init() { 3641 // If ThreadPriorityPolicy is 1, switch tables 3642 if (ThreadPriorityPolicy == 1) { 3643 int i; 3644 for (i = 0; i < CriticalPriority + 1; i++) { 3645 os::java_to_os_priority[i] = prio_policy1[i]; 3646 } 3647 } 3648 if (UseCriticalJavaThreadPriority) { 3649 os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority]; 3650 } 3651 return 0; 3652 } 3653 3654 OSReturn os::set_native_priority(Thread* thread, int priority) { 3655 if (!UseThreadPriorities) return OS_OK; 3656 bool ret = SetThreadPriority(thread->osthread()->thread_handle(), priority) != 0; 3657 return ret ? OS_OK : OS_ERR; 3658 } 3659 3660 OSReturn os::get_native_priority(const Thread* const thread, 3661 int* priority_ptr) { 3662 if (!UseThreadPriorities) { 3663 *priority_ptr = java_to_os_priority[NormPriority]; 3664 return OS_OK; 3665 } 3666 int os_prio = GetThreadPriority(thread->osthread()->thread_handle()); 3667 if (os_prio == THREAD_PRIORITY_ERROR_RETURN) { 3668 assert(false, "GetThreadPriority failed"); 3669 return OS_ERR; 3670 } 3671 *priority_ptr = os_prio; 3672 return OS_OK; 3673 } 3674 3675 3676 // Hint to the underlying OS that a task switch would not be good. 3677 // Void return because it's a hint and can fail. 3678 void os::hint_no_preempt() {} 3679 3680 void os::interrupt(Thread* thread) { 3681 assert(!thread->is_Java_thread() || Thread::current() == thread || 3682 Threads_lock->owned_by_self(), 3683 "possibility of dangling Thread pointer"); 3684 3685 OSThread* osthread = thread->osthread(); 3686 osthread->set_interrupted(true); 3687 // More than one thread can get here with the same value of osthread, 3688 // resulting in multiple notifications. We do, however, want the store 3689 // to interrupted() to be visible to other threads before we post 3690 // the interrupt event. 3691 OrderAccess::release(); 3692 SetEvent(osthread->interrupt_event()); 3693 // For JSR166: unpark after setting status 3694 if (thread->is_Java_thread()) { 3695 ((JavaThread*)thread)->parker()->unpark(); 3696 } 3697 3698 ParkEvent * ev = thread->_ParkEvent; 3699 if (ev != NULL) ev->unpark(); 3700 } 3701 3702 3703 bool os::is_interrupted(Thread* thread, bool clear_interrupted) { 3704 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(), 3705 "possibility of dangling Thread pointer"); 3706 3707 OSThread* osthread = thread->osthread(); 3708 // There is no synchronization between the setting of the interrupt 3709 // and it being cleared here. It is critical - see 6535709 - that 3710 // we only clear the interrupt state, and reset the interrupt event, 3711 // if we are going to report that we were indeed interrupted - else 3712 // an interrupt can be "lost", leading to spurious wakeups or lost wakeups 3713 // depending on the timing. By checking thread interrupt event to see 3714 // if the thread gets real interrupt thus prevent spurious wakeup. 3715 bool interrupted = osthread->interrupted() && (WaitForSingleObject(osthread->interrupt_event(), 0) == WAIT_OBJECT_0); 3716 if (interrupted && clear_interrupted) { 3717 osthread->set_interrupted(false); 3718 ResetEvent(osthread->interrupt_event()); 3719 } // Otherwise leave the interrupted state alone 3720 3721 return interrupted; 3722 } 3723 3724 // Get's a pc (hint) for a running thread. Currently used only for profiling. 3725 ExtendedPC os::get_thread_pc(Thread* thread) { 3726 CONTEXT context; 3727 context.ContextFlags = CONTEXT_CONTROL; 3728 HANDLE handle = thread->osthread()->thread_handle(); 3729 #ifdef _M_IA64 3730 assert(0, "Fix get_thread_pc"); 3731 return ExtendedPC(NULL); 3732 #else 3733 if (GetThreadContext(handle, &context)) { 3734 #ifdef _M_AMD64 3735 return ExtendedPC((address) context.Rip); 3736 #else 3737 return ExtendedPC((address) context.Eip); 3738 #endif 3739 } else { 3740 return ExtendedPC(NULL); 3741 } 3742 #endif 3743 } 3744 3745 // GetCurrentThreadId() returns DWORD 3746 intx os::current_thread_id() { return GetCurrentThreadId(); } 3747 3748 static int _initial_pid = 0; 3749 3750 int os::current_process_id() { 3751 return (_initial_pid ? _initial_pid : _getpid()); 3752 } 3753 3754 int os::win32::_vm_page_size = 0; 3755 int os::win32::_vm_allocation_granularity = 0; 3756 int os::win32::_processor_type = 0; 3757 // Processor level is not available on non-NT systems, use vm_version instead 3758 int os::win32::_processor_level = 0; 3759 julong os::win32::_physical_memory = 0; 3760 size_t os::win32::_default_stack_size = 0; 3761 3762 intx os::win32::_os_thread_limit = 0; 3763 volatile intx os::win32::_os_thread_count = 0; 3764 3765 bool os::win32::_is_windows_server = false; 3766 3767 // 6573254 3768 // Currently, the bug is observed across all the supported Windows releases, 3769 // including the latest one (as of this writing - Windows Server 2012 R2) 3770 bool os::win32::_has_exit_bug = true; 3771 3772 void os::win32::initialize_system_info() { 3773 SYSTEM_INFO si; 3774 GetSystemInfo(&si); 3775 _vm_page_size = si.dwPageSize; 3776 _vm_allocation_granularity = si.dwAllocationGranularity; 3777 _processor_type = si.dwProcessorType; 3778 _processor_level = si.wProcessorLevel; 3779 set_processor_count(si.dwNumberOfProcessors); 3780 3781 MEMORYSTATUSEX ms; 3782 ms.dwLength = sizeof(ms); 3783 3784 // also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual, 3785 // dwMemoryLoad (% of memory in use) 3786 GlobalMemoryStatusEx(&ms); 3787 _physical_memory = ms.ullTotalPhys; 3788 3789 OSVERSIONINFOEX oi; 3790 oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 3791 GetVersionEx((OSVERSIONINFO*)&oi); 3792 switch (oi.dwPlatformId) { 3793 case VER_PLATFORM_WIN32_NT: 3794 { 3795 int os_vers = oi.dwMajorVersion * 1000 + oi.dwMinorVersion; 3796 if (oi.wProductType == VER_NT_DOMAIN_CONTROLLER || 3797 oi.wProductType == VER_NT_SERVER) { 3798 _is_windows_server = true; 3799 } 3800 } 3801 break; 3802 default: fatal("Unknown platform"); 3803 } 3804 3805 _default_stack_size = os::current_stack_size(); 3806 assert(_default_stack_size > (size_t) _vm_page_size, "invalid stack size"); 3807 assert((_default_stack_size & (_vm_page_size - 1)) == 0, 3808 "stack size not a multiple of page size"); 3809 3810 initialize_performance_counter(); 3811 } 3812 3813 3814 HINSTANCE os::win32::load_Windows_dll(const char* name, char *ebuf, 3815 int ebuflen) { 3816 char path[MAX_PATH]; 3817 DWORD size; 3818 DWORD pathLen = (DWORD)sizeof(path); 3819 HINSTANCE result = NULL; 3820 3821 // only allow library name without path component 3822 assert(strchr(name, '\\') == NULL, "path not allowed"); 3823 assert(strchr(name, ':') == NULL, "path not allowed"); 3824 if (strchr(name, '\\') != NULL || strchr(name, ':') != NULL) { 3825 jio_snprintf(ebuf, ebuflen, 3826 "Invalid parameter while calling os::win32::load_windows_dll(): cannot take path: %s", name); 3827 return NULL; 3828 } 3829 3830 // search system directory 3831 if ((size = GetSystemDirectory(path, pathLen)) > 0) { 3832 if (size >= pathLen) { 3833 return NULL; // truncated 3834 } 3835 if (jio_snprintf(path + size, pathLen - size, "\\%s", name) == -1) { 3836 return NULL; // truncated 3837 } 3838 if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) { 3839 return result; 3840 } 3841 } 3842 3843 // try Windows directory 3844 if ((size = GetWindowsDirectory(path, pathLen)) > 0) { 3845 if (size >= pathLen) { 3846 return NULL; // truncated 3847 } 3848 if (jio_snprintf(path + size, pathLen - size, "\\%s", name) == -1) { 3849 return NULL; // truncated 3850 } 3851 if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) { 3852 return result; 3853 } 3854 } 3855 3856 jio_snprintf(ebuf, ebuflen, 3857 "os::win32::load_windows_dll() cannot load %s from system directories.", name); 3858 return NULL; 3859 } 3860 3861 #define MAXIMUM_THREADS_TO_KEEP (16 * MAXIMUM_WAIT_OBJECTS) 3862 #define EXIT_TIMEOUT 300000 /* 5 minutes */ 3863 3864 static BOOL CALLBACK init_crit_sect_call(PINIT_ONCE, PVOID pcrit_sect, PVOID*) { 3865 InitializeCriticalSection((CRITICAL_SECTION*)pcrit_sect); 3866 return TRUE; 3867 } 3868 3869 int os::win32::exit_process_or_thread(Ept what, int exit_code) { 3870 // Basic approach: 3871 // - Each exiting thread registers its intent to exit and then does so. 3872 // - A thread trying to terminate the process must wait for all 3873 // threads currently exiting to complete their exit. 3874 3875 if (os::win32::has_exit_bug()) { 3876 // The array holds handles of the threads that have started exiting by calling 3877 // _endthreadex(). 3878 // Should be large enough to avoid blocking the exiting thread due to lack of 3879 // a free slot. 3880 static HANDLE handles[MAXIMUM_THREADS_TO_KEEP]; 3881 static int handle_count = 0; 3882 3883 static INIT_ONCE init_once_crit_sect = INIT_ONCE_STATIC_INIT; 3884 static CRITICAL_SECTION crit_sect; 3885 static volatile jint process_exiting = 0; 3886 int i, j; 3887 DWORD res; 3888 HANDLE hproc, hthr; 3889 3890 // The first thread that reached this point, initializes the critical section. 3891 if (!InitOnceExecuteOnce(&init_once_crit_sect, init_crit_sect_call, &crit_sect, NULL)) { 3892 warning("crit_sect initialization failed in %s: %d\n", __FILE__, __LINE__); 3893 } else if (OrderAccess::load_acquire(&process_exiting) == 0) { 3894 if (what != EPT_THREAD) { 3895 // Atomically set process_exiting before the critical section 3896 // to increase the visibility between racing threads. 3897 Atomic::cmpxchg((jint)GetCurrentThreadId(), &process_exiting, 0); 3898 } 3899 EnterCriticalSection(&crit_sect); 3900 3901 if (what == EPT_THREAD && OrderAccess::load_acquire(&process_exiting) == 0) { 3902 // Remove from the array those handles of the threads that have completed exiting. 3903 for (i = 0, j = 0; i < handle_count; ++i) { 3904 res = WaitForSingleObject(handles[i], 0 /* don't wait */); 3905 if (res == WAIT_TIMEOUT) { 3906 handles[j++] = handles[i]; 3907 } else { 3908 if (res == WAIT_FAILED) { 3909 warning("WaitForSingleObject failed (%u) in %s: %d\n", 3910 GetLastError(), __FILE__, __LINE__); 3911 } 3912 // Don't keep the handle, if we failed waiting for it. 3913 CloseHandle(handles[i]); 3914 } 3915 } 3916 3917 // If there's no free slot in the array of the kept handles, we'll have to 3918 // wait until at least one thread completes exiting. 3919 if ((handle_count = j) == MAXIMUM_THREADS_TO_KEEP) { 3920 // Raise the priority of the oldest exiting thread to increase its chances 3921 // to complete sooner. 3922 SetThreadPriority(handles[0], THREAD_PRIORITY_ABOVE_NORMAL); 3923 res = WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, handles, FALSE, EXIT_TIMEOUT); 3924 if (res >= WAIT_OBJECT_0 && res < (WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS)) { 3925 i = (res - WAIT_OBJECT_0); 3926 handle_count = MAXIMUM_THREADS_TO_KEEP - 1; 3927 for (; i < handle_count; ++i) { 3928 handles[i] = handles[i + 1]; 3929 } 3930 } else { 3931 warning("WaitForMultipleObjects %s (%u) in %s: %d\n", 3932 (res == WAIT_FAILED ? "failed" : "timed out"), 3933 GetLastError(), __FILE__, __LINE__); 3934 // Don't keep handles, if we failed waiting for them. 3935 for (i = 0; i < MAXIMUM_THREADS_TO_KEEP; ++i) { 3936 CloseHandle(handles[i]); 3937 } 3938 handle_count = 0; 3939 } 3940 } 3941 3942 // Store a duplicate of the current thread handle in the array of handles. 3943 hproc = GetCurrentProcess(); 3944 hthr = GetCurrentThread(); 3945 if (!DuplicateHandle(hproc, hthr, hproc, &handles[handle_count], 3946 0, FALSE, DUPLICATE_SAME_ACCESS)) { 3947 warning("DuplicateHandle failed (%u) in %s: %d\n", 3948 GetLastError(), __FILE__, __LINE__); 3949 } else { 3950 ++handle_count; 3951 } 3952 3953 // The current exiting thread has stored its handle in the array, and now 3954 // should leave the critical section before calling _endthreadex(). 3955 3956 } else if (what != EPT_THREAD && handle_count > 0) { 3957 jlong start_time, finish_time, timeout_left; 3958 // Before ending the process, make sure all the threads that had called 3959 // _endthreadex() completed. 3960 3961 // Set the priority level of the current thread to the same value as 3962 // the priority level of exiting threads. 3963 // This is to ensure it will be given a fair chance to execute if 3964 // the timeout expires. 3965 hthr = GetCurrentThread(); 3966 SetThreadPriority(hthr, THREAD_PRIORITY_ABOVE_NORMAL); 3967 start_time = os::javaTimeNanos(); 3968 finish_time = start_time + ((jlong)EXIT_TIMEOUT * 1000000L); 3969 for (i = 0; ; ) { 3970 int portion_count = handle_count - i; 3971 if (portion_count > MAXIMUM_WAIT_OBJECTS) { 3972 portion_count = MAXIMUM_WAIT_OBJECTS; 3973 } 3974 for (j = 0; j < portion_count; ++j) { 3975 SetThreadPriority(handles[i + j], THREAD_PRIORITY_ABOVE_NORMAL); 3976 } 3977 timeout_left = (finish_time - start_time) / 1000000L; 3978 if (timeout_left < 0) { 3979 timeout_left = 0; 3980 } 3981 res = WaitForMultipleObjects(portion_count, handles + i, TRUE, timeout_left); 3982 if (res == WAIT_FAILED || res == WAIT_TIMEOUT) { 3983 warning("WaitForMultipleObjects %s (%u) in %s: %d\n", 3984 (res == WAIT_FAILED ? "failed" : "timed out"), 3985 GetLastError(), __FILE__, __LINE__); 3986 // Reset portion_count so we close the remaining 3987 // handles due to this error. 3988 portion_count = handle_count - i; 3989 } 3990 for (j = 0; j < portion_count; ++j) { 3991 CloseHandle(handles[i + j]); 3992 } 3993 if ((i += portion_count) >= handle_count) { 3994 break; 3995 } 3996 start_time = os::javaTimeNanos(); 3997 } 3998 handle_count = 0; 3999 } 4000 4001 LeaveCriticalSection(&crit_sect); 4002 } 4003 4004 if (OrderAccess::load_acquire(&process_exiting) != 0 && 4005 process_exiting != (jint)GetCurrentThreadId()) { 4006 // Some other thread is about to call exit(), so we 4007 // don't let the current thread proceed to exit() or _endthreadex() 4008 while (true) { 4009 SuspendThread(GetCurrentThread()); 4010 // Avoid busy-wait loop, if SuspendThread() failed. 4011 Sleep(EXIT_TIMEOUT); 4012 } 4013 } 4014 } 4015 4016 // We are here if either 4017 // - there's no 'race at exit' bug on this OS release; 4018 // - initialization of the critical section failed (unlikely); 4019 // - the current thread has stored its handle and left the critical section; 4020 // - the process-exiting thread has raised the flag and left the critical section. 4021 if (what == EPT_THREAD) { 4022 _endthreadex((unsigned)exit_code); 4023 } else if (what == EPT_PROCESS) { 4024 ::exit(exit_code); 4025 } else { 4026 _exit(exit_code); 4027 } 4028 4029 // Should not reach here 4030 return exit_code; 4031 } 4032 4033 #undef EXIT_TIMEOUT 4034 4035 void os::win32::setmode_streams() { 4036 _setmode(_fileno(stdin), _O_BINARY); 4037 _setmode(_fileno(stdout), _O_BINARY); 4038 _setmode(_fileno(stderr), _O_BINARY); 4039 } 4040 4041 4042 bool os::is_debugger_attached() { 4043 return IsDebuggerPresent() ? true : false; 4044 } 4045 4046 4047 void os::wait_for_keypress_at_exit(void) { 4048 if (PauseAtExit) { 4049 fprintf(stderr, "Press any key to continue...\n"); 4050 fgetc(stdin); 4051 } 4052 } 4053 4054 4055 bool os::message_box(const char* title, const char* message) { 4056 int result = MessageBox(NULL, message, title, 4057 MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY); 4058 return result == IDYES; 4059 } 4060 4061 #ifndef PRODUCT 4062 #ifndef _WIN64 4063 // Helpers to check whether NX protection is enabled 4064 int nx_exception_filter(_EXCEPTION_POINTERS *pex) { 4065 if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION && 4066 pex->ExceptionRecord->NumberParameters > 0 && 4067 pex->ExceptionRecord->ExceptionInformation[0] == 4068 EXCEPTION_INFO_EXEC_VIOLATION) { 4069 return EXCEPTION_EXECUTE_HANDLER; 4070 } 4071 return EXCEPTION_CONTINUE_SEARCH; 4072 } 4073 4074 void nx_check_protection() { 4075 // If NX is enabled we'll get an exception calling into code on the stack 4076 char code[] = { (char)0xC3 }; // ret 4077 void *code_ptr = (void *)code; 4078 __try { 4079 __asm call code_ptr 4080 } __except(nx_exception_filter((_EXCEPTION_POINTERS*)_exception_info())) { 4081 tty->print_raw_cr("NX protection detected."); 4082 } 4083 } 4084 #endif // _WIN64 4085 #endif // PRODUCT 4086 4087 // This is called _before_ the global arguments have been parsed 4088 void os::init(void) { 4089 _initial_pid = _getpid(); 4090 4091 init_random(1234567); 4092 4093 win32::initialize_system_info(); 4094 win32::setmode_streams(); 4095 init_page_sizes((size_t) win32::vm_page_size()); 4096 4097 // This may be overridden later when argument processing is done. 4098 FLAG_SET_ERGO(bool, UseLargePagesIndividualAllocation, false); 4099 4100 // Initialize main_process and main_thread 4101 main_process = GetCurrentProcess(); // Remember main_process is a pseudo handle 4102 if (!DuplicateHandle(main_process, GetCurrentThread(), main_process, 4103 &main_thread, THREAD_ALL_ACCESS, false, 0)) { 4104 fatal("DuplicateHandle failed\n"); 4105 } 4106 main_thread_id = (int) GetCurrentThreadId(); 4107 4108 // initialize fast thread access - only used for 32-bit 4109 win32::initialize_thread_ptr_offset(); 4110 } 4111 4112 // To install functions for atexit processing 4113 extern "C" { 4114 static void perfMemory_exit_helper() { 4115 perfMemory_exit(); 4116 } 4117 } 4118 4119 static jint initSock(); 4120 4121 // this is called _after_ the global arguments have been parsed 4122 jint os::init_2(void) { 4123 // Allocate a single page and mark it as readable for safepoint polling 4124 address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY); 4125 guarantee(polling_page != NULL, "Reserve Failed for polling page"); 4126 4127 address return_page = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY); 4128 guarantee(return_page != NULL, "Commit Failed for polling page"); 4129 4130 os::set_polling_page(polling_page); 4131 4132 #ifndef PRODUCT 4133 if (Verbose && PrintMiscellaneous) { 4134 tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", 4135 (intptr_t)polling_page); 4136 } 4137 #endif 4138 4139 if (!UseMembar) { 4140 address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE); 4141 guarantee(mem_serialize_page != NULL, "Reserve Failed for memory serialize page"); 4142 4143 return_page = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE); 4144 guarantee(return_page != NULL, "Commit Failed for memory serialize page"); 4145 4146 os::set_memory_serialize_page(mem_serialize_page); 4147 4148 #ifndef PRODUCT 4149 if (Verbose && PrintMiscellaneous) { 4150 tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", 4151 (intptr_t)mem_serialize_page); 4152 } 4153 #endif 4154 } 4155 4156 // Setup Windows Exceptions 4157 4158 // for debugging float code generation bugs 4159 if (ForceFloatExceptions) { 4160 #ifndef _WIN64 4161 static long fp_control_word = 0; 4162 __asm { fstcw fp_control_word } 4163 // see Intel PPro Manual, Vol. 2, p 7-16 4164 const long precision = 0x20; 4165 const long underflow = 0x10; 4166 const long overflow = 0x08; 4167 const long zero_div = 0x04; 4168 const long denorm = 0x02; 4169 const long invalid = 0x01; 4170 fp_control_word |= invalid; 4171 __asm { fldcw fp_control_word } 4172 #endif 4173 } 4174 4175 // If stack_commit_size is 0, windows will reserve the default size, 4176 // but only commit a small portion of it. 4177 size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size()); 4178 size_t default_reserve_size = os::win32::default_stack_size(); 4179 size_t actual_reserve_size = stack_commit_size; 4180 if (stack_commit_size < default_reserve_size) { 4181 // If stack_commit_size == 0, we want this too 4182 actual_reserve_size = default_reserve_size; 4183 } 4184 4185 // Check minimum allowable stack size for thread creation and to initialize 4186 // the java system classes, including StackOverflowError - depends on page 4187 // size. Add a page for compiler2 recursion in main thread. 4188 // Add in 2*BytesPerWord times page size to account for VM stack during 4189 // class initialization depending on 32 or 64 bit VM. 4190 size_t min_stack_allowed = 4191 (size_t)(JavaThread::stack_yellow_zone_size() + JavaThread::stack_red_zone_size() + 4192 JavaThread::stack_shadow_zone_size() + 4193 (2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size()); 4194 if (actual_reserve_size < min_stack_allowed) { 4195 tty->print_cr("\nThe stack size specified is too small, " 4196 "Specify at least %dk", 4197 min_stack_allowed / K); 4198 return JNI_ERR; 4199 } 4200 4201 JavaThread::set_stack_size_at_create(stack_commit_size); 4202 4203 // Calculate theoretical max. size of Threads to guard gainst artifical 4204 // out-of-memory situations, where all available address-space has been 4205 // reserved by thread stacks. 4206 assert(actual_reserve_size != 0, "Must have a stack"); 4207 4208 // Calculate the thread limit when we should start doing Virtual Memory 4209 // banging. Currently when the threads will have used all but 200Mb of space. 4210 // 4211 // TODO: consider performing a similar calculation for commit size instead 4212 // as reserve size, since on a 64-bit platform we'll run into that more 4213 // often than running out of virtual memory space. We can use the 4214 // lower value of the two calculations as the os_thread_limit. 4215 size_t max_address_space = ((size_t)1 << (BitsPerWord - 1)) - (200 * K * K); 4216 win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size); 4217 4218 // at exit methods are called in the reverse order of their registration. 4219 // there is no limit to the number of functions registered. atexit does 4220 // not set errno. 4221 4222 if (PerfAllowAtExitRegistration) { 4223 // only register atexit functions if PerfAllowAtExitRegistration is set. 4224 // atexit functions can be delayed until process exit time, which 4225 // can be problematic for embedded VM situations. Embedded VMs should 4226 // call DestroyJavaVM() to assure that VM resources are released. 4227 4228 // note: perfMemory_exit_helper atexit function may be removed in 4229 // the future if the appropriate cleanup code can be added to the 4230 // VM_Exit VMOperation's doit method. 4231 if (atexit(perfMemory_exit_helper) != 0) { 4232 warning("os::init_2 atexit(perfMemory_exit_helper) failed"); 4233 } 4234 } 4235 4236 #ifndef _WIN64 4237 // Print something if NX is enabled (win32 on AMD64) 4238 NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection()); 4239 #endif 4240 4241 // initialize thread priority policy 4242 prio_init(); 4243 4244 if (UseNUMA && !ForceNUMA) { 4245 UseNUMA = false; // We don't fully support this yet 4246 } 4247 4248 if (UseNUMAInterleaving) { 4249 // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag 4250 bool success = numa_interleaving_init(); 4251 if (!success) UseNUMAInterleaving = false; 4252 } 4253 4254 if (initSock() != JNI_OK) { 4255 return JNI_ERR; 4256 } 4257 4258 return JNI_OK; 4259 } 4260 4261 // Mark the polling page as unreadable 4262 void os::make_polling_page_unreadable(void) { 4263 DWORD old_status; 4264 if (!VirtualProtect((char *)_polling_page, os::vm_page_size(), 4265 PAGE_NOACCESS, &old_status)) { 4266 fatal("Could not disable polling page"); 4267 } 4268 } 4269 4270 // Mark the polling page as readable 4271 void os::make_polling_page_readable(void) { 4272 DWORD old_status; 4273 if (!VirtualProtect((char *)_polling_page, os::vm_page_size(), 4274 PAGE_READONLY, &old_status)) { 4275 fatal("Could not enable polling page"); 4276 } 4277 } 4278 4279 4280 int os::stat(const char *path, struct stat *sbuf) { 4281 char pathbuf[MAX_PATH]; 4282 if (strlen(path) > MAX_PATH - 1) { 4283 errno = ENAMETOOLONG; 4284 return -1; 4285 } 4286 os::native_path(strcpy(pathbuf, path)); 4287 int ret = ::stat(pathbuf, sbuf); 4288 if (sbuf != NULL && UseUTCFileTimestamp) { 4289 // Fix for 6539723. st_mtime returned from stat() is dependent on 4290 // the system timezone and so can return different values for the 4291 // same file if/when daylight savings time changes. This adjustment 4292 // makes sure the same timestamp is returned regardless of the TZ. 4293 // 4294 // See: 4295 // http://msdn.microsoft.com/library/ 4296 // default.asp?url=/library/en-us/sysinfo/base/ 4297 // time_zone_information_str.asp 4298 // and 4299 // http://msdn.microsoft.com/library/default.asp?url= 4300 // /library/en-us/sysinfo/base/settimezoneinformation.asp 4301 // 4302 // NOTE: there is a insidious bug here: If the timezone is changed 4303 // after the call to stat() but before 'GetTimeZoneInformation()', then 4304 // the adjustment we do here will be wrong and we'll return the wrong 4305 // value (which will likely end up creating an invalid class data 4306 // archive). Absent a better API for this, or some time zone locking 4307 // mechanism, we'll have to live with this risk. 4308 TIME_ZONE_INFORMATION tz; 4309 DWORD tzid = GetTimeZoneInformation(&tz); 4310 int daylightBias = 4311 (tzid == TIME_ZONE_ID_DAYLIGHT) ? tz.DaylightBias : tz.StandardBias; 4312 sbuf->st_mtime += (tz.Bias + daylightBias) * 60; 4313 } 4314 return ret; 4315 } 4316 4317 4318 #define FT2INT64(ft) \ 4319 ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime)) 4320 4321 4322 // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool) 4323 // are used by JVM M&M and JVMTI to get user+sys or user CPU time 4324 // of a thread. 4325 // 4326 // current_thread_cpu_time() and thread_cpu_time(Thread*) returns 4327 // the fast estimate available on the platform. 4328 4329 // current_thread_cpu_time() is not optimized for Windows yet 4330 jlong os::current_thread_cpu_time() { 4331 // return user + sys since the cost is the same 4332 return os::thread_cpu_time(Thread::current(), true /* user+sys */); 4333 } 4334 4335 jlong os::thread_cpu_time(Thread* thread) { 4336 // consistent with what current_thread_cpu_time() returns. 4337 return os::thread_cpu_time(thread, true /* user+sys */); 4338 } 4339 4340 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) { 4341 return os::thread_cpu_time(Thread::current(), user_sys_cpu_time); 4342 } 4343 4344 jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) { 4345 // This code is copy from clasic VM -> hpi::sysThreadCPUTime 4346 // If this function changes, os::is_thread_cpu_time_supported() should too 4347 FILETIME CreationTime; 4348 FILETIME ExitTime; 4349 FILETIME KernelTime; 4350 FILETIME UserTime; 4351 4352 if (GetThreadTimes(thread->osthread()->thread_handle(), &CreationTime, 4353 &ExitTime, &KernelTime, &UserTime) == 0) { 4354 return -1; 4355 } else if (user_sys_cpu_time) { 4356 return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100; 4357 } else { 4358 return FT2INT64(UserTime) * 100; 4359 } 4360 } 4361 4362 void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 4363 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits 4364 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time 4365 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time 4366 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned 4367 } 4368 4369 void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 4370 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits 4371 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time 4372 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time 4373 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned 4374 } 4375 4376 bool os::is_thread_cpu_time_supported() { 4377 // see os::thread_cpu_time 4378 FILETIME CreationTime; 4379 FILETIME ExitTime; 4380 FILETIME KernelTime; 4381 FILETIME UserTime; 4382 4383 if (GetThreadTimes(GetCurrentThread(), &CreationTime, &ExitTime, 4384 &KernelTime, &UserTime) == 0) { 4385 return false; 4386 } else { 4387 return true; 4388 } 4389 } 4390 4391 // Windows does't provide a loadavg primitive so this is stubbed out for now. 4392 // It does have primitives (PDH API) to get CPU usage and run queue length. 4393 // "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length" 4394 // If we wanted to implement loadavg on Windows, we have a few options: 4395 // 4396 // a) Query CPU usage and run queue length and "fake" an answer by 4397 // returning the CPU usage if it's under 100%, and the run queue 4398 // length otherwise. It turns out that querying is pretty slow 4399 // on Windows, on the order of 200 microseconds on a fast machine. 4400 // Note that on the Windows the CPU usage value is the % usage 4401 // since the last time the API was called (and the first call 4402 // returns 100%), so we'd have to deal with that as well. 4403 // 4404 // b) Sample the "fake" answer using a sampling thread and store 4405 // the answer in a global variable. The call to loadavg would 4406 // just return the value of the global, avoiding the slow query. 4407 // 4408 // c) Sample a better answer using exponential decay to smooth the 4409 // value. This is basically the algorithm used by UNIX kernels. 4410 // 4411 // Note that sampling thread starvation could affect both (b) and (c). 4412 int os::loadavg(double loadavg[], int nelem) { 4413 return -1; 4414 } 4415 4416 4417 // DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield() 4418 bool os::dont_yield() { 4419 return DontYieldALot; 4420 } 4421 4422 // This method is a slightly reworked copy of JDK's sysOpen 4423 // from src/windows/hpi/src/sys_api_md.c 4424 4425 int os::open(const char *path, int oflag, int mode) { 4426 char pathbuf[MAX_PATH]; 4427 4428 if (strlen(path) > MAX_PATH - 1) { 4429 errno = ENAMETOOLONG; 4430 return -1; 4431 } 4432 os::native_path(strcpy(pathbuf, path)); 4433 return ::open(pathbuf, oflag | O_BINARY | O_NOINHERIT, mode); 4434 } 4435 4436 FILE* os::open(int fd, const char* mode) { 4437 return ::_fdopen(fd, mode); 4438 } 4439 4440 // Is a (classpath) directory empty? 4441 bool os::dir_is_empty(const char* path) { 4442 WIN32_FIND_DATA fd; 4443 HANDLE f = FindFirstFile(path, &fd); 4444 if (f == INVALID_HANDLE_VALUE) { 4445 return true; 4446 } 4447 FindClose(f); 4448 return false; 4449 } 4450 4451 // create binary file, rewriting existing file if required 4452 int os::create_binary_file(const char* path, bool rewrite_existing) { 4453 int oflags = _O_CREAT | _O_WRONLY | _O_BINARY; 4454 if (!rewrite_existing) { 4455 oflags |= _O_EXCL; 4456 } 4457 return ::open(path, oflags, _S_IREAD | _S_IWRITE); 4458 } 4459 4460 // return current position of file pointer 4461 jlong os::current_file_offset(int fd) { 4462 return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR); 4463 } 4464 4465 // move file pointer to the specified offset 4466 jlong os::seek_to_file_offset(int fd, jlong offset) { 4467 return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET); 4468 } 4469 4470 4471 jlong os::lseek(int fd, jlong offset, int whence) { 4472 return (jlong) ::_lseeki64(fd, offset, whence); 4473 } 4474 4475 size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) { 4476 OVERLAPPED ov; 4477 DWORD nread; 4478 BOOL result; 4479 4480 ZeroMemory(&ov, sizeof(ov)); 4481 ov.Offset = (DWORD)offset; 4482 ov.OffsetHigh = (DWORD)(offset >> 32); 4483 4484 HANDLE h = (HANDLE)::_get_osfhandle(fd); 4485 4486 result = ReadFile(h, (LPVOID)buf, nBytes, &nread, &ov); 4487 4488 return result ? nread : 0; 4489 } 4490 4491 4492 // This method is a slightly reworked copy of JDK's sysNativePath 4493 // from src/windows/hpi/src/path_md.c 4494 4495 // Convert a pathname to native format. On win32, this involves forcing all 4496 // separators to be '\\' rather than '/' (both are legal inputs, but Win95 4497 // sometimes rejects '/') and removing redundant separators. The input path is 4498 // assumed to have been converted into the character encoding used by the local 4499 // system. Because this might be a double-byte encoding, care is taken to 4500 // treat double-byte lead characters correctly. 4501 // 4502 // This procedure modifies the given path in place, as the result is never 4503 // longer than the original. There is no error return; this operation always 4504 // succeeds. 4505 char * os::native_path(char *path) { 4506 char *src = path, *dst = path, *end = path; 4507 char *colon = NULL; // If a drive specifier is found, this will 4508 // point to the colon following the drive letter 4509 4510 // Assumption: '/', '\\', ':', and drive letters are never lead bytes 4511 assert(((!::IsDBCSLeadByte('/')) && (!::IsDBCSLeadByte('\\')) 4512 && (!::IsDBCSLeadByte(':'))), "Illegal lead byte"); 4513 4514 // Check for leading separators 4515 #define isfilesep(c) ((c) == '/' || (c) == '\\') 4516 while (isfilesep(*src)) { 4517 src++; 4518 } 4519 4520 if (::isalpha(*src) && !::IsDBCSLeadByte(*src) && src[1] == ':') { 4521 // Remove leading separators if followed by drive specifier. This 4522 // hack is necessary to support file URLs containing drive 4523 // specifiers (e.g., "file://c:/path"). As a side effect, 4524 // "/c:/path" can be used as an alternative to "c:/path". 4525 *dst++ = *src++; 4526 colon = dst; 4527 *dst++ = ':'; 4528 src++; 4529 } else { 4530 src = path; 4531 if (isfilesep(src[0]) && isfilesep(src[1])) { 4532 // UNC pathname: Retain first separator; leave src pointed at 4533 // second separator so that further separators will be collapsed 4534 // into the second separator. The result will be a pathname 4535 // beginning with "\\\\" followed (most likely) by a host name. 4536 src = dst = path + 1; 4537 path[0] = '\\'; // Force first separator to '\\' 4538 } 4539 } 4540 4541 end = dst; 4542 4543 // Remove redundant separators from remainder of path, forcing all 4544 // separators to be '\\' rather than '/'. Also, single byte space 4545 // characters are removed from the end of the path because those 4546 // are not legal ending characters on this operating system. 4547 // 4548 while (*src != '\0') { 4549 if (isfilesep(*src)) { 4550 *dst++ = '\\'; src++; 4551 while (isfilesep(*src)) src++; 4552 if (*src == '\0') { 4553 // Check for trailing separator 4554 end = dst; 4555 if (colon == dst - 2) break; // "z:\\" 4556 if (dst == path + 1) break; // "\\" 4557 if (dst == path + 2 && isfilesep(path[0])) { 4558 // "\\\\" is not collapsed to "\\" because "\\\\" marks the 4559 // beginning of a UNC pathname. Even though it is not, by 4560 // itself, a valid UNC pathname, we leave it as is in order 4561 // to be consistent with the path canonicalizer as well 4562 // as the win32 APIs, which treat this case as an invalid 4563 // UNC pathname rather than as an alias for the root 4564 // directory of the current drive. 4565 break; 4566 } 4567 end = --dst; // Path does not denote a root directory, so 4568 // remove trailing separator 4569 break; 4570 } 4571 end = dst; 4572 } else { 4573 if (::IsDBCSLeadByte(*src)) { // Copy a double-byte character 4574 *dst++ = *src++; 4575 if (*src) *dst++ = *src++; 4576 end = dst; 4577 } else { // Copy a single-byte character 4578 char c = *src++; 4579 *dst++ = c; 4580 // Space is not a legal ending character 4581 if (c != ' ') end = dst; 4582 } 4583 } 4584 } 4585 4586 *end = '\0'; 4587 4588 // For "z:", add "." to work around a bug in the C runtime library 4589 if (colon == dst - 1) { 4590 path[2] = '.'; 4591 path[3] = '\0'; 4592 } 4593 4594 return path; 4595 } 4596 4597 // This code is a copy of JDK's sysSetLength 4598 // from src/windows/hpi/src/sys_api_md.c 4599 4600 int os::ftruncate(int fd, jlong length) { 4601 HANDLE h = (HANDLE)::_get_osfhandle(fd); 4602 long high = (long)(length >> 32); 4603 DWORD ret; 4604 4605 if (h == (HANDLE)(-1)) { 4606 return -1; 4607 } 4608 4609 ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN); 4610 if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) { 4611 return -1; 4612 } 4613 4614 if (::SetEndOfFile(h) == FALSE) { 4615 return -1; 4616 } 4617 4618 return 0; 4619 } 4620 4621 4622 // This code is a copy of JDK's sysSync 4623 // from src/windows/hpi/src/sys_api_md.c 4624 // except for the legacy workaround for a bug in Win 98 4625 4626 int os::fsync(int fd) { 4627 HANDLE handle = (HANDLE)::_get_osfhandle(fd); 4628 4629 if ((!::FlushFileBuffers(handle)) && 4630 (GetLastError() != ERROR_ACCESS_DENIED)) { 4631 // from winerror.h 4632 return -1; 4633 } 4634 return 0; 4635 } 4636 4637 static int nonSeekAvailable(int, long *); 4638 static int stdinAvailable(int, long *); 4639 4640 #define S_ISCHR(mode) (((mode) & _S_IFCHR) == _S_IFCHR) 4641 #define S_ISFIFO(mode) (((mode) & _S_IFIFO) == _S_IFIFO) 4642 4643 // This code is a copy of JDK's sysAvailable 4644 // from src/windows/hpi/src/sys_api_md.c 4645 4646 int os::available(int fd, jlong *bytes) { 4647 jlong cur, end; 4648 struct _stati64 stbuf64; 4649 4650 if (::_fstati64(fd, &stbuf64) >= 0) { 4651 int mode = stbuf64.st_mode; 4652 if (S_ISCHR(mode) || S_ISFIFO(mode)) { 4653 int ret; 4654 long lpbytes; 4655 if (fd == 0) { 4656 ret = stdinAvailable(fd, &lpbytes); 4657 } else { 4658 ret = nonSeekAvailable(fd, &lpbytes); 4659 } 4660 (*bytes) = (jlong)(lpbytes); 4661 return ret; 4662 } 4663 if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) { 4664 return FALSE; 4665 } else if ((end = ::_lseeki64(fd, 0L, SEEK_END)) == -1) { 4666 return FALSE; 4667 } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) { 4668 return FALSE; 4669 } 4670 *bytes = end - cur; 4671 return TRUE; 4672 } else { 4673 return FALSE; 4674 } 4675 } 4676 4677 // This code is a copy of JDK's nonSeekAvailable 4678 // from src/windows/hpi/src/sys_api_md.c 4679 4680 static int nonSeekAvailable(int fd, long *pbytes) { 4681 // This is used for available on non-seekable devices 4682 // (like both named and anonymous pipes, such as pipes 4683 // connected to an exec'd process). 4684 // Standard Input is a special case. 4685 HANDLE han; 4686 4687 if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) { 4688 return FALSE; 4689 } 4690 4691 if (! ::PeekNamedPipe(han, NULL, 0, NULL, (LPDWORD)pbytes, NULL)) { 4692 // PeekNamedPipe fails when at EOF. In that case we 4693 // simply make *pbytes = 0 which is consistent with the 4694 // behavior we get on Solaris when an fd is at EOF. 4695 // The only alternative is to raise an Exception, 4696 // which isn't really warranted. 4697 // 4698 if (::GetLastError() != ERROR_BROKEN_PIPE) { 4699 return FALSE; 4700 } 4701 *pbytes = 0; 4702 } 4703 return TRUE; 4704 } 4705 4706 #define MAX_INPUT_EVENTS 2000 4707 4708 // This code is a copy of JDK's stdinAvailable 4709 // from src/windows/hpi/src/sys_api_md.c 4710 4711 static int stdinAvailable(int fd, long *pbytes) { 4712 HANDLE han; 4713 DWORD numEventsRead = 0; // Number of events read from buffer 4714 DWORD numEvents = 0; // Number of events in buffer 4715 DWORD i = 0; // Loop index 4716 DWORD curLength = 0; // Position marker 4717 DWORD actualLength = 0; // Number of bytes readable 4718 BOOL error = FALSE; // Error holder 4719 INPUT_RECORD *lpBuffer; // Pointer to records of input events 4720 4721 if ((han = ::GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) { 4722 return FALSE; 4723 } 4724 4725 // Construct an array of input records in the console buffer 4726 error = ::GetNumberOfConsoleInputEvents(han, &numEvents); 4727 if (error == 0) { 4728 return nonSeekAvailable(fd, pbytes); 4729 } 4730 4731 // lpBuffer must fit into 64K or else PeekConsoleInput fails 4732 if (numEvents > MAX_INPUT_EVENTS) { 4733 numEvents = MAX_INPUT_EVENTS; 4734 } 4735 4736 lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal); 4737 if (lpBuffer == NULL) { 4738 return FALSE; 4739 } 4740 4741 error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead); 4742 if (error == 0) { 4743 os::free(lpBuffer); 4744 return FALSE; 4745 } 4746 4747 // Examine input records for the number of bytes available 4748 for (i=0; i<numEvents; i++) { 4749 if (lpBuffer[i].EventType == KEY_EVENT) { 4750 4751 KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *) 4752 &(lpBuffer[i].Event); 4753 if (keyRecord->bKeyDown == TRUE) { 4754 CHAR *keyPressed = (CHAR *) &(keyRecord->uChar); 4755 curLength++; 4756 if (*keyPressed == '\r') { 4757 actualLength = curLength; 4758 } 4759 } 4760 } 4761 } 4762 4763 if (lpBuffer != NULL) { 4764 os::free(lpBuffer); 4765 } 4766 4767 *pbytes = (long) actualLength; 4768 return TRUE; 4769 } 4770 4771 // Map a block of memory. 4772 char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, 4773 char *addr, size_t bytes, bool read_only, 4774 bool allow_exec) { 4775 HANDLE hFile; 4776 char* base; 4777 4778 hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, 4779 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 4780 if (hFile == NULL) { 4781 if (PrintMiscellaneous && Verbose) { 4782 DWORD err = GetLastError(); 4783 tty->print_cr("CreateFile() failed: GetLastError->%ld.", err); 4784 } 4785 return NULL; 4786 } 4787 4788 if (allow_exec) { 4789 // CreateFileMapping/MapViewOfFileEx can't map executable memory 4790 // unless it comes from a PE image (which the shared archive is not.) 4791 // Even VirtualProtect refuses to give execute access to mapped memory 4792 // that was not previously executable. 4793 // 4794 // Instead, stick the executable region in anonymous memory. Yuck. 4795 // Penalty is that ~4 pages will not be shareable - in the future 4796 // we might consider DLLizing the shared archive with a proper PE 4797 // header so that mapping executable + sharing is possible. 4798 4799 base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE, 4800 PAGE_READWRITE); 4801 if (base == NULL) { 4802 if (PrintMiscellaneous && Verbose) { 4803 DWORD err = GetLastError(); 4804 tty->print_cr("VirtualAlloc() failed: GetLastError->%ld.", err); 4805 } 4806 CloseHandle(hFile); 4807 return NULL; 4808 } 4809 4810 DWORD bytes_read; 4811 OVERLAPPED overlapped; 4812 overlapped.Offset = (DWORD)file_offset; 4813 overlapped.OffsetHigh = 0; 4814 overlapped.hEvent = NULL; 4815 // ReadFile guarantees that if the return value is true, the requested 4816 // number of bytes were read before returning. 4817 bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0; 4818 if (!res) { 4819 if (PrintMiscellaneous && Verbose) { 4820 DWORD err = GetLastError(); 4821 tty->print_cr("ReadFile() failed: GetLastError->%ld.", err); 4822 } 4823 release_memory(base, bytes); 4824 CloseHandle(hFile); 4825 return NULL; 4826 } 4827 } else { 4828 HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0, 4829 NULL /* file_name */); 4830 if (hMap == NULL) { 4831 if (PrintMiscellaneous && Verbose) { 4832 DWORD err = GetLastError(); 4833 tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.", err); 4834 } 4835 CloseHandle(hFile); 4836 return NULL; 4837 } 4838 4839 DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY; 4840 base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset, 4841 (DWORD)bytes, addr); 4842 if (base == NULL) { 4843 if (PrintMiscellaneous && Verbose) { 4844 DWORD err = GetLastError(); 4845 tty->print_cr("MapViewOfFileEx() failed: GetLastError->%ld.", err); 4846 } 4847 CloseHandle(hMap); 4848 CloseHandle(hFile); 4849 return NULL; 4850 } 4851 4852 if (CloseHandle(hMap) == 0) { 4853 if (PrintMiscellaneous && Verbose) { 4854 DWORD err = GetLastError(); 4855 tty->print_cr("CloseHandle(hMap) failed: GetLastError->%ld.", err); 4856 } 4857 CloseHandle(hFile); 4858 return base; 4859 } 4860 } 4861 4862 if (allow_exec) { 4863 DWORD old_protect; 4864 DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE; 4865 bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0; 4866 4867 if (!res) { 4868 if (PrintMiscellaneous && Verbose) { 4869 DWORD err = GetLastError(); 4870 tty->print_cr("VirtualProtect() failed: GetLastError->%ld.", err); 4871 } 4872 // Don't consider this a hard error, on IA32 even if the 4873 // VirtualProtect fails, we should still be able to execute 4874 CloseHandle(hFile); 4875 return base; 4876 } 4877 } 4878 4879 if (CloseHandle(hFile) == 0) { 4880 if (PrintMiscellaneous && Verbose) { 4881 DWORD err = GetLastError(); 4882 tty->print_cr("CloseHandle(hFile) failed: GetLastError->%ld.", err); 4883 } 4884 return base; 4885 } 4886 4887 return base; 4888 } 4889 4890 4891 // Remap a block of memory. 4892 char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, 4893 char *addr, size_t bytes, bool read_only, 4894 bool allow_exec) { 4895 // This OS does not allow existing memory maps to be remapped so we 4896 // have to unmap the memory before we remap it. 4897 if (!os::unmap_memory(addr, bytes)) { 4898 return NULL; 4899 } 4900 4901 // There is a very small theoretical window between the unmap_memory() 4902 // call above and the map_memory() call below where a thread in native 4903 // code may be able to access an address that is no longer mapped. 4904 4905 return os::map_memory(fd, file_name, file_offset, addr, bytes, 4906 read_only, allow_exec); 4907 } 4908 4909 4910 // Unmap a block of memory. 4911 // Returns true=success, otherwise false. 4912 4913 bool os::pd_unmap_memory(char* addr, size_t bytes) { 4914 MEMORY_BASIC_INFORMATION mem_info; 4915 if (VirtualQuery(addr, &mem_info, sizeof(mem_info)) == 0) { 4916 if (PrintMiscellaneous && Verbose) { 4917 DWORD err = GetLastError(); 4918 tty->print_cr("VirtualQuery() failed: GetLastError->%ld.", err); 4919 } 4920 return false; 4921 } 4922 4923 // Executable memory was not mapped using CreateFileMapping/MapViewOfFileEx. 4924 // Instead, executable region was allocated using VirtualAlloc(). See 4925 // pd_map_memory() above. 4926 // 4927 // The following flags should match the 'exec_access' flages used for 4928 // VirtualProtect() in pd_map_memory(). 4929 if (mem_info.Protect == PAGE_EXECUTE_READ || 4930 mem_info.Protect == PAGE_EXECUTE_READWRITE) { 4931 return pd_release_memory(addr, bytes); 4932 } 4933 4934 BOOL result = UnmapViewOfFile(addr); 4935 if (result == 0) { 4936 if (PrintMiscellaneous && Verbose) { 4937 DWORD err = GetLastError(); 4938 tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err); 4939 } 4940 return false; 4941 } 4942 return true; 4943 } 4944 4945 void os::pause() { 4946 char filename[MAX_PATH]; 4947 if (PauseAtStartupFile && PauseAtStartupFile[0]) { 4948 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile); 4949 } else { 4950 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id()); 4951 } 4952 4953 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); 4954 if (fd != -1) { 4955 struct stat buf; 4956 ::close(fd); 4957 while (::stat(filename, &buf) == 0) { 4958 Sleep(100); 4959 } 4960 } else { 4961 jio_fprintf(stderr, 4962 "Could not open pause file '%s', continuing immediately.\n", filename); 4963 } 4964 } 4965 4966 os::WatcherThreadCrashProtection::WatcherThreadCrashProtection() { 4967 assert(Thread::current()->is_Watcher_thread(), "Must be WatcherThread"); 4968 } 4969 4970 // See the caveats for this class in os_windows.hpp 4971 // Protects the callback call so that raised OS EXCEPTIONS causes a jump back 4972 // into this method and returns false. If no OS EXCEPTION was raised, returns 4973 // true. 4974 // The callback is supposed to provide the method that should be protected. 4975 // 4976 bool os::WatcherThreadCrashProtection::call(os::CrashProtectionCallback& cb) { 4977 assert(Thread::current()->is_Watcher_thread(), "Only for WatcherThread"); 4978 assert(!WatcherThread::watcher_thread()->has_crash_protection(), 4979 "crash_protection already set?"); 4980 4981 bool success = true; 4982 __try { 4983 WatcherThread::watcher_thread()->set_crash_protection(this); 4984 cb.call(); 4985 } __except(EXCEPTION_EXECUTE_HANDLER) { 4986 // only for protection, nothing to do 4987 success = false; 4988 } 4989 WatcherThread::watcher_thread()->set_crash_protection(NULL); 4990 return success; 4991 } 4992 4993 // An Event wraps a win32 "CreateEvent" kernel handle. 4994 // 4995 // We have a number of choices regarding "CreateEvent" win32 handle leakage: 4996 // 4997 // 1: When a thread dies return the Event to the EventFreeList, clear the ParkHandle 4998 // field, and call CloseHandle() on the win32 event handle. Unpark() would 4999 // need to be modified to tolerate finding a NULL (invalid) win32 event handle. 5000 // In addition, an unpark() operation might fetch the handle field, but the 5001 // event could recycle between the fetch and the SetEvent() operation. 5002 // SetEvent() would either fail because the handle was invalid, or inadvertently work, 5003 // as the win32 handle value had been recycled. In an ideal world calling SetEvent() 5004 // on an stale but recycled handle would be harmless, but in practice this might 5005 // confuse other non-Sun code, so it's not a viable approach. 5006 // 5007 // 2: Once a win32 event handle is associated with an Event, it remains associated 5008 // with the Event. The event handle is never closed. This could be construed 5009 // as handle leakage, but only up to the maximum # of threads that have been extant 5010 // at any one time. This shouldn't be an issue, as windows platforms typically 5011 // permit a process to have hundreds of thousands of open handles. 5012 // 5013 // 3: Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList 5014 // and release unused handles. 5015 // 5016 // 4: Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle. 5017 // It's not clear, however, that we wouldn't be trading one type of leak for another. 5018 // 5019 // 5. Use an RCU-like mechanism (Read-Copy Update). 5020 // Or perhaps something similar to Maged Michael's "Hazard pointers". 5021 // 5022 // We use (2). 5023 // 5024 // TODO-FIXME: 5025 // 1. Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation. 5026 // 2. Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks 5027 // to recover from (or at least detect) the dreaded Windows 841176 bug. 5028 // 3. Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent 5029 // into a single win32 CreateEvent() handle. 5030 // 5031 // Assumption: 5032 // Only one parker can exist on an event, which is why we allocate 5033 // them per-thread. Multiple unparkers can coexist. 5034 // 5035 // _Event transitions in park() 5036 // -1 => -1 : illegal 5037 // 1 => 0 : pass - return immediately 5038 // 0 => -1 : block; then set _Event to 0 before returning 5039 // 5040 // _Event transitions in unpark() 5041 // 0 => 1 : just return 5042 // 1 => 1 : just return 5043 // -1 => either 0 or 1; must signal target thread 5044 // That is, we can safely transition _Event from -1 to either 5045 // 0 or 1. 5046 // 5047 // _Event serves as a restricted-range semaphore. 5048 // -1 : thread is blocked, i.e. there is a waiter 5049 // 0 : neutral: thread is running or ready, 5050 // could have been signaled after a wait started 5051 // 1 : signaled - thread is running or ready 5052 // 5053 // Another possible encoding of _Event would be with 5054 // explicit "PARKED" == 01b and "SIGNALED" == 10b bits. 5055 // 5056 5057 int os::PlatformEvent::park(jlong Millis) { 5058 // Transitions for _Event: 5059 // -1 => -1 : illegal 5060 // 1 => 0 : pass - return immediately 5061 // 0 => -1 : block; then set _Event to 0 before returning 5062 5063 guarantee(_ParkHandle != NULL , "Invariant"); 5064 guarantee(Millis > 0 , "Invariant"); 5065 5066 // CONSIDER: defer assigning a CreateEvent() handle to the Event until 5067 // the initial park() operation. 5068 // Consider: use atomic decrement instead of CAS-loop 5069 5070 int v; 5071 for (;;) { 5072 v = _Event; 5073 if (Atomic::cmpxchg(v-1, &_Event, v) == v) break; 5074 } 5075 guarantee((v == 0) || (v == 1), "invariant"); 5076 if (v != 0) return OS_OK; 5077 5078 // Do this the hard way by blocking ... 5079 // TODO: consider a brief spin here, gated on the success of recent 5080 // spin attempts by this thread. 5081 // 5082 // We decompose long timeouts into series of shorter timed waits. 5083 // Evidently large timo values passed in WaitForSingleObject() are problematic on some 5084 // versions of Windows. See EventWait() for details. This may be superstition. Or not. 5085 // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time 5086 // with os::javaTimeNanos(). Furthermore, we assume that spurious returns from 5087 // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend 5088 // to happen early in the wait interval. Specifically, after a spurious wakeup (rv == 5089 // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate 5090 // for the already waited time. This policy does not admit any new outcomes. 5091 // In the future, however, we might want to track the accumulated wait time and 5092 // adjust Millis accordingly if we encounter a spurious wakeup. 5093 5094 const int MAXTIMEOUT = 0x10000000; 5095 DWORD rv = WAIT_TIMEOUT; 5096 while (_Event < 0 && Millis > 0) { 5097 DWORD prd = Millis; // set prd = MAX (Millis, MAXTIMEOUT) 5098 if (Millis > MAXTIMEOUT) { 5099 prd = MAXTIMEOUT; 5100 } 5101 rv = ::WaitForSingleObject(_ParkHandle, prd); 5102 assert(rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed"); 5103 if (rv == WAIT_TIMEOUT) { 5104 Millis -= prd; 5105 } 5106 } 5107 v = _Event; 5108 _Event = 0; 5109 // see comment at end of os::PlatformEvent::park() below: 5110 OrderAccess::fence(); 5111 // If we encounter a nearly simultanous timeout expiry and unpark() 5112 // we return OS_OK indicating we awoke via unpark(). 5113 // Implementor's license -- returning OS_TIMEOUT would be equally valid, however. 5114 return (v >= 0) ? OS_OK : OS_TIMEOUT; 5115 } 5116 5117 void os::PlatformEvent::park() { 5118 // Transitions for _Event: 5119 // -1 => -1 : illegal 5120 // 1 => 0 : pass - return immediately 5121 // 0 => -1 : block; then set _Event to 0 before returning 5122 5123 guarantee(_ParkHandle != NULL, "Invariant"); 5124 // Invariant: Only the thread associated with the Event/PlatformEvent 5125 // may call park(). 5126 // Consider: use atomic decrement instead of CAS-loop 5127 int v; 5128 for (;;) { 5129 v = _Event; 5130 if (Atomic::cmpxchg(v-1, &_Event, v) == v) break; 5131 } 5132 guarantee((v == 0) || (v == 1), "invariant"); 5133 if (v != 0) return; 5134 5135 // Do this the hard way by blocking ... 5136 // TODO: consider a brief spin here, gated on the success of recent 5137 // spin attempts by this thread. 5138 while (_Event < 0) { 5139 DWORD rv = ::WaitForSingleObject(_ParkHandle, INFINITE); 5140 assert(rv == WAIT_OBJECT_0, "WaitForSingleObject failed"); 5141 } 5142 5143 // Usually we'll find _Event == 0 at this point, but as 5144 // an optional optimization we clear it, just in case can 5145 // multiple unpark() operations drove _Event up to 1. 5146 _Event = 0; 5147 OrderAccess::fence(); 5148 guarantee(_Event >= 0, "invariant"); 5149 } 5150 5151 void os::PlatformEvent::unpark() { 5152 guarantee(_ParkHandle != NULL, "Invariant"); 5153 5154 // Transitions for _Event: 5155 // 0 => 1 : just return 5156 // 1 => 1 : just return 5157 // -1 => either 0 or 1; must signal target thread 5158 // That is, we can safely transition _Event from -1 to either 5159 // 0 or 1. 5160 // See also: "Semaphores in Plan 9" by Mullender & Cox 5161 // 5162 // Note: Forcing a transition from "-1" to "1" on an unpark() means 5163 // that it will take two back-to-back park() calls for the owning 5164 // thread to block. This has the benefit of forcing a spurious return 5165 // from the first park() call after an unpark() call which will help 5166 // shake out uses of park() and unpark() without condition variables. 5167 5168 if (Atomic::xchg(1, &_Event) >= 0) return; 5169 5170 ::SetEvent(_ParkHandle); 5171 } 5172 5173 5174 // JSR166 5175 // ------------------------------------------------------- 5176 5177 // The Windows implementation of Park is very straightforward: Basic 5178 // operations on Win32 Events turn out to have the right semantics to 5179 // use them directly. We opportunistically resuse the event inherited 5180 // from Monitor. 5181 5182 void Parker::park(bool isAbsolute, jlong time) { 5183 guarantee(_ParkEvent != NULL, "invariant"); 5184 // First, demultiplex/decode time arguments 5185 if (time < 0) { // don't wait 5186 return; 5187 } else if (time == 0 && !isAbsolute) { 5188 time = INFINITE; 5189 } else if (isAbsolute) { 5190 time -= os::javaTimeMillis(); // convert to relative time 5191 if (time <= 0) { // already elapsed 5192 return; 5193 } 5194 } else { // relative 5195 time /= 1000000; // Must coarsen from nanos to millis 5196 if (time == 0) { // Wait for the minimal time unit if zero 5197 time = 1; 5198 } 5199 } 5200 5201 JavaThread* thread = JavaThread::current(); 5202 5203 // Don't wait if interrupted or already triggered 5204 if (Thread::is_interrupted(thread, false) || 5205 WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) { 5206 ResetEvent(_ParkEvent); 5207 return; 5208 } else { 5209 ThreadBlockInVM tbivm(thread); 5210 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); 5211 thread->set_suspend_equivalent(); 5212 5213 WaitForSingleObject(_ParkEvent, time); 5214 ResetEvent(_ParkEvent); 5215 5216 // If externally suspended while waiting, re-suspend 5217 if (thread->handle_special_suspend_equivalent_condition()) { 5218 thread->java_suspend_self(); 5219 } 5220 } 5221 } 5222 5223 void Parker::unpark() { 5224 guarantee(_ParkEvent != NULL, "invariant"); 5225 SetEvent(_ParkEvent); 5226 } 5227 5228 // Run the specified command in a separate process. Return its exit value, 5229 // or -1 on failure (e.g. can't create a new process). 5230 int os::fork_and_exec(char* cmd) { 5231 STARTUPINFO si; 5232 PROCESS_INFORMATION pi; 5233 5234 memset(&si, 0, sizeof(si)); 5235 si.cb = sizeof(si); 5236 memset(&pi, 0, sizeof(pi)); 5237 BOOL rslt = CreateProcess(NULL, // executable name - use command line 5238 cmd, // command line 5239 NULL, // process security attribute 5240 NULL, // thread security attribute 5241 TRUE, // inherits system handles 5242 0, // no creation flags 5243 NULL, // use parent's environment block 5244 NULL, // use parent's starting directory 5245 &si, // (in) startup information 5246 &pi); // (out) process information 5247 5248 if (rslt) { 5249 // Wait until child process exits. 5250 WaitForSingleObject(pi.hProcess, INFINITE); 5251 5252 DWORD exit_code; 5253 GetExitCodeProcess(pi.hProcess, &exit_code); 5254 5255 // Close process and thread handles. 5256 CloseHandle(pi.hProcess); 5257 CloseHandle(pi.hThread); 5258 5259 return (int)exit_code; 5260 } else { 5261 return -1; 5262 } 5263 } 5264 5265 //-------------------------------------------------------------------------------------------------- 5266 // Non-product code 5267 5268 static int mallocDebugIntervalCounter = 0; 5269 static int mallocDebugCounter = 0; 5270 bool os::check_heap(bool force) { 5271 if (++mallocDebugCounter < MallocVerifyStart && !force) return true; 5272 if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) { 5273 // Note: HeapValidate executes two hardware breakpoints when it finds something 5274 // wrong; at these points, eax contains the address of the offending block (I think). 5275 // To get to the exlicit error message(s) below, just continue twice. 5276 // 5277 // Note: we want to check the CRT heap, which is not necessarily located in the 5278 // process default heap. 5279 HANDLE heap = (HANDLE) _get_heap_handle(); 5280 if (!heap) { 5281 return true; 5282 } 5283 5284 // If we fail to lock the heap, then gflags.exe has been used 5285 // or some other special heap flag has been set that prevents 5286 // locking. We don't try to walk a heap we can't lock. 5287 if (HeapLock(heap) != 0) { 5288 PROCESS_HEAP_ENTRY phe; 5289 phe.lpData = NULL; 5290 while (HeapWalk(heap, &phe) != 0) { 5291 if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) && 5292 !HeapValidate(heap, 0, phe.lpData)) { 5293 tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter); 5294 tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData); 5295 HeapUnlock(heap); 5296 fatal("corrupted C heap"); 5297 } 5298 } 5299 DWORD err = GetLastError(); 5300 if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) { 5301 HeapUnlock(heap); 5302 fatal("heap walk aborted with error %d", err); 5303 } 5304 HeapUnlock(heap); 5305 } 5306 mallocDebugIntervalCounter = 0; 5307 } 5308 return true; 5309 } 5310 5311 5312 bool os::find(address addr, outputStream* st) { 5313 int offset = -1; 5314 bool result = false; 5315 char buf[256]; 5316 if (os::dll_address_to_library_name(addr, buf, sizeof(buf), &offset)) { 5317 st->print(PTR_FORMAT " ", addr); 5318 if (strlen(buf) < sizeof(buf) - 1) { 5319 char* p = strrchr(buf, '\\'); 5320 if (p) { 5321 st->print("%s", p + 1); 5322 } else { 5323 st->print("%s", buf); 5324 } 5325 } else { 5326 // The library name is probably truncated. Let's omit the library name. 5327 // See also JDK-8147512. 5328 } 5329 if (os::dll_address_to_function_name(addr, buf, sizeof(buf), &offset)) { 5330 st->print("::%s + 0x%x", buf, offset); 5331 } 5332 st->cr(); 5333 result = true; 5334 } 5335 return result; 5336 } 5337 5338 LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) { 5339 DWORD exception_code = e->ExceptionRecord->ExceptionCode; 5340 5341 if (exception_code == EXCEPTION_ACCESS_VIOLATION) { 5342 JavaThread* thread = JavaThread::current(); 5343 PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord; 5344 address addr = (address) exceptionRecord->ExceptionInformation[1]; 5345 5346 if (os::is_memory_serialize_page(thread, addr)) { 5347 return EXCEPTION_CONTINUE_EXECUTION; 5348 } 5349 } 5350 5351 return EXCEPTION_CONTINUE_SEARCH; 5352 } 5353 5354 // We don't build a headless jre for Windows 5355 bool os::is_headless_jre() { return false; } 5356 5357 static jint initSock() { 5358 WSADATA wsadata; 5359 5360 if (WSAStartup(MAKEWORD(2,2), &wsadata) != 0) { 5361 jio_fprintf(stderr, "Could not initialize Winsock (error: %d)\n", 5362 ::GetLastError()); 5363 return JNI_ERR; 5364 } 5365 return JNI_OK; 5366 } 5367 5368 struct hostent* os::get_host_by_name(char* name) { 5369 return (struct hostent*)gethostbyname(name); 5370 } 5371 5372 int os::socket_close(int fd) { 5373 return ::closesocket(fd); 5374 } 5375 5376 int os::socket(int domain, int type, int protocol) { 5377 return ::socket(domain, type, protocol); 5378 } 5379 5380 int os::connect(int fd, struct sockaddr* him, socklen_t len) { 5381 return ::connect(fd, him, len); 5382 } 5383 5384 int os::recv(int fd, char* buf, size_t nBytes, uint flags) { 5385 return ::recv(fd, buf, (int)nBytes, flags); 5386 } 5387 5388 int os::send(int fd, char* buf, size_t nBytes, uint flags) { 5389 return ::send(fd, buf, (int)nBytes, flags); 5390 } 5391 5392 int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) { 5393 return ::send(fd, buf, (int)nBytes, flags); 5394 } 5395 5396 // WINDOWS CONTEXT Flags for THREAD_SAMPLING 5397 #if defined(IA32) 5398 #define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS) 5399 #elif defined (AMD64) 5400 #define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT) 5401 #endif 5402 5403 // returns true if thread could be suspended, 5404 // false otherwise 5405 static bool do_suspend(HANDLE* h) { 5406 if (h != NULL) { 5407 if (SuspendThread(*h) != ~0) { 5408 return true; 5409 } 5410 } 5411 return false; 5412 } 5413 5414 // resume the thread 5415 // calling resume on an active thread is a no-op 5416 static void do_resume(HANDLE* h) { 5417 if (h != NULL) { 5418 ResumeThread(*h); 5419 } 5420 } 5421 5422 // retrieve a suspend/resume context capable handle 5423 // from the tid. Caller validates handle return value. 5424 void get_thread_handle_for_extended_context(HANDLE* h, 5425 OSThread::thread_id_t tid) { 5426 if (h != NULL) { 5427 *h = OpenThread(THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, FALSE, tid); 5428 } 5429 } 5430 5431 // Thread sampling implementation 5432 // 5433 void os::SuspendedThreadTask::internal_do_task() { 5434 CONTEXT ctxt; 5435 HANDLE h = NULL; 5436 5437 // get context capable handle for thread 5438 get_thread_handle_for_extended_context(&h, _thread->osthread()->thread_id()); 5439 5440 // sanity 5441 if (h == NULL || h == INVALID_HANDLE_VALUE) { 5442 return; 5443 } 5444 5445 // suspend the thread 5446 if (do_suspend(&h)) { 5447 ctxt.ContextFlags = sampling_context_flags; 5448 // get thread context 5449 GetThreadContext(h, &ctxt); 5450 SuspendedThreadTaskContext context(_thread, &ctxt); 5451 // pass context to Thread Sampling impl 5452 do_task(context); 5453 // resume thread 5454 do_resume(&h); 5455 } 5456 5457 // close handle 5458 CloseHandle(h); 5459 } 5460 5461 bool os::start_debugging(char *buf, int buflen) { 5462 int len = (int)strlen(buf); 5463 char *p = &buf[len]; 5464 5465 jio_snprintf(p, buflen-len, 5466 "\n\n" 5467 "Do you want to debug the problem?\n\n" 5468 "To debug, attach Visual Studio to process %d; then switch to thread 0x%x\n" 5469 "Select 'Yes' to launch Visual Studio automatically (PATH must include msdev)\n" 5470 "Otherwise, select 'No' to abort...", 5471 os::current_process_id(), os::current_thread_id()); 5472 5473 bool yes = os::message_box("Unexpected Error", buf); 5474 5475 if (yes) { 5476 // os::breakpoint() calls DebugBreak(), which causes a breakpoint 5477 // exception. If VM is running inside a debugger, the debugger will 5478 // catch the exception. Otherwise, the breakpoint exception will reach 5479 // the default windows exception handler, which can spawn a debugger and 5480 // automatically attach to the dying VM. 5481 os::breakpoint(); 5482 yes = false; 5483 } 5484 return yes; 5485 } 5486 5487 void* os::get_default_process_handle() { 5488 return (void*)GetModuleHandle(NULL); 5489 } 5490 5491 // Builds a platform dependent Agent_OnLoad_<lib_name> function name 5492 // which is used to find statically linked in agents. 5493 // Additionally for windows, takes into account __stdcall names. 5494 // Parameters: 5495 // sym_name: Symbol in library we are looking for 5496 // lib_name: Name of library to look in, NULL for shared libs. 5497 // is_absolute_path == true if lib_name is absolute path to agent 5498 // such as "C:/a/b/L.dll" 5499 // == false if only the base name of the library is passed in 5500 // such as "L" 5501 char* os::build_agent_function_name(const char *sym_name, const char *lib_name, 5502 bool is_absolute_path) { 5503 char *agent_entry_name; 5504 size_t len; 5505 size_t name_len; 5506 size_t prefix_len = strlen(JNI_LIB_PREFIX); 5507 size_t suffix_len = strlen(JNI_LIB_SUFFIX); 5508 const char *start; 5509 5510 if (lib_name != NULL) { 5511 len = name_len = strlen(lib_name); 5512 if (is_absolute_path) { 5513 // Need to strip path, prefix and suffix 5514 if ((start = strrchr(lib_name, *os::file_separator())) != NULL) { 5515 lib_name = ++start; 5516 } else { 5517 // Need to check for drive prefix 5518 if ((start = strchr(lib_name, ':')) != NULL) { 5519 lib_name = ++start; 5520 } 5521 } 5522 if (len <= (prefix_len + suffix_len)) { 5523 return NULL; 5524 } 5525 lib_name += prefix_len; 5526 name_len = strlen(lib_name) - suffix_len; 5527 } 5528 } 5529 len = (lib_name != NULL ? name_len : 0) + strlen(sym_name) + 2; 5530 agent_entry_name = NEW_C_HEAP_ARRAY_RETURN_NULL(char, len, mtThread); 5531 if (agent_entry_name == NULL) { 5532 return NULL; 5533 } 5534 if (lib_name != NULL) { 5535 const char *p = strrchr(sym_name, '@'); 5536 if (p != NULL && p != sym_name) { 5537 // sym_name == _Agent_OnLoad@XX 5538 strncpy(agent_entry_name, sym_name, (p - sym_name)); 5539 agent_entry_name[(p-sym_name)] = '\0'; 5540 // agent_entry_name == _Agent_OnLoad 5541 strcat(agent_entry_name, "_"); 5542 strncat(agent_entry_name, lib_name, name_len); 5543 strcat(agent_entry_name, p); 5544 // agent_entry_name == _Agent_OnLoad_lib_name@XX 5545 } else { 5546 strcpy(agent_entry_name, sym_name); 5547 strcat(agent_entry_name, "_"); 5548 strncat(agent_entry_name, lib_name, name_len); 5549 } 5550 } else { 5551 strcpy(agent_entry_name, sym_name); 5552 } 5553 return agent_entry_name; 5554 } 5555 5556 #ifndef PRODUCT 5557 5558 // test the code path in reserve_memory_special() that tries to allocate memory in a single 5559 // contiguous memory block at a particular address. 5560 // The test first tries to find a good approximate address to allocate at by using the same 5561 // method to allocate some memory at any address. The test then tries to allocate memory in 5562 // the vicinity (not directly after it to avoid possible by-chance use of that location) 5563 // This is of course only some dodgy assumption, there is no guarantee that the vicinity of 5564 // the previously allocated memory is available for allocation. The only actual failure 5565 // that is reported is when the test tries to allocate at a particular location but gets a 5566 // different valid one. A NULL return value at this point is not considered an error but may 5567 // be legitimate. 5568 // If -XX:+VerboseInternalVMTests is enabled, print some explanatory messages. 5569 void TestReserveMemorySpecial_test() { 5570 if (!UseLargePages) { 5571 if (VerboseInternalVMTests) { 5572 tty->print("Skipping test because large pages are disabled"); 5573 } 5574 return; 5575 } 5576 // save current value of globals 5577 bool old_use_large_pages_individual_allocation = UseLargePagesIndividualAllocation; 5578 bool old_use_numa_interleaving = UseNUMAInterleaving; 5579 5580 // set globals to make sure we hit the correct code path 5581 UseLargePagesIndividualAllocation = UseNUMAInterleaving = false; 5582 5583 // do an allocation at an address selected by the OS to get a good one. 5584 const size_t large_allocation_size = os::large_page_size() * 4; 5585 char* result = os::reserve_memory_special(large_allocation_size, os::large_page_size(), NULL, false); 5586 if (result == NULL) { 5587 if (VerboseInternalVMTests) { 5588 tty->print("Failed to allocate control block with size " SIZE_FORMAT ". Skipping remainder of test.", 5589 large_allocation_size); 5590 } 5591 } else { 5592 os::release_memory_special(result, large_allocation_size); 5593 5594 // allocate another page within the recently allocated memory area which seems to be a good location. At least 5595 // we managed to get it once. 5596 const size_t expected_allocation_size = os::large_page_size(); 5597 char* expected_location = result + os::large_page_size(); 5598 char* actual_location = os::reserve_memory_special(expected_allocation_size, os::large_page_size(), expected_location, false); 5599 if (actual_location == NULL) { 5600 if (VerboseInternalVMTests) { 5601 tty->print("Failed to allocate any memory at " PTR_FORMAT " size " SIZE_FORMAT ". Skipping remainder of test.", 5602 expected_location, large_allocation_size); 5603 } 5604 } else { 5605 // release memory 5606 os::release_memory_special(actual_location, expected_allocation_size); 5607 // only now check, after releasing any memory to avoid any leaks. 5608 assert(actual_location == expected_location, 5609 "Failed to allocate memory at requested location " PTR_FORMAT " of size " SIZE_FORMAT ", is " PTR_FORMAT " instead", 5610 expected_location, expected_allocation_size, actual_location); 5611 } 5612 } 5613 5614 // restore globals 5615 UseLargePagesIndividualAllocation = old_use_large_pages_individual_allocation; 5616 UseNUMAInterleaving = old_use_numa_interleaving; 5617 } 5618 #endif // PRODUCT 5619 5620 /* 5621 All the defined signal names for Windows. 5622 5623 NOTE that not all of these names are accepted by FindSignal! 5624 5625 For various reasons some of these may be rejected at runtime. 5626 5627 Here are the names currently accepted by a user of sun.misc.Signal with 5628 1.4.1 (ignoring potential interaction with use of chaining, etc): 5629 5630 (LIST TBD) 5631 5632 */ 5633 int os::get_signal_number(const char* name) { 5634 static const struct { 5635 char* name; 5636 int number; 5637 } siglabels [] = 5638 // derived from version 6.0 VC98/include/signal.h 5639 {"ABRT", SIGABRT, // abnormal termination triggered by abort cl 5640 "FPE", SIGFPE, // floating point exception 5641 "SEGV", SIGSEGV, // segment violation 5642 "INT", SIGINT, // interrupt 5643 "TERM", SIGTERM, // software term signal from kill 5644 "BREAK", SIGBREAK, // Ctrl-Break sequence 5645 "ILL", SIGILL}; // illegal instruction 5646 for(int i=0;i<sizeof(siglabels)/sizeof(struct siglabel);i++) 5647 if(!strcmp(name, siglabels[i].name)) 5648 return siglabels[i].number; 5649 return -1; 5650 } 5651 5652 // Fast current thread access 5653 5654 int os::win32::_thread_ptr_offset = 0; 5655 5656 static void call_wrapper_dummy() {} 5657 5658 // We need to call the os_exception_wrapper once so that it sets 5659 // up the offset from FS of the thread pointer. 5660 void os::win32::initialize_thread_ptr_offset() { 5661 os::os_exception_wrapper((java_call_t)call_wrapper_dummy, 5662 NULL, NULL, NULL, NULL); 5663 }