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