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