os_windows.cpp revision 10835:a6b1b83401c7
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 109static HANDLE main_process; 110static HANDLE main_thread; 111static int main_thread_id; 112 113static FILETIME process_creation_time; 114static FILETIME process_exit_time; 115static FILETIME process_user_time; 116static 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 130HINSTANCE vm_lib_handle; 131 132BOOL 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 151static 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 161bool 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. 167bool 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 175void os::run_periodic_checks() { 176 return; 177} 178 179// previous UnhandledExceptionFilter, if there is one 180static LPTOP_LEVEL_EXCEPTION_FILTER prev_uef_handler = NULL; 181 182LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo); 183 184void 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 308void os::breakpoint() { 309 DebugBreak(); 310} 311 312// Invoked from the BREAKPOINT Macro 313extern "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// 321int 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 339address 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 393size_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 401struct 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 410LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo); 411 412// Thread start routine for all new Java threads 413static 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 467static 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 499bool 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 525bool 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() 545static 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 565bool 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 671void 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 678static jlong first_filetime; 679static jlong initial_performance_count; 680static jlong performance_frequency; 681 682 683jlong 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 691jlong os::elapsed_counter() { 692 LARGE_INTEGER count; 693 QueryPerformanceCounter(&count); 694 return as_long(count) - initial_performance_count; 695} 696 697 698jlong os::elapsed_frequency() { 699 return performance_frequency; 700} 701 702 703julong os::available_memory() { 704 return win32::available_memory(); 705} 706 707julong 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 717julong os::physical_memory() { 718 return win32::physical_memory(); 719} 720 721bool 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 735int 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 753void 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 779bool os::distribute_processes(uint length, uint* distribution) { 780 // Not yet implemented. 781 return false; 782} 783 784bool os::bind_to_processor(uint processor_id) { 785 // Not yet implemented. 786 return false; 787} 788 789void 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 798double 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() 809static jlong _offset = 116444736000000000; 810// Fake time counter for reproducible results when debugging 811static jlong fake_time = 0; 812 813#ifdef ASSERT 814// Just to be safe, recalculate the offset in debug mode 815static jlong _calculated_offset = 0; 816static int _has_calculated_offset = 0; 817 818jlong 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 839jlong offset() { 840 return _offset; 841} 842#endif 843 844jlong 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) 850jlong windows_to_time_ticks(FILETIME wt) { 851 jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime); 852 return (a - offset()); 853} 854 855FILETIME 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 863bool os::supports_vtime() { return true; } 864bool os::enable_vtime() { return false; } 865bool os::vtime_enabled() { return false; } 866 867double 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 880jlong 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 890void 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 899jlong 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 908void 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 932char* 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 940bool 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 965void 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 980static BOOL (WINAPI *_MiniDumpWriteDump)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, 981 PMINIDUMP_EXCEPTION_INFORMATION, 982 PMINIDUMP_USER_STREAM_INFORMATION, 983 PMINIDUMP_CALLBACK_INFORMATION); 984 985static HANDLE dumpFile = NULL; 986 987// Check if dump file can be created. 988void 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 1021void 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. 1086void 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 1098DIR * 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 1165struct 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 1185int 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. 1201const 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 1211static 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 1218bool 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> 1277const 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// 1289static 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 1309struct _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 1316static 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 1333bool 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 1358bool 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] 1373static 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 1386address vm_lib_location[2]; // start and end address of jvm.dll 1387 1388// check if addr is inside jvm.dll 1389bool 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* 1401static 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 1414void * 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 1526void os::print_dll_info(outputStream *st) { 1527 st->print_cr("Dynamic libraries:"); 1528 get_loaded_modules_info(_print_module, (void *)st); 1529} 1530 1531int 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 1575bool os::get_host_name(char* buf, size_t buflen) { 1576 DWORD size = (DWORD)buflen; 1577 return (GetComputerNameEx(ComputerNameDnsHostname, buf, &size) == TRUE); 1578} 1579 1580void 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 1588int 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 1597void os::print_os_info_brief(outputStream* st) { 1598 os::print_os_info(st); 1599} 1600 1601void 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 1615void 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 1736void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) { 1737 // Nothing to do for now. 1738} 1739 1740void 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 1757void 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 1775void 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 1808void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) { 1809 // do nothing 1810} 1811 1812static char saved_jvm_path[MAX_PATH] = {0}; 1813 1814// Find the full path to the current module, jvm.dll 1815void 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 1860void os::print_jni_name_prefix_on(outputStream* st, int args_size) { 1861#ifndef _WIN64 1862 st->print("_"); 1863#endif 1864} 1865 1866 1867void 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 1876size_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 1912int os::get_last_error() { 1913 DWORD error = GetLastError(); 1914 if (error == 0) { 1915 error = errno; 1916 } 1917 return (int)error; 1918} 1919 1920WindowsSemaphore::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 1926WindowsSemaphore::~WindowsSemaphore() { 1927 ::CloseHandle(_semaphore); 1928} 1929 1930void 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 1938void 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. 1949static void (*sigbreakHandler)(int) = NULL; 1950 1951static 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 1957void* os::user_handler() { 1958 return (void*) UserHandler; 1959} 1960 1961void* 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 1971void 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// 1980static 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 2029int os::sigexitnum_pd() { 2030 return NSIG; 2031} 2032 2033// a counter for each possible signal value, including signal_thread exit signal 2034static volatile jint pending_signals[NSIG+1] = { 0 }; 2035static HANDLE sig_sem = NULL; 2036 2037void 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 2063void 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 2072static 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 2112int os::signal_lookup() { 2113 return check_pending_signals(false); 2114} 2115 2116int os::signal_wait() { 2117 return check_pending_signals(true); 2118} 2119 2120// Implicit OS exception handling 2121 2122LONG 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 2165extern "C" void safepoints(); 2166extern "C" void find(int x); 2167extern "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 2200static 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 2233const 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//----------------------------------------------------------------------------- 2246LONG 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//----------------------------------------------------------------------------- 2285LONG 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 2330static 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 2338bool 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//----------------------------------------------------------------------------- 2372LONG 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. 2714LONG 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 2740DEFINE_FAST_GETFIELD(jboolean, bool, Boolean) 2741DEFINE_FAST_GETFIELD(jbyte, byte, Byte) 2742DEFINE_FAST_GETFIELD(jchar, char, Char) 2743DEFINE_FAST_GETFIELD(jshort, short, Short) 2744DEFINE_FAST_GETFIELD(jint, int, Int) 2745DEFINE_FAST_GETFIELD(jlong, long, Long) 2746DEFINE_FAST_GETFIELD(jfloat, float, Float) 2747DEFINE_FAST_GETFIELD(jdouble, double, Double) 2748 2749address 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 2767int os::vm_page_size() { return os::win32::vm_page_size(); } 2768int 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 2794static HANDLE _hProcess; 2795static HANDLE _hToken; 2796 2797// Container for NUMA node list info 2798class 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 2848static size_t _large_page_size = 0; 2849 2850static 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 2875static void cleanup_after_large_page_init() { 2876 if (_hProcess) CloseHandle(_hProcess); 2877 _hProcess = NULL; 2878 if (_hToken) CloseHandle(_hToken); 2879 _hToken = NULL; 2880} 2881 2882static 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 2918static 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 if (TracePageSizes && Verbose) { 3010 tty->print_cr("Reserving pages individually failed."); 3011 } 3012 } 3013#endif 3014 return NULL; 3015 } 3016 3017 bytes_remaining -= bytes_to_rq; 3018 next_alloc_addr += bytes_to_rq; 3019 count++; 3020 } 3021 // Although the memory is allocated individually, it is returned as one. 3022 // NMT records it as one block. 3023 if ((flags & MEM_COMMIT) != 0) { 3024 MemTracker::record_virtual_memory_reserve_and_commit((address)p_buf, bytes, CALLER_PC); 3025 } else { 3026 MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, CALLER_PC); 3027 } 3028 3029 // made it this far, success 3030 return p_buf; 3031} 3032 3033 3034 3035void os::large_page_init() { 3036 if (!UseLargePages) return; 3037 3038 // print a warning if any large page related flag is specified on command line 3039 bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) || 3040 !FLAG_IS_DEFAULT(LargePageSizeInBytes); 3041 bool success = false; 3042 3043#define WARN(msg) if (warn_on_failure) { warning(msg); } 3044 if (request_lock_memory_privilege()) { 3045 size_t s = GetLargePageMinimum(); 3046 if (s) { 3047#if defined(IA32) || defined(AMD64) 3048 if (s > 4*M || LargePageSizeInBytes > 4*M) { 3049 WARN("JVM cannot use large pages bigger than 4mb."); 3050 } else { 3051#endif 3052 if (LargePageSizeInBytes && LargePageSizeInBytes % s == 0) { 3053 _large_page_size = LargePageSizeInBytes; 3054 } else { 3055 _large_page_size = s; 3056 } 3057 success = true; 3058#if defined(IA32) || defined(AMD64) 3059 } 3060#endif 3061 } else { 3062 WARN("Large page is not supported by the processor."); 3063 } 3064 } else { 3065 WARN("JVM cannot use large page memory because it does not have enough privilege to lock pages in memory."); 3066 } 3067#undef WARN 3068 3069 const size_t default_page_size = (size_t) vm_page_size(); 3070 if (success && _large_page_size > default_page_size) { 3071 _page_sizes[0] = _large_page_size; 3072 _page_sizes[1] = default_page_size; 3073 _page_sizes[2] = 0; 3074 } 3075 3076 cleanup_after_large_page_init(); 3077 UseLargePages = success; 3078} 3079 3080// On win32, one cannot release just a part of reserved memory, it's an 3081// all or nothing deal. When we split a reservation, we must break the 3082// reservation into two reservations. 3083void os::pd_split_reserved_memory(char *base, size_t size, size_t split, 3084 bool realloc) { 3085 if (size > 0) { 3086 release_memory(base, size); 3087 if (realloc) { 3088 reserve_memory(split, base); 3089 } 3090 if (size != split) { 3091 reserve_memory(size - split, base + split); 3092 } 3093 } 3094} 3095 3096// Multiple threads can race in this code but it's not possible to unmap small sections of 3097// virtual space to get requested alignment, like posix-like os's. 3098// Windows prevents multiple thread from remapping over each other so this loop is thread-safe. 3099char* os::reserve_memory_aligned(size_t size, size_t alignment) { 3100 assert((alignment & (os::vm_allocation_granularity() - 1)) == 0, 3101 "Alignment must be a multiple of allocation granularity (page size)"); 3102 assert((size & (alignment -1)) == 0, "size must be 'alignment' aligned"); 3103 3104 size_t extra_size = size + alignment; 3105 assert(extra_size >= size, "overflow, size is too large to allow alignment"); 3106 3107 char* aligned_base = NULL; 3108 3109 do { 3110 char* extra_base = os::reserve_memory(extra_size, NULL, alignment); 3111 if (extra_base == NULL) { 3112 return NULL; 3113 } 3114 // Do manual alignment 3115 aligned_base = (char*) align_size_up((uintptr_t) extra_base, alignment); 3116 3117 os::release_memory(extra_base, extra_size); 3118 3119 aligned_base = os::reserve_memory(size, aligned_base); 3120 3121 } while (aligned_base == NULL); 3122 3123 return aligned_base; 3124} 3125 3126char* os::pd_reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { 3127 assert((size_t)addr % os::vm_allocation_granularity() == 0, 3128 "reserve alignment"); 3129 assert(bytes % os::vm_page_size() == 0, "reserve page size"); 3130 char* res; 3131 // note that if UseLargePages is on, all the areas that require interleaving 3132 // will go thru reserve_memory_special rather than thru here. 3133 bool use_individual = (UseNUMAInterleaving && !UseLargePages); 3134 if (!use_individual) { 3135 res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE); 3136 } else { 3137 elapsedTimer reserveTimer; 3138 if (Verbose && PrintMiscellaneous) reserveTimer.start(); 3139 // in numa interleaving, we have to allocate pages individually 3140 // (well really chunks of NUMAInterleaveGranularity size) 3141 res = allocate_pages_individually(bytes, addr, MEM_RESERVE, PAGE_READWRITE); 3142 if (res == NULL) { 3143 warning("NUMA page allocation failed"); 3144 } 3145 if (Verbose && PrintMiscellaneous) { 3146 reserveTimer.stop(); 3147 tty->print_cr("reserve_memory of %Ix bytes took " JLONG_FORMAT " ms (" JLONG_FORMAT " ticks)", bytes, 3148 reserveTimer.milliseconds(), reserveTimer.ticks()); 3149 } 3150 } 3151 assert(res == NULL || addr == NULL || addr == res, 3152 "Unexpected address from reserve."); 3153 3154 return res; 3155} 3156 3157// Reserve memory at an arbitrary address, only if that area is 3158// available (and not reserved for something else). 3159char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { 3160 // Windows os::reserve_memory() fails of the requested address range is 3161 // not avilable. 3162 return reserve_memory(bytes, requested_addr); 3163} 3164 3165size_t os::large_page_size() { 3166 return _large_page_size; 3167} 3168 3169bool os::can_commit_large_page_memory() { 3170 // Windows only uses large page memory when the entire region is reserved 3171 // and committed in a single VirtualAlloc() call. This may change in the 3172 // future, but with Windows 2003 it's not possible to commit on demand. 3173 return false; 3174} 3175 3176bool os::can_execute_large_page_memory() { 3177 return true; 3178} 3179 3180char* os::reserve_memory_special(size_t bytes, size_t alignment, char* addr, 3181 bool exec) { 3182 assert(UseLargePages, "only for large pages"); 3183 3184 if (!is_size_aligned(bytes, os::large_page_size()) || alignment > os::large_page_size()) { 3185 return NULL; // Fallback to small pages. 3186 } 3187 3188 const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; 3189 const DWORD flags = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES; 3190 3191 // with large pages, there are two cases where we need to use Individual Allocation 3192 // 1) the UseLargePagesIndividualAllocation flag is set (set by default on WS2003) 3193 // 2) NUMA Interleaving is enabled, in which case we use a different node for each page 3194 if (UseLargePagesIndividualAllocation || UseNUMAInterleaving) { 3195 if (TracePageSizes && Verbose) { 3196 tty->print_cr("Reserving large pages individually."); 3197 } 3198 char * p_buf = allocate_pages_individually(bytes, addr, flags, prot, LargePagesIndividualAllocationInjectError); 3199 if (p_buf == NULL) { 3200 // give an appropriate warning message 3201 if (UseNUMAInterleaving) { 3202 warning("NUMA large page allocation failed, UseLargePages flag ignored"); 3203 } 3204 if (UseLargePagesIndividualAllocation) { 3205 warning("Individually allocated large pages failed, " 3206 "use -XX:-UseLargePagesIndividualAllocation to turn off"); 3207 } 3208 return NULL; 3209 } 3210 3211 return p_buf; 3212 3213 } else { 3214 if (TracePageSizes && Verbose) { 3215 tty->print_cr("Reserving large pages in a single large chunk."); 3216 } 3217 // normal policy just allocate it all at once 3218 DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES; 3219 char * res = (char *)VirtualAlloc(addr, bytes, flag, prot); 3220 if (res != NULL) { 3221 MemTracker::record_virtual_memory_reserve_and_commit((address)res, bytes, CALLER_PC); 3222 } 3223 3224 return res; 3225 } 3226} 3227 3228bool os::release_memory_special(char* base, size_t bytes) { 3229 assert(base != NULL, "Sanity check"); 3230 return release_memory(base, bytes); 3231} 3232 3233void os::print_statistics() { 3234} 3235 3236static void warn_fail_commit_memory(char* addr, size_t bytes, bool exec) { 3237 int err = os::get_last_error(); 3238 char buf[256]; 3239 size_t buf_len = os::lasterror(buf, sizeof(buf)); 3240 warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT 3241 ", %d) failed; error='%s' (DOS error/errno=%d)", addr, bytes, 3242 exec, buf_len != 0 ? buf : "<no_error_string>", err); 3243} 3244 3245bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) { 3246 if (bytes == 0) { 3247 // Don't bother the OS with noops. 3248 return true; 3249 } 3250 assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries"); 3251 assert(bytes % os::vm_page_size() == 0, "commit in page-sized chunks"); 3252 // Don't attempt to print anything if the OS call fails. We're 3253 // probably low on resources, so the print itself may cause crashes. 3254 3255 // unless we have NUMAInterleaving enabled, the range of a commit 3256 // is always within a reserve covered by a single VirtualAlloc 3257 // in that case we can just do a single commit for the requested size 3258 if (!UseNUMAInterleaving) { 3259 if (VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) == NULL) { 3260 NOT_PRODUCT(warn_fail_commit_memory(addr, bytes, exec);) 3261 return false; 3262 } 3263 if (exec) { 3264 DWORD oldprot; 3265 // Windows doc says to use VirtualProtect to get execute permissions 3266 if (!VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &oldprot)) { 3267 NOT_PRODUCT(warn_fail_commit_memory(addr, bytes, exec);) 3268 return false; 3269 } 3270 } 3271 return true; 3272 } else { 3273 3274 // when NUMAInterleaving is enabled, the commit might cover a range that 3275 // came from multiple VirtualAlloc reserves (using allocate_pages_individually). 3276 // VirtualQuery can help us determine that. The RegionSize that VirtualQuery 3277 // returns represents the number of bytes that can be committed in one step. 3278 size_t bytes_remaining = bytes; 3279 char * next_alloc_addr = addr; 3280 while (bytes_remaining > 0) { 3281 MEMORY_BASIC_INFORMATION alloc_info; 3282 VirtualQuery(next_alloc_addr, &alloc_info, sizeof(alloc_info)); 3283 size_t bytes_to_rq = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize); 3284 if (VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_COMMIT, 3285 PAGE_READWRITE) == NULL) { 3286 NOT_PRODUCT(warn_fail_commit_memory(next_alloc_addr, bytes_to_rq, 3287 exec);) 3288 return false; 3289 } 3290 if (exec) { 3291 DWORD oldprot; 3292 if (!VirtualProtect(next_alloc_addr, bytes_to_rq, 3293 PAGE_EXECUTE_READWRITE, &oldprot)) { 3294 NOT_PRODUCT(warn_fail_commit_memory(next_alloc_addr, bytes_to_rq, 3295 exec);) 3296 return false; 3297 } 3298 } 3299 bytes_remaining -= bytes_to_rq; 3300 next_alloc_addr += bytes_to_rq; 3301 } 3302 } 3303 // if we made it this far, return true 3304 return true; 3305} 3306 3307bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, 3308 bool exec) { 3309 // alignment_hint is ignored on this OS 3310 return pd_commit_memory(addr, size, exec); 3311} 3312 3313void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec, 3314 const char* mesg) { 3315 assert(mesg != NULL, "mesg must be specified"); 3316 if (!pd_commit_memory(addr, size, exec)) { 3317 warn_fail_commit_memory(addr, size, exec); 3318 vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "%s", mesg); 3319 } 3320} 3321 3322void os::pd_commit_memory_or_exit(char* addr, size_t size, 3323 size_t alignment_hint, bool exec, 3324 const char* mesg) { 3325 // alignment_hint is ignored on this OS 3326 pd_commit_memory_or_exit(addr, size, exec, mesg); 3327} 3328 3329bool os::pd_uncommit_memory(char* addr, size_t bytes) { 3330 if (bytes == 0) { 3331 // Don't bother the OS with noops. 3332 return true; 3333 } 3334 assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries"); 3335 assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks"); 3336 return (VirtualFree(addr, bytes, MEM_DECOMMIT) != 0); 3337} 3338 3339bool os::pd_release_memory(char* addr, size_t bytes) { 3340 return VirtualFree(addr, 0, MEM_RELEASE) != 0; 3341} 3342 3343bool os::pd_create_stack_guard_pages(char* addr, size_t size) { 3344 return os::commit_memory(addr, size, !ExecMem); 3345} 3346 3347bool os::remove_stack_guard_pages(char* addr, size_t size) { 3348 return os::uncommit_memory(addr, size); 3349} 3350 3351static bool protect_pages_individually(char* addr, size_t bytes, unsigned int p, DWORD *old_status) { 3352 uint count = 0; 3353 bool ret = false; 3354 size_t bytes_remaining = bytes; 3355 char * next_protect_addr = addr; 3356 3357 // Use VirtualQuery() to get the chunk size. 3358 while (bytes_remaining) { 3359 MEMORY_BASIC_INFORMATION alloc_info; 3360 if (VirtualQuery(next_protect_addr, &alloc_info, sizeof(alloc_info)) == 0) { 3361 return false; 3362 } 3363 3364 size_t bytes_to_protect = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize); 3365 // We used different API at allocate_pages_individually() based on UseNUMAInterleaving, 3366 // but we don't distinguish here as both cases are protected by same API. 3367 ret = VirtualProtect(next_protect_addr, bytes_to_protect, p, old_status) != 0; 3368 warning("Failed protecting pages individually for chunk #%u", count); 3369 if (!ret) { 3370 return false; 3371 } 3372 3373 bytes_remaining -= bytes_to_protect; 3374 next_protect_addr += bytes_to_protect; 3375 count++; 3376 } 3377 return ret; 3378} 3379 3380// Set protections specified 3381bool os::protect_memory(char* addr, size_t bytes, ProtType prot, 3382 bool is_committed) { 3383 unsigned int p = 0; 3384 switch (prot) { 3385 case MEM_PROT_NONE: p = PAGE_NOACCESS; break; 3386 case MEM_PROT_READ: p = PAGE_READONLY; break; 3387 case MEM_PROT_RW: p = PAGE_READWRITE; break; 3388 case MEM_PROT_RWX: p = PAGE_EXECUTE_READWRITE; break; 3389 default: 3390 ShouldNotReachHere(); 3391 } 3392 3393 DWORD old_status; 3394 3395 // Strange enough, but on Win32 one can change protection only for committed 3396 // memory, not a big deal anyway, as bytes less or equal than 64K 3397 if (!is_committed) { 3398 commit_memory_or_exit(addr, bytes, prot == MEM_PROT_RWX, 3399 "cannot commit protection page"); 3400 } 3401 // One cannot use os::guard_memory() here, as on Win32 guard page 3402 // have different (one-shot) semantics, from MSDN on PAGE_GUARD: 3403 // 3404 // Pages in the region become guard pages. Any attempt to access a guard page 3405 // causes the system to raise a STATUS_GUARD_PAGE exception and turn off 3406 // the guard page status. Guard pages thus act as a one-time access alarm. 3407 bool ret; 3408 if (UseNUMAInterleaving) { 3409 // If UseNUMAInterleaving is enabled, the pages may have been allocated a chunk at a time, 3410 // so we must protect the chunks individually. 3411 ret = protect_pages_individually(addr, bytes, p, &old_status); 3412 } else { 3413 ret = VirtualProtect(addr, bytes, p, &old_status) != 0; 3414 } 3415#ifdef ASSERT 3416 if (!ret) { 3417 int err = os::get_last_error(); 3418 char buf[256]; 3419 size_t buf_len = os::lasterror(buf, sizeof(buf)); 3420 warning("INFO: os::protect_memory(" PTR_FORMAT ", " SIZE_FORMAT 3421 ") failed; error='%s' (DOS error/errno=%d)", addr, bytes, 3422 buf_len != 0 ? buf : "<no_error_string>", err); 3423 } 3424#endif 3425 return ret; 3426} 3427 3428bool os::guard_memory(char* addr, size_t bytes) { 3429 DWORD old_status; 3430 return VirtualProtect(addr, bytes, PAGE_READWRITE | PAGE_GUARD, &old_status) != 0; 3431} 3432 3433bool os::unguard_memory(char* addr, size_t bytes) { 3434 DWORD old_status; 3435 return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0; 3436} 3437 3438void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } 3439void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { } 3440void os::numa_make_global(char *addr, size_t bytes) { } 3441void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { } 3442bool os::numa_topology_changed() { return false; } 3443size_t os::numa_get_groups_num() { return MAX2(numa_node_list_holder.get_count(), 1); } 3444int os::numa_get_group_id() { return 0; } 3445size_t os::numa_get_leaf_groups(int *ids, size_t size) { 3446 if (numa_node_list_holder.get_count() == 0 && size > 0) { 3447 // Provide an answer for UMA systems 3448 ids[0] = 0; 3449 return 1; 3450 } else { 3451 // check for size bigger than actual groups_num 3452 size = MIN2(size, numa_get_groups_num()); 3453 for (int i = 0; i < (int)size; i++) { 3454 ids[i] = numa_node_list_holder.get_node_list_entry(i); 3455 } 3456 return size; 3457 } 3458} 3459 3460bool os::get_page_info(char *start, page_info* info) { 3461 return false; 3462} 3463 3464char *os::scan_pages(char *start, char* end, page_info* page_expected, 3465 page_info* page_found) { 3466 return end; 3467} 3468 3469char* os::non_memory_address_word() { 3470 // Must never look like an address returned by reserve_memory, 3471 // even in its subfields (as defined by the CPU immediate fields, 3472 // if the CPU splits constants across multiple instructions). 3473 return (char*)-1; 3474} 3475 3476#define MAX_ERROR_COUNT 100 3477#define SYS_THREAD_ERROR 0xffffffffUL 3478 3479void os::pd_start_thread(Thread* thread) { 3480 DWORD ret = ResumeThread(thread->osthread()->thread_handle()); 3481 // Returns previous suspend state: 3482 // 0: Thread was not suspended 3483 // 1: Thread is running now 3484 // >1: Thread is still suspended. 3485 assert(ret != SYS_THREAD_ERROR, "StartThread failed"); // should propagate back 3486} 3487 3488class HighResolutionInterval : public CHeapObj<mtThread> { 3489 // The default timer resolution seems to be 10 milliseconds. 3490 // (Where is this written down?) 3491 // If someone wants to sleep for only a fraction of the default, 3492 // then we set the timer resolution down to 1 millisecond for 3493 // the duration of their interval. 3494 // We carefully set the resolution back, since otherwise we 3495 // seem to incur an overhead (3%?) that we don't need. 3496 // CONSIDER: if ms is small, say 3, then we should run with a high resolution time. 3497 // Buf if ms is large, say 500, or 503, we should avoid the call to timeBeginPeriod(). 3498 // Alternatively, we could compute the relative error (503/500 = .6%) and only use 3499 // timeBeginPeriod() if the relative error exceeded some threshold. 3500 // timeBeginPeriod() has been linked to problems with clock drift on win32 systems and 3501 // to decreased efficiency related to increased timer "tick" rates. We want to minimize 3502 // (a) calls to timeBeginPeriod() and timeEndPeriod() and (b) time spent with high 3503 // resolution timers running. 3504 private: 3505 jlong resolution; 3506 public: 3507 HighResolutionInterval(jlong ms) { 3508 resolution = ms % 10L; 3509 if (resolution != 0) { 3510 MMRESULT result = timeBeginPeriod(1L); 3511 } 3512 } 3513 ~HighResolutionInterval() { 3514 if (resolution != 0) { 3515 MMRESULT result = timeEndPeriod(1L); 3516 } 3517 resolution = 0L; 3518 } 3519}; 3520 3521int os::sleep(Thread* thread, jlong ms, bool interruptable) { 3522 jlong limit = (jlong) MAXDWORD; 3523 3524 while (ms > limit) { 3525 int res; 3526 if ((res = sleep(thread, limit, interruptable)) != OS_TIMEOUT) { 3527 return res; 3528 } 3529 ms -= limit; 3530 } 3531 3532 assert(thread == Thread::current(), "thread consistency check"); 3533 OSThread* osthread = thread->osthread(); 3534 OSThreadWaitState osts(osthread, false /* not Object.wait() */); 3535 int result; 3536 if (interruptable) { 3537 assert(thread->is_Java_thread(), "must be java thread"); 3538 JavaThread *jt = (JavaThread *) thread; 3539 ThreadBlockInVM tbivm(jt); 3540 3541 jt->set_suspend_equivalent(); 3542 // cleared by handle_special_suspend_equivalent_condition() or 3543 // java_suspend_self() via check_and_wait_while_suspended() 3544 3545 HANDLE events[1]; 3546 events[0] = osthread->interrupt_event(); 3547 HighResolutionInterval *phri=NULL; 3548 if (!ForceTimeHighResolution) { 3549 phri = new HighResolutionInterval(ms); 3550 } 3551 if (WaitForMultipleObjects(1, events, FALSE, (DWORD)ms) == WAIT_TIMEOUT) { 3552 result = OS_TIMEOUT; 3553 } else { 3554 ResetEvent(osthread->interrupt_event()); 3555 osthread->set_interrupted(false); 3556 result = OS_INTRPT; 3557 } 3558 delete phri; //if it is NULL, harmless 3559 3560 // were we externally suspended while we were waiting? 3561 jt->check_and_wait_while_suspended(); 3562 } else { 3563 assert(!thread->is_Java_thread(), "must not be java thread"); 3564 Sleep((long) ms); 3565 result = OS_TIMEOUT; 3566 } 3567 return result; 3568} 3569 3570// Short sleep, direct OS call. 3571// 3572// ms = 0, means allow others (if any) to run. 3573// 3574void os::naked_short_sleep(jlong ms) { 3575 assert(ms < 1000, "Un-interruptable sleep, short time use only"); 3576 Sleep(ms); 3577} 3578 3579// Sleep forever; naked call to OS-specific sleep; use with CAUTION 3580void os::infinite_sleep() { 3581 while (true) { // sleep forever ... 3582 Sleep(100000); // ... 100 seconds at a time 3583 } 3584} 3585 3586typedef BOOL (WINAPI * STTSignature)(void); 3587 3588void os::naked_yield() { 3589 // Consider passing back the return value from SwitchToThread(). 3590 SwitchToThread(); 3591} 3592 3593// Win32 only gives you access to seven real priorities at a time, 3594// so we compress Java's ten down to seven. It would be better 3595// if we dynamically adjusted relative priorities. 3596 3597int os::java_to_os_priority[CriticalPriority + 1] = { 3598 THREAD_PRIORITY_IDLE, // 0 Entry should never be used 3599 THREAD_PRIORITY_LOWEST, // 1 MinPriority 3600 THREAD_PRIORITY_LOWEST, // 2 3601 THREAD_PRIORITY_BELOW_NORMAL, // 3 3602 THREAD_PRIORITY_BELOW_NORMAL, // 4 3603 THREAD_PRIORITY_NORMAL, // 5 NormPriority 3604 THREAD_PRIORITY_NORMAL, // 6 3605 THREAD_PRIORITY_ABOVE_NORMAL, // 7 3606 THREAD_PRIORITY_ABOVE_NORMAL, // 8 3607 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority 3608 THREAD_PRIORITY_HIGHEST, // 10 MaxPriority 3609 THREAD_PRIORITY_HIGHEST // 11 CriticalPriority 3610}; 3611 3612int prio_policy1[CriticalPriority + 1] = { 3613 THREAD_PRIORITY_IDLE, // 0 Entry should never be used 3614 THREAD_PRIORITY_LOWEST, // 1 MinPriority 3615 THREAD_PRIORITY_LOWEST, // 2 3616 THREAD_PRIORITY_BELOW_NORMAL, // 3 3617 THREAD_PRIORITY_BELOW_NORMAL, // 4 3618 THREAD_PRIORITY_NORMAL, // 5 NormPriority 3619 THREAD_PRIORITY_ABOVE_NORMAL, // 6 3620 THREAD_PRIORITY_ABOVE_NORMAL, // 7 3621 THREAD_PRIORITY_HIGHEST, // 8 3622 THREAD_PRIORITY_HIGHEST, // 9 NearMaxPriority 3623 THREAD_PRIORITY_TIME_CRITICAL, // 10 MaxPriority 3624 THREAD_PRIORITY_TIME_CRITICAL // 11 CriticalPriority 3625}; 3626 3627static int prio_init() { 3628 // If ThreadPriorityPolicy is 1, switch tables 3629 if (ThreadPriorityPolicy == 1) { 3630 int i; 3631 for (i = 0; i < CriticalPriority + 1; i++) { 3632 os::java_to_os_priority[i] = prio_policy1[i]; 3633 } 3634 } 3635 if (UseCriticalJavaThreadPriority) { 3636 os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority]; 3637 } 3638 return 0; 3639} 3640 3641OSReturn os::set_native_priority(Thread* thread, int priority) { 3642 if (!UseThreadPriorities) return OS_OK; 3643 bool ret = SetThreadPriority(thread->osthread()->thread_handle(), priority) != 0; 3644 return ret ? OS_OK : OS_ERR; 3645} 3646 3647OSReturn os::get_native_priority(const Thread* const thread, 3648 int* priority_ptr) { 3649 if (!UseThreadPriorities) { 3650 *priority_ptr = java_to_os_priority[NormPriority]; 3651 return OS_OK; 3652 } 3653 int os_prio = GetThreadPriority(thread->osthread()->thread_handle()); 3654 if (os_prio == THREAD_PRIORITY_ERROR_RETURN) { 3655 assert(false, "GetThreadPriority failed"); 3656 return OS_ERR; 3657 } 3658 *priority_ptr = os_prio; 3659 return OS_OK; 3660} 3661 3662 3663// Hint to the underlying OS that a task switch would not be good. 3664// Void return because it's a hint and can fail. 3665void os::hint_no_preempt() {} 3666 3667void os::interrupt(Thread* thread) { 3668 assert(!thread->is_Java_thread() || Thread::current() == thread || 3669 Threads_lock->owned_by_self(), 3670 "possibility of dangling Thread pointer"); 3671 3672 OSThread* osthread = thread->osthread(); 3673 osthread->set_interrupted(true); 3674 // More than one thread can get here with the same value of osthread, 3675 // resulting in multiple notifications. We do, however, want the store 3676 // to interrupted() to be visible to other threads before we post 3677 // the interrupt event. 3678 OrderAccess::release(); 3679 SetEvent(osthread->interrupt_event()); 3680 // For JSR166: unpark after setting status 3681 if (thread->is_Java_thread()) { 3682 ((JavaThread*)thread)->parker()->unpark(); 3683 } 3684 3685 ParkEvent * ev = thread->_ParkEvent; 3686 if (ev != NULL) ev->unpark(); 3687} 3688 3689 3690bool os::is_interrupted(Thread* thread, bool clear_interrupted) { 3691 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(), 3692 "possibility of dangling Thread pointer"); 3693 3694 OSThread* osthread = thread->osthread(); 3695 // There is no synchronization between the setting of the interrupt 3696 // and it being cleared here. It is critical - see 6535709 - that 3697 // we only clear the interrupt state, and reset the interrupt event, 3698 // if we are going to report that we were indeed interrupted - else 3699 // an interrupt can be "lost", leading to spurious wakeups or lost wakeups 3700 // depending on the timing. By checking thread interrupt event to see 3701 // if the thread gets real interrupt thus prevent spurious wakeup. 3702 bool interrupted = osthread->interrupted() && (WaitForSingleObject(osthread->interrupt_event(), 0) == WAIT_OBJECT_0); 3703 if (interrupted && clear_interrupted) { 3704 osthread->set_interrupted(false); 3705 ResetEvent(osthread->interrupt_event()); 3706 } // Otherwise leave the interrupted state alone 3707 3708 return interrupted; 3709} 3710 3711// Get's a pc (hint) for a running thread. Currently used only for profiling. 3712ExtendedPC os::get_thread_pc(Thread* thread) { 3713 CONTEXT context; 3714 context.ContextFlags = CONTEXT_CONTROL; 3715 HANDLE handle = thread->osthread()->thread_handle(); 3716#ifdef _M_IA64 3717 assert(0, "Fix get_thread_pc"); 3718 return ExtendedPC(NULL); 3719#else 3720 if (GetThreadContext(handle, &context)) { 3721#ifdef _M_AMD64 3722 return ExtendedPC((address) context.Rip); 3723#else 3724 return ExtendedPC((address) context.Eip); 3725#endif 3726 } else { 3727 return ExtendedPC(NULL); 3728 } 3729#endif 3730} 3731 3732// GetCurrentThreadId() returns DWORD 3733intx os::current_thread_id() { return GetCurrentThreadId(); } 3734 3735static int _initial_pid = 0; 3736 3737int os::current_process_id() { 3738 return (_initial_pid ? _initial_pid : _getpid()); 3739} 3740 3741int os::win32::_vm_page_size = 0; 3742int os::win32::_vm_allocation_granularity = 0; 3743int os::win32::_processor_type = 0; 3744// Processor level is not available on non-NT systems, use vm_version instead 3745int os::win32::_processor_level = 0; 3746julong os::win32::_physical_memory = 0; 3747size_t os::win32::_default_stack_size = 0; 3748 3749intx os::win32::_os_thread_limit = 0; 3750volatile intx os::win32::_os_thread_count = 0; 3751 3752bool os::win32::_is_windows_server = false; 3753 3754// 6573254 3755// Currently, the bug is observed across all the supported Windows releases, 3756// including the latest one (as of this writing - Windows Server 2012 R2) 3757bool os::win32::_has_exit_bug = true; 3758 3759void os::win32::initialize_system_info() { 3760 SYSTEM_INFO si; 3761 GetSystemInfo(&si); 3762 _vm_page_size = si.dwPageSize; 3763 _vm_allocation_granularity = si.dwAllocationGranularity; 3764 _processor_type = si.dwProcessorType; 3765 _processor_level = si.wProcessorLevel; 3766 set_processor_count(si.dwNumberOfProcessors); 3767 3768 MEMORYSTATUSEX ms; 3769 ms.dwLength = sizeof(ms); 3770 3771 // also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual, 3772 // dwMemoryLoad (% of memory in use) 3773 GlobalMemoryStatusEx(&ms); 3774 _physical_memory = ms.ullTotalPhys; 3775 3776 OSVERSIONINFOEX oi; 3777 oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 3778 GetVersionEx((OSVERSIONINFO*)&oi); 3779 switch (oi.dwPlatformId) { 3780 case VER_PLATFORM_WIN32_NT: 3781 { 3782 int os_vers = oi.dwMajorVersion * 1000 + oi.dwMinorVersion; 3783 if (oi.wProductType == VER_NT_DOMAIN_CONTROLLER || 3784 oi.wProductType == VER_NT_SERVER) { 3785 _is_windows_server = true; 3786 } 3787 } 3788 break; 3789 default: fatal("Unknown platform"); 3790 } 3791 3792 _default_stack_size = os::current_stack_size(); 3793 assert(_default_stack_size > (size_t) _vm_page_size, "invalid stack size"); 3794 assert((_default_stack_size & (_vm_page_size - 1)) == 0, 3795 "stack size not a multiple of page size"); 3796 3797 initialize_performance_counter(); 3798} 3799 3800 3801HINSTANCE os::win32::load_Windows_dll(const char* name, char *ebuf, 3802 int ebuflen) { 3803 char path[MAX_PATH]; 3804 DWORD size; 3805 DWORD pathLen = (DWORD)sizeof(path); 3806 HINSTANCE result = NULL; 3807 3808 // only allow library name without path component 3809 assert(strchr(name, '\\') == NULL, "path not allowed"); 3810 assert(strchr(name, ':') == NULL, "path not allowed"); 3811 if (strchr(name, '\\') != NULL || strchr(name, ':') != NULL) { 3812 jio_snprintf(ebuf, ebuflen, 3813 "Invalid parameter while calling os::win32::load_windows_dll(): cannot take path: %s", name); 3814 return NULL; 3815 } 3816 3817 // search system directory 3818 if ((size = GetSystemDirectory(path, pathLen)) > 0) { 3819 if (size >= pathLen) { 3820 return NULL; // truncated 3821 } 3822 if (jio_snprintf(path + size, pathLen - size, "\\%s", name) == -1) { 3823 return NULL; // truncated 3824 } 3825 if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) { 3826 return result; 3827 } 3828 } 3829 3830 // try Windows directory 3831 if ((size = GetWindowsDirectory(path, pathLen)) > 0) { 3832 if (size >= pathLen) { 3833 return NULL; // truncated 3834 } 3835 if (jio_snprintf(path + size, pathLen - size, "\\%s", name) == -1) { 3836 return NULL; // truncated 3837 } 3838 if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) { 3839 return result; 3840 } 3841 } 3842 3843 jio_snprintf(ebuf, ebuflen, 3844 "os::win32::load_windows_dll() cannot load %s from system directories.", name); 3845 return NULL; 3846} 3847 3848#define MAXIMUM_THREADS_TO_KEEP (16 * MAXIMUM_WAIT_OBJECTS) 3849#define EXIT_TIMEOUT 300000 /* 5 minutes */ 3850 3851static BOOL CALLBACK init_crit_sect_call(PINIT_ONCE, PVOID pcrit_sect, PVOID*) { 3852 InitializeCriticalSection((CRITICAL_SECTION*)pcrit_sect); 3853 return TRUE; 3854} 3855 3856int os::win32::exit_process_or_thread(Ept what, int exit_code) { 3857 // Basic approach: 3858 // - Each exiting thread registers its intent to exit and then does so. 3859 // - A thread trying to terminate the process must wait for all 3860 // threads currently exiting to complete their exit. 3861 3862 if (os::win32::has_exit_bug()) { 3863 // The array holds handles of the threads that have started exiting by calling 3864 // _endthreadex(). 3865 // Should be large enough to avoid blocking the exiting thread due to lack of 3866 // a free slot. 3867 static HANDLE handles[MAXIMUM_THREADS_TO_KEEP]; 3868 static int handle_count = 0; 3869 3870 static INIT_ONCE init_once_crit_sect = INIT_ONCE_STATIC_INIT; 3871 static CRITICAL_SECTION crit_sect; 3872 static volatile jint process_exiting = 0; 3873 int i, j; 3874 DWORD res; 3875 HANDLE hproc, hthr; 3876 3877 // The first thread that reached this point, initializes the critical section. 3878 if (!InitOnceExecuteOnce(&init_once_crit_sect, init_crit_sect_call, &crit_sect, NULL)) { 3879 warning("crit_sect initialization failed in %s: %d\n", __FILE__, __LINE__); 3880 } else if (OrderAccess::load_acquire(&process_exiting) == 0) { 3881 if (what != EPT_THREAD) { 3882 // Atomically set process_exiting before the critical section 3883 // to increase the visibility between racing threads. 3884 Atomic::cmpxchg((jint)GetCurrentThreadId(), &process_exiting, 0); 3885 } 3886 EnterCriticalSection(&crit_sect); 3887 3888 if (what == EPT_THREAD && OrderAccess::load_acquire(&process_exiting) == 0) { 3889 // Remove from the array those handles of the threads that have completed exiting. 3890 for (i = 0, j = 0; i < handle_count; ++i) { 3891 res = WaitForSingleObject(handles[i], 0 /* don't wait */); 3892 if (res == WAIT_TIMEOUT) { 3893 handles[j++] = handles[i]; 3894 } else { 3895 if (res == WAIT_FAILED) { 3896 warning("WaitForSingleObject failed (%u) in %s: %d\n", 3897 GetLastError(), __FILE__, __LINE__); 3898 } 3899 // Don't keep the handle, if we failed waiting for it. 3900 CloseHandle(handles[i]); 3901 } 3902 } 3903 3904 // If there's no free slot in the array of the kept handles, we'll have to 3905 // wait until at least one thread completes exiting. 3906 if ((handle_count = j) == MAXIMUM_THREADS_TO_KEEP) { 3907 // Raise the priority of the oldest exiting thread to increase its chances 3908 // to complete sooner. 3909 SetThreadPriority(handles[0], THREAD_PRIORITY_ABOVE_NORMAL); 3910 res = WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, handles, FALSE, EXIT_TIMEOUT); 3911 if (res >= WAIT_OBJECT_0 && res < (WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS)) { 3912 i = (res - WAIT_OBJECT_0); 3913 handle_count = MAXIMUM_THREADS_TO_KEEP - 1; 3914 for (; i < handle_count; ++i) { 3915 handles[i] = handles[i + 1]; 3916 } 3917 } else { 3918 warning("WaitForMultipleObjects %s (%u) in %s: %d\n", 3919 (res == WAIT_FAILED ? "failed" : "timed out"), 3920 GetLastError(), __FILE__, __LINE__); 3921 // Don't keep handles, if we failed waiting for them. 3922 for (i = 0; i < MAXIMUM_THREADS_TO_KEEP; ++i) { 3923 CloseHandle(handles[i]); 3924 } 3925 handle_count = 0; 3926 } 3927 } 3928 3929 // Store a duplicate of the current thread handle in the array of handles. 3930 hproc = GetCurrentProcess(); 3931 hthr = GetCurrentThread(); 3932 if (!DuplicateHandle(hproc, hthr, hproc, &handles[handle_count], 3933 0, FALSE, DUPLICATE_SAME_ACCESS)) { 3934 warning("DuplicateHandle failed (%u) in %s: %d\n", 3935 GetLastError(), __FILE__, __LINE__); 3936 } else { 3937 ++handle_count; 3938 } 3939 3940 // The current exiting thread has stored its handle in the array, and now 3941 // should leave the critical section before calling _endthreadex(). 3942 3943 } else if (what != EPT_THREAD && handle_count > 0) { 3944 jlong start_time, finish_time, timeout_left; 3945 // Before ending the process, make sure all the threads that had called 3946 // _endthreadex() completed. 3947 3948 // Set the priority level of the current thread to the same value as 3949 // the priority level of exiting threads. 3950 // This is to ensure it will be given a fair chance to execute if 3951 // the timeout expires. 3952 hthr = GetCurrentThread(); 3953 SetThreadPriority(hthr, THREAD_PRIORITY_ABOVE_NORMAL); 3954 start_time = os::javaTimeNanos(); 3955 finish_time = start_time + ((jlong)EXIT_TIMEOUT * 1000000L); 3956 for (i = 0; ; ) { 3957 int portion_count = handle_count - i; 3958 if (portion_count > MAXIMUM_WAIT_OBJECTS) { 3959 portion_count = MAXIMUM_WAIT_OBJECTS; 3960 } 3961 for (j = 0; j < portion_count; ++j) { 3962 SetThreadPriority(handles[i + j], THREAD_PRIORITY_ABOVE_NORMAL); 3963 } 3964 timeout_left = (finish_time - start_time) / 1000000L; 3965 if (timeout_left < 0) { 3966 timeout_left = 0; 3967 } 3968 res = WaitForMultipleObjects(portion_count, handles + i, TRUE, timeout_left); 3969 if (res == WAIT_FAILED || res == WAIT_TIMEOUT) { 3970 warning("WaitForMultipleObjects %s (%u) in %s: %d\n", 3971 (res == WAIT_FAILED ? "failed" : "timed out"), 3972 GetLastError(), __FILE__, __LINE__); 3973 // Reset portion_count so we close the remaining 3974 // handles due to this error. 3975 portion_count = handle_count - i; 3976 } 3977 for (j = 0; j < portion_count; ++j) { 3978 CloseHandle(handles[i + j]); 3979 } 3980 if ((i += portion_count) >= handle_count) { 3981 break; 3982 } 3983 start_time = os::javaTimeNanos(); 3984 } 3985 handle_count = 0; 3986 } 3987 3988 LeaveCriticalSection(&crit_sect); 3989 } 3990 3991 if (OrderAccess::load_acquire(&process_exiting) != 0 && 3992 process_exiting != (jint)GetCurrentThreadId()) { 3993 // Some other thread is about to call exit(), so we 3994 // don't let the current thread proceed to exit() or _endthreadex() 3995 while (true) { 3996 SuspendThread(GetCurrentThread()); 3997 // Avoid busy-wait loop, if SuspendThread() failed. 3998 Sleep(EXIT_TIMEOUT); 3999 } 4000 } 4001 } 4002 4003 // We are here if either 4004 // - there's no 'race at exit' bug on this OS release; 4005 // - initialization of the critical section failed (unlikely); 4006 // - the current thread has stored its handle and left the critical section; 4007 // - the process-exiting thread has raised the flag and left the critical section. 4008 if (what == EPT_THREAD) { 4009 _endthreadex((unsigned)exit_code); 4010 } else if (what == EPT_PROCESS) { 4011 ::exit(exit_code); 4012 } else { 4013 _exit(exit_code); 4014 } 4015 4016 // Should not reach here 4017 return exit_code; 4018} 4019 4020#undef EXIT_TIMEOUT 4021 4022void os::win32::setmode_streams() { 4023 _setmode(_fileno(stdin), _O_BINARY); 4024 _setmode(_fileno(stdout), _O_BINARY); 4025 _setmode(_fileno(stderr), _O_BINARY); 4026} 4027 4028 4029bool os::is_debugger_attached() { 4030 return IsDebuggerPresent() ? true : false; 4031} 4032 4033 4034void os::wait_for_keypress_at_exit(void) { 4035 if (PauseAtExit) { 4036 fprintf(stderr, "Press any key to continue...\n"); 4037 fgetc(stdin); 4038 } 4039} 4040 4041 4042bool os::message_box(const char* title, const char* message) { 4043 int result = MessageBox(NULL, message, title, 4044 MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY); 4045 return result == IDYES; 4046} 4047 4048#ifndef PRODUCT 4049#ifndef _WIN64 4050// Helpers to check whether NX protection is enabled 4051int nx_exception_filter(_EXCEPTION_POINTERS *pex) { 4052 if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION && 4053 pex->ExceptionRecord->NumberParameters > 0 && 4054 pex->ExceptionRecord->ExceptionInformation[0] == 4055 EXCEPTION_INFO_EXEC_VIOLATION) { 4056 return EXCEPTION_EXECUTE_HANDLER; 4057 } 4058 return EXCEPTION_CONTINUE_SEARCH; 4059} 4060 4061void nx_check_protection() { 4062 // If NX is enabled we'll get an exception calling into code on the stack 4063 char code[] = { (char)0xC3 }; // ret 4064 void *code_ptr = (void *)code; 4065 __try { 4066 __asm call code_ptr 4067 } __except(nx_exception_filter((_EXCEPTION_POINTERS*)_exception_info())) { 4068 tty->print_raw_cr("NX protection detected."); 4069 } 4070} 4071#endif // _WIN64 4072#endif // PRODUCT 4073 4074// This is called _before_ the global arguments have been parsed 4075void os::init(void) { 4076 _initial_pid = _getpid(); 4077 4078 init_random(1234567); 4079 4080 win32::initialize_system_info(); 4081 win32::setmode_streams(); 4082 init_page_sizes((size_t) win32::vm_page_size()); 4083 4084 // This may be overridden later when argument processing is done. 4085 FLAG_SET_ERGO(bool, UseLargePagesIndividualAllocation, false); 4086 4087 // Initialize main_process and main_thread 4088 main_process = GetCurrentProcess(); // Remember main_process is a pseudo handle 4089 if (!DuplicateHandle(main_process, GetCurrentThread(), main_process, 4090 &main_thread, THREAD_ALL_ACCESS, false, 0)) { 4091 fatal("DuplicateHandle failed\n"); 4092 } 4093 main_thread_id = (int) GetCurrentThreadId(); 4094 4095 // initialize fast thread access - only used for 32-bit 4096 win32::initialize_thread_ptr_offset(); 4097} 4098 4099// To install functions for atexit processing 4100extern "C" { 4101 static void perfMemory_exit_helper() { 4102 perfMemory_exit(); 4103 } 4104} 4105 4106static jint initSock(); 4107 4108// this is called _after_ the global arguments have been parsed 4109jint os::init_2(void) { 4110 // Allocate a single page and mark it as readable for safepoint polling 4111 address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY); 4112 guarantee(polling_page != NULL, "Reserve Failed for polling page"); 4113 4114 address return_page = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY); 4115 guarantee(return_page != NULL, "Commit Failed for polling page"); 4116 4117 os::set_polling_page(polling_page); 4118 log_info(os)("SafePoint Polling address: " INTPTR_FORMAT, p2i(polling_page)); 4119 4120 if (!UseMembar) { 4121 address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE); 4122 guarantee(mem_serialize_page != NULL, "Reserve Failed for memory serialize page"); 4123 4124 return_page = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE); 4125 guarantee(return_page != NULL, "Commit Failed for memory serialize page"); 4126 4127 os::set_memory_serialize_page(mem_serialize_page); 4128 log_info(os)("Memory Serialize Page address: " INTPTR_FORMAT, p2i(mem_serialize_page)); 4129 } 4130 4131 // Setup Windows Exceptions 4132 4133 // for debugging float code generation bugs 4134 if (ForceFloatExceptions) { 4135#ifndef _WIN64 4136 static long fp_control_word = 0; 4137 __asm { fstcw fp_control_word } 4138 // see Intel PPro Manual, Vol. 2, p 7-16 4139 const long precision = 0x20; 4140 const long underflow = 0x10; 4141 const long overflow = 0x08; 4142 const long zero_div = 0x04; 4143 const long denorm = 0x02; 4144 const long invalid = 0x01; 4145 fp_control_word |= invalid; 4146 __asm { fldcw fp_control_word } 4147#endif 4148 } 4149 4150 // If stack_commit_size is 0, windows will reserve the default size, 4151 // but only commit a small portion of it. 4152 size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size()); 4153 size_t default_reserve_size = os::win32::default_stack_size(); 4154 size_t actual_reserve_size = stack_commit_size; 4155 if (stack_commit_size < default_reserve_size) { 4156 // If stack_commit_size == 0, we want this too 4157 actual_reserve_size = default_reserve_size; 4158 } 4159 4160 // Check minimum allowable stack size for thread creation and to initialize 4161 // the java system classes, including StackOverflowError - depends on page 4162 // size. Add a page for compiler2 recursion in main thread. 4163 // Add in 2*BytesPerWord times page size to account for VM stack during 4164 // class initialization depending on 32 or 64 bit VM. 4165 size_t min_stack_allowed = 4166 (size_t)(JavaThread::stack_yellow_zone_size() + JavaThread::stack_red_zone_size() + 4167 JavaThread::stack_shadow_zone_size() + 4168 (2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size()); 4169 if (actual_reserve_size < min_stack_allowed) { 4170 tty->print_cr("\nThe stack size specified is too small, " 4171 "Specify at least %dk", 4172 min_stack_allowed / K); 4173 return JNI_ERR; 4174 } 4175 4176 JavaThread::set_stack_size_at_create(stack_commit_size); 4177 4178 // Calculate theoretical max. size of Threads to guard gainst artifical 4179 // out-of-memory situations, where all available address-space has been 4180 // reserved by thread stacks. 4181 assert(actual_reserve_size != 0, "Must have a stack"); 4182 4183 // Calculate the thread limit when we should start doing Virtual Memory 4184 // banging. Currently when the threads will have used all but 200Mb of space. 4185 // 4186 // TODO: consider performing a similar calculation for commit size instead 4187 // as reserve size, since on a 64-bit platform we'll run into that more 4188 // often than running out of virtual memory space. We can use the 4189 // lower value of the two calculations as the os_thread_limit. 4190 size_t max_address_space = ((size_t)1 << (BitsPerWord - 1)) - (200 * K * K); 4191 win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size); 4192 4193 // at exit methods are called in the reverse order of their registration. 4194 // there is no limit to the number of functions registered. atexit does 4195 // not set errno. 4196 4197 if (PerfAllowAtExitRegistration) { 4198 // only register atexit functions if PerfAllowAtExitRegistration is set. 4199 // atexit functions can be delayed until process exit time, which 4200 // can be problematic for embedded VM situations. Embedded VMs should 4201 // call DestroyJavaVM() to assure that VM resources are released. 4202 4203 // note: perfMemory_exit_helper atexit function may be removed in 4204 // the future if the appropriate cleanup code can be added to the 4205 // VM_Exit VMOperation's doit method. 4206 if (atexit(perfMemory_exit_helper) != 0) { 4207 warning("os::init_2 atexit(perfMemory_exit_helper) failed"); 4208 } 4209 } 4210 4211#ifndef _WIN64 4212 // Print something if NX is enabled (win32 on AMD64) 4213 NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection()); 4214#endif 4215 4216 // initialize thread priority policy 4217 prio_init(); 4218 4219 if (UseNUMA && !ForceNUMA) { 4220 UseNUMA = false; // We don't fully support this yet 4221 } 4222 4223 if (UseNUMAInterleaving) { 4224 // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag 4225 bool success = numa_interleaving_init(); 4226 if (!success) UseNUMAInterleaving = false; 4227 } 4228 4229 if (initSock() != JNI_OK) { 4230 return JNI_ERR; 4231 } 4232 4233 return JNI_OK; 4234} 4235 4236// Mark the polling page as unreadable 4237void os::make_polling_page_unreadable(void) { 4238 DWORD old_status; 4239 if (!VirtualProtect((char *)_polling_page, os::vm_page_size(), 4240 PAGE_NOACCESS, &old_status)) { 4241 fatal("Could not disable polling page"); 4242 } 4243} 4244 4245// Mark the polling page as readable 4246void os::make_polling_page_readable(void) { 4247 DWORD old_status; 4248 if (!VirtualProtect((char *)_polling_page, os::vm_page_size(), 4249 PAGE_READONLY, &old_status)) { 4250 fatal("Could not enable polling page"); 4251 } 4252} 4253 4254 4255int os::stat(const char *path, struct stat *sbuf) { 4256 char pathbuf[MAX_PATH]; 4257 if (strlen(path) > MAX_PATH - 1) { 4258 errno = ENAMETOOLONG; 4259 return -1; 4260 } 4261 os::native_path(strcpy(pathbuf, path)); 4262 int ret = ::stat(pathbuf, sbuf); 4263 if (sbuf != NULL && UseUTCFileTimestamp) { 4264 // Fix for 6539723. st_mtime returned from stat() is dependent on 4265 // the system timezone and so can return different values for the 4266 // same file if/when daylight savings time changes. This adjustment 4267 // makes sure the same timestamp is returned regardless of the TZ. 4268 // 4269 // See: 4270 // http://msdn.microsoft.com/library/ 4271 // default.asp?url=/library/en-us/sysinfo/base/ 4272 // time_zone_information_str.asp 4273 // and 4274 // http://msdn.microsoft.com/library/default.asp?url= 4275 // /library/en-us/sysinfo/base/settimezoneinformation.asp 4276 // 4277 // NOTE: there is a insidious bug here: If the timezone is changed 4278 // after the call to stat() but before 'GetTimeZoneInformation()', then 4279 // the adjustment we do here will be wrong and we'll return the wrong 4280 // value (which will likely end up creating an invalid class data 4281 // archive). Absent a better API for this, or some time zone locking 4282 // mechanism, we'll have to live with this risk. 4283 TIME_ZONE_INFORMATION tz; 4284 DWORD tzid = GetTimeZoneInformation(&tz); 4285 int daylightBias = 4286 (tzid == TIME_ZONE_ID_DAYLIGHT) ? tz.DaylightBias : tz.StandardBias; 4287 sbuf->st_mtime += (tz.Bias + daylightBias) * 60; 4288 } 4289 return ret; 4290} 4291 4292 4293#define FT2INT64(ft) \ 4294 ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime)) 4295 4296 4297// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool) 4298// are used by JVM M&M and JVMTI to get user+sys or user CPU time 4299// of a thread. 4300// 4301// current_thread_cpu_time() and thread_cpu_time(Thread*) returns 4302// the fast estimate available on the platform. 4303 4304// current_thread_cpu_time() is not optimized for Windows yet 4305jlong os::current_thread_cpu_time() { 4306 // return user + sys since the cost is the same 4307 return os::thread_cpu_time(Thread::current(), true /* user+sys */); 4308} 4309 4310jlong os::thread_cpu_time(Thread* thread) { 4311 // consistent with what current_thread_cpu_time() returns. 4312 return os::thread_cpu_time(thread, true /* user+sys */); 4313} 4314 4315jlong os::current_thread_cpu_time(bool user_sys_cpu_time) { 4316 return os::thread_cpu_time(Thread::current(), user_sys_cpu_time); 4317} 4318 4319jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) { 4320 // This code is copy from clasic VM -> hpi::sysThreadCPUTime 4321 // If this function changes, os::is_thread_cpu_time_supported() should too 4322 FILETIME CreationTime; 4323 FILETIME ExitTime; 4324 FILETIME KernelTime; 4325 FILETIME UserTime; 4326 4327 if (GetThreadTimes(thread->osthread()->thread_handle(), &CreationTime, 4328 &ExitTime, &KernelTime, &UserTime) == 0) { 4329 return -1; 4330 } else if (user_sys_cpu_time) { 4331 return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100; 4332 } else { 4333 return FT2INT64(UserTime) * 100; 4334 } 4335} 4336 4337void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 4338 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits 4339 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time 4340 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time 4341 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned 4342} 4343 4344void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { 4345 info_ptr->max_value = ALL_64_BITS; // the max value -- all 64 bits 4346 info_ptr->may_skip_backward = false; // GetThreadTimes returns absolute time 4347 info_ptr->may_skip_forward = false; // GetThreadTimes returns absolute time 4348 info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned 4349} 4350 4351bool os::is_thread_cpu_time_supported() { 4352 // see os::thread_cpu_time 4353 FILETIME CreationTime; 4354 FILETIME ExitTime; 4355 FILETIME KernelTime; 4356 FILETIME UserTime; 4357 4358 if (GetThreadTimes(GetCurrentThread(), &CreationTime, &ExitTime, 4359 &KernelTime, &UserTime) == 0) { 4360 return false; 4361 } else { 4362 return true; 4363 } 4364} 4365 4366// Windows does't provide a loadavg primitive so this is stubbed out for now. 4367// It does have primitives (PDH API) to get CPU usage and run queue length. 4368// "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length" 4369// If we wanted to implement loadavg on Windows, we have a few options: 4370// 4371// a) Query CPU usage and run queue length and "fake" an answer by 4372// returning the CPU usage if it's under 100%, and the run queue 4373// length otherwise. It turns out that querying is pretty slow 4374// on Windows, on the order of 200 microseconds on a fast machine. 4375// Note that on the Windows the CPU usage value is the % usage 4376// since the last time the API was called (and the first call 4377// returns 100%), so we'd have to deal with that as well. 4378// 4379// b) Sample the "fake" answer using a sampling thread and store 4380// the answer in a global variable. The call to loadavg would 4381// just return the value of the global, avoiding the slow query. 4382// 4383// c) Sample a better answer using exponential decay to smooth the 4384// value. This is basically the algorithm used by UNIX kernels. 4385// 4386// Note that sampling thread starvation could affect both (b) and (c). 4387int os::loadavg(double loadavg[], int nelem) { 4388 return -1; 4389} 4390 4391 4392// DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield() 4393bool os::dont_yield() { 4394 return DontYieldALot; 4395} 4396 4397// This method is a slightly reworked copy of JDK's sysOpen 4398// from src/windows/hpi/src/sys_api_md.c 4399 4400int os::open(const char *path, int oflag, int mode) { 4401 char pathbuf[MAX_PATH]; 4402 4403 if (strlen(path) > MAX_PATH - 1) { 4404 errno = ENAMETOOLONG; 4405 return -1; 4406 } 4407 os::native_path(strcpy(pathbuf, path)); 4408 return ::open(pathbuf, oflag | O_BINARY | O_NOINHERIT, mode); 4409} 4410 4411FILE* os::open(int fd, const char* mode) { 4412 return ::_fdopen(fd, mode); 4413} 4414 4415// Is a (classpath) directory empty? 4416bool os::dir_is_empty(const char* path) { 4417 WIN32_FIND_DATA fd; 4418 HANDLE f = FindFirstFile(path, &fd); 4419 if (f == INVALID_HANDLE_VALUE) { 4420 return true; 4421 } 4422 FindClose(f); 4423 return false; 4424} 4425 4426// create binary file, rewriting existing file if required 4427int os::create_binary_file(const char* path, bool rewrite_existing) { 4428 int oflags = _O_CREAT | _O_WRONLY | _O_BINARY; 4429 if (!rewrite_existing) { 4430 oflags |= _O_EXCL; 4431 } 4432 return ::open(path, oflags, _S_IREAD | _S_IWRITE); 4433} 4434 4435// return current position of file pointer 4436jlong os::current_file_offset(int fd) { 4437 return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR); 4438} 4439 4440// move file pointer to the specified offset 4441jlong os::seek_to_file_offset(int fd, jlong offset) { 4442 return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET); 4443} 4444 4445 4446jlong os::lseek(int fd, jlong offset, int whence) { 4447 return (jlong) ::_lseeki64(fd, offset, whence); 4448} 4449 4450size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) { 4451 OVERLAPPED ov; 4452 DWORD nread; 4453 BOOL result; 4454 4455 ZeroMemory(&ov, sizeof(ov)); 4456 ov.Offset = (DWORD)offset; 4457 ov.OffsetHigh = (DWORD)(offset >> 32); 4458 4459 HANDLE h = (HANDLE)::_get_osfhandle(fd); 4460 4461 result = ReadFile(h, (LPVOID)buf, nBytes, &nread, &ov); 4462 4463 return result ? nread : 0; 4464} 4465 4466 4467// This method is a slightly reworked copy of JDK's sysNativePath 4468// from src/windows/hpi/src/path_md.c 4469 4470// Convert a pathname to native format. On win32, this involves forcing all 4471// separators to be '\\' rather than '/' (both are legal inputs, but Win95 4472// sometimes rejects '/') and removing redundant separators. The input path is 4473// assumed to have been converted into the character encoding used by the local 4474// system. Because this might be a double-byte encoding, care is taken to 4475// treat double-byte lead characters correctly. 4476// 4477// This procedure modifies the given path in place, as the result is never 4478// longer than the original. There is no error return; this operation always 4479// succeeds. 4480char * os::native_path(char *path) { 4481 char *src = path, *dst = path, *end = path; 4482 char *colon = NULL; // If a drive specifier is found, this will 4483 // point to the colon following the drive letter 4484 4485 // Assumption: '/', '\\', ':', and drive letters are never lead bytes 4486 assert(((!::IsDBCSLeadByte('/')) && (!::IsDBCSLeadByte('\\')) 4487 && (!::IsDBCSLeadByte(':'))), "Illegal lead byte"); 4488 4489 // Check for leading separators 4490#define isfilesep(c) ((c) == '/' || (c) == '\\') 4491 while (isfilesep(*src)) { 4492 src++; 4493 } 4494 4495 if (::isalpha(*src) && !::IsDBCSLeadByte(*src) && src[1] == ':') { 4496 // Remove leading separators if followed by drive specifier. This 4497 // hack is necessary to support file URLs containing drive 4498 // specifiers (e.g., "file://c:/path"). As a side effect, 4499 // "/c:/path" can be used as an alternative to "c:/path". 4500 *dst++ = *src++; 4501 colon = dst; 4502 *dst++ = ':'; 4503 src++; 4504 } else { 4505 src = path; 4506 if (isfilesep(src[0]) && isfilesep(src[1])) { 4507 // UNC pathname: Retain first separator; leave src pointed at 4508 // second separator so that further separators will be collapsed 4509 // into the second separator. The result will be a pathname 4510 // beginning with "\\\\" followed (most likely) by a host name. 4511 src = dst = path + 1; 4512 path[0] = '\\'; // Force first separator to '\\' 4513 } 4514 } 4515 4516 end = dst; 4517 4518 // Remove redundant separators from remainder of path, forcing all 4519 // separators to be '\\' rather than '/'. Also, single byte space 4520 // characters are removed from the end of the path because those 4521 // are not legal ending characters on this operating system. 4522 // 4523 while (*src != '\0') { 4524 if (isfilesep(*src)) { 4525 *dst++ = '\\'; src++; 4526 while (isfilesep(*src)) src++; 4527 if (*src == '\0') { 4528 // Check for trailing separator 4529 end = dst; 4530 if (colon == dst - 2) break; // "z:\\" 4531 if (dst == path + 1) break; // "\\" 4532 if (dst == path + 2 && isfilesep(path[0])) { 4533 // "\\\\" is not collapsed to "\\" because "\\\\" marks the 4534 // beginning of a UNC pathname. Even though it is not, by 4535 // itself, a valid UNC pathname, we leave it as is in order 4536 // to be consistent with the path canonicalizer as well 4537 // as the win32 APIs, which treat this case as an invalid 4538 // UNC pathname rather than as an alias for the root 4539 // directory of the current drive. 4540 break; 4541 } 4542 end = --dst; // Path does not denote a root directory, so 4543 // remove trailing separator 4544 break; 4545 } 4546 end = dst; 4547 } else { 4548 if (::IsDBCSLeadByte(*src)) { // Copy a double-byte character 4549 *dst++ = *src++; 4550 if (*src) *dst++ = *src++; 4551 end = dst; 4552 } else { // Copy a single-byte character 4553 char c = *src++; 4554 *dst++ = c; 4555 // Space is not a legal ending character 4556 if (c != ' ') end = dst; 4557 } 4558 } 4559 } 4560 4561 *end = '\0'; 4562 4563 // For "z:", add "." to work around a bug in the C runtime library 4564 if (colon == dst - 1) { 4565 path[2] = '.'; 4566 path[3] = '\0'; 4567 } 4568 4569 return path; 4570} 4571 4572// This code is a copy of JDK's sysSetLength 4573// from src/windows/hpi/src/sys_api_md.c 4574 4575int os::ftruncate(int fd, jlong length) { 4576 HANDLE h = (HANDLE)::_get_osfhandle(fd); 4577 long high = (long)(length >> 32); 4578 DWORD ret; 4579 4580 if (h == (HANDLE)(-1)) { 4581 return -1; 4582 } 4583 4584 ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN); 4585 if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) { 4586 return -1; 4587 } 4588 4589 if (::SetEndOfFile(h) == FALSE) { 4590 return -1; 4591 } 4592 4593 return 0; 4594} 4595 4596 4597// This code is a copy of JDK's sysSync 4598// from src/windows/hpi/src/sys_api_md.c 4599// except for the legacy workaround for a bug in Win 98 4600 4601int os::fsync(int fd) { 4602 HANDLE handle = (HANDLE)::_get_osfhandle(fd); 4603 4604 if ((!::FlushFileBuffers(handle)) && 4605 (GetLastError() != ERROR_ACCESS_DENIED)) { 4606 // from winerror.h 4607 return -1; 4608 } 4609 return 0; 4610} 4611 4612static int nonSeekAvailable(int, long *); 4613static int stdinAvailable(int, long *); 4614 4615#define S_ISCHR(mode) (((mode) & _S_IFCHR) == _S_IFCHR) 4616#define S_ISFIFO(mode) (((mode) & _S_IFIFO) == _S_IFIFO) 4617 4618// This code is a copy of JDK's sysAvailable 4619// from src/windows/hpi/src/sys_api_md.c 4620 4621int os::available(int fd, jlong *bytes) { 4622 jlong cur, end; 4623 struct _stati64 stbuf64; 4624 4625 if (::_fstati64(fd, &stbuf64) >= 0) { 4626 int mode = stbuf64.st_mode; 4627 if (S_ISCHR(mode) || S_ISFIFO(mode)) { 4628 int ret; 4629 long lpbytes; 4630 if (fd == 0) { 4631 ret = stdinAvailable(fd, &lpbytes); 4632 } else { 4633 ret = nonSeekAvailable(fd, &lpbytes); 4634 } 4635 (*bytes) = (jlong)(lpbytes); 4636 return ret; 4637 } 4638 if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) { 4639 return FALSE; 4640 } else if ((end = ::_lseeki64(fd, 0L, SEEK_END)) == -1) { 4641 return FALSE; 4642 } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) { 4643 return FALSE; 4644 } 4645 *bytes = end - cur; 4646 return TRUE; 4647 } else { 4648 return FALSE; 4649 } 4650} 4651 4652// This code is a copy of JDK's nonSeekAvailable 4653// from src/windows/hpi/src/sys_api_md.c 4654 4655static int nonSeekAvailable(int fd, long *pbytes) { 4656 // This is used for available on non-seekable devices 4657 // (like both named and anonymous pipes, such as pipes 4658 // connected to an exec'd process). 4659 // Standard Input is a special case. 4660 HANDLE han; 4661 4662 if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) { 4663 return FALSE; 4664 } 4665 4666 if (! ::PeekNamedPipe(han, NULL, 0, NULL, (LPDWORD)pbytes, NULL)) { 4667 // PeekNamedPipe fails when at EOF. In that case we 4668 // simply make *pbytes = 0 which is consistent with the 4669 // behavior we get on Solaris when an fd is at EOF. 4670 // The only alternative is to raise an Exception, 4671 // which isn't really warranted. 4672 // 4673 if (::GetLastError() != ERROR_BROKEN_PIPE) { 4674 return FALSE; 4675 } 4676 *pbytes = 0; 4677 } 4678 return TRUE; 4679} 4680 4681#define MAX_INPUT_EVENTS 2000 4682 4683// This code is a copy of JDK's stdinAvailable 4684// from src/windows/hpi/src/sys_api_md.c 4685 4686static int stdinAvailable(int fd, long *pbytes) { 4687 HANDLE han; 4688 DWORD numEventsRead = 0; // Number of events read from buffer 4689 DWORD numEvents = 0; // Number of events in buffer 4690 DWORD i = 0; // Loop index 4691 DWORD curLength = 0; // Position marker 4692 DWORD actualLength = 0; // Number of bytes readable 4693 BOOL error = FALSE; // Error holder 4694 INPUT_RECORD *lpBuffer; // Pointer to records of input events 4695 4696 if ((han = ::GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) { 4697 return FALSE; 4698 } 4699 4700 // Construct an array of input records in the console buffer 4701 error = ::GetNumberOfConsoleInputEvents(han, &numEvents); 4702 if (error == 0) { 4703 return nonSeekAvailable(fd, pbytes); 4704 } 4705 4706 // lpBuffer must fit into 64K or else PeekConsoleInput fails 4707 if (numEvents > MAX_INPUT_EVENTS) { 4708 numEvents = MAX_INPUT_EVENTS; 4709 } 4710 4711 lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal); 4712 if (lpBuffer == NULL) { 4713 return FALSE; 4714 } 4715 4716 error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead); 4717 if (error == 0) { 4718 os::free(lpBuffer); 4719 return FALSE; 4720 } 4721 4722 // Examine input records for the number of bytes available 4723 for (i=0; i<numEvents; i++) { 4724 if (lpBuffer[i].EventType == KEY_EVENT) { 4725 4726 KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *) 4727 &(lpBuffer[i].Event); 4728 if (keyRecord->bKeyDown == TRUE) { 4729 CHAR *keyPressed = (CHAR *) &(keyRecord->uChar); 4730 curLength++; 4731 if (*keyPressed == '\r') { 4732 actualLength = curLength; 4733 } 4734 } 4735 } 4736 } 4737 4738 if (lpBuffer != NULL) { 4739 os::free(lpBuffer); 4740 } 4741 4742 *pbytes = (long) actualLength; 4743 return TRUE; 4744} 4745 4746// Map a block of memory. 4747char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, 4748 char *addr, size_t bytes, bool read_only, 4749 bool allow_exec) { 4750 HANDLE hFile; 4751 char* base; 4752 4753 hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, 4754 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 4755 if (hFile == NULL) { 4756 log_info(os)("CreateFile() failed: GetLastError->%ld.", GetLastError()); 4757 return NULL; 4758 } 4759 4760 if (allow_exec) { 4761 // CreateFileMapping/MapViewOfFileEx can't map executable memory 4762 // unless it comes from a PE image (which the shared archive is not.) 4763 // Even VirtualProtect refuses to give execute access to mapped memory 4764 // that was not previously executable. 4765 // 4766 // Instead, stick the executable region in anonymous memory. Yuck. 4767 // Penalty is that ~4 pages will not be shareable - in the future 4768 // we might consider DLLizing the shared archive with a proper PE 4769 // header so that mapping executable + sharing is possible. 4770 4771 base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE, 4772 PAGE_READWRITE); 4773 if (base == NULL) { 4774 log_info(os)("VirtualAlloc() failed: GetLastError->%ld.", GetLastError()); 4775 CloseHandle(hFile); 4776 return NULL; 4777 } 4778 4779 DWORD bytes_read; 4780 OVERLAPPED overlapped; 4781 overlapped.Offset = (DWORD)file_offset; 4782 overlapped.OffsetHigh = 0; 4783 overlapped.hEvent = NULL; 4784 // ReadFile guarantees that if the return value is true, the requested 4785 // number of bytes were read before returning. 4786 bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0; 4787 if (!res) { 4788 log_info(os)("ReadFile() failed: GetLastError->%ld.", GetLastError()); 4789 release_memory(base, bytes); 4790 CloseHandle(hFile); 4791 return NULL; 4792 } 4793 } else { 4794 HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0, 4795 NULL /* file_name */); 4796 if (hMap == NULL) { 4797 log_info(os)("CreateFileMapping() failed: GetLastError->%ld.", GetLastError()); 4798 CloseHandle(hFile); 4799 return NULL; 4800 } 4801 4802 DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY; 4803 base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset, 4804 (DWORD)bytes, addr); 4805 if (base == NULL) { 4806 log_info(os)("MapViewOfFileEx() failed: GetLastError->%ld.", GetLastError()); 4807 CloseHandle(hMap); 4808 CloseHandle(hFile); 4809 return NULL; 4810 } 4811 4812 if (CloseHandle(hMap) == 0) { 4813 log_info(os)("CloseHandle(hMap) failed: GetLastError->%ld.", GetLastError()); 4814 CloseHandle(hFile); 4815 return base; 4816 } 4817 } 4818 4819 if (allow_exec) { 4820 DWORD old_protect; 4821 DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE; 4822 bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0; 4823 4824 if (!res) { 4825 log_info(os)("VirtualProtect() failed: GetLastError->%ld.", GetLastError()); 4826 // Don't consider this a hard error, on IA32 even if the 4827 // VirtualProtect fails, we should still be able to execute 4828 CloseHandle(hFile); 4829 return base; 4830 } 4831 } 4832 4833 if (CloseHandle(hFile) == 0) { 4834 log_info(os)("CloseHandle(hFile) failed: GetLastError->%ld.", GetLastError()); 4835 return base; 4836 } 4837 4838 return base; 4839} 4840 4841 4842// Remap a block of memory. 4843char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, 4844 char *addr, size_t bytes, bool read_only, 4845 bool allow_exec) { 4846 // This OS does not allow existing memory maps to be remapped so we 4847 // have to unmap the memory before we remap it. 4848 if (!os::unmap_memory(addr, bytes)) { 4849 return NULL; 4850 } 4851 4852 // There is a very small theoretical window between the unmap_memory() 4853 // call above and the map_memory() call below where a thread in native 4854 // code may be able to access an address that is no longer mapped. 4855 4856 return os::map_memory(fd, file_name, file_offset, addr, bytes, 4857 read_only, allow_exec); 4858} 4859 4860 4861// Unmap a block of memory. 4862// Returns true=success, otherwise false. 4863 4864bool os::pd_unmap_memory(char* addr, size_t bytes) { 4865 MEMORY_BASIC_INFORMATION mem_info; 4866 if (VirtualQuery(addr, &mem_info, sizeof(mem_info)) == 0) { 4867 log_info(os)("VirtualQuery() failed: GetLastError->%ld.", GetLastError()); 4868 return false; 4869 } 4870 4871 // Executable memory was not mapped using CreateFileMapping/MapViewOfFileEx. 4872 // Instead, executable region was allocated using VirtualAlloc(). See 4873 // pd_map_memory() above. 4874 // 4875 // The following flags should match the 'exec_access' flages used for 4876 // VirtualProtect() in pd_map_memory(). 4877 if (mem_info.Protect == PAGE_EXECUTE_READ || 4878 mem_info.Protect == PAGE_EXECUTE_READWRITE) { 4879 return pd_release_memory(addr, bytes); 4880 } 4881 4882 BOOL result = UnmapViewOfFile(addr); 4883 if (result == 0) { 4884 log_info(os)("UnmapViewOfFile() failed: GetLastError->%ld.", GetLastError()); 4885 return false; 4886 } 4887 return true; 4888} 4889 4890void os::pause() { 4891 char filename[MAX_PATH]; 4892 if (PauseAtStartupFile && PauseAtStartupFile[0]) { 4893 jio_snprintf(filename, MAX_PATH, PauseAtStartupFile); 4894 } else { 4895 jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id()); 4896 } 4897 4898 int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); 4899 if (fd != -1) { 4900 struct stat buf; 4901 ::close(fd); 4902 while (::stat(filename, &buf) == 0) { 4903 Sleep(100); 4904 } 4905 } else { 4906 jio_fprintf(stderr, 4907 "Could not open pause file '%s', continuing immediately.\n", filename); 4908 } 4909} 4910 4911os::WatcherThreadCrashProtection::WatcherThreadCrashProtection() { 4912 assert(Thread::current()->is_Watcher_thread(), "Must be WatcherThread"); 4913} 4914 4915// See the caveats for this class in os_windows.hpp 4916// Protects the callback call so that raised OS EXCEPTIONS causes a jump back 4917// into this method and returns false. If no OS EXCEPTION was raised, returns 4918// true. 4919// The callback is supposed to provide the method that should be protected. 4920// 4921bool os::WatcherThreadCrashProtection::call(os::CrashProtectionCallback& cb) { 4922 assert(Thread::current()->is_Watcher_thread(), "Only for WatcherThread"); 4923 assert(!WatcherThread::watcher_thread()->has_crash_protection(), 4924 "crash_protection already set?"); 4925 4926 bool success = true; 4927 __try { 4928 WatcherThread::watcher_thread()->set_crash_protection(this); 4929 cb.call(); 4930 } __except(EXCEPTION_EXECUTE_HANDLER) { 4931 // only for protection, nothing to do 4932 success = false; 4933 } 4934 WatcherThread::watcher_thread()->set_crash_protection(NULL); 4935 return success; 4936} 4937 4938// An Event wraps a win32 "CreateEvent" kernel handle. 4939// 4940// We have a number of choices regarding "CreateEvent" win32 handle leakage: 4941// 4942// 1: When a thread dies return the Event to the EventFreeList, clear the ParkHandle 4943// field, and call CloseHandle() on the win32 event handle. Unpark() would 4944// need to be modified to tolerate finding a NULL (invalid) win32 event handle. 4945// In addition, an unpark() operation might fetch the handle field, but the 4946// event could recycle between the fetch and the SetEvent() operation. 4947// SetEvent() would either fail because the handle was invalid, or inadvertently work, 4948// as the win32 handle value had been recycled. In an ideal world calling SetEvent() 4949// on an stale but recycled handle would be harmless, but in practice this might 4950// confuse other non-Sun code, so it's not a viable approach. 4951// 4952// 2: Once a win32 event handle is associated with an Event, it remains associated 4953// with the Event. The event handle is never closed. This could be construed 4954// as handle leakage, but only up to the maximum # of threads that have been extant 4955// at any one time. This shouldn't be an issue, as windows platforms typically 4956// permit a process to have hundreds of thousands of open handles. 4957// 4958// 3: Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList 4959// and release unused handles. 4960// 4961// 4: Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle. 4962// It's not clear, however, that we wouldn't be trading one type of leak for another. 4963// 4964// 5. Use an RCU-like mechanism (Read-Copy Update). 4965// Or perhaps something similar to Maged Michael's "Hazard pointers". 4966// 4967// We use (2). 4968// 4969// TODO-FIXME: 4970// 1. Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation. 4971// 2. Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks 4972// to recover from (or at least detect) the dreaded Windows 841176 bug. 4973// 3. Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent 4974// into a single win32 CreateEvent() handle. 4975// 4976// Assumption: 4977// Only one parker can exist on an event, which is why we allocate 4978// them per-thread. Multiple unparkers can coexist. 4979// 4980// _Event transitions in park() 4981// -1 => -1 : illegal 4982// 1 => 0 : pass - return immediately 4983// 0 => -1 : block; then set _Event to 0 before returning 4984// 4985// _Event transitions in unpark() 4986// 0 => 1 : just return 4987// 1 => 1 : just return 4988// -1 => either 0 or 1; must signal target thread 4989// That is, we can safely transition _Event from -1 to either 4990// 0 or 1. 4991// 4992// _Event serves as a restricted-range semaphore. 4993// -1 : thread is blocked, i.e. there is a waiter 4994// 0 : neutral: thread is running or ready, 4995// could have been signaled after a wait started 4996// 1 : signaled - thread is running or ready 4997// 4998// Another possible encoding of _Event would be with 4999// explicit "PARKED" == 01b and "SIGNALED" == 10b bits. 5000// 5001 5002int os::PlatformEvent::park(jlong Millis) { 5003 // Transitions for _Event: 5004 // -1 => -1 : illegal 5005 // 1 => 0 : pass - return immediately 5006 // 0 => -1 : block; then set _Event to 0 before returning 5007 5008 guarantee(_ParkHandle != NULL , "Invariant"); 5009 guarantee(Millis > 0 , "Invariant"); 5010 5011 // CONSIDER: defer assigning a CreateEvent() handle to the Event until 5012 // the initial park() operation. 5013 // Consider: use atomic decrement instead of CAS-loop 5014 5015 int v; 5016 for (;;) { 5017 v = _Event; 5018 if (Atomic::cmpxchg(v-1, &_Event, v) == v) break; 5019 } 5020 guarantee((v == 0) || (v == 1), "invariant"); 5021 if (v != 0) return OS_OK; 5022 5023 // Do this the hard way by blocking ... 5024 // TODO: consider a brief spin here, gated on the success of recent 5025 // spin attempts by this thread. 5026 // 5027 // We decompose long timeouts into series of shorter timed waits. 5028 // Evidently large timo values passed in WaitForSingleObject() are problematic on some 5029 // versions of Windows. See EventWait() for details. This may be superstition. Or not. 5030 // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time 5031 // with os::javaTimeNanos(). Furthermore, we assume that spurious returns from 5032 // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend 5033 // to happen early in the wait interval. Specifically, after a spurious wakeup (rv == 5034 // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate 5035 // for the already waited time. This policy does not admit any new outcomes. 5036 // In the future, however, we might want to track the accumulated wait time and 5037 // adjust Millis accordingly if we encounter a spurious wakeup. 5038 5039 const int MAXTIMEOUT = 0x10000000; 5040 DWORD rv = WAIT_TIMEOUT; 5041 while (_Event < 0 && Millis > 0) { 5042 DWORD prd = Millis; // set prd = MAX (Millis, MAXTIMEOUT) 5043 if (Millis > MAXTIMEOUT) { 5044 prd = MAXTIMEOUT; 5045 } 5046 rv = ::WaitForSingleObject(_ParkHandle, prd); 5047 assert(rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed"); 5048 if (rv == WAIT_TIMEOUT) { 5049 Millis -= prd; 5050 } 5051 } 5052 v = _Event; 5053 _Event = 0; 5054 // see comment at end of os::PlatformEvent::park() below: 5055 OrderAccess::fence(); 5056 // If we encounter a nearly simultanous timeout expiry and unpark() 5057 // we return OS_OK indicating we awoke via unpark(). 5058 // Implementor's license -- returning OS_TIMEOUT would be equally valid, however. 5059 return (v >= 0) ? OS_OK : OS_TIMEOUT; 5060} 5061 5062void os::PlatformEvent::park() { 5063 // Transitions for _Event: 5064 // -1 => -1 : illegal 5065 // 1 => 0 : pass - return immediately 5066 // 0 => -1 : block; then set _Event to 0 before returning 5067 5068 guarantee(_ParkHandle != NULL, "Invariant"); 5069 // Invariant: Only the thread associated with the Event/PlatformEvent 5070 // may call park(). 5071 // Consider: use atomic decrement instead of CAS-loop 5072 int v; 5073 for (;;) { 5074 v = _Event; 5075 if (Atomic::cmpxchg(v-1, &_Event, v) == v) break; 5076 } 5077 guarantee((v == 0) || (v == 1), "invariant"); 5078 if (v != 0) return; 5079 5080 // Do this the hard way by blocking ... 5081 // TODO: consider a brief spin here, gated on the success of recent 5082 // spin attempts by this thread. 5083 while (_Event < 0) { 5084 DWORD rv = ::WaitForSingleObject(_ParkHandle, INFINITE); 5085 assert(rv == WAIT_OBJECT_0, "WaitForSingleObject failed"); 5086 } 5087 5088 // Usually we'll find _Event == 0 at this point, but as 5089 // an optional optimization we clear it, just in case can 5090 // multiple unpark() operations drove _Event up to 1. 5091 _Event = 0; 5092 OrderAccess::fence(); 5093 guarantee(_Event >= 0, "invariant"); 5094} 5095 5096void os::PlatformEvent::unpark() { 5097 guarantee(_ParkHandle != NULL, "Invariant"); 5098 5099 // Transitions for _Event: 5100 // 0 => 1 : just return 5101 // 1 => 1 : just return 5102 // -1 => either 0 or 1; must signal target thread 5103 // That is, we can safely transition _Event from -1 to either 5104 // 0 or 1. 5105 // See also: "Semaphores in Plan 9" by Mullender & Cox 5106 // 5107 // Note: Forcing a transition from "-1" to "1" on an unpark() means 5108 // that it will take two back-to-back park() calls for the owning 5109 // thread to block. This has the benefit of forcing a spurious return 5110 // from the first park() call after an unpark() call which will help 5111 // shake out uses of park() and unpark() without condition variables. 5112 5113 if (Atomic::xchg(1, &_Event) >= 0) return; 5114 5115 ::SetEvent(_ParkHandle); 5116} 5117 5118 5119// JSR166 5120// ------------------------------------------------------- 5121 5122// The Windows implementation of Park is very straightforward: Basic 5123// operations on Win32 Events turn out to have the right semantics to 5124// use them directly. We opportunistically resuse the event inherited 5125// from Monitor. 5126 5127void Parker::park(bool isAbsolute, jlong time) { 5128 guarantee(_ParkEvent != NULL, "invariant"); 5129 // First, demultiplex/decode time arguments 5130 if (time < 0) { // don't wait 5131 return; 5132 } else if (time == 0 && !isAbsolute) { 5133 time = INFINITE; 5134 } else if (isAbsolute) { 5135 time -= os::javaTimeMillis(); // convert to relative time 5136 if (time <= 0) { // already elapsed 5137 return; 5138 } 5139 } else { // relative 5140 time /= 1000000; // Must coarsen from nanos to millis 5141 if (time == 0) { // Wait for the minimal time unit if zero 5142 time = 1; 5143 } 5144 } 5145 5146 JavaThread* thread = JavaThread::current(); 5147 5148 // Don't wait if interrupted or already triggered 5149 if (Thread::is_interrupted(thread, false) || 5150 WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) { 5151 ResetEvent(_ParkEvent); 5152 return; 5153 } else { 5154 ThreadBlockInVM tbivm(thread); 5155 OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); 5156 thread->set_suspend_equivalent(); 5157 5158 WaitForSingleObject(_ParkEvent, time); 5159 ResetEvent(_ParkEvent); 5160 5161 // If externally suspended while waiting, re-suspend 5162 if (thread->handle_special_suspend_equivalent_condition()) { 5163 thread->java_suspend_self(); 5164 } 5165 } 5166} 5167 5168void Parker::unpark() { 5169 guarantee(_ParkEvent != NULL, "invariant"); 5170 SetEvent(_ParkEvent); 5171} 5172 5173// Run the specified command in a separate process. Return its exit value, 5174// or -1 on failure (e.g. can't create a new process). 5175int os::fork_and_exec(char* cmd) { 5176 STARTUPINFO si; 5177 PROCESS_INFORMATION pi; 5178 5179 memset(&si, 0, sizeof(si)); 5180 si.cb = sizeof(si); 5181 memset(&pi, 0, sizeof(pi)); 5182 BOOL rslt = CreateProcess(NULL, // executable name - use command line 5183 cmd, // command line 5184 NULL, // process security attribute 5185 NULL, // thread security attribute 5186 TRUE, // inherits system handles 5187 0, // no creation flags 5188 NULL, // use parent's environment block 5189 NULL, // use parent's starting directory 5190 &si, // (in) startup information 5191 &pi); // (out) process information 5192 5193 if (rslt) { 5194 // Wait until child process exits. 5195 WaitForSingleObject(pi.hProcess, INFINITE); 5196 5197 DWORD exit_code; 5198 GetExitCodeProcess(pi.hProcess, &exit_code); 5199 5200 // Close process and thread handles. 5201 CloseHandle(pi.hProcess); 5202 CloseHandle(pi.hThread); 5203 5204 return (int)exit_code; 5205 } else { 5206 return -1; 5207 } 5208} 5209 5210//-------------------------------------------------------------------------------------------------- 5211// Non-product code 5212 5213static int mallocDebugIntervalCounter = 0; 5214static int mallocDebugCounter = 0; 5215bool os::check_heap(bool force) { 5216 if (++mallocDebugCounter < MallocVerifyStart && !force) return true; 5217 if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) { 5218 // Note: HeapValidate executes two hardware breakpoints when it finds something 5219 // wrong; at these points, eax contains the address of the offending block (I think). 5220 // To get to the exlicit error message(s) below, just continue twice. 5221 // 5222 // Note: we want to check the CRT heap, which is not necessarily located in the 5223 // process default heap. 5224 HANDLE heap = (HANDLE) _get_heap_handle(); 5225 if (!heap) { 5226 return true; 5227 } 5228 5229 // If we fail to lock the heap, then gflags.exe has been used 5230 // or some other special heap flag has been set that prevents 5231 // locking. We don't try to walk a heap we can't lock. 5232 if (HeapLock(heap) != 0) { 5233 PROCESS_HEAP_ENTRY phe; 5234 phe.lpData = NULL; 5235 while (HeapWalk(heap, &phe) != 0) { 5236 if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) && 5237 !HeapValidate(heap, 0, phe.lpData)) { 5238 tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter); 5239 tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData); 5240 HeapUnlock(heap); 5241 fatal("corrupted C heap"); 5242 } 5243 } 5244 DWORD err = GetLastError(); 5245 if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) { 5246 HeapUnlock(heap); 5247 fatal("heap walk aborted with error %d", err); 5248 } 5249 HeapUnlock(heap); 5250 } 5251 mallocDebugIntervalCounter = 0; 5252 } 5253 return true; 5254} 5255 5256 5257bool os::find(address addr, outputStream* st) { 5258 int offset = -1; 5259 bool result = false; 5260 char buf[256]; 5261 if (os::dll_address_to_library_name(addr, buf, sizeof(buf), &offset)) { 5262 st->print(PTR_FORMAT " ", addr); 5263 if (strlen(buf) < sizeof(buf) - 1) { 5264 char* p = strrchr(buf, '\\'); 5265 if (p) { 5266 st->print("%s", p + 1); 5267 } else { 5268 st->print("%s", buf); 5269 } 5270 } else { 5271 // The library name is probably truncated. Let's omit the library name. 5272 // See also JDK-8147512. 5273 } 5274 if (os::dll_address_to_function_name(addr, buf, sizeof(buf), &offset)) { 5275 st->print("::%s + 0x%x", buf, offset); 5276 } 5277 st->cr(); 5278 result = true; 5279 } 5280 return result; 5281} 5282 5283LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) { 5284 DWORD exception_code = e->ExceptionRecord->ExceptionCode; 5285 5286 if (exception_code == EXCEPTION_ACCESS_VIOLATION) { 5287 JavaThread* thread = JavaThread::current(); 5288 PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord; 5289 address addr = (address) exceptionRecord->ExceptionInformation[1]; 5290 5291 if (os::is_memory_serialize_page(thread, addr)) { 5292 return EXCEPTION_CONTINUE_EXECUTION; 5293 } 5294 } 5295 5296 return EXCEPTION_CONTINUE_SEARCH; 5297} 5298 5299// We don't build a headless jre for Windows 5300bool os::is_headless_jre() { return false; } 5301 5302static jint initSock() { 5303 WSADATA wsadata; 5304 5305 if (WSAStartup(MAKEWORD(2,2), &wsadata) != 0) { 5306 jio_fprintf(stderr, "Could not initialize Winsock (error: %d)\n", 5307 ::GetLastError()); 5308 return JNI_ERR; 5309 } 5310 return JNI_OK; 5311} 5312 5313struct hostent* os::get_host_by_name(char* name) { 5314 return (struct hostent*)gethostbyname(name); 5315} 5316 5317int os::socket_close(int fd) { 5318 return ::closesocket(fd); 5319} 5320 5321int os::socket(int domain, int type, int protocol) { 5322 return ::socket(domain, type, protocol); 5323} 5324 5325int os::connect(int fd, struct sockaddr* him, socklen_t len) { 5326 return ::connect(fd, him, len); 5327} 5328 5329int os::recv(int fd, char* buf, size_t nBytes, uint flags) { 5330 return ::recv(fd, buf, (int)nBytes, flags); 5331} 5332 5333int os::send(int fd, char* buf, size_t nBytes, uint flags) { 5334 return ::send(fd, buf, (int)nBytes, flags); 5335} 5336 5337int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) { 5338 return ::send(fd, buf, (int)nBytes, flags); 5339} 5340 5341// WINDOWS CONTEXT Flags for THREAD_SAMPLING 5342#if defined(IA32) 5343 #define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS) 5344#elif defined (AMD64) 5345 #define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT) 5346#endif 5347 5348// returns true if thread could be suspended, 5349// false otherwise 5350static bool do_suspend(HANDLE* h) { 5351 if (h != NULL) { 5352 if (SuspendThread(*h) != ~0) { 5353 return true; 5354 } 5355 } 5356 return false; 5357} 5358 5359// resume the thread 5360// calling resume on an active thread is a no-op 5361static void do_resume(HANDLE* h) { 5362 if (h != NULL) { 5363 ResumeThread(*h); 5364 } 5365} 5366 5367// retrieve a suspend/resume context capable handle 5368// from the tid. Caller validates handle return value. 5369void get_thread_handle_for_extended_context(HANDLE* h, 5370 OSThread::thread_id_t tid) { 5371 if (h != NULL) { 5372 *h = OpenThread(THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, FALSE, tid); 5373 } 5374} 5375 5376// Thread sampling implementation 5377// 5378void os::SuspendedThreadTask::internal_do_task() { 5379 CONTEXT ctxt; 5380 HANDLE h = NULL; 5381 5382 // get context capable handle for thread 5383 get_thread_handle_for_extended_context(&h, _thread->osthread()->thread_id()); 5384 5385 // sanity 5386 if (h == NULL || h == INVALID_HANDLE_VALUE) { 5387 return; 5388 } 5389 5390 // suspend the thread 5391 if (do_suspend(&h)) { 5392 ctxt.ContextFlags = sampling_context_flags; 5393 // get thread context 5394 GetThreadContext(h, &ctxt); 5395 SuspendedThreadTaskContext context(_thread, &ctxt); 5396 // pass context to Thread Sampling impl 5397 do_task(context); 5398 // resume thread 5399 do_resume(&h); 5400 } 5401 5402 // close handle 5403 CloseHandle(h); 5404} 5405 5406bool os::start_debugging(char *buf, int buflen) { 5407 int len = (int)strlen(buf); 5408 char *p = &buf[len]; 5409 5410 jio_snprintf(p, buflen-len, 5411 "\n\n" 5412 "Do you want to debug the problem?\n\n" 5413 "To debug, attach Visual Studio to process %d; then switch to thread 0x%x\n" 5414 "Select 'Yes' to launch Visual Studio automatically (PATH must include msdev)\n" 5415 "Otherwise, select 'No' to abort...", 5416 os::current_process_id(), os::current_thread_id()); 5417 5418 bool yes = os::message_box("Unexpected Error", buf); 5419 5420 if (yes) { 5421 // os::breakpoint() calls DebugBreak(), which causes a breakpoint 5422 // exception. If VM is running inside a debugger, the debugger will 5423 // catch the exception. Otherwise, the breakpoint exception will reach 5424 // the default windows exception handler, which can spawn a debugger and 5425 // automatically attach to the dying VM. 5426 os::breakpoint(); 5427 yes = false; 5428 } 5429 return yes; 5430} 5431 5432void* os::get_default_process_handle() { 5433 return (void*)GetModuleHandle(NULL); 5434} 5435 5436// Builds a platform dependent Agent_OnLoad_<lib_name> function name 5437// which is used to find statically linked in agents. 5438// Additionally for windows, takes into account __stdcall names. 5439// Parameters: 5440// sym_name: Symbol in library we are looking for 5441// lib_name: Name of library to look in, NULL for shared libs. 5442// is_absolute_path == true if lib_name is absolute path to agent 5443// such as "C:/a/b/L.dll" 5444// == false if only the base name of the library is passed in 5445// such as "L" 5446char* os::build_agent_function_name(const char *sym_name, const char *lib_name, 5447 bool is_absolute_path) { 5448 char *agent_entry_name; 5449 size_t len; 5450 size_t name_len; 5451 size_t prefix_len = strlen(JNI_LIB_PREFIX); 5452 size_t suffix_len = strlen(JNI_LIB_SUFFIX); 5453 const char *start; 5454 5455 if (lib_name != NULL) { 5456 len = name_len = strlen(lib_name); 5457 if (is_absolute_path) { 5458 // Need to strip path, prefix and suffix 5459 if ((start = strrchr(lib_name, *os::file_separator())) != NULL) { 5460 lib_name = ++start; 5461 } else { 5462 // Need to check for drive prefix 5463 if ((start = strchr(lib_name, ':')) != NULL) { 5464 lib_name = ++start; 5465 } 5466 } 5467 if (len <= (prefix_len + suffix_len)) { 5468 return NULL; 5469 } 5470 lib_name += prefix_len; 5471 name_len = strlen(lib_name) - suffix_len; 5472 } 5473 } 5474 len = (lib_name != NULL ? name_len : 0) + strlen(sym_name) + 2; 5475 agent_entry_name = NEW_C_HEAP_ARRAY_RETURN_NULL(char, len, mtThread); 5476 if (agent_entry_name == NULL) { 5477 return NULL; 5478 } 5479 if (lib_name != NULL) { 5480 const char *p = strrchr(sym_name, '@'); 5481 if (p != NULL && p != sym_name) { 5482 // sym_name == _Agent_OnLoad@XX 5483 strncpy(agent_entry_name, sym_name, (p - sym_name)); 5484 agent_entry_name[(p-sym_name)] = '\0'; 5485 // agent_entry_name == _Agent_OnLoad 5486 strcat(agent_entry_name, "_"); 5487 strncat(agent_entry_name, lib_name, name_len); 5488 strcat(agent_entry_name, p); 5489 // agent_entry_name == _Agent_OnLoad_lib_name@XX 5490 } else { 5491 strcpy(agent_entry_name, sym_name); 5492 strcat(agent_entry_name, "_"); 5493 strncat(agent_entry_name, lib_name, name_len); 5494 } 5495 } else { 5496 strcpy(agent_entry_name, sym_name); 5497 } 5498 return agent_entry_name; 5499} 5500 5501#ifndef PRODUCT 5502 5503// test the code path in reserve_memory_special() that tries to allocate memory in a single 5504// contiguous memory block at a particular address. 5505// The test first tries to find a good approximate address to allocate at by using the same 5506// method to allocate some memory at any address. The test then tries to allocate memory in 5507// the vicinity (not directly after it to avoid possible by-chance use of that location) 5508// This is of course only some dodgy assumption, there is no guarantee that the vicinity of 5509// the previously allocated memory is available for allocation. The only actual failure 5510// that is reported is when the test tries to allocate at a particular location but gets a 5511// different valid one. A NULL return value at this point is not considered an error but may 5512// be legitimate. 5513// If -XX:+VerboseInternalVMTests is enabled, print some explanatory messages. 5514void TestReserveMemorySpecial_test() { 5515 if (!UseLargePages) { 5516 if (VerboseInternalVMTests) { 5517 tty->print("Skipping test because large pages are disabled"); 5518 } 5519 return; 5520 } 5521 // save current value of globals 5522 bool old_use_large_pages_individual_allocation = UseLargePagesIndividualAllocation; 5523 bool old_use_numa_interleaving = UseNUMAInterleaving; 5524 5525 // set globals to make sure we hit the correct code path 5526 UseLargePagesIndividualAllocation = UseNUMAInterleaving = false; 5527 5528 // do an allocation at an address selected by the OS to get a good one. 5529 const size_t large_allocation_size = os::large_page_size() * 4; 5530 char* result = os::reserve_memory_special(large_allocation_size, os::large_page_size(), NULL, false); 5531 if (result == NULL) { 5532 if (VerboseInternalVMTests) { 5533 tty->print("Failed to allocate control block with size " SIZE_FORMAT ". Skipping remainder of test.", 5534 large_allocation_size); 5535 } 5536 } else { 5537 os::release_memory_special(result, large_allocation_size); 5538 5539 // allocate another page within the recently allocated memory area which seems to be a good location. At least 5540 // we managed to get it once. 5541 const size_t expected_allocation_size = os::large_page_size(); 5542 char* expected_location = result + os::large_page_size(); 5543 char* actual_location = os::reserve_memory_special(expected_allocation_size, os::large_page_size(), expected_location, false); 5544 if (actual_location == NULL) { 5545 if (VerboseInternalVMTests) { 5546 tty->print("Failed to allocate any memory at " PTR_FORMAT " size " SIZE_FORMAT ". Skipping remainder of test.", 5547 expected_location, large_allocation_size); 5548 } 5549 } else { 5550 // release memory 5551 os::release_memory_special(actual_location, expected_allocation_size); 5552 // only now check, after releasing any memory to avoid any leaks. 5553 assert(actual_location == expected_location, 5554 "Failed to allocate memory at requested location " PTR_FORMAT " of size " SIZE_FORMAT ", is " PTR_FORMAT " instead", 5555 expected_location, expected_allocation_size, actual_location); 5556 } 5557 } 5558 5559 // restore globals 5560 UseLargePagesIndividualAllocation = old_use_large_pages_individual_allocation; 5561 UseNUMAInterleaving = old_use_numa_interleaving; 5562} 5563#endif // PRODUCT 5564 5565/* 5566 All the defined signal names for Windows. 5567 5568 NOTE that not all of these names are accepted by FindSignal! 5569 5570 For various reasons some of these may be rejected at runtime. 5571 5572 Here are the names currently accepted by a user of sun.misc.Signal with 5573 1.4.1 (ignoring potential interaction with use of chaining, etc): 5574 5575 (LIST TBD) 5576 5577*/ 5578int os::get_signal_number(const char* name) { 5579 static const struct { 5580 char* name; 5581 int number; 5582 } siglabels [] = 5583 // derived from version 6.0 VC98/include/signal.h 5584 {"ABRT", SIGABRT, // abnormal termination triggered by abort cl 5585 "FPE", SIGFPE, // floating point exception 5586 "SEGV", SIGSEGV, // segment violation 5587 "INT", SIGINT, // interrupt 5588 "TERM", SIGTERM, // software term signal from kill 5589 "BREAK", SIGBREAK, // Ctrl-Break sequence 5590 "ILL", SIGILL}; // illegal instruction 5591 for (unsigned i = 0; i < ARRAY_SIZE(siglabels); ++i) { 5592 if (strcmp(name, siglabels[i].name) == 0) { 5593 return siglabels[i].number; 5594 } 5595 } 5596 return -1; 5597} 5598 5599// Fast current thread access 5600 5601int os::win32::_thread_ptr_offset = 0; 5602 5603static void call_wrapper_dummy() {} 5604 5605// We need to call the os_exception_wrapper once so that it sets 5606// up the offset from FS of the thread pointer. 5607void os::win32::initialize_thread_ptr_offset() { 5608 os::os_exception_wrapper((java_call_t)call_wrapper_dummy, 5609 NULL, NULL, NULL, NULL); 5610} 5611