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