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