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