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