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