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