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