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