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