os_windows.cpp revision 6760:22b98ab2a69f
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
3519os::YieldResult os::NakedYield() {
3520  // Use either SwitchToThread() or Sleep(0)
3521  // Consider passing back the return value from SwitchToThread().
3522  if (os::Kernel32Dll::SwitchToThreadAvailable()) {
3523    return SwitchToThread() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY;
3524  } else {
3525    Sleep(0);
3526  }
3527  return os::YIELD_UNKNOWN;
3528}
3529
3530void os::yield() {  os::NakedYield(); }
3531
3532// Win32 only gives you access to seven real priorities at a time,
3533// so we compress Java's ten down to seven.  It would be better
3534// if we dynamically adjusted relative priorities.
3535
3536int os::java_to_os_priority[CriticalPriority + 1] = {
3537  THREAD_PRIORITY_IDLE,                         // 0  Entry should never be used
3538  THREAD_PRIORITY_LOWEST,                       // 1  MinPriority
3539  THREAD_PRIORITY_LOWEST,                       // 2
3540  THREAD_PRIORITY_BELOW_NORMAL,                 // 3
3541  THREAD_PRIORITY_BELOW_NORMAL,                 // 4
3542  THREAD_PRIORITY_NORMAL,                       // 5  NormPriority
3543  THREAD_PRIORITY_NORMAL,                       // 6
3544  THREAD_PRIORITY_ABOVE_NORMAL,                 // 7
3545  THREAD_PRIORITY_ABOVE_NORMAL,                 // 8
3546  THREAD_PRIORITY_HIGHEST,                      // 9  NearMaxPriority
3547  THREAD_PRIORITY_HIGHEST,                      // 10 MaxPriority
3548  THREAD_PRIORITY_HIGHEST                       // 11 CriticalPriority
3549};
3550
3551int prio_policy1[CriticalPriority + 1] = {
3552  THREAD_PRIORITY_IDLE,                         // 0  Entry should never be used
3553  THREAD_PRIORITY_LOWEST,                       // 1  MinPriority
3554  THREAD_PRIORITY_LOWEST,                       // 2
3555  THREAD_PRIORITY_BELOW_NORMAL,                 // 3
3556  THREAD_PRIORITY_BELOW_NORMAL,                 // 4
3557  THREAD_PRIORITY_NORMAL,                       // 5  NormPriority
3558  THREAD_PRIORITY_ABOVE_NORMAL,                 // 6
3559  THREAD_PRIORITY_ABOVE_NORMAL,                 // 7
3560  THREAD_PRIORITY_HIGHEST,                      // 8
3561  THREAD_PRIORITY_HIGHEST,                      // 9  NearMaxPriority
3562  THREAD_PRIORITY_TIME_CRITICAL,                // 10 MaxPriority
3563  THREAD_PRIORITY_TIME_CRITICAL                 // 11 CriticalPriority
3564};
3565
3566static int prio_init() {
3567  // If ThreadPriorityPolicy is 1, switch tables
3568  if (ThreadPriorityPolicy == 1) {
3569    int i;
3570    for (i = 0; i < CriticalPriority + 1; i++) {
3571      os::java_to_os_priority[i] = prio_policy1[i];
3572    }
3573  }
3574  if (UseCriticalJavaThreadPriority) {
3575    os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority];
3576  }
3577  return 0;
3578}
3579
3580OSReturn os::set_native_priority(Thread* thread, int priority) {
3581  if (!UseThreadPriorities) return OS_OK;
3582  bool ret = SetThreadPriority(thread->osthread()->thread_handle(), priority) != 0;
3583  return ret ? OS_OK : OS_ERR;
3584}
3585
3586OSReturn os::get_native_priority(const Thread* const thread, int* priority_ptr) {
3587  if (!UseThreadPriorities) {
3588    *priority_ptr = java_to_os_priority[NormPriority];
3589    return OS_OK;
3590  }
3591  int os_prio = GetThreadPriority(thread->osthread()->thread_handle());
3592  if (os_prio == THREAD_PRIORITY_ERROR_RETURN) {
3593    assert(false, "GetThreadPriority failed");
3594    return OS_ERR;
3595  }
3596  *priority_ptr = os_prio;
3597  return OS_OK;
3598}
3599
3600
3601// Hint to the underlying OS that a task switch would not be good.
3602// Void return because it's a hint and can fail.
3603void os::hint_no_preempt() {}
3604
3605void os::interrupt(Thread* thread) {
3606  assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
3607         "possibility of dangling Thread pointer");
3608
3609  OSThread* osthread = thread->osthread();
3610  osthread->set_interrupted(true);
3611  // More than one thread can get here with the same value of osthread,
3612  // resulting in multiple notifications.  We do, however, want the store
3613  // to interrupted() to be visible to other threads before we post
3614  // the interrupt event.
3615  OrderAccess::release();
3616  SetEvent(osthread->interrupt_event());
3617  // For JSR166:  unpark after setting status
3618  if (thread->is_Java_thread())
3619    ((JavaThread*)thread)->parker()->unpark();
3620
3621  ParkEvent * ev = thread->_ParkEvent;
3622  if (ev != NULL) ev->unpark();
3623
3624}
3625
3626
3627bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
3628  assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
3629         "possibility of dangling Thread pointer");
3630
3631  OSThread* osthread = thread->osthread();
3632  // There is no synchronization between the setting of the interrupt
3633  // and it being cleared here. It is critical - see 6535709 - that
3634  // we only clear the interrupt state, and reset the interrupt event,
3635  // if we are going to report that we were indeed interrupted - else
3636  // an interrupt can be "lost", leading to spurious wakeups or lost wakeups
3637  // depending on the timing. By checking thread interrupt event to see
3638  // if the thread gets real interrupt thus prevent spurious wakeup.
3639  bool interrupted = osthread->interrupted() && (WaitForSingleObject(osthread->interrupt_event(), 0) == WAIT_OBJECT_0);
3640  if (interrupted && clear_interrupted) {
3641    osthread->set_interrupted(false);
3642    ResetEvent(osthread->interrupt_event());
3643  } // Otherwise leave the interrupted state alone
3644
3645  return interrupted;
3646}
3647
3648// Get's a pc (hint) for a running thread. Currently used only for profiling.
3649ExtendedPC os::get_thread_pc(Thread* thread) {
3650  CONTEXT context;
3651  context.ContextFlags = CONTEXT_CONTROL;
3652  HANDLE handle = thread->osthread()->thread_handle();
3653#ifdef _M_IA64
3654  assert(0, "Fix get_thread_pc");
3655  return ExtendedPC(NULL);
3656#else
3657  if (GetThreadContext(handle, &context)) {
3658#ifdef _M_AMD64
3659    return ExtendedPC((address) context.Rip);
3660#else
3661    return ExtendedPC((address) context.Eip);
3662#endif
3663  } else {
3664    return ExtendedPC(NULL);
3665  }
3666#endif
3667}
3668
3669// GetCurrentThreadId() returns DWORD
3670intx os::current_thread_id()          { return GetCurrentThreadId(); }
3671
3672static int _initial_pid = 0;
3673
3674int os::current_process_id()
3675{
3676  return (_initial_pid ? _initial_pid : _getpid());
3677}
3678
3679int    os::win32::_vm_page_size       = 0;
3680int    os::win32::_vm_allocation_granularity = 0;
3681int    os::win32::_processor_type     = 0;
3682// Processor level is not available on non-NT systems, use vm_version instead
3683int    os::win32::_processor_level    = 0;
3684julong os::win32::_physical_memory    = 0;
3685size_t os::win32::_default_stack_size = 0;
3686
3687         intx os::win32::_os_thread_limit    = 0;
3688volatile intx os::win32::_os_thread_count    = 0;
3689
3690bool   os::win32::_is_nt              = false;
3691bool   os::win32::_is_windows_2003    = false;
3692bool   os::win32::_is_windows_server  = false;
3693
3694bool   os::win32::_has_performance_count = 0;
3695
3696void os::win32::initialize_system_info() {
3697  SYSTEM_INFO si;
3698  GetSystemInfo(&si);
3699  _vm_page_size    = si.dwPageSize;
3700  _vm_allocation_granularity = si.dwAllocationGranularity;
3701  _processor_type  = si.dwProcessorType;
3702  _processor_level = si.wProcessorLevel;
3703  set_processor_count(si.dwNumberOfProcessors);
3704
3705  MEMORYSTATUSEX ms;
3706  ms.dwLength = sizeof(ms);
3707
3708  // also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual,
3709  // dwMemoryLoad (% of memory in use)
3710  GlobalMemoryStatusEx(&ms);
3711  _physical_memory = ms.ullTotalPhys;
3712
3713  OSVERSIONINFOEX oi;
3714  oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
3715  GetVersionEx((OSVERSIONINFO*)&oi);
3716  switch (oi.dwPlatformId) {
3717    case VER_PLATFORM_WIN32_WINDOWS: _is_nt = false; break;
3718    case VER_PLATFORM_WIN32_NT:
3719      _is_nt = true;
3720      {
3721        int os_vers = oi.dwMajorVersion * 1000 + oi.dwMinorVersion;
3722        if (os_vers == 5002) {
3723          _is_windows_2003 = true;
3724        }
3725        if (oi.wProductType == VER_NT_DOMAIN_CONTROLLER ||
3726          oi.wProductType == VER_NT_SERVER) {
3727            _is_windows_server = true;
3728        }
3729      }
3730      break;
3731    default: fatal("Unknown platform");
3732  }
3733
3734  _default_stack_size = os::current_stack_size();
3735  assert(_default_stack_size > (size_t) _vm_page_size, "invalid stack size");
3736  assert((_default_stack_size & (_vm_page_size - 1)) == 0,
3737    "stack size not a multiple of page size");
3738
3739  initialize_performance_counter();
3740
3741  // Win95/Win98 scheduler bug work-around. The Win95/98 scheduler is
3742  // known to deadlock the system, if the VM issues to thread operations with
3743  // a too high frequency, e.g., such as changing the priorities.
3744  // The 6000 seems to work well - no deadlocks has been notices on the test
3745  // programs that we have seen experience this problem.
3746  if (!os::win32::is_nt()) {
3747    StarvationMonitorInterval = 6000;
3748  }
3749}
3750
3751
3752HINSTANCE os::win32::load_Windows_dll(const char* name, char *ebuf, int ebuflen) {
3753  char path[MAX_PATH];
3754  DWORD size;
3755  DWORD pathLen = (DWORD)sizeof(path);
3756  HINSTANCE result = NULL;
3757
3758  // only allow library name without path component
3759  assert(strchr(name, '\\') == NULL, "path not allowed");
3760  assert(strchr(name, ':') == NULL, "path not allowed");
3761  if (strchr(name, '\\') != NULL || strchr(name, ':') != NULL) {
3762    jio_snprintf(ebuf, ebuflen,
3763      "Invalid parameter while calling os::win32::load_windows_dll(): cannot take path: %s", name);
3764    return NULL;
3765  }
3766
3767  // search system directory
3768  if ((size = GetSystemDirectory(path, pathLen)) > 0) {
3769    strcat(path, "\\");
3770    strcat(path, name);
3771    if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
3772      return result;
3773    }
3774  }
3775
3776  // try Windows directory
3777  if ((size = GetWindowsDirectory(path, pathLen)) > 0) {
3778    strcat(path, "\\");
3779    strcat(path, name);
3780    if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
3781      return result;
3782    }
3783  }
3784
3785  jio_snprintf(ebuf, ebuflen,
3786    "os::win32::load_windows_dll() cannot load %s from system directories.", name);
3787  return NULL;
3788}
3789
3790void os::win32::setmode_streams() {
3791  _setmode(_fileno(stdin), _O_BINARY);
3792  _setmode(_fileno(stdout), _O_BINARY);
3793  _setmode(_fileno(stderr), _O_BINARY);
3794}
3795
3796
3797bool os::is_debugger_attached() {
3798  return IsDebuggerPresent() ? true : false;
3799}
3800
3801
3802void os::wait_for_keypress_at_exit(void) {
3803  if (PauseAtExit) {
3804    fprintf(stderr, "Press any key to continue...\n");
3805    fgetc(stdin);
3806  }
3807}
3808
3809
3810int os::message_box(const char* title, const char* message) {
3811  int result = MessageBox(NULL, message, title,
3812                          MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY);
3813  return result == IDYES;
3814}
3815
3816int os::allocate_thread_local_storage() {
3817  return TlsAlloc();
3818}
3819
3820
3821void os::free_thread_local_storage(int index) {
3822  TlsFree(index);
3823}
3824
3825
3826void os::thread_local_storage_at_put(int index, void* value) {
3827  TlsSetValue(index, value);
3828  assert(thread_local_storage_at(index) == value, "Just checking");
3829}
3830
3831
3832void* os::thread_local_storage_at(int index) {
3833  return TlsGetValue(index);
3834}
3835
3836
3837#ifndef PRODUCT
3838#ifndef _WIN64
3839// Helpers to check whether NX protection is enabled
3840int nx_exception_filter(_EXCEPTION_POINTERS *pex) {
3841  if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
3842      pex->ExceptionRecord->NumberParameters > 0 &&
3843      pex->ExceptionRecord->ExceptionInformation[0] ==
3844      EXCEPTION_INFO_EXEC_VIOLATION) {
3845    return EXCEPTION_EXECUTE_HANDLER;
3846  }
3847  return EXCEPTION_CONTINUE_SEARCH;
3848}
3849
3850void nx_check_protection() {
3851  // If NX is enabled we'll get an exception calling into code on the stack
3852  char code[] = { (char)0xC3 }; // ret
3853  void *code_ptr = (void *)code;
3854  __try {
3855    __asm call code_ptr
3856  } __except(nx_exception_filter((_EXCEPTION_POINTERS*)_exception_info())) {
3857    tty->print_raw_cr("NX protection detected.");
3858  }
3859}
3860#endif // _WIN64
3861#endif // PRODUCT
3862
3863// this is called _before_ the global arguments have been parsed
3864void os::init(void) {
3865  _initial_pid = _getpid();
3866
3867  init_random(1234567);
3868
3869  win32::initialize_system_info();
3870  win32::setmode_streams();
3871  init_page_sizes((size_t) win32::vm_page_size());
3872
3873  // This may be overridden later when argument processing is done.
3874  FLAG_SET_ERGO(bool, UseLargePagesIndividualAllocation,
3875    os::win32::is_windows_2003());
3876
3877  // Initialize main_process and main_thread
3878  main_process = GetCurrentProcess();  // Remember main_process is a pseudo handle
3879 if (!DuplicateHandle(main_process, GetCurrentThread(), main_process,
3880                       &main_thread, THREAD_ALL_ACCESS, false, 0)) {
3881    fatal("DuplicateHandle failed\n");
3882  }
3883  main_thread_id = (int) GetCurrentThreadId();
3884}
3885
3886// To install functions for atexit processing
3887extern "C" {
3888  static void perfMemory_exit_helper() {
3889    perfMemory_exit();
3890  }
3891}
3892
3893static jint initSock();
3894
3895// this is called _after_ the global arguments have been parsed
3896jint os::init_2(void) {
3897  // Allocate a single page and mark it as readable for safepoint polling
3898  address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY);
3899  guarantee(polling_page != NULL, "Reserve Failed for polling page");
3900
3901  address return_page  = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY);
3902  guarantee(return_page != NULL, "Commit Failed for polling page");
3903
3904  os::set_polling_page(polling_page);
3905
3906#ifndef PRODUCT
3907  if (Verbose && PrintMiscellaneous)
3908    tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
3909#endif
3910
3911  if (!UseMembar) {
3912    address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE);
3913    guarantee(mem_serialize_page != NULL, "Reserve Failed for memory serialize page");
3914
3915    return_page  = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE);
3916    guarantee(return_page != NULL, "Commit Failed for memory serialize page");
3917
3918    os::set_memory_serialize_page(mem_serialize_page);
3919
3920#ifndef PRODUCT
3921    if (Verbose && PrintMiscellaneous)
3922      tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
3923#endif
3924  }
3925
3926  // Setup Windows Exceptions
3927
3928  // for debugging float code generation bugs
3929  if (ForceFloatExceptions) {
3930#ifndef  _WIN64
3931    static long fp_control_word = 0;
3932    __asm { fstcw fp_control_word }
3933    // see Intel PPro Manual, Vol. 2, p 7-16
3934    const long precision = 0x20;
3935    const long underflow = 0x10;
3936    const long overflow  = 0x08;
3937    const long zero_div  = 0x04;
3938    const long denorm    = 0x02;
3939    const long invalid   = 0x01;
3940    fp_control_word |= invalid;
3941    __asm { fldcw fp_control_word }
3942#endif
3943  }
3944
3945  // If stack_commit_size is 0, windows will reserve the default size,
3946  // but only commit a small portion of it.
3947  size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size());
3948  size_t default_reserve_size = os::win32::default_stack_size();
3949  size_t actual_reserve_size = stack_commit_size;
3950  if (stack_commit_size < default_reserve_size) {
3951    // If stack_commit_size == 0, we want this too
3952    actual_reserve_size = default_reserve_size;
3953  }
3954
3955  // Check minimum allowable stack size for thread creation and to initialize
3956  // the java system classes, including StackOverflowError - depends on page
3957  // size.  Add a page for compiler2 recursion in main thread.
3958  // Add in 2*BytesPerWord times page size to account for VM stack during
3959  // class initialization depending on 32 or 64 bit VM.
3960  size_t min_stack_allowed =
3961            (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
3962            2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size();
3963  if (actual_reserve_size < min_stack_allowed) {
3964    tty->print_cr("\nThe stack size specified is too small, "
3965                  "Specify at least %dk",
3966                  min_stack_allowed / K);
3967    return JNI_ERR;
3968  }
3969
3970  JavaThread::set_stack_size_at_create(stack_commit_size);
3971
3972  // Calculate theoretical max. size of Threads to guard gainst artifical
3973  // out-of-memory situations, where all available address-space has been
3974  // reserved by thread stacks.
3975  assert(actual_reserve_size != 0, "Must have a stack");
3976
3977  // Calculate the thread limit when we should start doing Virtual Memory
3978  // banging. Currently when the threads will have used all but 200Mb of space.
3979  //
3980  // TODO: consider performing a similar calculation for commit size instead
3981  // as reserve size, since on a 64-bit platform we'll run into that more
3982  // often than running out of virtual memory space.  We can use the
3983  // lower value of the two calculations as the os_thread_limit.
3984  size_t max_address_space = ((size_t)1 << (BitsPerWord - 1)) - (200 * K * K);
3985  win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size);
3986
3987  // at exit methods are called in the reverse order of their registration.
3988  // there is no limit to the number of functions registered. atexit does
3989  // not set errno.
3990
3991  if (PerfAllowAtExitRegistration) {
3992    // only register atexit functions if PerfAllowAtExitRegistration is set.
3993    // atexit functions can be delayed until process exit time, which
3994    // can be problematic for embedded VM situations. Embedded VMs should
3995    // call DestroyJavaVM() to assure that VM resources are released.
3996
3997    // note: perfMemory_exit_helper atexit function may be removed in
3998    // the future if the appropriate cleanup code can be added to the
3999    // VM_Exit VMOperation's doit method.
4000    if (atexit(perfMemory_exit_helper) != 0) {
4001      warning("os::init_2 atexit(perfMemory_exit_helper) failed");
4002    }
4003  }
4004
4005#ifndef _WIN64
4006  // Print something if NX is enabled (win32 on AMD64)
4007  NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection());
4008#endif
4009
4010  // initialize thread priority policy
4011  prio_init();
4012
4013  if (UseNUMA && !ForceNUMA) {
4014    UseNUMA = false; // We don't fully support this yet
4015  }
4016
4017  if (UseNUMAInterleaving) {
4018    // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag
4019    bool success = numa_interleaving_init();
4020    if (!success) UseNUMAInterleaving = false;
4021  }
4022
4023  if (initSock() != JNI_OK) {
4024    return JNI_ERR;
4025  }
4026
4027  return JNI_OK;
4028}
4029
4030void os::init_3(void) {
4031  return;
4032}
4033
4034// Mark the polling page as unreadable
4035void os::make_polling_page_unreadable(void) {
4036  DWORD old_status;
4037  if (!VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_NOACCESS, &old_status))
4038    fatal("Could not disable polling page");
4039};
4040
4041// Mark the polling page as readable
4042void os::make_polling_page_readable(void) {
4043  DWORD old_status;
4044  if (!VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_READONLY, &old_status))
4045    fatal("Could not enable polling page");
4046};
4047
4048
4049int os::stat(const char *path, struct stat *sbuf) {
4050  char pathbuf[MAX_PATH];
4051  if (strlen(path) > MAX_PATH - 1) {
4052    errno = ENAMETOOLONG;
4053    return -1;
4054  }
4055  os::native_path(strcpy(pathbuf, path));
4056  int ret = ::stat(pathbuf, sbuf);
4057  if (sbuf != NULL && UseUTCFileTimestamp) {
4058    // Fix for 6539723.  st_mtime returned from stat() is dependent on
4059    // the system timezone and so can return different values for the
4060    // same file if/when daylight savings time changes.  This adjustment
4061    // makes sure the same timestamp is returned regardless of the TZ.
4062    //
4063    // See:
4064    // http://msdn.microsoft.com/library/
4065    //   default.asp?url=/library/en-us/sysinfo/base/
4066    //   time_zone_information_str.asp
4067    // and
4068    // http://msdn.microsoft.com/library/default.asp?url=
4069    //   /library/en-us/sysinfo/base/settimezoneinformation.asp
4070    //
4071    // NOTE: there is a insidious bug here:  If the timezone is changed
4072    // after the call to stat() but before 'GetTimeZoneInformation()', then
4073    // the adjustment we do here will be wrong and we'll return the wrong
4074    // value (which will likely end up creating an invalid class data
4075    // archive).  Absent a better API for this, or some time zone locking
4076    // mechanism, we'll have to live with this risk.
4077    TIME_ZONE_INFORMATION tz;
4078    DWORD tzid = GetTimeZoneInformation(&tz);
4079    int daylightBias =
4080      (tzid == TIME_ZONE_ID_DAYLIGHT) ?  tz.DaylightBias : tz.StandardBias;
4081    sbuf->st_mtime += (tz.Bias + daylightBias) * 60;
4082  }
4083  return ret;
4084}
4085
4086
4087#define FT2INT64(ft) \
4088  ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime))
4089
4090
4091// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
4092// are used by JVM M&M and JVMTI to get user+sys or user CPU time
4093// of a thread.
4094//
4095// current_thread_cpu_time() and thread_cpu_time(Thread*) returns
4096// the fast estimate available on the platform.
4097
4098// current_thread_cpu_time() is not optimized for Windows yet
4099jlong os::current_thread_cpu_time() {
4100  // return user + sys since the cost is the same
4101  return os::thread_cpu_time(Thread::current(), true /* user+sys */);
4102}
4103
4104jlong os::thread_cpu_time(Thread* thread) {
4105  // consistent with what current_thread_cpu_time() returns.
4106  return os::thread_cpu_time(thread, true /* user+sys */);
4107}
4108
4109jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
4110  return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
4111}
4112
4113jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) {
4114  // This code is copy from clasic VM -> hpi::sysThreadCPUTime
4115  // If this function changes, os::is_thread_cpu_time_supported() should too
4116  if (os::win32::is_nt()) {
4117    FILETIME CreationTime;
4118    FILETIME ExitTime;
4119    FILETIME KernelTime;
4120    FILETIME UserTime;
4121
4122    if (GetThreadTimes(thread->osthread()->thread_handle(),
4123                    &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
4124      return -1;
4125    else
4126      if (user_sys_cpu_time) {
4127        return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100;
4128      } else {
4129        return FT2INT64(UserTime) * 100;
4130      }
4131  } else {
4132    return (jlong) timeGetTime() * 1000000;
4133  }
4134}
4135
4136void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4137  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
4138  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
4139  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
4140  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
4141}
4142
4143void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4144  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
4145  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
4146  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
4147  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
4148}
4149
4150bool os::is_thread_cpu_time_supported() {
4151  // see os::thread_cpu_time
4152  if (os::win32::is_nt()) {
4153    FILETIME CreationTime;
4154    FILETIME ExitTime;
4155    FILETIME KernelTime;
4156    FILETIME UserTime;
4157
4158    if (GetThreadTimes(GetCurrentThread(),
4159                    &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
4160      return false;
4161    else
4162      return true;
4163  } else {
4164    return false;
4165  }
4166}
4167
4168// Windows does't provide a loadavg primitive so this is stubbed out for now.
4169// It does have primitives (PDH API) to get CPU usage and run queue length.
4170// "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length"
4171// If we wanted to implement loadavg on Windows, we have a few options:
4172//
4173// a) Query CPU usage and run queue length and "fake" an answer by
4174//    returning the CPU usage if it's under 100%, and the run queue
4175//    length otherwise.  It turns out that querying is pretty slow
4176//    on Windows, on the order of 200 microseconds on a fast machine.
4177//    Note that on the Windows the CPU usage value is the % usage
4178//    since the last time the API was called (and the first call
4179//    returns 100%), so we'd have to deal with that as well.
4180//
4181// b) Sample the "fake" answer using a sampling thread and store
4182//    the answer in a global variable.  The call to loadavg would
4183//    just return the value of the global, avoiding the slow query.
4184//
4185// c) Sample a better answer using exponential decay to smooth the
4186//    value.  This is basically the algorithm used by UNIX kernels.
4187//
4188// Note that sampling thread starvation could affect both (b) and (c).
4189int os::loadavg(double loadavg[], int nelem) {
4190  return -1;
4191}
4192
4193
4194// DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield()
4195bool os::dont_yield() {
4196  return DontYieldALot;
4197}
4198
4199// This method is a slightly reworked copy of JDK's sysOpen
4200// from src/windows/hpi/src/sys_api_md.c
4201
4202int os::open(const char *path, int oflag, int mode) {
4203  char pathbuf[MAX_PATH];
4204
4205  if (strlen(path) > MAX_PATH - 1) {
4206    errno = ENAMETOOLONG;
4207          return -1;
4208  }
4209  os::native_path(strcpy(pathbuf, path));
4210  return ::open(pathbuf, oflag | O_BINARY | O_NOINHERIT, mode);
4211}
4212
4213FILE* os::open(int fd, const char* mode) {
4214  return ::_fdopen(fd, mode);
4215}
4216
4217// Is a (classpath) directory empty?
4218bool os::dir_is_empty(const char* path) {
4219  WIN32_FIND_DATA fd;
4220  HANDLE f = FindFirstFile(path, &fd);
4221  if (f == INVALID_HANDLE_VALUE) {
4222    return true;
4223  }
4224  FindClose(f);
4225  return false;
4226}
4227
4228// create binary file, rewriting existing file if required
4229int os::create_binary_file(const char* path, bool rewrite_existing) {
4230  int oflags = _O_CREAT | _O_WRONLY | _O_BINARY;
4231  if (!rewrite_existing) {
4232    oflags |= _O_EXCL;
4233  }
4234  return ::open(path, oflags, _S_IREAD | _S_IWRITE);
4235}
4236
4237// return current position of file pointer
4238jlong os::current_file_offset(int fd) {
4239  return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR);
4240}
4241
4242// move file pointer to the specified offset
4243jlong os::seek_to_file_offset(int fd, jlong offset) {
4244  return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET);
4245}
4246
4247
4248jlong os::lseek(int fd, jlong offset, int whence) {
4249  return (jlong) ::_lseeki64(fd, offset, whence);
4250}
4251
4252// This method is a slightly reworked copy of JDK's sysNativePath
4253// from src/windows/hpi/src/path_md.c
4254
4255/* Convert a pathname to native format.  On win32, this involves forcing all
4256   separators to be '\\' rather than '/' (both are legal inputs, but Win95
4257   sometimes rejects '/') and removing redundant separators.  The input path is
4258   assumed to have been converted into the character encoding used by the local
4259   system.  Because this might be a double-byte encoding, care is taken to
4260   treat double-byte lead characters correctly.
4261
4262   This procedure modifies the given path in place, as the result is never
4263   longer than the original.  There is no error return; this operation always
4264   succeeds. */
4265char * os::native_path(char *path) {
4266  char *src = path, *dst = path, *end = path;
4267  char *colon = NULL;           /* If a drive specifier is found, this will
4268                                        point to the colon following the drive
4269                                        letter */
4270
4271  /* Assumption: '/', '\\', ':', and drive letters are never lead bytes */
4272  assert(((!::IsDBCSLeadByte('/'))
4273    && (!::IsDBCSLeadByte('\\'))
4274    && (!::IsDBCSLeadByte(':'))),
4275    "Illegal lead byte");
4276
4277  /* Check for leading separators */
4278#define isfilesep(c) ((c) == '/' || (c) == '\\')
4279  while (isfilesep(*src)) {
4280    src++;
4281  }
4282
4283  if (::isalpha(*src) && !::IsDBCSLeadByte(*src) && src[1] == ':') {
4284    /* Remove leading separators if followed by drive specifier.  This
4285      hack is necessary to support file URLs containing drive
4286      specifiers (e.g., "file://c:/path").  As a side effect,
4287      "/c:/path" can be used as an alternative to "c:/path". */
4288    *dst++ = *src++;
4289    colon = dst;
4290    *dst++ = ':';
4291    src++;
4292  } else {
4293    src = path;
4294    if (isfilesep(src[0]) && isfilesep(src[1])) {
4295      /* UNC pathname: Retain first separator; leave src pointed at
4296         second separator so that further separators will be collapsed
4297         into the second separator.  The result will be a pathname
4298         beginning with "\\\\" followed (most likely) by a host name. */
4299      src = dst = path + 1;
4300      path[0] = '\\';     /* Force first separator to '\\' */
4301    }
4302  }
4303
4304  end = dst;
4305
4306  /* Remove redundant separators from remainder of path, forcing all
4307      separators to be '\\' rather than '/'. Also, single byte space
4308      characters are removed from the end of the path because those
4309      are not legal ending characters on this operating system.
4310  */
4311  while (*src != '\0') {
4312    if (isfilesep(*src)) {
4313      *dst++ = '\\'; src++;
4314      while (isfilesep(*src)) src++;
4315      if (*src == '\0') {
4316        /* Check for trailing separator */
4317        end = dst;
4318        if (colon == dst - 2) break;                      /* "z:\\" */
4319        if (dst == path + 1) break;                       /* "\\" */
4320        if (dst == path + 2 && isfilesep(path[0])) {
4321          /* "\\\\" is not collapsed to "\\" because "\\\\" marks the
4322            beginning of a UNC pathname.  Even though it is not, by
4323            itself, a valid UNC pathname, we leave it as is in order
4324            to be consistent with the path canonicalizer as well
4325            as the win32 APIs, which treat this case as an invalid
4326            UNC pathname rather than as an alias for the root
4327            directory of the current drive. */
4328          break;
4329        }
4330        end = --dst;  /* Path does not denote a root directory, so
4331                                    remove trailing separator */
4332        break;
4333      }
4334      end = dst;
4335    } else {
4336      if (::IsDBCSLeadByte(*src)) { /* Copy a double-byte character */
4337        *dst++ = *src++;
4338        if (*src) *dst++ = *src++;
4339        end = dst;
4340      } else {         /* Copy a single-byte character */
4341        char c = *src++;
4342        *dst++ = c;
4343        /* Space is not a legal ending character */
4344        if (c != ' ') end = dst;
4345      }
4346    }
4347  }
4348
4349  *end = '\0';
4350
4351  /* For "z:", add "." to work around a bug in the C runtime library */
4352  if (colon == dst - 1) {
4353          path[2] = '.';
4354          path[3] = '\0';
4355  }
4356
4357  return path;
4358}
4359
4360// This code is a copy of JDK's sysSetLength
4361// from src/windows/hpi/src/sys_api_md.c
4362
4363int os::ftruncate(int fd, jlong length) {
4364  HANDLE h = (HANDLE)::_get_osfhandle(fd);
4365  long high = (long)(length >> 32);
4366  DWORD ret;
4367
4368  if (h == (HANDLE)(-1)) {
4369    return -1;
4370  }
4371
4372  ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN);
4373  if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) {
4374      return -1;
4375  }
4376
4377  if (::SetEndOfFile(h) == FALSE) {
4378    return -1;
4379  }
4380
4381  return 0;
4382}
4383
4384
4385// This code is a copy of JDK's sysSync
4386// from src/windows/hpi/src/sys_api_md.c
4387// except for the legacy workaround for a bug in Win 98
4388
4389int os::fsync(int fd) {
4390  HANDLE handle = (HANDLE)::_get_osfhandle(fd);
4391
4392  if ((!::FlushFileBuffers(handle)) &&
4393         (GetLastError() != ERROR_ACCESS_DENIED) ) {
4394    /* from winerror.h */
4395    return -1;
4396  }
4397  return 0;
4398}
4399
4400static int nonSeekAvailable(int, long *);
4401static int stdinAvailable(int, long *);
4402
4403#define S_ISCHR(mode)   (((mode) & _S_IFCHR) == _S_IFCHR)
4404#define S_ISFIFO(mode)  (((mode) & _S_IFIFO) == _S_IFIFO)
4405
4406// This code is a copy of JDK's sysAvailable
4407// from src/windows/hpi/src/sys_api_md.c
4408
4409int os::available(int fd, jlong *bytes) {
4410  jlong cur, end;
4411  struct _stati64 stbuf64;
4412
4413  if (::_fstati64(fd, &stbuf64) >= 0) {
4414    int mode = stbuf64.st_mode;
4415    if (S_ISCHR(mode) || S_ISFIFO(mode)) {
4416      int ret;
4417      long lpbytes;
4418      if (fd == 0) {
4419        ret = stdinAvailable(fd, &lpbytes);
4420      } else {
4421        ret = nonSeekAvailable(fd, &lpbytes);
4422      }
4423      (*bytes) = (jlong)(lpbytes);
4424      return ret;
4425    }
4426    if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) {
4427      return FALSE;
4428    } else if ((end = ::_lseeki64(fd, 0L, SEEK_END)) == -1) {
4429      return FALSE;
4430    } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) {
4431      return FALSE;
4432    }
4433    *bytes = end - cur;
4434    return TRUE;
4435  } else {
4436    return FALSE;
4437  }
4438}
4439
4440// This code is a copy of JDK's nonSeekAvailable
4441// from src/windows/hpi/src/sys_api_md.c
4442
4443static int nonSeekAvailable(int fd, long *pbytes) {
4444  /* This is used for available on non-seekable devices
4445    * (like both named and anonymous pipes, such as pipes
4446    *  connected to an exec'd process).
4447    * Standard Input is a special case.
4448    *
4449    */
4450  HANDLE han;
4451
4452  if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) {
4453    return FALSE;
4454  }
4455
4456  if (! ::PeekNamedPipe(han, NULL, 0, NULL, (LPDWORD)pbytes, NULL)) {
4457        /* PeekNamedPipe fails when at EOF.  In that case we
4458         * simply make *pbytes = 0 which is consistent with the
4459         * behavior we get on Solaris when an fd is at EOF.
4460         * The only alternative is to raise an Exception,
4461         * which isn't really warranted.
4462         */
4463    if (::GetLastError() != ERROR_BROKEN_PIPE) {
4464      return FALSE;
4465    }
4466    *pbytes = 0;
4467  }
4468  return TRUE;
4469}
4470
4471#define MAX_INPUT_EVENTS 2000
4472
4473// This code is a copy of JDK's stdinAvailable
4474// from src/windows/hpi/src/sys_api_md.c
4475
4476static int stdinAvailable(int fd, long *pbytes) {
4477  HANDLE han;
4478  DWORD numEventsRead = 0;      /* Number of events read from buffer */
4479  DWORD numEvents = 0;  /* Number of events in buffer */
4480  DWORD i = 0;          /* Loop index */
4481  DWORD curLength = 0;  /* Position marker */
4482  DWORD actualLength = 0;       /* Number of bytes readable */
4483  BOOL error = FALSE;         /* Error holder */
4484  INPUT_RECORD *lpBuffer;     /* Pointer to records of input events */
4485
4486  if ((han = ::GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) {
4487        return FALSE;
4488  }
4489
4490  /* Construct an array of input records in the console buffer */
4491  error = ::GetNumberOfConsoleInputEvents(han, &numEvents);
4492  if (error == 0) {
4493    return nonSeekAvailable(fd, pbytes);
4494  }
4495
4496  /* lpBuffer must fit into 64K or else PeekConsoleInput fails */
4497  if (numEvents > MAX_INPUT_EVENTS) {
4498    numEvents = MAX_INPUT_EVENTS;
4499  }
4500
4501  lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal);
4502  if (lpBuffer == NULL) {
4503    return FALSE;
4504  }
4505
4506  error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
4507  if (error == 0) {
4508    os::free(lpBuffer, mtInternal);
4509    return FALSE;
4510  }
4511
4512  /* Examine input records for the number of bytes available */
4513  for (i=0; i<numEvents; i++) {
4514    if (lpBuffer[i].EventType == KEY_EVENT) {
4515
4516      KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *)
4517                                      &(lpBuffer[i].Event);
4518      if (keyRecord->bKeyDown == TRUE) {
4519        CHAR *keyPressed = (CHAR *) &(keyRecord->uChar);
4520        curLength++;
4521        if (*keyPressed == '\r') {
4522          actualLength = curLength;
4523        }
4524      }
4525    }
4526  }
4527
4528  if (lpBuffer != NULL) {
4529    os::free(lpBuffer, mtInternal);
4530  }
4531
4532  *pbytes = (long) actualLength;
4533  return TRUE;
4534}
4535
4536// Map a block of memory.
4537char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
4538                     char *addr, size_t bytes, bool read_only,
4539                     bool allow_exec) {
4540  HANDLE hFile;
4541  char* base;
4542
4543  hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
4544                     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
4545  if (hFile == NULL) {
4546    if (PrintMiscellaneous && Verbose) {
4547      DWORD err = GetLastError();
4548      tty->print_cr("CreateFile() failed: GetLastError->%ld.", err);
4549    }
4550    return NULL;
4551  }
4552
4553  if (allow_exec) {
4554    // CreateFileMapping/MapViewOfFileEx can't map executable memory
4555    // unless it comes from a PE image (which the shared archive is not.)
4556    // Even VirtualProtect refuses to give execute access to mapped memory
4557    // that was not previously executable.
4558    //
4559    // Instead, stick the executable region in anonymous memory.  Yuck.
4560    // Penalty is that ~4 pages will not be shareable - in the future
4561    // we might consider DLLizing the shared archive with a proper PE
4562    // header so that mapping executable + sharing is possible.
4563
4564    base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE,
4565                                PAGE_READWRITE);
4566    if (base == NULL) {
4567      if (PrintMiscellaneous && Verbose) {
4568        DWORD err = GetLastError();
4569        tty->print_cr("VirtualAlloc() failed: GetLastError->%ld.", err);
4570      }
4571      CloseHandle(hFile);
4572      return NULL;
4573    }
4574
4575    DWORD bytes_read;
4576    OVERLAPPED overlapped;
4577    overlapped.Offset = (DWORD)file_offset;
4578    overlapped.OffsetHigh = 0;
4579    overlapped.hEvent = NULL;
4580    // ReadFile guarantees that if the return value is true, the requested
4581    // number of bytes were read before returning.
4582    bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0;
4583    if (!res) {
4584      if (PrintMiscellaneous && Verbose) {
4585        DWORD err = GetLastError();
4586        tty->print_cr("ReadFile() failed: GetLastError->%ld.", err);
4587      }
4588      release_memory(base, bytes);
4589      CloseHandle(hFile);
4590      return NULL;
4591    }
4592  } else {
4593    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0,
4594                                    NULL /*file_name*/);
4595    if (hMap == NULL) {
4596      if (PrintMiscellaneous && Verbose) {
4597        DWORD err = GetLastError();
4598        tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.", err);
4599      }
4600      CloseHandle(hFile);
4601      return NULL;
4602    }
4603
4604    DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY;
4605    base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset,
4606                                  (DWORD)bytes, addr);
4607    if (base == NULL) {
4608      if (PrintMiscellaneous && Verbose) {
4609        DWORD err = GetLastError();
4610        tty->print_cr("MapViewOfFileEx() failed: GetLastError->%ld.", err);
4611      }
4612      CloseHandle(hMap);
4613      CloseHandle(hFile);
4614      return NULL;
4615    }
4616
4617    if (CloseHandle(hMap) == 0) {
4618      if (PrintMiscellaneous && Verbose) {
4619        DWORD err = GetLastError();
4620        tty->print_cr("CloseHandle(hMap) failed: GetLastError->%ld.", err);
4621      }
4622      CloseHandle(hFile);
4623      return base;
4624    }
4625  }
4626
4627  if (allow_exec) {
4628    DWORD old_protect;
4629    DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE;
4630    bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0;
4631
4632    if (!res) {
4633      if (PrintMiscellaneous && Verbose) {
4634        DWORD err = GetLastError();
4635        tty->print_cr("VirtualProtect() failed: GetLastError->%ld.", err);
4636      }
4637      // Don't consider this a hard error, on IA32 even if the
4638      // VirtualProtect fails, we should still be able to execute
4639      CloseHandle(hFile);
4640      return base;
4641    }
4642  }
4643
4644  if (CloseHandle(hFile) == 0) {
4645    if (PrintMiscellaneous && Verbose) {
4646      DWORD err = GetLastError();
4647      tty->print_cr("CloseHandle(hFile) failed: GetLastError->%ld.", err);
4648    }
4649    return base;
4650  }
4651
4652  return base;
4653}
4654
4655
4656// Remap a block of memory.
4657char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
4658                       char *addr, size_t bytes, bool read_only,
4659                       bool allow_exec) {
4660  // This OS does not allow existing memory maps to be remapped so we
4661  // have to unmap the memory before we remap it.
4662  if (!os::unmap_memory(addr, bytes)) {
4663    return NULL;
4664  }
4665
4666  // There is a very small theoretical window between the unmap_memory()
4667  // call above and the map_memory() call below where a thread in native
4668  // code may be able to access an address that is no longer mapped.
4669
4670  return os::map_memory(fd, file_name, file_offset, addr, bytes,
4671           read_only, allow_exec);
4672}
4673
4674
4675// Unmap a block of memory.
4676// Returns true=success, otherwise false.
4677
4678bool os::pd_unmap_memory(char* addr, size_t bytes) {
4679  BOOL result = UnmapViewOfFile(addr);
4680  if (result == 0) {
4681    if (PrintMiscellaneous && Verbose) {
4682      DWORD err = GetLastError();
4683      tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err);
4684    }
4685    return false;
4686  }
4687  return true;
4688}
4689
4690void os::pause() {
4691  char filename[MAX_PATH];
4692  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4693    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
4694  } else {
4695    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4696  }
4697
4698  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4699  if (fd != -1) {
4700    struct stat buf;
4701    ::close(fd);
4702    while (::stat(filename, &buf) == 0) {
4703      Sleep(100);
4704    }
4705  } else {
4706    jio_fprintf(stderr,
4707      "Could not open pause file '%s', continuing immediately.\n", filename);
4708  }
4709}
4710
4711os::WatcherThreadCrashProtection::WatcherThreadCrashProtection() {
4712  assert(Thread::current()->is_Watcher_thread(), "Must be WatcherThread");
4713}
4714
4715/*
4716 * See the caveats for this class in os_windows.hpp
4717 * Protects the callback call so that raised OS EXCEPTIONS causes a jump back
4718 * into this method and returns false. If no OS EXCEPTION was raised, returns
4719 * true.
4720 * The callback is supposed to provide the method that should be protected.
4721 */
4722bool os::WatcherThreadCrashProtection::call(os::CrashProtectionCallback& cb) {
4723  assert(Thread::current()->is_Watcher_thread(), "Only for WatcherThread");
4724  assert(!WatcherThread::watcher_thread()->has_crash_protection(),
4725      "crash_protection already set?");
4726
4727  bool success = true;
4728  __try {
4729    WatcherThread::watcher_thread()->set_crash_protection(this);
4730    cb.call();
4731  } __except(EXCEPTION_EXECUTE_HANDLER) {
4732    // only for protection, nothing to do
4733    success = false;
4734  }
4735  WatcherThread::watcher_thread()->set_crash_protection(NULL);
4736  return success;
4737}
4738
4739// An Event wraps a win32 "CreateEvent" kernel handle.
4740//
4741// We have a number of choices regarding "CreateEvent" win32 handle leakage:
4742//
4743// 1:  When a thread dies return the Event to the EventFreeList, clear the ParkHandle
4744//     field, and call CloseHandle() on the win32 event handle.  Unpark() would
4745//     need to be modified to tolerate finding a NULL (invalid) win32 event handle.
4746//     In addition, an unpark() operation might fetch the handle field, but the
4747//     event could recycle between the fetch and the SetEvent() operation.
4748//     SetEvent() would either fail because the handle was invalid, or inadvertently work,
4749//     as the win32 handle value had been recycled.  In an ideal world calling SetEvent()
4750//     on an stale but recycled handle would be harmless, but in practice this might
4751//     confuse other non-Sun code, so it's not a viable approach.
4752//
4753// 2:  Once a win32 event handle is associated with an Event, it remains associated
4754//     with the Event.  The event handle is never closed.  This could be construed
4755//     as handle leakage, but only up to the maximum # of threads that have been extant
4756//     at any one time.  This shouldn't be an issue, as windows platforms typically
4757//     permit a process to have hundreds of thousands of open handles.
4758//
4759// 3:  Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList
4760//     and release unused handles.
4761//
4762// 4:  Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle.
4763//     It's not clear, however, that we wouldn't be trading one type of leak for another.
4764//
4765// 5.  Use an RCU-like mechanism (Read-Copy Update).
4766//     Or perhaps something similar to Maged Michael's "Hazard pointers".
4767//
4768// We use (2).
4769//
4770// TODO-FIXME:
4771// 1.  Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation.
4772// 2.  Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks
4773//     to recover from (or at least detect) the dreaded Windows 841176 bug.
4774// 3.  Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent
4775//     into a single win32 CreateEvent() handle.
4776//
4777// _Event transitions in park()
4778//   -1 => -1 : illegal
4779//    1 =>  0 : pass - return immediately
4780//    0 => -1 : block
4781//
4782// _Event serves as a restricted-range semaphore :
4783//    -1 : thread is blocked
4784//     0 : neutral  - thread is running or ready
4785//     1 : signaled - thread is running or ready
4786//
4787// Another possible encoding of _Event would be
4788// with explicit "PARKED" and "SIGNALED" bits.
4789
4790int os::PlatformEvent::park (jlong Millis) {
4791    guarantee(_ParkHandle != NULL , "Invariant");
4792    guarantee(Millis > 0          , "Invariant");
4793    int v;
4794
4795    // CONSIDER: defer assigning a CreateEvent() handle to the Event until
4796    // the initial park() operation.
4797
4798    for (;;) {
4799        v = _Event;
4800        if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
4801    }
4802    guarantee((v == 0) || (v == 1), "invariant");
4803    if (v != 0) return OS_OK;
4804
4805    // Do this the hard way by blocking ...
4806    // TODO: consider a brief spin here, gated on the success of recent
4807    // spin attempts by this thread.
4808    //
4809    // We decompose long timeouts into series of shorter timed waits.
4810    // Evidently large timo values passed in WaitForSingleObject() are problematic on some
4811    // versions of Windows.  See EventWait() for details.  This may be superstition.  Or not.
4812    // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time
4813    // with os::javaTimeNanos().  Furthermore, we assume that spurious returns from
4814    // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend
4815    // to happen early in the wait interval.  Specifically, after a spurious wakeup (rv ==
4816    // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate
4817    // for the already waited time.  This policy does not admit any new outcomes.
4818    // In the future, however, we might want to track the accumulated wait time and
4819    // adjust Millis accordingly if we encounter a spurious wakeup.
4820
4821    const int MAXTIMEOUT = 0x10000000;
4822    DWORD rv = WAIT_TIMEOUT;
4823    while (_Event < 0 && Millis > 0) {
4824       DWORD prd = Millis;     // set prd = MAX (Millis, MAXTIMEOUT)
4825       if (Millis > MAXTIMEOUT) {
4826          prd = MAXTIMEOUT;
4827       }
4828       rv = ::WaitForSingleObject(_ParkHandle, prd);
4829       assert(rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed");
4830       if (rv == WAIT_TIMEOUT) {
4831           Millis -= prd;
4832       }
4833    }
4834    v = _Event;
4835    _Event = 0;
4836    // see comment at end of os::PlatformEvent::park() below:
4837    OrderAccess::fence();
4838    // If we encounter a nearly simultanous timeout expiry and unpark()
4839    // we return OS_OK indicating we awoke via unpark().
4840    // Implementor's license -- returning OS_TIMEOUT would be equally valid, however.
4841    return (v >= 0) ? OS_OK : OS_TIMEOUT;
4842}
4843
4844void os::PlatformEvent::park() {
4845    guarantee(_ParkHandle != NULL, "Invariant");
4846    // Invariant: Only the thread associated with the Event/PlatformEvent
4847    // may call park().
4848    int v;
4849    for (;;) {
4850        v = _Event;
4851        if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
4852    }
4853    guarantee((v == 0) || (v == 1), "invariant");
4854    if (v != 0) return;
4855
4856    // Do this the hard way by blocking ...
4857    // TODO: consider a brief spin here, gated on the success of recent
4858    // spin attempts by this thread.
4859    while (_Event < 0) {
4860       DWORD rv = ::WaitForSingleObject(_ParkHandle, INFINITE);
4861       assert(rv == WAIT_OBJECT_0, "WaitForSingleObject failed");
4862    }
4863
4864    // Usually we'll find _Event == 0 at this point, but as
4865    // an optional optimization we clear it, just in case can
4866    // multiple unpark() operations drove _Event up to 1.
4867    _Event = 0;
4868    OrderAccess::fence();
4869    guarantee(_Event >= 0, "invariant");
4870}
4871
4872void os::PlatformEvent::unpark() {
4873  guarantee(_ParkHandle != NULL, "Invariant");
4874
4875  // Transitions for _Event:
4876  //    0 :=> 1
4877  //    1 :=> 1
4878  //   -1 :=> either 0 or 1; must signal target thread
4879  //          That is, we can safely transition _Event from -1 to either
4880  //          0 or 1. Forcing 1 is slightly more efficient for back-to-back
4881  //          unpark() calls.
4882  // See also: "Semaphores in Plan 9" by Mullender & Cox
4883  //
4884  // Note: Forcing a transition from "-1" to "1" on an unpark() means
4885  // that it will take two back-to-back park() calls for the owning
4886  // thread to block. This has the benefit of forcing a spurious return
4887  // from the first park() call after an unpark() call which will help
4888  // shake out uses of park() and unpark() without condition variables.
4889
4890  if (Atomic::xchg(1, &_Event) >= 0) return;
4891
4892  ::SetEvent(_ParkHandle);
4893}
4894
4895
4896// JSR166
4897// -------------------------------------------------------
4898
4899/*
4900 * The Windows implementation of Park is very straightforward: Basic
4901 * operations on Win32 Events turn out to have the right semantics to
4902 * use them directly. We opportunistically resuse the event inherited
4903 * from Monitor.
4904 */
4905
4906
4907void Parker::park(bool isAbsolute, jlong time) {
4908  guarantee(_ParkEvent != NULL, "invariant");
4909  // First, demultiplex/decode time arguments
4910  if (time < 0) { // don't wait
4911    return;
4912  }
4913  else if (time == 0 && !isAbsolute) {
4914    time = INFINITE;
4915  }
4916  else if  (isAbsolute) {
4917    time -= os::javaTimeMillis(); // convert to relative time
4918    if (time <= 0) // already elapsed
4919      return;
4920  }
4921  else { // relative
4922    time /= 1000000; // Must coarsen from nanos to millis
4923    if (time == 0)   // Wait for the minimal time unit if zero
4924      time = 1;
4925  }
4926
4927  JavaThread* thread = (JavaThread*)(Thread::current());
4928  assert(thread->is_Java_thread(), "Must be JavaThread");
4929  JavaThread *jt = (JavaThread *)thread;
4930
4931  // Don't wait if interrupted or already triggered
4932  if (Thread::is_interrupted(thread, false) ||
4933    WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) {
4934    ResetEvent(_ParkEvent);
4935    return;
4936  }
4937  else {
4938    ThreadBlockInVM tbivm(jt);
4939    OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
4940    jt->set_suspend_equivalent();
4941
4942    WaitForSingleObject(_ParkEvent, time);
4943    ResetEvent(_ParkEvent);
4944
4945    // If externally suspended while waiting, re-suspend
4946    if (jt->handle_special_suspend_equivalent_condition()) {
4947      jt->java_suspend_self();
4948    }
4949  }
4950}
4951
4952void Parker::unpark() {
4953  guarantee(_ParkEvent != NULL, "invariant");
4954  SetEvent(_ParkEvent);
4955}
4956
4957// Run the specified command in a separate process. Return its exit value,
4958// or -1 on failure (e.g. can't create a new process).
4959int os::fork_and_exec(char* cmd) {
4960  STARTUPINFO si;
4961  PROCESS_INFORMATION pi;
4962
4963  memset(&si, 0, sizeof(si));
4964  si.cb = sizeof(si);
4965  memset(&pi, 0, sizeof(pi));
4966  BOOL rslt = CreateProcess(NULL,   // executable name - use command line
4967                            cmd,    // command line
4968                            NULL,   // process security attribute
4969                            NULL,   // thread security attribute
4970                            TRUE,   // inherits system handles
4971                            0,      // no creation flags
4972                            NULL,   // use parent's environment block
4973                            NULL,   // use parent's starting directory
4974                            &si,    // (in) startup information
4975                            &pi);   // (out) process information
4976
4977  if (rslt) {
4978    // Wait until child process exits.
4979    WaitForSingleObject(pi.hProcess, INFINITE);
4980
4981    DWORD exit_code;
4982    GetExitCodeProcess(pi.hProcess, &exit_code);
4983
4984    // Close process and thread handles.
4985    CloseHandle(pi.hProcess);
4986    CloseHandle(pi.hThread);
4987
4988    return (int)exit_code;
4989  } else {
4990    return -1;
4991  }
4992}
4993
4994//--------------------------------------------------------------------------------------------------
4995// Non-product code
4996
4997static int mallocDebugIntervalCounter = 0;
4998static int mallocDebugCounter = 0;
4999bool os::check_heap(bool force) {
5000  if (++mallocDebugCounter < MallocVerifyStart && !force) return true;
5001  if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) {
5002    // Note: HeapValidate executes two hardware breakpoints when it finds something
5003    // wrong; at these points, eax contains the address of the offending block (I think).
5004    // To get to the exlicit error message(s) below, just continue twice.
5005    HANDLE heap = GetProcessHeap();
5006
5007    // If we fail to lock the heap, then gflags.exe has been used
5008    // or some other special heap flag has been set that prevents
5009    // locking. We don't try to walk a heap we can't lock.
5010    if (HeapLock(heap) != 0) {
5011      PROCESS_HEAP_ENTRY phe;
5012      phe.lpData = NULL;
5013      while (HeapWalk(heap, &phe) != 0) {
5014        if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) &&
5015            !HeapValidate(heap, 0, phe.lpData)) {
5016          tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter);
5017          tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData);
5018          fatal("corrupted C heap");
5019        }
5020      }
5021      DWORD err = GetLastError();
5022      if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) {
5023        fatal(err_msg("heap walk aborted with error %d", err));
5024      }
5025      HeapUnlock(heap);
5026    }
5027    mallocDebugIntervalCounter = 0;
5028  }
5029  return true;
5030}
5031
5032
5033bool os::find(address addr, outputStream* st) {
5034  // Nothing yet
5035  return false;
5036}
5037
5038LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) {
5039  DWORD exception_code = e->ExceptionRecord->ExceptionCode;
5040
5041  if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
5042    JavaThread* thread = (JavaThread*)ThreadLocalStorage::get_thread_slow();
5043    PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord;
5044    address addr = (address) exceptionRecord->ExceptionInformation[1];
5045
5046    if (os::is_memory_serialize_page(thread, addr))
5047      return EXCEPTION_CONTINUE_EXECUTION;
5048  }
5049
5050  return EXCEPTION_CONTINUE_SEARCH;
5051}
5052
5053// We don't build a headless jre for Windows
5054bool os::is_headless_jre() { return false; }
5055
5056static jint initSock() {
5057  WSADATA wsadata;
5058
5059  if (!os::WinSock2Dll::WinSock2Available()) {
5060    jio_fprintf(stderr, "Could not load Winsock (error: %d)\n",
5061      ::GetLastError());
5062    return JNI_ERR;
5063  }
5064
5065  if (os::WinSock2Dll::WSAStartup(MAKEWORD(2,2), &wsadata) != 0) {
5066    jio_fprintf(stderr, "Could not initialize Winsock (error: %d)\n",
5067      ::GetLastError());
5068    return JNI_ERR;
5069  }
5070  return JNI_OK;
5071}
5072
5073struct hostent* os::get_host_by_name(char* name) {
5074  return (struct hostent*)os::WinSock2Dll::gethostbyname(name);
5075}
5076
5077int os::socket_close(int fd) {
5078  return ::closesocket(fd);
5079}
5080
5081int os::socket_available(int fd, jint *pbytes) {
5082  int ret = ::ioctlsocket(fd, FIONREAD, (u_long*)pbytes);
5083  return (ret < 0) ? 0 : 1;
5084}
5085
5086int os::socket(int domain, int type, int protocol) {
5087  return ::socket(domain, type, protocol);
5088}
5089
5090int os::listen(int fd, int count) {
5091  return ::listen(fd, count);
5092}
5093
5094int os::connect(int fd, struct sockaddr* him, socklen_t len) {
5095  return ::connect(fd, him, len);
5096}
5097
5098int os::accept(int fd, struct sockaddr* him, socklen_t* len) {
5099  return ::accept(fd, him, len);
5100}
5101
5102int os::sendto(int fd, char* buf, size_t len, uint flags,
5103               struct sockaddr* to, socklen_t tolen) {
5104
5105  return ::sendto(fd, buf, (int)len, flags, to, tolen);
5106}
5107
5108int os::recvfrom(int fd, char *buf, size_t nBytes, uint flags,
5109                 sockaddr* from, socklen_t* fromlen) {
5110
5111  return ::recvfrom(fd, buf, (int)nBytes, flags, from, fromlen);
5112}
5113
5114int os::recv(int fd, char* buf, size_t nBytes, uint flags) {
5115  return ::recv(fd, buf, (int)nBytes, flags);
5116}
5117
5118int os::send(int fd, char* buf, size_t nBytes, uint flags) {
5119  return ::send(fd, buf, (int)nBytes, flags);
5120}
5121
5122int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) {
5123  return ::send(fd, buf, (int)nBytes, flags);
5124}
5125
5126int os::timeout(int fd, long timeout) {
5127  fd_set tbl;
5128  struct timeval t;
5129
5130  t.tv_sec  = timeout / 1000;
5131  t.tv_usec = (timeout % 1000) * 1000;
5132
5133  tbl.fd_count    = 1;
5134  tbl.fd_array[0] = fd;
5135
5136  return ::select(1, &tbl, 0, 0, &t);
5137}
5138
5139int os::get_host_name(char* name, int namelen) {
5140  return ::gethostname(name, namelen);
5141}
5142
5143int os::socket_shutdown(int fd, int howto) {
5144  return ::shutdown(fd, howto);
5145}
5146
5147int os::bind(int fd, struct sockaddr* him, socklen_t len) {
5148  return ::bind(fd, him, len);
5149}
5150
5151int os::get_sock_name(int fd, struct sockaddr* him, socklen_t* len) {
5152  return ::getsockname(fd, him, len);
5153}
5154
5155int os::get_sock_opt(int fd, int level, int optname,
5156                     char* optval, socklen_t* optlen) {
5157  return ::getsockopt(fd, level, optname, optval, optlen);
5158}
5159
5160int os::set_sock_opt(int fd, int level, int optname,
5161                     const char* optval, socklen_t optlen) {
5162  return ::setsockopt(fd, level, optname, optval, optlen);
5163}
5164
5165// WINDOWS CONTEXT Flags for THREAD_SAMPLING
5166#if defined(IA32)
5167#  define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS)
5168#elif defined (AMD64)
5169#  define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
5170#endif
5171
5172// returns true if thread could be suspended,
5173// false otherwise
5174static bool do_suspend(HANDLE* h) {
5175  if (h != NULL) {
5176    if (SuspendThread(*h) != ~0) {
5177      return true;
5178    }
5179  }
5180  return false;
5181}
5182
5183// resume the thread
5184// calling resume on an active thread is a no-op
5185static void do_resume(HANDLE* h) {
5186  if (h != NULL) {
5187    ResumeThread(*h);
5188  }
5189}
5190
5191// retrieve a suspend/resume context capable handle
5192// from the tid. Caller validates handle return value.
5193void get_thread_handle_for_extended_context(HANDLE* h, OSThread::thread_id_t tid) {
5194  if (h != NULL) {
5195    *h = OpenThread(THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, FALSE, tid);
5196  }
5197}
5198
5199//
5200// Thread sampling implementation
5201//
5202void os::SuspendedThreadTask::internal_do_task() {
5203  CONTEXT    ctxt;
5204  HANDLE     h = NULL;
5205
5206  // get context capable handle for thread
5207  get_thread_handle_for_extended_context(&h, _thread->osthread()->thread_id());
5208
5209  // sanity
5210  if (h == NULL || h == INVALID_HANDLE_VALUE) {
5211    return;
5212  }
5213
5214  // suspend the thread
5215  if (do_suspend(&h)) {
5216    ctxt.ContextFlags = sampling_context_flags;
5217    // get thread context
5218    GetThreadContext(h, &ctxt);
5219    SuspendedThreadTaskContext context(_thread, &ctxt);
5220    // pass context to Thread Sampling impl
5221    do_task(context);
5222    // resume thread
5223    do_resume(&h);
5224  }
5225
5226  // close handle
5227  CloseHandle(h);
5228}
5229
5230
5231// Kernel32 API
5232typedef SIZE_T (WINAPI* GetLargePageMinimum_Fn)(void);
5233typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
5234typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG);
5235typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG);
5236typedef USHORT (WINAPI* RtlCaptureStackBackTrace_Fn)(ULONG, ULONG, PVOID*, PULONG);
5237
5238GetLargePageMinimum_Fn      os::Kernel32Dll::_GetLargePageMinimum = NULL;
5239VirtualAllocExNuma_Fn       os::Kernel32Dll::_VirtualAllocExNuma = NULL;
5240GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL;
5241GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL;
5242RtlCaptureStackBackTrace_Fn os::Kernel32Dll::_RtlCaptureStackBackTrace = NULL;
5243
5244
5245BOOL                        os::Kernel32Dll::initialized = FALSE;
5246SIZE_T os::Kernel32Dll::GetLargePageMinimum() {
5247  assert(initialized && _GetLargePageMinimum != NULL,
5248    "GetLargePageMinimumAvailable() not yet called");
5249  return _GetLargePageMinimum();
5250}
5251
5252BOOL os::Kernel32Dll::GetLargePageMinimumAvailable() {
5253  if (!initialized) {
5254    initialize();
5255  }
5256  return _GetLargePageMinimum != NULL;
5257}
5258
5259BOOL os::Kernel32Dll::NumaCallsAvailable() {
5260  if (!initialized) {
5261    initialize();
5262  }
5263  return _VirtualAllocExNuma != NULL;
5264}
5265
5266LPVOID os::Kernel32Dll::VirtualAllocExNuma(HANDLE hProc, LPVOID addr, SIZE_T bytes, DWORD flags, DWORD prot, DWORD node) {
5267  assert(initialized && _VirtualAllocExNuma != NULL,
5268    "NUMACallsAvailable() not yet called");
5269
5270  return _VirtualAllocExNuma(hProc, addr, bytes, flags, prot, node);
5271}
5272
5273BOOL os::Kernel32Dll::GetNumaHighestNodeNumber(PULONG ptr_highest_node_number) {
5274  assert(initialized && _GetNumaHighestNodeNumber != NULL,
5275    "NUMACallsAvailable() not yet called");
5276
5277  return _GetNumaHighestNodeNumber(ptr_highest_node_number);
5278}
5279
5280BOOL os::Kernel32Dll::GetNumaNodeProcessorMask(UCHAR node, PULONGLONG proc_mask) {
5281  assert(initialized && _GetNumaNodeProcessorMask != NULL,
5282    "NUMACallsAvailable() not yet called");
5283
5284  return _GetNumaNodeProcessorMask(node, proc_mask);
5285}
5286
5287USHORT os::Kernel32Dll::RtlCaptureStackBackTrace(ULONG FrameToSkip,
5288  ULONG FrameToCapture, PVOID* BackTrace, PULONG BackTraceHash) {
5289    if (!initialized) {
5290      initialize();
5291    }
5292
5293    if (_RtlCaptureStackBackTrace != NULL) {
5294      return _RtlCaptureStackBackTrace(FrameToSkip, FrameToCapture,
5295        BackTrace, BackTraceHash);
5296    } else {
5297      return 0;
5298    }
5299}
5300
5301void os::Kernel32Dll::initializeCommon() {
5302  if (!initialized) {
5303    HMODULE handle = ::GetModuleHandle("Kernel32.dll");
5304    assert(handle != NULL, "Just check");
5305    _GetLargePageMinimum = (GetLargePageMinimum_Fn)::GetProcAddress(handle, "GetLargePageMinimum");
5306    _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma");
5307    _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber");
5308    _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask");
5309    _RtlCaptureStackBackTrace = (RtlCaptureStackBackTrace_Fn)::GetProcAddress(handle, "RtlCaptureStackBackTrace");
5310    initialized = TRUE;
5311  }
5312}
5313
5314
5315
5316#ifndef JDK6_OR_EARLIER
5317
5318void os::Kernel32Dll::initialize() {
5319  initializeCommon();
5320}
5321
5322
5323// Kernel32 API
5324inline BOOL os::Kernel32Dll::SwitchToThread() {
5325  return ::SwitchToThread();
5326}
5327
5328inline BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
5329  return true;
5330}
5331
5332  // Help tools
5333inline BOOL os::Kernel32Dll::HelpToolsAvailable() {
5334  return true;
5335}
5336
5337inline HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
5338  return ::CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
5339}
5340
5341inline BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5342  return ::Module32First(hSnapshot, lpme);
5343}
5344
5345inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5346  return ::Module32Next(hSnapshot, lpme);
5347}
5348
5349
5350inline BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
5351  return true;
5352}
5353
5354inline void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
5355  ::GetNativeSystemInfo(lpSystemInfo);
5356}
5357
5358// PSAPI API
5359inline BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
5360  return ::EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
5361}
5362
5363inline DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
5364  return ::GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
5365}
5366
5367inline BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
5368  return ::GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
5369}
5370
5371inline BOOL os::PSApiDll::PSApiAvailable() {
5372  return true;
5373}
5374
5375
5376// WinSock2 API
5377inline BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
5378  return ::WSAStartup(wVersionRequested, lpWSAData);
5379}
5380
5381inline struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
5382  return ::gethostbyname(name);
5383}
5384
5385inline BOOL os::WinSock2Dll::WinSock2Available() {
5386  return true;
5387}
5388
5389// Advapi API
5390inline BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
5391   BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
5392   PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
5393     return ::AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
5394       BufferLength, PreviousState, ReturnLength);
5395}
5396
5397inline BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
5398  PHANDLE TokenHandle) {
5399    return ::OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
5400}
5401
5402inline BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
5403  return ::LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
5404}
5405
5406inline BOOL os::Advapi32Dll::AdvapiAvailable() {
5407  return true;
5408}
5409
5410void* os::get_default_process_handle() {
5411  return (void*)GetModuleHandle(NULL);
5412}
5413
5414// Builds a platform dependent Agent_OnLoad_<lib_name> function name
5415// which is used to find statically linked in agents.
5416// Additionally for windows, takes into account __stdcall names.
5417// Parameters:
5418//            sym_name: Symbol in library we are looking for
5419//            lib_name: Name of library to look in, NULL for shared libs.
5420//            is_absolute_path == true if lib_name is absolute path to agent
5421//                                     such as "C:/a/b/L.dll"
5422//            == false if only the base name of the library is passed in
5423//               such as "L"
5424char* os::build_agent_function_name(const char *sym_name, const char *lib_name,
5425                                    bool is_absolute_path) {
5426  char *agent_entry_name;
5427  size_t len;
5428  size_t name_len;
5429  size_t prefix_len = strlen(JNI_LIB_PREFIX);
5430  size_t suffix_len = strlen(JNI_LIB_SUFFIX);
5431  const char *start;
5432
5433  if (lib_name != NULL) {
5434    len = name_len = strlen(lib_name);
5435    if (is_absolute_path) {
5436      // Need to strip path, prefix and suffix
5437      if ((start = strrchr(lib_name, *os::file_separator())) != NULL) {
5438        lib_name = ++start;
5439      } else {
5440        // Need to check for drive prefix
5441        if ((start = strchr(lib_name, ':')) != NULL) {
5442          lib_name = ++start;
5443        }
5444      }
5445      if (len <= (prefix_len + suffix_len)) {
5446        return NULL;
5447      }
5448      lib_name += prefix_len;
5449      name_len = strlen(lib_name) - suffix_len;
5450    }
5451  }
5452  len = (lib_name != NULL ? name_len : 0) + strlen(sym_name) + 2;
5453  agent_entry_name = NEW_C_HEAP_ARRAY_RETURN_NULL(char, len, mtThread);
5454  if (agent_entry_name == NULL) {
5455    return NULL;
5456  }
5457  if (lib_name != NULL) {
5458    const char *p = strrchr(sym_name, '@');
5459    if (p != NULL && p != sym_name) {
5460      // sym_name == _Agent_OnLoad@XX
5461      strncpy(agent_entry_name, sym_name, (p - sym_name));
5462      agent_entry_name[(p-sym_name)] = '\0';
5463      // agent_entry_name == _Agent_OnLoad
5464      strcat(agent_entry_name, "_");
5465      strncat(agent_entry_name, lib_name, name_len);
5466      strcat(agent_entry_name, p);
5467      // agent_entry_name == _Agent_OnLoad_lib_name@XX
5468    } else {
5469      strcpy(agent_entry_name, sym_name);
5470      strcat(agent_entry_name, "_");
5471      strncat(agent_entry_name, lib_name, name_len);
5472    }
5473  } else {
5474    strcpy(agent_entry_name, sym_name);
5475  }
5476  return agent_entry_name;
5477}
5478
5479#else
5480// Kernel32 API
5481typedef BOOL (WINAPI* SwitchToThread_Fn)(void);
5482typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD);
5483typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32);
5484typedef BOOL (WINAPI* Module32Next_Fn)(HANDLE,LPMODULEENTRY32);
5485typedef void (WINAPI* GetNativeSystemInfo_Fn)(LPSYSTEM_INFO);
5486
5487SwitchToThread_Fn           os::Kernel32Dll::_SwitchToThread = NULL;
5488CreateToolhelp32Snapshot_Fn os::Kernel32Dll::_CreateToolhelp32Snapshot = NULL;
5489Module32First_Fn            os::Kernel32Dll::_Module32First = NULL;
5490Module32Next_Fn             os::Kernel32Dll::_Module32Next = NULL;
5491GetNativeSystemInfo_Fn      os::Kernel32Dll::_GetNativeSystemInfo = NULL;
5492
5493void os::Kernel32Dll::initialize() {
5494  if (!initialized) {
5495    HMODULE handle = ::GetModuleHandle("Kernel32.dll");
5496    assert(handle != NULL, "Just check");
5497
5498    _SwitchToThread = (SwitchToThread_Fn)::GetProcAddress(handle, "SwitchToThread");
5499    _CreateToolhelp32Snapshot = (CreateToolhelp32Snapshot_Fn)
5500      ::GetProcAddress(handle, "CreateToolhelp32Snapshot");
5501    _Module32First = (Module32First_Fn)::GetProcAddress(handle, "Module32First");
5502    _Module32Next = (Module32Next_Fn)::GetProcAddress(handle, "Module32Next");
5503    _GetNativeSystemInfo = (GetNativeSystemInfo_Fn)::GetProcAddress(handle, "GetNativeSystemInfo");
5504    initializeCommon();  // resolve the functions that always need resolving
5505
5506    initialized = TRUE;
5507  }
5508}
5509
5510BOOL os::Kernel32Dll::SwitchToThread() {
5511  assert(initialized && _SwitchToThread != NULL,
5512    "SwitchToThreadAvailable() not yet called");
5513  return _SwitchToThread();
5514}
5515
5516
5517BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
5518  if (!initialized) {
5519    initialize();
5520  }
5521  return _SwitchToThread != NULL;
5522}
5523
5524// Help tools
5525BOOL os::Kernel32Dll::HelpToolsAvailable() {
5526  if (!initialized) {
5527    initialize();
5528  }
5529  return _CreateToolhelp32Snapshot != NULL &&
5530         _Module32First != NULL &&
5531         _Module32Next != NULL;
5532}
5533
5534HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
5535  assert(initialized && _CreateToolhelp32Snapshot != NULL,
5536    "HelpToolsAvailable() not yet called");
5537
5538  return _CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
5539}
5540
5541BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5542  assert(initialized && _Module32First != NULL,
5543    "HelpToolsAvailable() not yet called");
5544
5545  return _Module32First(hSnapshot, lpme);
5546}
5547
5548inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5549  assert(initialized && _Module32Next != NULL,
5550    "HelpToolsAvailable() not yet called");
5551
5552  return _Module32Next(hSnapshot, lpme);
5553}
5554
5555
5556BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
5557  if (!initialized) {
5558    initialize();
5559  }
5560  return _GetNativeSystemInfo != NULL;
5561}
5562
5563void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
5564  assert(initialized && _GetNativeSystemInfo != NULL,
5565    "GetNativeSystemInfoAvailable() not yet called");
5566
5567  _GetNativeSystemInfo(lpSystemInfo);
5568}
5569
5570// PSAPI API
5571
5572
5573typedef BOOL (WINAPI *EnumProcessModules_Fn)(HANDLE, HMODULE *, DWORD, LPDWORD);
5574typedef BOOL (WINAPI *GetModuleFileNameEx_Fn)(HANDLE, HMODULE, LPTSTR, DWORD);;
5575typedef BOOL (WINAPI *GetModuleInformation_Fn)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
5576
5577EnumProcessModules_Fn   os::PSApiDll::_EnumProcessModules = NULL;
5578GetModuleFileNameEx_Fn  os::PSApiDll::_GetModuleFileNameEx = NULL;
5579GetModuleInformation_Fn os::PSApiDll::_GetModuleInformation = NULL;
5580BOOL                    os::PSApiDll::initialized = FALSE;
5581
5582void os::PSApiDll::initialize() {
5583  if (!initialized) {
5584    HMODULE handle = os::win32::load_Windows_dll("PSAPI.DLL", NULL, 0);
5585    if (handle != NULL) {
5586      _EnumProcessModules = (EnumProcessModules_Fn)::GetProcAddress(handle,
5587        "EnumProcessModules");
5588      _GetModuleFileNameEx = (GetModuleFileNameEx_Fn)::GetProcAddress(handle,
5589        "GetModuleFileNameExA");
5590      _GetModuleInformation = (GetModuleInformation_Fn)::GetProcAddress(handle,
5591        "GetModuleInformation");
5592    }
5593    initialized = TRUE;
5594  }
5595}
5596
5597
5598
5599BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
5600  assert(initialized && _EnumProcessModules != NULL,
5601    "PSApiAvailable() not yet called");
5602  return _EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
5603}
5604
5605DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
5606  assert(initialized && _GetModuleFileNameEx != NULL,
5607    "PSApiAvailable() not yet called");
5608  return _GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
5609}
5610
5611BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
5612  assert(initialized && _GetModuleInformation != NULL,
5613    "PSApiAvailable() not yet called");
5614  return _GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
5615}
5616
5617BOOL os::PSApiDll::PSApiAvailable() {
5618  if (!initialized) {
5619    initialize();
5620  }
5621  return _EnumProcessModules != NULL &&
5622    _GetModuleFileNameEx != NULL &&
5623    _GetModuleInformation != NULL;
5624}
5625
5626
5627// WinSock2 API
5628typedef int (PASCAL FAR* WSAStartup_Fn)(WORD, LPWSADATA);
5629typedef struct hostent *(PASCAL FAR *gethostbyname_Fn)(...);
5630
5631WSAStartup_Fn    os::WinSock2Dll::_WSAStartup = NULL;
5632gethostbyname_Fn os::WinSock2Dll::_gethostbyname = NULL;
5633BOOL             os::WinSock2Dll::initialized = FALSE;
5634
5635void os::WinSock2Dll::initialize() {
5636  if (!initialized) {
5637    HMODULE handle = os::win32::load_Windows_dll("ws2_32.dll", NULL, 0);
5638    if (handle != NULL) {
5639      _WSAStartup = (WSAStartup_Fn)::GetProcAddress(handle, "WSAStartup");
5640      _gethostbyname = (gethostbyname_Fn)::GetProcAddress(handle, "gethostbyname");
5641    }
5642    initialized = TRUE;
5643  }
5644}
5645
5646
5647BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
5648  assert(initialized && _WSAStartup != NULL,
5649    "WinSock2Available() not yet called");
5650  return _WSAStartup(wVersionRequested, lpWSAData);
5651}
5652
5653struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
5654  assert(initialized && _gethostbyname != NULL,
5655    "WinSock2Available() not yet called");
5656  return _gethostbyname(name);
5657}
5658
5659BOOL os::WinSock2Dll::WinSock2Available() {
5660  if (!initialized) {
5661    initialize();
5662  }
5663  return _WSAStartup != NULL &&
5664    _gethostbyname != NULL;
5665}
5666
5667typedef BOOL (WINAPI *AdjustTokenPrivileges_Fn)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
5668typedef BOOL (WINAPI *OpenProcessToken_Fn)(HANDLE, DWORD, PHANDLE);
5669typedef BOOL (WINAPI *LookupPrivilegeValue_Fn)(LPCTSTR, LPCTSTR, PLUID);
5670
5671AdjustTokenPrivileges_Fn os::Advapi32Dll::_AdjustTokenPrivileges = NULL;
5672OpenProcessToken_Fn      os::Advapi32Dll::_OpenProcessToken = NULL;
5673LookupPrivilegeValue_Fn  os::Advapi32Dll::_LookupPrivilegeValue = NULL;
5674BOOL                     os::Advapi32Dll::initialized = FALSE;
5675
5676void os::Advapi32Dll::initialize() {
5677  if (!initialized) {
5678    HMODULE handle = os::win32::load_Windows_dll("advapi32.dll", NULL, 0);
5679    if (handle != NULL) {
5680      _AdjustTokenPrivileges = (AdjustTokenPrivileges_Fn)::GetProcAddress(handle,
5681        "AdjustTokenPrivileges");
5682      _OpenProcessToken = (OpenProcessToken_Fn)::GetProcAddress(handle,
5683        "OpenProcessToken");
5684      _LookupPrivilegeValue = (LookupPrivilegeValue_Fn)::GetProcAddress(handle,
5685        "LookupPrivilegeValueA");
5686    }
5687    initialized = TRUE;
5688  }
5689}
5690
5691BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
5692   BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
5693   PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
5694   assert(initialized && _AdjustTokenPrivileges != NULL,
5695     "AdvapiAvailable() not yet called");
5696   return _AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
5697       BufferLength, PreviousState, ReturnLength);
5698}
5699
5700BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
5701  PHANDLE TokenHandle) {
5702   assert(initialized && _OpenProcessToken != NULL,
5703     "AdvapiAvailable() not yet called");
5704    return _OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
5705}
5706
5707BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
5708   assert(initialized && _LookupPrivilegeValue != NULL,
5709     "AdvapiAvailable() not yet called");
5710  return _LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
5711}
5712
5713BOOL os::Advapi32Dll::AdvapiAvailable() {
5714  if (!initialized) {
5715    initialize();
5716  }
5717  return _AdjustTokenPrivileges != NULL &&
5718    _OpenProcessToken != NULL &&
5719    _LookupPrivilegeValue != NULL;
5720}
5721
5722#endif
5723
5724#ifndef PRODUCT
5725
5726// test the code path in reserve_memory_special() that tries to allocate memory in a single
5727// contiguous memory block at a particular address.
5728// The test first tries to find a good approximate address to allocate at by using the same
5729// method to allocate some memory at any address. The test then tries to allocate memory in
5730// the vicinity (not directly after it to avoid possible by-chance use of that location)
5731// This is of course only some dodgy assumption, there is no guarantee that the vicinity of
5732// the previously allocated memory is available for allocation. The only actual failure
5733// that is reported is when the test tries to allocate at a particular location but gets a
5734// different valid one. A NULL return value at this point is not considered an error but may
5735// be legitimate.
5736// If -XX:+VerboseInternalVMTests is enabled, print some explanatory messages.
5737void TestReserveMemorySpecial_test() {
5738  if (!UseLargePages) {
5739    if (VerboseInternalVMTests) {
5740      gclog_or_tty->print("Skipping test because large pages are disabled");
5741    }
5742    return;
5743  }
5744  // save current value of globals
5745  bool old_use_large_pages_individual_allocation = UseLargePagesIndividualAllocation;
5746  bool old_use_numa_interleaving = UseNUMAInterleaving;
5747
5748  // set globals to make sure we hit the correct code path
5749  UseLargePagesIndividualAllocation = UseNUMAInterleaving = false;
5750
5751  // do an allocation at an address selected by the OS to get a good one.
5752  const size_t large_allocation_size = os::large_page_size() * 4;
5753  char* result = os::reserve_memory_special(large_allocation_size, os::large_page_size(), NULL, false);
5754  if (result == NULL) {
5755    if (VerboseInternalVMTests) {
5756      gclog_or_tty->print("Failed to allocate control block with size "SIZE_FORMAT". Skipping remainder of test.",
5757        large_allocation_size);
5758    }
5759  } else {
5760    os::release_memory_special(result, large_allocation_size);
5761
5762    // allocate another page within the recently allocated memory area which seems to be a good location. At least
5763    // we managed to get it once.
5764    const size_t expected_allocation_size = os::large_page_size();
5765    char* expected_location = result + os::large_page_size();
5766    char* actual_location = os::reserve_memory_special(expected_allocation_size, os::large_page_size(), expected_location, false);
5767    if (actual_location == NULL) {
5768      if (VerboseInternalVMTests) {
5769        gclog_or_tty->print("Failed to allocate any memory at "PTR_FORMAT" size "SIZE_FORMAT". Skipping remainder of test.",
5770          expected_location, large_allocation_size);
5771      }
5772    } else {
5773      // release memory
5774      os::release_memory_special(actual_location, expected_allocation_size);
5775      // only now check, after releasing any memory to avoid any leaks.
5776      assert(actual_location == expected_location,
5777        err_msg("Failed to allocate memory at requested location "PTR_FORMAT" of size "SIZE_FORMAT", is "PTR_FORMAT" instead",
5778          expected_location, expected_allocation_size, actual_location));
5779    }
5780  }
5781
5782  // restore globals
5783  UseLargePagesIndividualAllocation = old_use_large_pages_individual_allocation;
5784  UseNUMAInterleaving = old_use_numa_interleaving;
5785}
5786#endif // PRODUCT
5787
5788