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