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