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