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