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