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