os_windows.cpp revision 4276:6b803ba47588
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
3771// this is called _after_ the global arguments have been parsed
3772jint os::init_2(void) {
3773  // Allocate a single page and mark it as readable for safepoint polling
3774  address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY);
3775  guarantee( polling_page != NULL, "Reserve Failed for polling page");
3776
3777  address return_page  = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY);
3778  guarantee( return_page != NULL, "Commit Failed for polling page");
3779
3780  os::set_polling_page( polling_page );
3781
3782#ifndef PRODUCT
3783  if( Verbose && PrintMiscellaneous )
3784    tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
3785#endif
3786
3787  if (!UseMembar) {
3788    address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE);
3789    guarantee( mem_serialize_page != NULL, "Reserve Failed for memory serialize page");
3790
3791    return_page  = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE);
3792    guarantee( return_page != NULL, "Commit Failed for memory serialize page");
3793
3794    os::set_memory_serialize_page( mem_serialize_page );
3795
3796#ifndef PRODUCT
3797    if(Verbose && PrintMiscellaneous)
3798      tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
3799#endif
3800  }
3801
3802  os::large_page_init();
3803
3804  // Setup Windows Exceptions
3805
3806  // for debugging float code generation bugs
3807  if (ForceFloatExceptions) {
3808#ifndef  _WIN64
3809    static long fp_control_word = 0;
3810    __asm { fstcw fp_control_word }
3811    // see Intel PPro Manual, Vol. 2, p 7-16
3812    const long precision = 0x20;
3813    const long underflow = 0x10;
3814    const long overflow  = 0x08;
3815    const long zero_div  = 0x04;
3816    const long denorm    = 0x02;
3817    const long invalid   = 0x01;
3818    fp_control_word |= invalid;
3819    __asm { fldcw fp_control_word }
3820#endif
3821  }
3822
3823  // If stack_commit_size is 0, windows will reserve the default size,
3824  // but only commit a small portion of it.
3825  size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size());
3826  size_t default_reserve_size = os::win32::default_stack_size();
3827  size_t actual_reserve_size = stack_commit_size;
3828  if (stack_commit_size < default_reserve_size) {
3829    // If stack_commit_size == 0, we want this too
3830    actual_reserve_size = default_reserve_size;
3831  }
3832
3833  // Check minimum allowable stack size for thread creation and to initialize
3834  // the java system classes, including StackOverflowError - depends on page
3835  // size.  Add a page for compiler2 recursion in main thread.
3836  // Add in 2*BytesPerWord times page size to account for VM stack during
3837  // class initialization depending on 32 or 64 bit VM.
3838  size_t min_stack_allowed =
3839            (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
3840            2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size();
3841  if (actual_reserve_size < min_stack_allowed) {
3842    tty->print_cr("\nThe stack size specified is too small, "
3843                  "Specify at least %dk",
3844                  min_stack_allowed / K);
3845    return JNI_ERR;
3846  }
3847
3848  JavaThread::set_stack_size_at_create(stack_commit_size);
3849
3850  // Calculate theoretical max. size of Threads to guard gainst artifical
3851  // out-of-memory situations, where all available address-space has been
3852  // reserved by thread stacks.
3853  assert(actual_reserve_size != 0, "Must have a stack");
3854
3855  // Calculate the thread limit when we should start doing Virtual Memory
3856  // banging. Currently when the threads will have used all but 200Mb of space.
3857  //
3858  // TODO: consider performing a similar calculation for commit size instead
3859  // as reserve size, since on a 64-bit platform we'll run into that more
3860  // often than running out of virtual memory space.  We can use the
3861  // lower value of the two calculations as the os_thread_limit.
3862  size_t max_address_space = ((size_t)1 << (BitsPerWord - 1)) - (200 * K * K);
3863  win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size);
3864
3865  // at exit methods are called in the reverse order of their registration.
3866  // there is no limit to the number of functions registered. atexit does
3867  // not set errno.
3868
3869  if (PerfAllowAtExitRegistration) {
3870    // only register atexit functions if PerfAllowAtExitRegistration is set.
3871    // atexit functions can be delayed until process exit time, which
3872    // can be problematic for embedded VM situations. Embedded VMs should
3873    // call DestroyJavaVM() to assure that VM resources are released.
3874
3875    // note: perfMemory_exit_helper atexit function may be removed in
3876    // the future if the appropriate cleanup code can be added to the
3877    // VM_Exit VMOperation's doit method.
3878    if (atexit(perfMemory_exit_helper) != 0) {
3879      warning("os::init_2 atexit(perfMemory_exit_helper) failed");
3880    }
3881  }
3882
3883#ifndef _WIN64
3884  // Print something if NX is enabled (win32 on AMD64)
3885  NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection());
3886#endif
3887
3888  // initialize thread priority policy
3889  prio_init();
3890
3891  if (UseNUMA && !ForceNUMA) {
3892    UseNUMA = false; // We don't fully support this yet
3893  }
3894
3895  if (UseNUMAInterleaving) {
3896    // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag
3897    bool success = numa_interleaving_init();
3898    if (!success) UseNUMAInterleaving = false;
3899  }
3900
3901  return JNI_OK;
3902}
3903
3904void os::init_3(void) {
3905  return;
3906}
3907
3908// Mark the polling page as unreadable
3909void os::make_polling_page_unreadable(void) {
3910  DWORD old_status;
3911  if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_NOACCESS, &old_status) )
3912    fatal("Could not disable polling page");
3913};
3914
3915// Mark the polling page as readable
3916void os::make_polling_page_readable(void) {
3917  DWORD old_status;
3918  if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_READONLY, &old_status) )
3919    fatal("Could not enable polling page");
3920};
3921
3922
3923int os::stat(const char *path, struct stat *sbuf) {
3924  char pathbuf[MAX_PATH];
3925  if (strlen(path) > MAX_PATH - 1) {
3926    errno = ENAMETOOLONG;
3927    return -1;
3928  }
3929  os::native_path(strcpy(pathbuf, path));
3930  int ret = ::stat(pathbuf, sbuf);
3931  if (sbuf != NULL && UseUTCFileTimestamp) {
3932    // Fix for 6539723.  st_mtime returned from stat() is dependent on
3933    // the system timezone and so can return different values for the
3934    // same file if/when daylight savings time changes.  This adjustment
3935    // makes sure the same timestamp is returned regardless of the TZ.
3936    //
3937    // See:
3938    // http://msdn.microsoft.com/library/
3939    //   default.asp?url=/library/en-us/sysinfo/base/
3940    //   time_zone_information_str.asp
3941    // and
3942    // http://msdn.microsoft.com/library/default.asp?url=
3943    //   /library/en-us/sysinfo/base/settimezoneinformation.asp
3944    //
3945    // NOTE: there is a insidious bug here:  If the timezone is changed
3946    // after the call to stat() but before 'GetTimeZoneInformation()', then
3947    // the adjustment we do here will be wrong and we'll return the wrong
3948    // value (which will likely end up creating an invalid class data
3949    // archive).  Absent a better API for this, or some time zone locking
3950    // mechanism, we'll have to live with this risk.
3951    TIME_ZONE_INFORMATION tz;
3952    DWORD tzid = GetTimeZoneInformation(&tz);
3953    int daylightBias =
3954      (tzid == TIME_ZONE_ID_DAYLIGHT) ?  tz.DaylightBias : tz.StandardBias;
3955    sbuf->st_mtime += (tz.Bias + daylightBias) * 60;
3956  }
3957  return ret;
3958}
3959
3960
3961#define FT2INT64(ft) \
3962  ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime))
3963
3964
3965// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
3966// are used by JVM M&M and JVMTI to get user+sys or user CPU time
3967// of a thread.
3968//
3969// current_thread_cpu_time() and thread_cpu_time(Thread*) returns
3970// the fast estimate available on the platform.
3971
3972// current_thread_cpu_time() is not optimized for Windows yet
3973jlong os::current_thread_cpu_time() {
3974  // return user + sys since the cost is the same
3975  return os::thread_cpu_time(Thread::current(), true /* user+sys */);
3976}
3977
3978jlong os::thread_cpu_time(Thread* thread) {
3979  // consistent with what current_thread_cpu_time() returns.
3980  return os::thread_cpu_time(thread, true /* user+sys */);
3981}
3982
3983jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
3984  return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
3985}
3986
3987jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) {
3988  // This code is copy from clasic VM -> hpi::sysThreadCPUTime
3989  // If this function changes, os::is_thread_cpu_time_supported() should too
3990  if (os::win32::is_nt()) {
3991    FILETIME CreationTime;
3992    FILETIME ExitTime;
3993    FILETIME KernelTime;
3994    FILETIME UserTime;
3995
3996    if ( GetThreadTimes(thread->osthread()->thread_handle(),
3997                    &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
3998      return -1;
3999    else
4000      if (user_sys_cpu_time) {
4001        return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100;
4002      } else {
4003        return FT2INT64(UserTime) * 100;
4004      }
4005  } else {
4006    return (jlong) timeGetTime() * 1000000;
4007  }
4008}
4009
4010void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4011  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
4012  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
4013  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
4014  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
4015}
4016
4017void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4018  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
4019  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
4020  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
4021  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
4022}
4023
4024bool os::is_thread_cpu_time_supported() {
4025  // see os::thread_cpu_time
4026  if (os::win32::is_nt()) {
4027    FILETIME CreationTime;
4028    FILETIME ExitTime;
4029    FILETIME KernelTime;
4030    FILETIME UserTime;
4031
4032    if ( GetThreadTimes(GetCurrentThread(),
4033                    &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
4034      return false;
4035    else
4036      return true;
4037  } else {
4038    return false;
4039  }
4040}
4041
4042// Windows does't provide a loadavg primitive so this is stubbed out for now.
4043// It does have primitives (PDH API) to get CPU usage and run queue length.
4044// "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length"
4045// If we wanted to implement loadavg on Windows, we have a few options:
4046//
4047// a) Query CPU usage and run queue length and "fake" an answer by
4048//    returning the CPU usage if it's under 100%, and the run queue
4049//    length otherwise.  It turns out that querying is pretty slow
4050//    on Windows, on the order of 200 microseconds on a fast machine.
4051//    Note that on the Windows the CPU usage value is the % usage
4052//    since the last time the API was called (and the first call
4053//    returns 100%), so we'd have to deal with that as well.
4054//
4055// b) Sample the "fake" answer using a sampling thread and store
4056//    the answer in a global variable.  The call to loadavg would
4057//    just return the value of the global, avoiding the slow query.
4058//
4059// c) Sample a better answer using exponential decay to smooth the
4060//    value.  This is basically the algorithm used by UNIX kernels.
4061//
4062// Note that sampling thread starvation could affect both (b) and (c).
4063int os::loadavg(double loadavg[], int nelem) {
4064  return -1;
4065}
4066
4067
4068// DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield()
4069bool os::dont_yield() {
4070  return DontYieldALot;
4071}
4072
4073// This method is a slightly reworked copy of JDK's sysOpen
4074// from src/windows/hpi/src/sys_api_md.c
4075
4076int os::open(const char *path, int oflag, int mode) {
4077  char pathbuf[MAX_PATH];
4078
4079  if (strlen(path) > MAX_PATH - 1) {
4080    errno = ENAMETOOLONG;
4081          return -1;
4082  }
4083  os::native_path(strcpy(pathbuf, path));
4084  return ::open(pathbuf, oflag | O_BINARY | O_NOINHERIT, mode);
4085}
4086
4087// Is a (classpath) directory empty?
4088bool os::dir_is_empty(const char* path) {
4089  WIN32_FIND_DATA fd;
4090  HANDLE f = FindFirstFile(path, &fd);
4091  if (f == INVALID_HANDLE_VALUE) {
4092    return true;
4093  }
4094  FindClose(f);
4095  return false;
4096}
4097
4098// create binary file, rewriting existing file if required
4099int os::create_binary_file(const char* path, bool rewrite_existing) {
4100  int oflags = _O_CREAT | _O_WRONLY | _O_BINARY;
4101  if (!rewrite_existing) {
4102    oflags |= _O_EXCL;
4103  }
4104  return ::open(path, oflags, _S_IREAD | _S_IWRITE);
4105}
4106
4107// return current position of file pointer
4108jlong os::current_file_offset(int fd) {
4109  return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR);
4110}
4111
4112// move file pointer to the specified offset
4113jlong os::seek_to_file_offset(int fd, jlong offset) {
4114  return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET);
4115}
4116
4117
4118jlong os::lseek(int fd, jlong offset, int whence) {
4119  return (jlong) ::_lseeki64(fd, offset, whence);
4120}
4121
4122// This method is a slightly reworked copy of JDK's sysNativePath
4123// from src/windows/hpi/src/path_md.c
4124
4125/* Convert a pathname to native format.  On win32, this involves forcing all
4126   separators to be '\\' rather than '/' (both are legal inputs, but Win95
4127   sometimes rejects '/') and removing redundant separators.  The input path is
4128   assumed to have been converted into the character encoding used by the local
4129   system.  Because this might be a double-byte encoding, care is taken to
4130   treat double-byte lead characters correctly.
4131
4132   This procedure modifies the given path in place, as the result is never
4133   longer than the original.  There is no error return; this operation always
4134   succeeds. */
4135char * os::native_path(char *path) {
4136  char *src = path, *dst = path, *end = path;
4137  char *colon = NULL;           /* If a drive specifier is found, this will
4138                                        point to the colon following the drive
4139                                        letter */
4140
4141  /* Assumption: '/', '\\', ':', and drive letters are never lead bytes */
4142  assert(((!::IsDBCSLeadByte('/'))
4143    && (!::IsDBCSLeadByte('\\'))
4144    && (!::IsDBCSLeadByte(':'))),
4145    "Illegal lead byte");
4146
4147  /* Check for leading separators */
4148#define isfilesep(c) ((c) == '/' || (c) == '\\')
4149  while (isfilesep(*src)) {
4150    src++;
4151  }
4152
4153  if (::isalpha(*src) && !::IsDBCSLeadByte(*src) && src[1] == ':') {
4154    /* Remove leading separators if followed by drive specifier.  This
4155      hack is necessary to support file URLs containing drive
4156      specifiers (e.g., "file://c:/path").  As a side effect,
4157      "/c:/path" can be used as an alternative to "c:/path". */
4158    *dst++ = *src++;
4159    colon = dst;
4160    *dst++ = ':';
4161    src++;
4162  } else {
4163    src = path;
4164    if (isfilesep(src[0]) && isfilesep(src[1])) {
4165      /* UNC pathname: Retain first separator; leave src pointed at
4166         second separator so that further separators will be collapsed
4167         into the second separator.  The result will be a pathname
4168         beginning with "\\\\" followed (most likely) by a host name. */
4169      src = dst = path + 1;
4170      path[0] = '\\';     /* Force first separator to '\\' */
4171    }
4172  }
4173
4174  end = dst;
4175
4176  /* Remove redundant separators from remainder of path, forcing all
4177      separators to be '\\' rather than '/'. Also, single byte space
4178      characters are removed from the end of the path because those
4179      are not legal ending characters on this operating system.
4180  */
4181  while (*src != '\0') {
4182    if (isfilesep(*src)) {
4183      *dst++ = '\\'; src++;
4184      while (isfilesep(*src)) src++;
4185      if (*src == '\0') {
4186        /* Check for trailing separator */
4187        end = dst;
4188        if (colon == dst - 2) break;                      /* "z:\\" */
4189        if (dst == path + 1) break;                       /* "\\" */
4190        if (dst == path + 2 && isfilesep(path[0])) {
4191          /* "\\\\" is not collapsed to "\\" because "\\\\" marks the
4192            beginning of a UNC pathname.  Even though it is not, by
4193            itself, a valid UNC pathname, we leave it as is in order
4194            to be consistent with the path canonicalizer as well
4195            as the win32 APIs, which treat this case as an invalid
4196            UNC pathname rather than as an alias for the root
4197            directory of the current drive. */
4198          break;
4199        }
4200        end = --dst;  /* Path does not denote a root directory, so
4201                                    remove trailing separator */
4202        break;
4203      }
4204      end = dst;
4205    } else {
4206      if (::IsDBCSLeadByte(*src)) { /* Copy a double-byte character */
4207        *dst++ = *src++;
4208        if (*src) *dst++ = *src++;
4209        end = dst;
4210      } else {         /* Copy a single-byte character */
4211        char c = *src++;
4212        *dst++ = c;
4213        /* Space is not a legal ending character */
4214        if (c != ' ') end = dst;
4215      }
4216    }
4217  }
4218
4219  *end = '\0';
4220
4221  /* For "z:", add "." to work around a bug in the C runtime library */
4222  if (colon == dst - 1) {
4223          path[2] = '.';
4224          path[3] = '\0';
4225  }
4226
4227  #ifdef DEBUG
4228    jio_fprintf(stderr, "sysNativePath: %s\n", path);
4229  #endif DEBUG
4230  return path;
4231}
4232
4233// This code is a copy of JDK's sysSetLength
4234// from src/windows/hpi/src/sys_api_md.c
4235
4236int os::ftruncate(int fd, jlong length) {
4237  HANDLE h = (HANDLE)::_get_osfhandle(fd);
4238  long high = (long)(length >> 32);
4239  DWORD ret;
4240
4241  if (h == (HANDLE)(-1)) {
4242    return -1;
4243  }
4244
4245  ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN);
4246  if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) {
4247      return -1;
4248  }
4249
4250  if (::SetEndOfFile(h) == FALSE) {
4251    return -1;
4252  }
4253
4254  return 0;
4255}
4256
4257
4258// This code is a copy of JDK's sysSync
4259// from src/windows/hpi/src/sys_api_md.c
4260// except for the legacy workaround for a bug in Win 98
4261
4262int os::fsync(int fd) {
4263  HANDLE handle = (HANDLE)::_get_osfhandle(fd);
4264
4265  if ( (!::FlushFileBuffers(handle)) &&
4266         (GetLastError() != ERROR_ACCESS_DENIED) ) {
4267    /* from winerror.h */
4268    return -1;
4269  }
4270  return 0;
4271}
4272
4273static int nonSeekAvailable(int, long *);
4274static int stdinAvailable(int, long *);
4275
4276#define S_ISCHR(mode)   (((mode) & _S_IFCHR) == _S_IFCHR)
4277#define S_ISFIFO(mode)  (((mode) & _S_IFIFO) == _S_IFIFO)
4278
4279// This code is a copy of JDK's sysAvailable
4280// from src/windows/hpi/src/sys_api_md.c
4281
4282int os::available(int fd, jlong *bytes) {
4283  jlong cur, end;
4284  struct _stati64 stbuf64;
4285
4286  if (::_fstati64(fd, &stbuf64) >= 0) {
4287    int mode = stbuf64.st_mode;
4288    if (S_ISCHR(mode) || S_ISFIFO(mode)) {
4289      int ret;
4290      long lpbytes;
4291      if (fd == 0) {
4292        ret = stdinAvailable(fd, &lpbytes);
4293      } else {
4294        ret = nonSeekAvailable(fd, &lpbytes);
4295      }
4296      (*bytes) = (jlong)(lpbytes);
4297      return ret;
4298    }
4299    if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) {
4300      return FALSE;
4301    } else if ((end = ::_lseeki64(fd, 0L, SEEK_END)) == -1) {
4302      return FALSE;
4303    } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) {
4304      return FALSE;
4305    }
4306    *bytes = end - cur;
4307    return TRUE;
4308  } else {
4309    return FALSE;
4310  }
4311}
4312
4313// This code is a copy of JDK's nonSeekAvailable
4314// from src/windows/hpi/src/sys_api_md.c
4315
4316static int nonSeekAvailable(int fd, long *pbytes) {
4317  /* This is used for available on non-seekable devices
4318    * (like both named and anonymous pipes, such as pipes
4319    *  connected to an exec'd process).
4320    * Standard Input is a special case.
4321    *
4322    */
4323  HANDLE han;
4324
4325  if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) {
4326    return FALSE;
4327  }
4328
4329  if (! ::PeekNamedPipe(han, NULL, 0, NULL, (LPDWORD)pbytes, NULL)) {
4330        /* PeekNamedPipe fails when at EOF.  In that case we
4331         * simply make *pbytes = 0 which is consistent with the
4332         * behavior we get on Solaris when an fd is at EOF.
4333         * The only alternative is to raise an Exception,
4334         * which isn't really warranted.
4335         */
4336    if (::GetLastError() != ERROR_BROKEN_PIPE) {
4337      return FALSE;
4338    }
4339    *pbytes = 0;
4340  }
4341  return TRUE;
4342}
4343
4344#define MAX_INPUT_EVENTS 2000
4345
4346// This code is a copy of JDK's stdinAvailable
4347// from src/windows/hpi/src/sys_api_md.c
4348
4349static int stdinAvailable(int fd, long *pbytes) {
4350  HANDLE han;
4351  DWORD numEventsRead = 0;      /* Number of events read from buffer */
4352  DWORD numEvents = 0;  /* Number of events in buffer */
4353  DWORD i = 0;          /* Loop index */
4354  DWORD curLength = 0;  /* Position marker */
4355  DWORD actualLength = 0;       /* Number of bytes readable */
4356  BOOL error = FALSE;         /* Error holder */
4357  INPUT_RECORD *lpBuffer;     /* Pointer to records of input events */
4358
4359  if ((han = ::GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) {
4360        return FALSE;
4361  }
4362
4363  /* Construct an array of input records in the console buffer */
4364  error = ::GetNumberOfConsoleInputEvents(han, &numEvents);
4365  if (error == 0) {
4366    return nonSeekAvailable(fd, pbytes);
4367  }
4368
4369  /* lpBuffer must fit into 64K or else PeekConsoleInput fails */
4370  if (numEvents > MAX_INPUT_EVENTS) {
4371    numEvents = MAX_INPUT_EVENTS;
4372  }
4373
4374  lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal);
4375  if (lpBuffer == NULL) {
4376    return FALSE;
4377  }
4378
4379  error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
4380  if (error == 0) {
4381    os::free(lpBuffer, mtInternal);
4382    return FALSE;
4383  }
4384
4385  /* Examine input records for the number of bytes available */
4386  for(i=0; i<numEvents; i++) {
4387    if (lpBuffer[i].EventType == KEY_EVENT) {
4388
4389      KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *)
4390                                      &(lpBuffer[i].Event);
4391      if (keyRecord->bKeyDown == TRUE) {
4392        CHAR *keyPressed = (CHAR *) &(keyRecord->uChar);
4393        curLength++;
4394        if (*keyPressed == '\r') {
4395          actualLength = curLength;
4396        }
4397      }
4398    }
4399  }
4400
4401  if(lpBuffer != NULL) {
4402    os::free(lpBuffer, mtInternal);
4403  }
4404
4405  *pbytes = (long) actualLength;
4406  return TRUE;
4407}
4408
4409// Map a block of memory.
4410char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
4411                     char *addr, size_t bytes, bool read_only,
4412                     bool allow_exec) {
4413  HANDLE hFile;
4414  char* base;
4415
4416  hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
4417                     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
4418  if (hFile == NULL) {
4419    if (PrintMiscellaneous && Verbose) {
4420      DWORD err = GetLastError();
4421      tty->print_cr("CreateFile() failed: GetLastError->%ld.", err);
4422    }
4423    return NULL;
4424  }
4425
4426  if (allow_exec) {
4427    // CreateFileMapping/MapViewOfFileEx can't map executable memory
4428    // unless it comes from a PE image (which the shared archive is not.)
4429    // Even VirtualProtect refuses to give execute access to mapped memory
4430    // that was not previously executable.
4431    //
4432    // Instead, stick the executable region in anonymous memory.  Yuck.
4433    // Penalty is that ~4 pages will not be shareable - in the future
4434    // we might consider DLLizing the shared archive with a proper PE
4435    // header so that mapping executable + sharing is possible.
4436
4437    base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE,
4438                                PAGE_READWRITE);
4439    if (base == NULL) {
4440      if (PrintMiscellaneous && Verbose) {
4441        DWORD err = GetLastError();
4442        tty->print_cr("VirtualAlloc() failed: GetLastError->%ld.", err);
4443      }
4444      CloseHandle(hFile);
4445      return NULL;
4446    }
4447
4448    DWORD bytes_read;
4449    OVERLAPPED overlapped;
4450    overlapped.Offset = (DWORD)file_offset;
4451    overlapped.OffsetHigh = 0;
4452    overlapped.hEvent = NULL;
4453    // ReadFile guarantees that if the return value is true, the requested
4454    // number of bytes were read before returning.
4455    bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0;
4456    if (!res) {
4457      if (PrintMiscellaneous && Verbose) {
4458        DWORD err = GetLastError();
4459        tty->print_cr("ReadFile() failed: GetLastError->%ld.", err);
4460      }
4461      release_memory(base, bytes);
4462      CloseHandle(hFile);
4463      return NULL;
4464    }
4465  } else {
4466    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0,
4467                                    NULL /*file_name*/);
4468    if (hMap == NULL) {
4469      if (PrintMiscellaneous && Verbose) {
4470        DWORD err = GetLastError();
4471        tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.", err);
4472      }
4473      CloseHandle(hFile);
4474      return NULL;
4475    }
4476
4477    DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY;
4478    base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset,
4479                                  (DWORD)bytes, addr);
4480    if (base == NULL) {
4481      if (PrintMiscellaneous && Verbose) {
4482        DWORD err = GetLastError();
4483        tty->print_cr("MapViewOfFileEx() failed: GetLastError->%ld.", err);
4484      }
4485      CloseHandle(hMap);
4486      CloseHandle(hFile);
4487      return NULL;
4488    }
4489
4490    if (CloseHandle(hMap) == 0) {
4491      if (PrintMiscellaneous && Verbose) {
4492        DWORD err = GetLastError();
4493        tty->print_cr("CloseHandle(hMap) failed: GetLastError->%ld.", err);
4494      }
4495      CloseHandle(hFile);
4496      return base;
4497    }
4498  }
4499
4500  if (allow_exec) {
4501    DWORD old_protect;
4502    DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE;
4503    bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0;
4504
4505    if (!res) {
4506      if (PrintMiscellaneous && Verbose) {
4507        DWORD err = GetLastError();
4508        tty->print_cr("VirtualProtect() failed: GetLastError->%ld.", err);
4509      }
4510      // Don't consider this a hard error, on IA32 even if the
4511      // VirtualProtect fails, we should still be able to execute
4512      CloseHandle(hFile);
4513      return base;
4514    }
4515  }
4516
4517  if (CloseHandle(hFile) == 0) {
4518    if (PrintMiscellaneous && Verbose) {
4519      DWORD err = GetLastError();
4520      tty->print_cr("CloseHandle(hFile) failed: GetLastError->%ld.", err);
4521    }
4522    return base;
4523  }
4524
4525  return base;
4526}
4527
4528
4529// Remap a block of memory.
4530char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
4531                       char *addr, size_t bytes, bool read_only,
4532                       bool allow_exec) {
4533  // This OS does not allow existing memory maps to be remapped so we
4534  // have to unmap the memory before we remap it.
4535  if (!os::unmap_memory(addr, bytes)) {
4536    return NULL;
4537  }
4538
4539  // There is a very small theoretical window between the unmap_memory()
4540  // call above and the map_memory() call below where a thread in native
4541  // code may be able to access an address that is no longer mapped.
4542
4543  return os::map_memory(fd, file_name, file_offset, addr, bytes,
4544           read_only, allow_exec);
4545}
4546
4547
4548// Unmap a block of memory.
4549// Returns true=success, otherwise false.
4550
4551bool os::pd_unmap_memory(char* addr, size_t bytes) {
4552  BOOL result = UnmapViewOfFile(addr);
4553  if (result == 0) {
4554    if (PrintMiscellaneous && Verbose) {
4555      DWORD err = GetLastError();
4556      tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err);
4557    }
4558    return false;
4559  }
4560  return true;
4561}
4562
4563void os::pause() {
4564  char filename[MAX_PATH];
4565  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4566    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
4567  } else {
4568    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4569  }
4570
4571  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4572  if (fd != -1) {
4573    struct stat buf;
4574    ::close(fd);
4575    while (::stat(filename, &buf) == 0) {
4576      Sleep(100);
4577    }
4578  } else {
4579    jio_fprintf(stderr,
4580      "Could not open pause file '%s', continuing immediately.\n", filename);
4581  }
4582}
4583
4584// An Event wraps a win32 "CreateEvent" kernel handle.
4585//
4586// We have a number of choices regarding "CreateEvent" win32 handle leakage:
4587//
4588// 1:  When a thread dies return the Event to the EventFreeList, clear the ParkHandle
4589//     field, and call CloseHandle() on the win32 event handle.  Unpark() would
4590//     need to be modified to tolerate finding a NULL (invalid) win32 event handle.
4591//     In addition, an unpark() operation might fetch the handle field, but the
4592//     event could recycle between the fetch and the SetEvent() operation.
4593//     SetEvent() would either fail because the handle was invalid, or inadvertently work,
4594//     as the win32 handle value had been recycled.  In an ideal world calling SetEvent()
4595//     on an stale but recycled handle would be harmless, but in practice this might
4596//     confuse other non-Sun code, so it's not a viable approach.
4597//
4598// 2:  Once a win32 event handle is associated with an Event, it remains associated
4599//     with the Event.  The event handle is never closed.  This could be construed
4600//     as handle leakage, but only up to the maximum # of threads that have been extant
4601//     at any one time.  This shouldn't be an issue, as windows platforms typically
4602//     permit a process to have hundreds of thousands of open handles.
4603//
4604// 3:  Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList
4605//     and release unused handles.
4606//
4607// 4:  Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle.
4608//     It's not clear, however, that we wouldn't be trading one type of leak for another.
4609//
4610// 5.  Use an RCU-like mechanism (Read-Copy Update).
4611//     Or perhaps something similar to Maged Michael's "Hazard pointers".
4612//
4613// We use (2).
4614//
4615// TODO-FIXME:
4616// 1.  Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation.
4617// 2.  Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks
4618//     to recover from (or at least detect) the dreaded Windows 841176 bug.
4619// 3.  Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent
4620//     into a single win32 CreateEvent() handle.
4621//
4622// _Event transitions in park()
4623//   -1 => -1 : illegal
4624//    1 =>  0 : pass - return immediately
4625//    0 => -1 : block
4626//
4627// _Event serves as a restricted-range semaphore :
4628//    -1 : thread is blocked
4629//     0 : neutral  - thread is running or ready
4630//     1 : signaled - thread is running or ready
4631//
4632// Another possible encoding of _Event would be
4633// with explicit "PARKED" and "SIGNALED" bits.
4634
4635int os::PlatformEvent::park (jlong Millis) {
4636    guarantee (_ParkHandle != NULL , "Invariant") ;
4637    guarantee (Millis > 0          , "Invariant") ;
4638    int v ;
4639
4640    // CONSIDER: defer assigning a CreateEvent() handle to the Event until
4641    // the initial park() operation.
4642
4643    for (;;) {
4644        v = _Event ;
4645        if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
4646    }
4647    guarantee ((v == 0) || (v == 1), "invariant") ;
4648    if (v != 0) return OS_OK ;
4649
4650    // Do this the hard way by blocking ...
4651    // TODO: consider a brief spin here, gated on the success of recent
4652    // spin attempts by this thread.
4653    //
4654    // We decompose long timeouts into series of shorter timed waits.
4655    // Evidently large timo values passed in WaitForSingleObject() are problematic on some
4656    // versions of Windows.  See EventWait() for details.  This may be superstition.  Or not.
4657    // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time
4658    // with os::javaTimeNanos().  Furthermore, we assume that spurious returns from
4659    // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend
4660    // to happen early in the wait interval.  Specifically, after a spurious wakeup (rv ==
4661    // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate
4662    // for the already waited time.  This policy does not admit any new outcomes.
4663    // In the future, however, we might want to track the accumulated wait time and
4664    // adjust Millis accordingly if we encounter a spurious wakeup.
4665
4666    const int MAXTIMEOUT = 0x10000000 ;
4667    DWORD rv = WAIT_TIMEOUT ;
4668    while (_Event < 0 && Millis > 0) {
4669       DWORD prd = Millis ;     // set prd = MAX (Millis, MAXTIMEOUT)
4670       if (Millis > MAXTIMEOUT) {
4671          prd = MAXTIMEOUT ;
4672       }
4673       rv = ::WaitForSingleObject (_ParkHandle, prd) ;
4674       assert (rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed") ;
4675       if (rv == WAIT_TIMEOUT) {
4676           Millis -= prd ;
4677       }
4678    }
4679    v = _Event ;
4680    _Event = 0 ;
4681    // see comment at end of os::PlatformEvent::park() below:
4682    OrderAccess::fence() ;
4683    // If we encounter a nearly simultanous timeout expiry and unpark()
4684    // we return OS_OK indicating we awoke via unpark().
4685    // Implementor's license -- returning OS_TIMEOUT would be equally valid, however.
4686    return (v >= 0) ? OS_OK : OS_TIMEOUT ;
4687}
4688
4689void os::PlatformEvent::park () {
4690    guarantee (_ParkHandle != NULL, "Invariant") ;
4691    // Invariant: Only the thread associated with the Event/PlatformEvent
4692    // may call park().
4693    int v ;
4694    for (;;) {
4695        v = _Event ;
4696        if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
4697    }
4698    guarantee ((v == 0) || (v == 1), "invariant") ;
4699    if (v != 0) return ;
4700
4701    // Do this the hard way by blocking ...
4702    // TODO: consider a brief spin here, gated on the success of recent
4703    // spin attempts by this thread.
4704    while (_Event < 0) {
4705       DWORD rv = ::WaitForSingleObject (_ParkHandle, INFINITE) ;
4706       assert (rv == WAIT_OBJECT_0, "WaitForSingleObject failed") ;
4707    }
4708
4709    // Usually we'll find _Event == 0 at this point, but as
4710    // an optional optimization we clear it, just in case can
4711    // multiple unpark() operations drove _Event up to 1.
4712    _Event = 0 ;
4713    OrderAccess::fence() ;
4714    guarantee (_Event >= 0, "invariant") ;
4715}
4716
4717void os::PlatformEvent::unpark() {
4718  guarantee (_ParkHandle != NULL, "Invariant") ;
4719
4720  // Transitions for _Event:
4721  //    0 :=> 1
4722  //    1 :=> 1
4723  //   -1 :=> either 0 or 1; must signal target thread
4724  //          That is, we can safely transition _Event from -1 to either
4725  //          0 or 1. Forcing 1 is slightly more efficient for back-to-back
4726  //          unpark() calls.
4727  // See also: "Semaphores in Plan 9" by Mullender & Cox
4728  //
4729  // Note: Forcing a transition from "-1" to "1" on an unpark() means
4730  // that it will take two back-to-back park() calls for the owning
4731  // thread to block. This has the benefit of forcing a spurious return
4732  // from the first park() call after an unpark() call which will help
4733  // shake out uses of park() and unpark() without condition variables.
4734
4735  if (Atomic::xchg(1, &_Event) >= 0) return;
4736
4737  ::SetEvent(_ParkHandle);
4738}
4739
4740
4741// JSR166
4742// -------------------------------------------------------
4743
4744/*
4745 * The Windows implementation of Park is very straightforward: Basic
4746 * operations on Win32 Events turn out to have the right semantics to
4747 * use them directly. We opportunistically resuse the event inherited
4748 * from Monitor.
4749 */
4750
4751
4752void Parker::park(bool isAbsolute, jlong time) {
4753  guarantee (_ParkEvent != NULL, "invariant") ;
4754  // First, demultiplex/decode time arguments
4755  if (time < 0) { // don't wait
4756    return;
4757  }
4758  else if (time == 0 && !isAbsolute) {
4759    time = INFINITE;
4760  }
4761  else if  (isAbsolute) {
4762    time -= os::javaTimeMillis(); // convert to relative time
4763    if (time <= 0) // already elapsed
4764      return;
4765  }
4766  else { // relative
4767    time /= 1000000; // Must coarsen from nanos to millis
4768    if (time == 0)   // Wait for the minimal time unit if zero
4769      time = 1;
4770  }
4771
4772  JavaThread* thread = (JavaThread*)(Thread::current());
4773  assert(thread->is_Java_thread(), "Must be JavaThread");
4774  JavaThread *jt = (JavaThread *)thread;
4775
4776  // Don't wait if interrupted or already triggered
4777  if (Thread::is_interrupted(thread, false) ||
4778    WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) {
4779    ResetEvent(_ParkEvent);
4780    return;
4781  }
4782  else {
4783    ThreadBlockInVM tbivm(jt);
4784    OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
4785    jt->set_suspend_equivalent();
4786
4787    WaitForSingleObject(_ParkEvent,  time);
4788    ResetEvent(_ParkEvent);
4789
4790    // If externally suspended while waiting, re-suspend
4791    if (jt->handle_special_suspend_equivalent_condition()) {
4792      jt->java_suspend_self();
4793    }
4794  }
4795}
4796
4797void Parker::unpark() {
4798  guarantee (_ParkEvent != NULL, "invariant") ;
4799  SetEvent(_ParkEvent);
4800}
4801
4802// Run the specified command in a separate process. Return its exit value,
4803// or -1 on failure (e.g. can't create a new process).
4804int os::fork_and_exec(char* cmd) {
4805  STARTUPINFO si;
4806  PROCESS_INFORMATION pi;
4807
4808  memset(&si, 0, sizeof(si));
4809  si.cb = sizeof(si);
4810  memset(&pi, 0, sizeof(pi));
4811  BOOL rslt = CreateProcess(NULL,   // executable name - use command line
4812                            cmd,    // command line
4813                            NULL,   // process security attribute
4814                            NULL,   // thread security attribute
4815                            TRUE,   // inherits system handles
4816                            0,      // no creation flags
4817                            NULL,   // use parent's environment block
4818                            NULL,   // use parent's starting directory
4819                            &si,    // (in) startup information
4820                            &pi);   // (out) process information
4821
4822  if (rslt) {
4823    // Wait until child process exits.
4824    WaitForSingleObject(pi.hProcess, INFINITE);
4825
4826    DWORD exit_code;
4827    GetExitCodeProcess(pi.hProcess, &exit_code);
4828
4829    // Close process and thread handles.
4830    CloseHandle(pi.hProcess);
4831    CloseHandle(pi.hThread);
4832
4833    return (int)exit_code;
4834  } else {
4835    return -1;
4836  }
4837}
4838
4839//--------------------------------------------------------------------------------------------------
4840// Non-product code
4841
4842static int mallocDebugIntervalCounter = 0;
4843static int mallocDebugCounter = 0;
4844bool os::check_heap(bool force) {
4845  if (++mallocDebugCounter < MallocVerifyStart && !force) return true;
4846  if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) {
4847    // Note: HeapValidate executes two hardware breakpoints when it finds something
4848    // wrong; at these points, eax contains the address of the offending block (I think).
4849    // To get to the exlicit error message(s) below, just continue twice.
4850    HANDLE heap = GetProcessHeap();
4851    { HeapLock(heap);
4852      PROCESS_HEAP_ENTRY phe;
4853      phe.lpData = NULL;
4854      while (HeapWalk(heap, &phe) != 0) {
4855        if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) &&
4856            !HeapValidate(heap, 0, phe.lpData)) {
4857          tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter);
4858          tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData);
4859          fatal("corrupted C heap");
4860        }
4861      }
4862      DWORD err = GetLastError();
4863      if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) {
4864        fatal(err_msg("heap walk aborted with error %d", err));
4865      }
4866      HeapUnlock(heap);
4867    }
4868    mallocDebugIntervalCounter = 0;
4869  }
4870  return true;
4871}
4872
4873
4874bool os::find(address addr, outputStream* st) {
4875  // Nothing yet
4876  return false;
4877}
4878
4879LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) {
4880  DWORD exception_code = e->ExceptionRecord->ExceptionCode;
4881
4882  if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
4883    JavaThread* thread = (JavaThread*)ThreadLocalStorage::get_thread_slow();
4884    PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord;
4885    address addr = (address) exceptionRecord->ExceptionInformation[1];
4886
4887    if (os::is_memory_serialize_page(thread, addr))
4888      return EXCEPTION_CONTINUE_EXECUTION;
4889  }
4890
4891  return EXCEPTION_CONTINUE_SEARCH;
4892}
4893
4894// We don't build a headless jre for Windows
4895bool os::is_headless_jre() { return false; }
4896
4897
4898typedef CRITICAL_SECTION mutex_t;
4899#define mutexInit(m)    InitializeCriticalSection(m)
4900#define mutexDestroy(m) DeleteCriticalSection(m)
4901#define mutexLock(m)    EnterCriticalSection(m)
4902#define mutexUnlock(m)  LeaveCriticalSection(m)
4903
4904static bool sock_initialized = FALSE;
4905static mutex_t sockFnTableMutex;
4906
4907static void initSock() {
4908  WSADATA wsadata;
4909
4910  if (!os::WinSock2Dll::WinSock2Available()) {
4911    jio_fprintf(stderr, "Could not load Winsock 2 (error: %d)\n",
4912      ::GetLastError());
4913    return;
4914  }
4915  if (sock_initialized == TRUE) return;
4916
4917  ::mutexInit(&sockFnTableMutex);
4918  ::mutexLock(&sockFnTableMutex);
4919  if (os::WinSock2Dll::WSAStartup(MAKEWORD(1,1), &wsadata) != 0) {
4920      jio_fprintf(stderr, "Could not initialize Winsock\n");
4921  }
4922  sock_initialized = TRUE;
4923  ::mutexUnlock(&sockFnTableMutex);
4924}
4925
4926struct hostent* os::get_host_by_name(char* name) {
4927  if (!sock_initialized) {
4928    initSock();
4929  }
4930  if (!os::WinSock2Dll::WinSock2Available()) {
4931    return NULL;
4932  }
4933  return (struct hostent*)os::WinSock2Dll::gethostbyname(name);
4934}
4935
4936int os::socket_close(int fd) {
4937  return ::closesocket(fd);
4938}
4939
4940int os::socket_available(int fd, jint *pbytes) {
4941  int ret = ::ioctlsocket(fd, FIONREAD, (u_long*)pbytes);
4942  return (ret < 0) ? 0 : 1;
4943}
4944
4945int os::socket(int domain, int type, int protocol) {
4946  return ::socket(domain, type, protocol);
4947}
4948
4949int os::listen(int fd, int count) {
4950  return ::listen(fd, count);
4951}
4952
4953int os::connect(int fd, struct sockaddr* him, socklen_t len) {
4954  return ::connect(fd, him, len);
4955}
4956
4957int os::accept(int fd, struct sockaddr* him, socklen_t* len) {
4958  return ::accept(fd, him, len);
4959}
4960
4961int os::sendto(int fd, char* buf, size_t len, uint flags,
4962               struct sockaddr* to, socklen_t tolen) {
4963
4964  return ::sendto(fd, buf, (int)len, flags, to, tolen);
4965}
4966
4967int os::recvfrom(int fd, char *buf, size_t nBytes, uint flags,
4968                 sockaddr* from, socklen_t* fromlen) {
4969
4970  return ::recvfrom(fd, buf, (int)nBytes, flags, from, fromlen);
4971}
4972
4973int os::recv(int fd, char* buf, size_t nBytes, uint flags) {
4974  return ::recv(fd, buf, (int)nBytes, flags);
4975}
4976
4977int os::send(int fd, char* buf, size_t nBytes, uint flags) {
4978  return ::send(fd, buf, (int)nBytes, flags);
4979}
4980
4981int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) {
4982  return ::send(fd, buf, (int)nBytes, flags);
4983}
4984
4985int os::timeout(int fd, long timeout) {
4986  fd_set tbl;
4987  struct timeval t;
4988
4989  t.tv_sec  = timeout / 1000;
4990  t.tv_usec = (timeout % 1000) * 1000;
4991
4992  tbl.fd_count    = 1;
4993  tbl.fd_array[0] = fd;
4994
4995  return ::select(1, &tbl, 0, 0, &t);
4996}
4997
4998int os::get_host_name(char* name, int namelen) {
4999  return ::gethostname(name, namelen);
5000}
5001
5002int os::socket_shutdown(int fd, int howto) {
5003  return ::shutdown(fd, howto);
5004}
5005
5006int os::bind(int fd, struct sockaddr* him, socklen_t len) {
5007  return ::bind(fd, him, len);
5008}
5009
5010int os::get_sock_name(int fd, struct sockaddr* him, socklen_t* len) {
5011  return ::getsockname(fd, him, len);
5012}
5013
5014int os::get_sock_opt(int fd, int level, int optname,
5015                     char* optval, socklen_t* optlen) {
5016  return ::getsockopt(fd, level, optname, optval, optlen);
5017}
5018
5019int os::set_sock_opt(int fd, int level, int optname,
5020                     const char* optval, socklen_t optlen) {
5021  return ::setsockopt(fd, level, optname, optval, optlen);
5022}
5023
5024
5025// Kernel32 API
5026typedef SIZE_T (WINAPI* GetLargePageMinimum_Fn)(void);
5027typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
5028typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG);
5029typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG);
5030typedef USHORT (WINAPI* RtlCaptureStackBackTrace_Fn)(ULONG, ULONG, PVOID*, PULONG);
5031
5032GetLargePageMinimum_Fn      os::Kernel32Dll::_GetLargePageMinimum = NULL;
5033VirtualAllocExNuma_Fn       os::Kernel32Dll::_VirtualAllocExNuma = NULL;
5034GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL;
5035GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL;
5036RtlCaptureStackBackTrace_Fn os::Kernel32Dll::_RtlCaptureStackBackTrace = NULL;
5037
5038
5039BOOL                        os::Kernel32Dll::initialized = FALSE;
5040SIZE_T os::Kernel32Dll::GetLargePageMinimum() {
5041  assert(initialized && _GetLargePageMinimum != NULL,
5042    "GetLargePageMinimumAvailable() not yet called");
5043  return _GetLargePageMinimum();
5044}
5045
5046BOOL os::Kernel32Dll::GetLargePageMinimumAvailable() {
5047  if (!initialized) {
5048    initialize();
5049  }
5050  return _GetLargePageMinimum != NULL;
5051}
5052
5053BOOL os::Kernel32Dll::NumaCallsAvailable() {
5054  if (!initialized) {
5055    initialize();
5056  }
5057  return _VirtualAllocExNuma != NULL;
5058}
5059
5060LPVOID os::Kernel32Dll::VirtualAllocExNuma(HANDLE hProc, LPVOID addr, SIZE_T bytes, DWORD flags, DWORD prot, DWORD node) {
5061  assert(initialized && _VirtualAllocExNuma != NULL,
5062    "NUMACallsAvailable() not yet called");
5063
5064  return _VirtualAllocExNuma(hProc, addr, bytes, flags, prot, node);
5065}
5066
5067BOOL os::Kernel32Dll::GetNumaHighestNodeNumber(PULONG ptr_highest_node_number) {
5068  assert(initialized && _GetNumaHighestNodeNumber != NULL,
5069    "NUMACallsAvailable() not yet called");
5070
5071  return _GetNumaHighestNodeNumber(ptr_highest_node_number);
5072}
5073
5074BOOL os::Kernel32Dll::GetNumaNodeProcessorMask(UCHAR node, PULONGLONG proc_mask) {
5075  assert(initialized && _GetNumaNodeProcessorMask != NULL,
5076    "NUMACallsAvailable() not yet called");
5077
5078  return _GetNumaNodeProcessorMask(node, proc_mask);
5079}
5080
5081USHORT os::Kernel32Dll::RtlCaptureStackBackTrace(ULONG FrameToSkip,
5082  ULONG FrameToCapture, PVOID* BackTrace, PULONG BackTraceHash) {
5083    if (!initialized) {
5084      initialize();
5085    }
5086
5087    if (_RtlCaptureStackBackTrace != NULL) {
5088      return _RtlCaptureStackBackTrace(FrameToSkip, FrameToCapture,
5089        BackTrace, BackTraceHash);
5090    } else {
5091      return 0;
5092    }
5093}
5094
5095void os::Kernel32Dll::initializeCommon() {
5096  if (!initialized) {
5097    HMODULE handle = ::GetModuleHandle("Kernel32.dll");
5098    assert(handle != NULL, "Just check");
5099    _GetLargePageMinimum = (GetLargePageMinimum_Fn)::GetProcAddress(handle, "GetLargePageMinimum");
5100    _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma");
5101    _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber");
5102    _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask");
5103    _RtlCaptureStackBackTrace = (RtlCaptureStackBackTrace_Fn)::GetProcAddress(handle, "RtlCaptureStackBackTrace");
5104    initialized = TRUE;
5105  }
5106}
5107
5108
5109
5110#ifndef JDK6_OR_EARLIER
5111
5112void os::Kernel32Dll::initialize() {
5113  initializeCommon();
5114}
5115
5116
5117// Kernel32 API
5118inline BOOL os::Kernel32Dll::SwitchToThread() {
5119  return ::SwitchToThread();
5120}
5121
5122inline BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
5123  return true;
5124}
5125
5126  // Help tools
5127inline BOOL os::Kernel32Dll::HelpToolsAvailable() {
5128  return true;
5129}
5130
5131inline HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
5132  return ::CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
5133}
5134
5135inline BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5136  return ::Module32First(hSnapshot, lpme);
5137}
5138
5139inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5140  return ::Module32Next(hSnapshot, lpme);
5141}
5142
5143
5144inline BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
5145  return true;
5146}
5147
5148inline void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
5149  ::GetNativeSystemInfo(lpSystemInfo);
5150}
5151
5152// PSAPI API
5153inline BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
5154  return ::EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
5155}
5156
5157inline DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
5158  return ::GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
5159}
5160
5161inline BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
5162  return ::GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
5163}
5164
5165inline BOOL os::PSApiDll::PSApiAvailable() {
5166  return true;
5167}
5168
5169
5170// WinSock2 API
5171inline BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
5172  return ::WSAStartup(wVersionRequested, lpWSAData);
5173}
5174
5175inline struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
5176  return ::gethostbyname(name);
5177}
5178
5179inline BOOL os::WinSock2Dll::WinSock2Available() {
5180  return true;
5181}
5182
5183// Advapi API
5184inline BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
5185   BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
5186   PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
5187     return ::AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
5188       BufferLength, PreviousState, ReturnLength);
5189}
5190
5191inline BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
5192  PHANDLE TokenHandle) {
5193    return ::OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
5194}
5195
5196inline BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
5197  return ::LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
5198}
5199
5200inline BOOL os::Advapi32Dll::AdvapiAvailable() {
5201  return true;
5202}
5203
5204#else
5205// Kernel32 API
5206typedef BOOL (WINAPI* SwitchToThread_Fn)(void);
5207typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD);
5208typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32);
5209typedef BOOL (WINAPI* Module32Next_Fn)(HANDLE,LPMODULEENTRY32);
5210typedef void (WINAPI* GetNativeSystemInfo_Fn)(LPSYSTEM_INFO);
5211
5212SwitchToThread_Fn           os::Kernel32Dll::_SwitchToThread = NULL;
5213CreateToolhelp32Snapshot_Fn os::Kernel32Dll::_CreateToolhelp32Snapshot = NULL;
5214Module32First_Fn            os::Kernel32Dll::_Module32First = NULL;
5215Module32Next_Fn             os::Kernel32Dll::_Module32Next = NULL;
5216GetNativeSystemInfo_Fn      os::Kernel32Dll::_GetNativeSystemInfo = NULL;
5217
5218void os::Kernel32Dll::initialize() {
5219  if (!initialized) {
5220    HMODULE handle = ::GetModuleHandle("Kernel32.dll");
5221    assert(handle != NULL, "Just check");
5222
5223    _SwitchToThread = (SwitchToThread_Fn)::GetProcAddress(handle, "SwitchToThread");
5224    _CreateToolhelp32Snapshot = (CreateToolhelp32Snapshot_Fn)
5225      ::GetProcAddress(handle, "CreateToolhelp32Snapshot");
5226    _Module32First = (Module32First_Fn)::GetProcAddress(handle, "Module32First");
5227    _Module32Next = (Module32Next_Fn)::GetProcAddress(handle, "Module32Next");
5228    _GetNativeSystemInfo = (GetNativeSystemInfo_Fn)::GetProcAddress(handle, "GetNativeSystemInfo");
5229    initializeCommon();  // resolve the functions that always need resolving
5230
5231    initialized = TRUE;
5232  }
5233}
5234
5235BOOL os::Kernel32Dll::SwitchToThread() {
5236  assert(initialized && _SwitchToThread != NULL,
5237    "SwitchToThreadAvailable() not yet called");
5238  return _SwitchToThread();
5239}
5240
5241
5242BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
5243  if (!initialized) {
5244    initialize();
5245  }
5246  return _SwitchToThread != NULL;
5247}
5248
5249// Help tools
5250BOOL os::Kernel32Dll::HelpToolsAvailable() {
5251  if (!initialized) {
5252    initialize();
5253  }
5254  return _CreateToolhelp32Snapshot != NULL &&
5255         _Module32First != NULL &&
5256         _Module32Next != NULL;
5257}
5258
5259HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
5260  assert(initialized && _CreateToolhelp32Snapshot != NULL,
5261    "HelpToolsAvailable() not yet called");
5262
5263  return _CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
5264}
5265
5266BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5267  assert(initialized && _Module32First != NULL,
5268    "HelpToolsAvailable() not yet called");
5269
5270  return _Module32First(hSnapshot, lpme);
5271}
5272
5273inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5274  assert(initialized && _Module32Next != NULL,
5275    "HelpToolsAvailable() not yet called");
5276
5277  return _Module32Next(hSnapshot, lpme);
5278}
5279
5280
5281BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
5282  if (!initialized) {
5283    initialize();
5284  }
5285  return _GetNativeSystemInfo != NULL;
5286}
5287
5288void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
5289  assert(initialized && _GetNativeSystemInfo != NULL,
5290    "GetNativeSystemInfoAvailable() not yet called");
5291
5292  _GetNativeSystemInfo(lpSystemInfo);
5293}
5294
5295// PSAPI API
5296
5297
5298typedef BOOL (WINAPI *EnumProcessModules_Fn)(HANDLE, HMODULE *, DWORD, LPDWORD);
5299typedef BOOL (WINAPI *GetModuleFileNameEx_Fn)(HANDLE, HMODULE, LPTSTR, DWORD);;
5300typedef BOOL (WINAPI *GetModuleInformation_Fn)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
5301
5302EnumProcessModules_Fn   os::PSApiDll::_EnumProcessModules = NULL;
5303GetModuleFileNameEx_Fn  os::PSApiDll::_GetModuleFileNameEx = NULL;
5304GetModuleInformation_Fn os::PSApiDll::_GetModuleInformation = NULL;
5305BOOL                    os::PSApiDll::initialized = FALSE;
5306
5307void os::PSApiDll::initialize() {
5308  if (!initialized) {
5309    HMODULE handle = os::win32::load_Windows_dll("PSAPI.DLL", NULL, 0);
5310    if (handle != NULL) {
5311      _EnumProcessModules = (EnumProcessModules_Fn)::GetProcAddress(handle,
5312        "EnumProcessModules");
5313      _GetModuleFileNameEx = (GetModuleFileNameEx_Fn)::GetProcAddress(handle,
5314        "GetModuleFileNameExA");
5315      _GetModuleInformation = (GetModuleInformation_Fn)::GetProcAddress(handle,
5316        "GetModuleInformation");
5317    }
5318    initialized = TRUE;
5319  }
5320}
5321
5322
5323
5324BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
5325  assert(initialized && _EnumProcessModules != NULL,
5326    "PSApiAvailable() not yet called");
5327  return _EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
5328}
5329
5330DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
5331  assert(initialized && _GetModuleFileNameEx != NULL,
5332    "PSApiAvailable() not yet called");
5333  return _GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
5334}
5335
5336BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
5337  assert(initialized && _GetModuleInformation != NULL,
5338    "PSApiAvailable() not yet called");
5339  return _GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
5340}
5341
5342BOOL os::PSApiDll::PSApiAvailable() {
5343  if (!initialized) {
5344    initialize();
5345  }
5346  return _EnumProcessModules != NULL &&
5347    _GetModuleFileNameEx != NULL &&
5348    _GetModuleInformation != NULL;
5349}
5350
5351
5352// WinSock2 API
5353typedef int (PASCAL FAR* WSAStartup_Fn)(WORD, LPWSADATA);
5354typedef struct hostent *(PASCAL FAR *gethostbyname_Fn)(...);
5355
5356WSAStartup_Fn    os::WinSock2Dll::_WSAStartup = NULL;
5357gethostbyname_Fn os::WinSock2Dll::_gethostbyname = NULL;
5358BOOL             os::WinSock2Dll::initialized = FALSE;
5359
5360void os::WinSock2Dll::initialize() {
5361  if (!initialized) {
5362    HMODULE handle = os::win32::load_Windows_dll("ws2_32.dll", NULL, 0);
5363    if (handle != NULL) {
5364      _WSAStartup = (WSAStartup_Fn)::GetProcAddress(handle, "WSAStartup");
5365      _gethostbyname = (gethostbyname_Fn)::GetProcAddress(handle, "gethostbyname");
5366    }
5367    initialized = TRUE;
5368  }
5369}
5370
5371
5372BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
5373  assert(initialized && _WSAStartup != NULL,
5374    "WinSock2Available() not yet called");
5375  return _WSAStartup(wVersionRequested, lpWSAData);
5376}
5377
5378struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
5379  assert(initialized && _gethostbyname != NULL,
5380    "WinSock2Available() not yet called");
5381  return _gethostbyname(name);
5382}
5383
5384BOOL os::WinSock2Dll::WinSock2Available() {
5385  if (!initialized) {
5386    initialize();
5387  }
5388  return _WSAStartup != NULL &&
5389    _gethostbyname != NULL;
5390}
5391
5392typedef BOOL (WINAPI *AdjustTokenPrivileges_Fn)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
5393typedef BOOL (WINAPI *OpenProcessToken_Fn)(HANDLE, DWORD, PHANDLE);
5394typedef BOOL (WINAPI *LookupPrivilegeValue_Fn)(LPCTSTR, LPCTSTR, PLUID);
5395
5396AdjustTokenPrivileges_Fn os::Advapi32Dll::_AdjustTokenPrivileges = NULL;
5397OpenProcessToken_Fn      os::Advapi32Dll::_OpenProcessToken = NULL;
5398LookupPrivilegeValue_Fn  os::Advapi32Dll::_LookupPrivilegeValue = NULL;
5399BOOL                     os::Advapi32Dll::initialized = FALSE;
5400
5401void os::Advapi32Dll::initialize() {
5402  if (!initialized) {
5403    HMODULE handle = os::win32::load_Windows_dll("advapi32.dll", NULL, 0);
5404    if (handle != NULL) {
5405      _AdjustTokenPrivileges = (AdjustTokenPrivileges_Fn)::GetProcAddress(handle,
5406        "AdjustTokenPrivileges");
5407      _OpenProcessToken = (OpenProcessToken_Fn)::GetProcAddress(handle,
5408        "OpenProcessToken");
5409      _LookupPrivilegeValue = (LookupPrivilegeValue_Fn)::GetProcAddress(handle,
5410        "LookupPrivilegeValueA");
5411    }
5412    initialized = TRUE;
5413  }
5414}
5415
5416BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
5417   BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
5418   PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
5419   assert(initialized && _AdjustTokenPrivileges != NULL,
5420     "AdvapiAvailable() not yet called");
5421   return _AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
5422       BufferLength, PreviousState, ReturnLength);
5423}
5424
5425BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
5426  PHANDLE TokenHandle) {
5427   assert(initialized && _OpenProcessToken != NULL,
5428     "AdvapiAvailable() not yet called");
5429    return _OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
5430}
5431
5432BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
5433   assert(initialized && _LookupPrivilegeValue != NULL,
5434     "AdvapiAvailable() not yet called");
5435  return _LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
5436}
5437
5438BOOL os::Advapi32Dll::AdvapiAvailable() {
5439  if (!initialized) {
5440    initialize();
5441  }
5442  return _AdjustTokenPrivileges != NULL &&
5443    _OpenProcessToken != NULL &&
5444    _LookupPrivilegeValue != NULL;
5445}
5446
5447#endif
5448