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