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