os_windows.cpp revision 13249:a2753984d2c1
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/align.hpp"
71#include "utilities/decoder.hpp"
72#include "utilities/defaultStream.hpp"
73#include "utilities/events.hpp"
74#include "utilities/growableArray.hpp"
75#include "utilities/macros.hpp"
76#include "utilities/vmError.hpp"
77
78#ifdef _DEBUG
79#include <crtdbg.h>
80#endif
81
82
83#include <windows.h>
84#include <sys/types.h>
85#include <sys/stat.h>
86#include <sys/timeb.h>
87#include <objidl.h>
88#include <shlobj.h>
89
90#include <malloc.h>
91#include <signal.h>
92#include <direct.h>
93#include <errno.h>
94#include <fcntl.h>
95#include <io.h>
96#include <process.h>              // For _beginthreadex(), _endthreadex()
97#include <imagehlp.h>             // For os::dll_address_to_function_name
98// for enumerating dll libraries
99#include <vdmdbg.h>
100
101// for timer info max values which include all bits
102#define ALL_64_BITS CONST64(-1)
103
104// For DLL loading/load error detection
105// Values of PE COFF
106#define IMAGE_FILE_PTR_TO_SIGNATURE 0x3c
107#define IMAGE_FILE_SIGNATURE_LENGTH 4
108
109static HANDLE main_process;
110static HANDLE main_thread;
111static int    main_thread_id;
112
113static FILETIME process_creation_time;
114static FILETIME process_exit_time;
115static FILETIME process_user_time;
116static FILETIME process_kernel_time;
117
118#ifdef _M_AMD64
119  #define __CPU__ amd64
120#else
121  #define __CPU__ i486
122#endif
123
124// save DLL module handle, used by GetModuleFileName
125
126HINSTANCE vm_lib_handle;
127
128BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) {
129  switch (reason) {
130  case DLL_PROCESS_ATTACH:
131    vm_lib_handle = hinst;
132    if (ForceTimeHighResolution) {
133      timeBeginPeriod(1L);
134    }
135    break;
136  case DLL_PROCESS_DETACH:
137    if (ForceTimeHighResolution) {
138      timeEndPeriod(1L);
139    }
140    break;
141  default:
142    break;
143  }
144  return true;
145}
146
147static inline double fileTimeAsDouble(FILETIME* time) {
148  const double high  = (double) ((unsigned int) ~0);
149  const double split = 10000000.0;
150  double result = (time->dwLowDateTime / split) +
151                   time->dwHighDateTime * (high/split);
152  return result;
153}
154
155// Implementation of os
156
157bool os::unsetenv(const char* name) {
158  assert(name != NULL, "Null pointer");
159  return (SetEnvironmentVariable(name, NULL) == TRUE);
160}
161
162// No setuid programs under Windows.
163bool os::have_special_privileges() {
164  return false;
165}
166
167
168// This method is  a periodic task to check for misbehaving JNI applications
169// under CheckJNI, we can add any periodic checks here.
170// For Windows at the moment does nothing
171void os::run_periodic_checks() {
172  return;
173}
174
175// previous UnhandledExceptionFilter, if there is one
176static LPTOP_LEVEL_EXCEPTION_FILTER prev_uef_handler = NULL;
177
178LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo);
179
180void os::init_system_properties_values() {
181  // sysclasspath, java_home, dll_dir
182  {
183    char *home_path;
184    char *dll_path;
185    char *pslash;
186    char *bin = "\\bin";
187    char home_dir[MAX_PATH + 1];
188    char *alt_home_dir = ::getenv("_ALT_JAVA_HOME_DIR");
189
190    if (alt_home_dir != NULL)  {
191      strncpy(home_dir, alt_home_dir, MAX_PATH + 1);
192      home_dir[MAX_PATH] = '\0';
193    } else {
194      os::jvm_path(home_dir, sizeof(home_dir));
195      // Found the full path to jvm.dll.
196      // Now cut the path to <java_home>/jre if we can.
197      *(strrchr(home_dir, '\\')) = '\0';  // get rid of \jvm.dll
198      pslash = strrchr(home_dir, '\\');
199      if (pslash != NULL) {
200        *pslash = '\0';                   // get rid of \{client|server}
201        pslash = strrchr(home_dir, '\\');
202        if (pslash != NULL) {
203          *pslash = '\0';                 // get rid of \bin
204        }
205      }
206    }
207
208    home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1, mtInternal);
209    if (home_path == NULL) {
210      return;
211    }
212    strcpy(home_path, home_dir);
213    Arguments::set_java_home(home_path);
214    FREE_C_HEAP_ARRAY(char, home_path);
215
216    dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1,
217                                mtInternal);
218    if (dll_path == NULL) {
219      return;
220    }
221    strcpy(dll_path, home_dir);
222    strcat(dll_path, bin);
223    Arguments::set_dll_dir(dll_path);
224    FREE_C_HEAP_ARRAY(char, dll_path);
225
226    if (!set_boot_path('\\', ';')) {
227      return;
228    }
229  }
230
231// library_path
232#define EXT_DIR "\\lib\\ext"
233#define BIN_DIR "\\bin"
234#define PACKAGE_DIR "\\Sun\\Java"
235  {
236    // Win32 library search order (See the documentation for LoadLibrary):
237    //
238    // 1. The directory from which application is loaded.
239    // 2. The system wide Java Extensions directory (Java only)
240    // 3. System directory (GetSystemDirectory)
241    // 4. Windows directory (GetWindowsDirectory)
242    // 5. The PATH environment variable
243    // 6. The current directory
244
245    char *library_path;
246    char tmp[MAX_PATH];
247    char *path_str = ::getenv("PATH");
248
249    library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) +
250                                    sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10, mtInternal);
251
252    library_path[0] = '\0';
253
254    GetModuleFileName(NULL, tmp, sizeof(tmp));
255    *(strrchr(tmp, '\\')) = '\0';
256    strcat(library_path, tmp);
257
258    GetWindowsDirectory(tmp, sizeof(tmp));
259    strcat(library_path, ";");
260    strcat(library_path, tmp);
261    strcat(library_path, PACKAGE_DIR BIN_DIR);
262
263    GetSystemDirectory(tmp, sizeof(tmp));
264    strcat(library_path, ";");
265    strcat(library_path, tmp);
266
267    GetWindowsDirectory(tmp, sizeof(tmp));
268    strcat(library_path, ";");
269    strcat(library_path, tmp);
270
271    if (path_str) {
272      strcat(library_path, ";");
273      strcat(library_path, path_str);
274    }
275
276    strcat(library_path, ";.");
277
278    Arguments::set_library_path(library_path);
279    FREE_C_HEAP_ARRAY(char, library_path);
280  }
281
282  // Default extensions directory
283  {
284    char path[MAX_PATH];
285    char buf[2 * MAX_PATH + 2 * sizeof(EXT_DIR) + sizeof(PACKAGE_DIR) + 1];
286    GetWindowsDirectory(path, MAX_PATH);
287    sprintf(buf, "%s%s;%s%s%s", Arguments::get_java_home(), EXT_DIR,
288            path, PACKAGE_DIR, EXT_DIR);
289    Arguments::set_ext_dirs(buf);
290  }
291  #undef EXT_DIR
292  #undef BIN_DIR
293  #undef PACKAGE_DIR
294
295#ifndef _WIN64
296  // set our UnhandledExceptionFilter and save any previous one
297  prev_uef_handler = SetUnhandledExceptionFilter(Handle_FLT_Exception);
298#endif
299
300  // Done
301  return;
302}
303
304void os::breakpoint() {
305  DebugBreak();
306}
307
308// Invoked from the BREAKPOINT Macro
309extern "C" void breakpoint() {
310  os::breakpoint();
311}
312
313// RtlCaptureStackBackTrace Windows API may not exist prior to Windows XP.
314// So far, this method is only used by Native Memory Tracking, which is
315// only supported on Windows XP or later.
316//
317int os::get_native_stack(address* stack, int frames, int toSkip) {
318  int captured = RtlCaptureStackBackTrace(toSkip + 1, frames, (PVOID*)stack, NULL);
319  for (int index = captured; index < frames; index ++) {
320    stack[index] = NULL;
321  }
322  return captured;
323}
324
325
326// os::current_stack_base()
327//
328//   Returns the base of the stack, which is the stack's
329//   starting address.  This function must be called
330//   while running on the stack of the thread being queried.
331
332address os::current_stack_base() {
333  MEMORY_BASIC_INFORMATION minfo;
334  address stack_bottom;
335  size_t stack_size;
336
337  VirtualQuery(&minfo, &minfo, sizeof(minfo));
338  stack_bottom =  (address)minfo.AllocationBase;
339  stack_size = minfo.RegionSize;
340
341  // Add up the sizes of all the regions with the same
342  // AllocationBase.
343  while (1) {
344    VirtualQuery(stack_bottom+stack_size, &minfo, sizeof(minfo));
345    if (stack_bottom == (address)minfo.AllocationBase) {
346      stack_size += minfo.RegionSize;
347    } else {
348      break;
349    }
350  }
351  return stack_bottom + stack_size;
352}
353
354size_t os::current_stack_size() {
355  size_t sz;
356  MEMORY_BASIC_INFORMATION minfo;
357  VirtualQuery(&minfo, &minfo, sizeof(minfo));
358  sz = (size_t)os::current_stack_base() - (size_t)minfo.AllocationBase;
359  return sz;
360}
361
362struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
363  const struct tm* time_struct_ptr = localtime(clock);
364  if (time_struct_ptr != NULL) {
365    *res = *time_struct_ptr;
366    return res;
367  }
368  return NULL;
369}
370
371struct tm* os::gmtime_pd(const time_t* clock, struct tm* res) {
372  const struct tm* time_struct_ptr = gmtime(clock);
373  if (time_struct_ptr != NULL) {
374    *res = *time_struct_ptr;
375    return res;
376  }
377  return NULL;
378}
379
380LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo);
381
382// Thread start routine for all newly created threads
383static unsigned __stdcall thread_native_entry(Thread* thread) {
384  // Try to randomize the cache line index of hot stack frames.
385  // This helps when threads of the same stack traces evict each other's
386  // cache lines. The threads can be either from the same JVM instance, or
387  // from different JVM instances. The benefit is especially true for
388  // processors with hyperthreading technology.
389  static int counter = 0;
390  int pid = os::current_process_id();
391  _alloca(((pid ^ counter++) & 7) * 128);
392
393  thread->initialize_thread_current();
394
395  OSThread* osthr = thread->osthread();
396  assert(osthr->get_state() == RUNNABLE, "invalid os thread state");
397
398  if (UseNUMA) {
399    int lgrp_id = os::numa_get_group_id();
400    if (lgrp_id != -1) {
401      thread->set_lgrp_id(lgrp_id);
402    }
403  }
404
405  // Diagnostic code to investigate JDK-6573254
406  int res = 30115;  // non-java thread
407  if (thread->is_Java_thread()) {
408    res = 20115;    // java thread
409  }
410
411  log_info(os, thread)("Thread is alive (tid: " UINTX_FORMAT ").", os::current_thread_id());
412
413  // Install a win32 structured exception handler around every thread created
414  // by VM, so VM can generate error dump when an exception occurred in non-
415  // Java thread (e.g. VM thread).
416  __try {
417    thread->run();
418  } __except(topLevelExceptionFilter(
419                                     (_EXCEPTION_POINTERS*)_exception_info())) {
420    // Nothing to do.
421  }
422
423  log_info(os, thread)("Thread finished (tid: " UINTX_FORMAT ").", os::current_thread_id());
424
425  // One less thread is executing
426  // When the VMThread gets here, the main thread may have already exited
427  // which frees the CodeHeap containing the Atomic::add code
428  if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) {
429    Atomic::dec_ptr((intptr_t*)&os::win32::_os_thread_count);
430  }
431
432  // If a thread has not deleted itself ("delete this") as part of its
433  // termination sequence, we have to ensure thread-local-storage is
434  // cleared before we actually terminate. No threads should ever be
435  // deleted asynchronously with respect to their termination.
436  if (Thread::current_or_null_safe() != NULL) {
437    assert(Thread::current_or_null_safe() == thread, "current thread is wrong");
438    thread->clear_thread_current();
439  }
440
441  // Thread must not return from exit_process_or_thread(), but if it does,
442  // let it proceed to exit normally
443  return (unsigned)os::win32::exit_process_or_thread(os::win32::EPT_THREAD, res);
444}
445
446static OSThread* create_os_thread(Thread* thread, HANDLE thread_handle,
447                                  int thread_id) {
448  // Allocate the OSThread object
449  OSThread* osthread = new OSThread(NULL, NULL);
450  if (osthread == NULL) return NULL;
451
452  // Initialize support for Java interrupts
453  HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL);
454  if (interrupt_event == NULL) {
455    delete osthread;
456    return NULL;
457  }
458  osthread->set_interrupt_event(interrupt_event);
459
460  // Store info on the Win32 thread into the OSThread
461  osthread->set_thread_handle(thread_handle);
462  osthread->set_thread_id(thread_id);
463
464  if (UseNUMA) {
465    int lgrp_id = os::numa_get_group_id();
466    if (lgrp_id != -1) {
467      thread->set_lgrp_id(lgrp_id);
468    }
469  }
470
471  // Initial thread state is INITIALIZED, not SUSPENDED
472  osthread->set_state(INITIALIZED);
473
474  return osthread;
475}
476
477
478bool os::create_attached_thread(JavaThread* thread) {
479#ifdef ASSERT
480  thread->verify_not_published();
481#endif
482  HANDLE thread_h;
483  if (!DuplicateHandle(main_process, GetCurrentThread(), GetCurrentProcess(),
484                       &thread_h, THREAD_ALL_ACCESS, false, 0)) {
485    fatal("DuplicateHandle failed\n");
486  }
487  OSThread* osthread = create_os_thread(thread, thread_h,
488                                        (int)current_thread_id());
489  if (osthread == NULL) {
490    return false;
491  }
492
493  // Initial thread state is RUNNABLE
494  osthread->set_state(RUNNABLE);
495
496  thread->set_osthread(osthread);
497
498  log_info(os, thread)("Thread attached (tid: " UINTX_FORMAT ").",
499    os::current_thread_id());
500
501  return true;
502}
503
504bool os::create_main_thread(JavaThread* thread) {
505#ifdef ASSERT
506  thread->verify_not_published();
507#endif
508  if (_starting_thread == NULL) {
509    _starting_thread = create_os_thread(thread, main_thread, main_thread_id);
510    if (_starting_thread == NULL) {
511      return false;
512    }
513  }
514
515  // The primordial thread is runnable from the start)
516  _starting_thread->set_state(RUNNABLE);
517
518  thread->set_osthread(_starting_thread);
519  return true;
520}
521
522// Helper function to trace _beginthreadex attributes,
523//  similar to os::Posix::describe_pthread_attr()
524static char* describe_beginthreadex_attributes(char* buf, size_t buflen,
525                                               size_t stacksize, unsigned initflag) {
526  stringStream ss(buf, buflen);
527  if (stacksize == 0) {
528    ss.print("stacksize: default, ");
529  } else {
530    ss.print("stacksize: " SIZE_FORMAT "k, ", stacksize / 1024);
531  }
532  ss.print("flags: ");
533  #define PRINT_FLAG(f) if (initflag & f) ss.print( #f " ");
534  #define ALL(X) \
535    X(CREATE_SUSPENDED) \
536    X(STACK_SIZE_PARAM_IS_A_RESERVATION)
537  ALL(PRINT_FLAG)
538  #undef ALL
539  #undef PRINT_FLAG
540  return buf;
541}
542
543// Allocate and initialize a new OSThread
544bool os::create_thread(Thread* thread, ThreadType thr_type,
545                       size_t stack_size) {
546  unsigned thread_id;
547
548  // Allocate the OSThread object
549  OSThread* osthread = new OSThread(NULL, NULL);
550  if (osthread == NULL) {
551    return false;
552  }
553
554  // Initialize support for Java interrupts
555  HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL);
556  if (interrupt_event == NULL) {
557    delete osthread;
558    return NULL;
559  }
560  osthread->set_interrupt_event(interrupt_event);
561  osthread->set_interrupted(false);
562
563  thread->set_osthread(osthread);
564
565  if (stack_size == 0) {
566    switch (thr_type) {
567    case os::java_thread:
568      // Java threads use ThreadStackSize which default value can be changed with the flag -Xss
569      if (JavaThread::stack_size_at_create() > 0) {
570        stack_size = JavaThread::stack_size_at_create();
571      }
572      break;
573    case os::compiler_thread:
574      if (CompilerThreadStackSize > 0) {
575        stack_size = (size_t)(CompilerThreadStackSize * K);
576        break;
577      } // else fall through:
578        // use VMThreadStackSize if CompilerThreadStackSize is not defined
579    case os::vm_thread:
580    case os::pgc_thread:
581    case os::cgc_thread:
582    case os::watcher_thread:
583      if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
584      break;
585    }
586  }
587
588  // Create the Win32 thread
589  //
590  // Contrary to what MSDN document says, "stack_size" in _beginthreadex()
591  // does not specify stack size. Instead, it specifies the size of
592  // initially committed space. The stack size is determined by
593  // PE header in the executable. If the committed "stack_size" is larger
594  // than default value in the PE header, the stack is rounded up to the
595  // nearest multiple of 1MB. For example if the launcher has default
596  // stack size of 320k, specifying any size less than 320k does not
597  // affect the actual stack size at all, it only affects the initial
598  // commitment. On the other hand, specifying 'stack_size' larger than
599  // default value may cause significant increase in memory usage, because
600  // not only the stack space will be rounded up to MB, but also the
601  // entire space is committed upfront.
602  //
603  // Finally Windows XP added a new flag 'STACK_SIZE_PARAM_IS_A_RESERVATION'
604  // for CreateThread() that can treat 'stack_size' as stack size. However we
605  // are not supposed to call CreateThread() directly according to MSDN
606  // document because JVM uses C runtime library. The good news is that the
607  // flag appears to work with _beginthredex() as well.
608
609  const unsigned initflag = CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION;
610  HANDLE thread_handle =
611    (HANDLE)_beginthreadex(NULL,
612                           (unsigned)stack_size,
613                           (unsigned (__stdcall *)(void*)) thread_native_entry,
614                           thread,
615                           initflag,
616                           &thread_id);
617
618  char buf[64];
619  if (thread_handle != NULL) {
620    log_info(os, thread)("Thread started (tid: %u, attributes: %s)",
621      thread_id, describe_beginthreadex_attributes(buf, sizeof(buf), stack_size, initflag));
622  } else {
623    log_warning(os, thread)("Failed to start thread - _beginthreadex failed (%s) for attributes: %s.",
624      os::errno_name(errno), describe_beginthreadex_attributes(buf, sizeof(buf), stack_size, initflag));
625  }
626
627  if (thread_handle == NULL) {
628    // Need to clean up stuff we've allocated so far
629    CloseHandle(osthread->interrupt_event());
630    thread->set_osthread(NULL);
631    delete osthread;
632    return NULL;
633  }
634
635  Atomic::inc_ptr((intptr_t*)&os::win32::_os_thread_count);
636
637  // Store info on the Win32 thread into the OSThread
638  osthread->set_thread_handle(thread_handle);
639  osthread->set_thread_id(thread_id);
640
641  // Initial thread state is INITIALIZED, not SUSPENDED
642  osthread->set_state(INITIALIZED);
643
644  // The thread is returned suspended (in state INITIALIZED), and is started higher up in the call chain
645  return true;
646}
647
648
649// Free Win32 resources related to the OSThread
650void os::free_thread(OSThread* osthread) {
651  assert(osthread != NULL, "osthread not set");
652
653  // We are told to free resources of the argument thread,
654  // but we can only really operate on the current thread.
655  assert(Thread::current()->osthread() == osthread,
656         "os::free_thread but not current thread");
657
658  CloseHandle(osthread->thread_handle());
659  CloseHandle(osthread->interrupt_event());
660  delete osthread;
661}
662
663static jlong first_filetime;
664static jlong initial_performance_count;
665static jlong performance_frequency;
666
667
668jlong as_long(LARGE_INTEGER x) {
669  jlong result = 0; // initialization to avoid warning
670  set_high(&result, x.HighPart);
671  set_low(&result, x.LowPart);
672  return result;
673}
674
675
676jlong os::elapsed_counter() {
677  LARGE_INTEGER count;
678  QueryPerformanceCounter(&count);
679  return as_long(count) - initial_performance_count;
680}
681
682
683jlong os::elapsed_frequency() {
684  return performance_frequency;
685}
686
687
688julong os::available_memory() {
689  return win32::available_memory();
690}
691
692julong os::win32::available_memory() {
693  // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect
694  // value if total memory is larger than 4GB
695  MEMORYSTATUSEX ms;
696  ms.dwLength = sizeof(ms);
697  GlobalMemoryStatusEx(&ms);
698
699  return (julong)ms.ullAvailPhys;
700}
701
702julong os::physical_memory() {
703  return win32::physical_memory();
704}
705
706bool os::has_allocatable_memory_limit(julong* limit) {
707  MEMORYSTATUSEX ms;
708  ms.dwLength = sizeof(ms);
709  GlobalMemoryStatusEx(&ms);
710#ifdef _LP64
711  *limit = (julong)ms.ullAvailVirtual;
712  return true;
713#else
714  // Limit to 1400m because of the 2gb address space wall
715  *limit = MIN2((julong)1400*M, (julong)ms.ullAvailVirtual);
716  return true;
717#endif
718}
719
720int os::active_processor_count() {
721  DWORD_PTR lpProcessAffinityMask = 0;
722  DWORD_PTR lpSystemAffinityMask = 0;
723  int proc_count = processor_count();
724  if (proc_count <= sizeof(UINT_PTR) * BitsPerByte &&
725      GetProcessAffinityMask(GetCurrentProcess(), &lpProcessAffinityMask, &lpSystemAffinityMask)) {
726    // Nof active processors is number of bits in process affinity mask
727    int bitcount = 0;
728    while (lpProcessAffinityMask != 0) {
729      lpProcessAffinityMask = lpProcessAffinityMask & (lpProcessAffinityMask-1);
730      bitcount++;
731    }
732    return bitcount;
733  } else {
734    return proc_count;
735  }
736}
737
738void os::set_native_thread_name(const char *name) {
739
740  // See: http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
741  //
742  // Note that unfortunately this only works if the process
743  // is already attached to a debugger; debugger must observe
744  // the exception below to show the correct name.
745
746  // If there is no debugger attached skip raising the exception
747  if (!IsDebuggerPresent()) {
748    return;
749  }
750
751  const DWORD MS_VC_EXCEPTION = 0x406D1388;
752  struct {
753    DWORD dwType;     // must be 0x1000
754    LPCSTR szName;    // pointer to name (in user addr space)
755    DWORD dwThreadID; // thread ID (-1=caller thread)
756    DWORD dwFlags;    // reserved for future use, must be zero
757  } info;
758
759  info.dwType = 0x1000;
760  info.szName = name;
761  info.dwThreadID = -1;
762  info.dwFlags = 0;
763
764  __try {
765    RaiseException (MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(DWORD), (const ULONG_PTR*)&info );
766  } __except(EXCEPTION_EXECUTE_HANDLER) {}
767}
768
769bool os::distribute_processes(uint length, uint* distribution) {
770  // Not yet implemented.
771  return false;
772}
773
774bool os::bind_to_processor(uint processor_id) {
775  // Not yet implemented.
776  return false;
777}
778
779void os::win32::initialize_performance_counter() {
780  LARGE_INTEGER count;
781  QueryPerformanceFrequency(&count);
782  performance_frequency = as_long(count);
783  QueryPerformanceCounter(&count);
784  initial_performance_count = as_long(count);
785}
786
787
788double os::elapsedTime() {
789  return (double) elapsed_counter() / (double) elapsed_frequency();
790}
791
792
793// Windows format:
794//   The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601.
795// Java format:
796//   Java standards require the number of milliseconds since 1/1/1970
797
798// Constant offset - calculated using offset()
799static jlong  _offset   = 116444736000000000;
800// Fake time counter for reproducible results when debugging
801static jlong  fake_time = 0;
802
803#ifdef ASSERT
804// Just to be safe, recalculate the offset in debug mode
805static jlong _calculated_offset = 0;
806static int   _has_calculated_offset = 0;
807
808jlong offset() {
809  if (_has_calculated_offset) return _calculated_offset;
810  SYSTEMTIME java_origin;
811  java_origin.wYear          = 1970;
812  java_origin.wMonth         = 1;
813  java_origin.wDayOfWeek     = 0; // ignored
814  java_origin.wDay           = 1;
815  java_origin.wHour          = 0;
816  java_origin.wMinute        = 0;
817  java_origin.wSecond        = 0;
818  java_origin.wMilliseconds  = 0;
819  FILETIME jot;
820  if (!SystemTimeToFileTime(&java_origin, &jot)) {
821    fatal("Error = %d\nWindows error", GetLastError());
822  }
823  _calculated_offset = jlong_from(jot.dwHighDateTime, jot.dwLowDateTime);
824  _has_calculated_offset = 1;
825  assert(_calculated_offset == _offset, "Calculated and constant time offsets must be equal");
826  return _calculated_offset;
827}
828#else
829jlong offset() {
830  return _offset;
831}
832#endif
833
834jlong windows_to_java_time(FILETIME wt) {
835  jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
836  return (a - offset()) / 10000;
837}
838
839// Returns time ticks in (10th of micro seconds)
840jlong windows_to_time_ticks(FILETIME wt) {
841  jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
842  return (a - offset());
843}
844
845FILETIME java_to_windows_time(jlong l) {
846  jlong a = (l * 10000) + offset();
847  FILETIME result;
848  result.dwHighDateTime = high(a);
849  result.dwLowDateTime  = low(a);
850  return result;
851}
852
853bool os::supports_vtime() { return true; }
854bool os::enable_vtime() { return false; }
855bool os::vtime_enabled() { return false; }
856
857double os::elapsedVTime() {
858  FILETIME created;
859  FILETIME exited;
860  FILETIME kernel;
861  FILETIME user;
862  if (GetThreadTimes(GetCurrentThread(), &created, &exited, &kernel, &user) != 0) {
863    // the resolution of windows_to_java_time() should be sufficient (ms)
864    return (double) (windows_to_java_time(kernel) + windows_to_java_time(user)) / MILLIUNITS;
865  } else {
866    return elapsedTime();
867  }
868}
869
870jlong os::javaTimeMillis() {
871  if (UseFakeTimers) {
872    return fake_time++;
873  } else {
874    FILETIME wt;
875    GetSystemTimeAsFileTime(&wt);
876    return windows_to_java_time(wt);
877  }
878}
879
880void os::javaTimeSystemUTC(jlong &seconds, jlong &nanos) {
881  FILETIME wt;
882  GetSystemTimeAsFileTime(&wt);
883  jlong ticks = windows_to_time_ticks(wt); // 10th of micros
884  jlong secs = jlong(ticks / 10000000); // 10000 * 1000
885  seconds = secs;
886  nanos = jlong(ticks - (secs*10000000)) * 100;
887}
888
889jlong os::javaTimeNanos() {
890    LARGE_INTEGER current_count;
891    QueryPerformanceCounter(&current_count);
892    double current = as_long(current_count);
893    double freq = performance_frequency;
894    jlong time = (jlong)((current/freq) * NANOSECS_PER_SEC);
895    return time;
896}
897
898void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
899  jlong freq = performance_frequency;
900  if (freq < NANOSECS_PER_SEC) {
901    // the performance counter is 64 bits and we will
902    // be multiplying it -- so no wrap in 64 bits
903    info_ptr->max_value = ALL_64_BITS;
904  } else if (freq > NANOSECS_PER_SEC) {
905    // use the max value the counter can reach to
906    // determine the max value which could be returned
907    julong max_counter = (julong)ALL_64_BITS;
908    info_ptr->max_value = (jlong)(max_counter / (freq / NANOSECS_PER_SEC));
909  } else {
910    // the performance counter is 64 bits and we will
911    // be using it directly -- so no wrap in 64 bits
912    info_ptr->max_value = ALL_64_BITS;
913  }
914
915  // using a counter, so no skipping
916  info_ptr->may_skip_backward = false;
917  info_ptr->may_skip_forward = false;
918
919  info_ptr->kind = JVMTI_TIMER_ELAPSED;                // elapsed not CPU time
920}
921
922char* os::local_time_string(char *buf, size_t buflen) {
923  SYSTEMTIME st;
924  GetLocalTime(&st);
925  jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
926               st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
927  return buf;
928}
929
930bool os::getTimesSecs(double* process_real_time,
931                      double* process_user_time,
932                      double* process_system_time) {
933  HANDLE h_process = GetCurrentProcess();
934  FILETIME create_time, exit_time, kernel_time, user_time;
935  BOOL result = GetProcessTimes(h_process,
936                                &create_time,
937                                &exit_time,
938                                &kernel_time,
939                                &user_time);
940  if (result != 0) {
941    FILETIME wt;
942    GetSystemTimeAsFileTime(&wt);
943    jlong rtc_millis = windows_to_java_time(wt);
944    *process_real_time = ((double) rtc_millis) / ((double) MILLIUNITS);
945    *process_user_time =
946      (double) jlong_from(user_time.dwHighDateTime, user_time.dwLowDateTime) / (10 * MICROUNITS);
947    *process_system_time =
948      (double) jlong_from(kernel_time.dwHighDateTime, kernel_time.dwLowDateTime) / (10 * MICROUNITS);
949    return true;
950  } else {
951    return false;
952  }
953}
954
955void os::shutdown() {
956  // allow PerfMemory to attempt cleanup of any persistent resources
957  perfMemory_exit();
958
959  // flush buffered output, finish log files
960  ostream_abort();
961
962  // Check for abort hook
963  abort_hook_t abort_hook = Arguments::abort_hook();
964  if (abort_hook != NULL) {
965    abort_hook();
966  }
967}
968
969
970static BOOL (WINAPI *_MiniDumpWriteDump)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE,
971                                         PMINIDUMP_EXCEPTION_INFORMATION,
972                                         PMINIDUMP_USER_STREAM_INFORMATION,
973                                         PMINIDUMP_CALLBACK_INFORMATION);
974
975static HANDLE dumpFile = NULL;
976
977// Check if dump file can be created.
978void os::check_dump_limit(char* buffer, size_t buffsz) {
979  bool status = true;
980  if (!FLAG_IS_DEFAULT(CreateCoredumpOnCrash) && !CreateCoredumpOnCrash) {
981    jio_snprintf(buffer, buffsz, "CreateCoredumpOnCrash is disabled from command line");
982    status = false;
983  }
984
985#ifndef ASSERT
986  if (!os::win32::is_windows_server() && FLAG_IS_DEFAULT(CreateCoredumpOnCrash)) {
987    jio_snprintf(buffer, buffsz, "Minidumps are not enabled by default on client versions of Windows");
988    status = false;
989  }
990#endif
991
992  if (status) {
993    const char* cwd = get_current_directory(NULL, 0);
994    int pid = current_process_id();
995    if (cwd != NULL) {
996      jio_snprintf(buffer, buffsz, "%s\\hs_err_pid%u.mdmp", cwd, pid);
997    } else {
998      jio_snprintf(buffer, buffsz, ".\\hs_err_pid%u.mdmp", pid);
999    }
1000
1001    if (dumpFile == NULL &&
1002       (dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL))
1003                 == INVALID_HANDLE_VALUE) {
1004      jio_snprintf(buffer, buffsz, "Failed to create minidump file (0x%x).", GetLastError());
1005      status = false;
1006    }
1007  }
1008  VMError::record_coredump_status(buffer, status);
1009}
1010
1011void os::abort(bool dump_core, void* siginfo, const void* context) {
1012  HINSTANCE dbghelp;
1013  EXCEPTION_POINTERS ep;
1014  MINIDUMP_EXCEPTION_INFORMATION mei;
1015  MINIDUMP_EXCEPTION_INFORMATION* pmei;
1016
1017  HANDLE hProcess = GetCurrentProcess();
1018  DWORD processId = GetCurrentProcessId();
1019  MINIDUMP_TYPE dumpType;
1020
1021  shutdown();
1022  if (!dump_core || dumpFile == NULL) {
1023    if (dumpFile != NULL) {
1024      CloseHandle(dumpFile);
1025    }
1026    win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
1027  }
1028
1029  dbghelp = os::win32::load_Windows_dll("DBGHELP.DLL", NULL, 0);
1030
1031  if (dbghelp == NULL) {
1032    jio_fprintf(stderr, "Failed to load dbghelp.dll\n");
1033    CloseHandle(dumpFile);
1034    win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
1035  }
1036
1037  _MiniDumpWriteDump =
1038      CAST_TO_FN_PTR(BOOL(WINAPI *)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE,
1039                                    PMINIDUMP_EXCEPTION_INFORMATION,
1040                                    PMINIDUMP_USER_STREAM_INFORMATION,
1041                                    PMINIDUMP_CALLBACK_INFORMATION),
1042                                    GetProcAddress(dbghelp,
1043                                    "MiniDumpWriteDump"));
1044
1045  if (_MiniDumpWriteDump == NULL) {
1046    jio_fprintf(stderr, "Failed to find MiniDumpWriteDump() in module dbghelp.dll.\n");
1047    CloseHandle(dumpFile);
1048    win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
1049  }
1050
1051  dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData |
1052    MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules);
1053
1054  if (siginfo != NULL && context != NULL) {
1055    ep.ContextRecord = (PCONTEXT) context;
1056    ep.ExceptionRecord = (PEXCEPTION_RECORD) siginfo;
1057
1058    mei.ThreadId = GetCurrentThreadId();
1059    mei.ExceptionPointers = &ep;
1060    pmei = &mei;
1061  } else {
1062    pmei = NULL;
1063  }
1064
1065  // Older versions of dbghelp.dll (the one shipped with Win2003 for example) may not support all
1066  // the dump types we really want. If first call fails, lets fall back to just use MiniDumpWithFullMemory then.
1067  if (_MiniDumpWriteDump(hProcess, processId, dumpFile, dumpType, pmei, NULL, NULL) == false &&
1068      _MiniDumpWriteDump(hProcess, processId, dumpFile, (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, NULL, NULL) == false) {
1069    jio_fprintf(stderr, "Call to MiniDumpWriteDump() failed (Error 0x%x)\n", GetLastError());
1070  }
1071  CloseHandle(dumpFile);
1072  win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
1073}
1074
1075// Die immediately, no exit hook, no abort hook, no cleanup.
1076void os::die() {
1077  win32::exit_process_or_thread(win32::EPT_PROCESS_DIE, -1);
1078}
1079
1080// Directory routines copied from src/win32/native/java/io/dirent_md.c
1081//  * dirent_md.c       1.15 00/02/02
1082//
1083// The declarations for DIR and struct dirent are in jvm_win32.h.
1084
1085// Caller must have already run dirname through JVM_NativePath, which removes
1086// duplicate slashes and converts all instances of '/' into '\\'.
1087
1088DIR * os::opendir(const char *dirname) {
1089  assert(dirname != NULL, "just checking");   // hotspot change
1090  DIR *dirp = (DIR *)malloc(sizeof(DIR), mtInternal);
1091  DWORD fattr;                                // hotspot change
1092  char alt_dirname[4] = { 0, 0, 0, 0 };
1093
1094  if (dirp == 0) {
1095    errno = ENOMEM;
1096    return 0;
1097  }
1098
1099  // Win32 accepts "\" in its POSIX stat(), but refuses to treat it
1100  // as a directory in FindFirstFile().  We detect this case here and
1101  // prepend the current drive name.
1102  //
1103  if (dirname[1] == '\0' && dirname[0] == '\\') {
1104    alt_dirname[0] = _getdrive() + 'A' - 1;
1105    alt_dirname[1] = ':';
1106    alt_dirname[2] = '\\';
1107    alt_dirname[3] = '\0';
1108    dirname = alt_dirname;
1109  }
1110
1111  dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal);
1112  if (dirp->path == 0) {
1113    free(dirp);
1114    errno = ENOMEM;
1115    return 0;
1116  }
1117  strcpy(dirp->path, dirname);
1118
1119  fattr = GetFileAttributes(dirp->path);
1120  if (fattr == 0xffffffff) {
1121    free(dirp->path);
1122    free(dirp);
1123    errno = ENOENT;
1124    return 0;
1125  } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
1126    free(dirp->path);
1127    free(dirp);
1128    errno = ENOTDIR;
1129    return 0;
1130  }
1131
1132  // Append "*.*", or possibly "\\*.*", to path
1133  if (dirp->path[1] == ':' &&
1134      (dirp->path[2] == '\0' ||
1135      (dirp->path[2] == '\\' && dirp->path[3] == '\0'))) {
1136    // No '\\' needed for cases like "Z:" or "Z:\"
1137    strcat(dirp->path, "*.*");
1138  } else {
1139    strcat(dirp->path, "\\*.*");
1140  }
1141
1142  dirp->handle = FindFirstFile(dirp->path, &dirp->find_data);
1143  if (dirp->handle == INVALID_HANDLE_VALUE) {
1144    if (GetLastError() != ERROR_FILE_NOT_FOUND) {
1145      free(dirp->path);
1146      free(dirp);
1147      errno = EACCES;
1148      return 0;
1149    }
1150  }
1151  return dirp;
1152}
1153
1154// parameter dbuf unused on Windows
1155struct dirent * os::readdir(DIR *dirp, dirent *dbuf) {
1156  assert(dirp != NULL, "just checking");      // hotspot change
1157  if (dirp->handle == INVALID_HANDLE_VALUE) {
1158    return 0;
1159  }
1160
1161  strcpy(dirp->dirent.d_name, dirp->find_data.cFileName);
1162
1163  if (!FindNextFile(dirp->handle, &dirp->find_data)) {
1164    if (GetLastError() == ERROR_INVALID_HANDLE) {
1165      errno = EBADF;
1166      return 0;
1167    }
1168    FindClose(dirp->handle);
1169    dirp->handle = INVALID_HANDLE_VALUE;
1170  }
1171
1172  return &dirp->dirent;
1173}
1174
1175int os::closedir(DIR *dirp) {
1176  assert(dirp != NULL, "just checking");      // hotspot change
1177  if (dirp->handle != INVALID_HANDLE_VALUE) {
1178    if (!FindClose(dirp->handle)) {
1179      errno = EBADF;
1180      return -1;
1181    }
1182    dirp->handle = INVALID_HANDLE_VALUE;
1183  }
1184  free(dirp->path);
1185  free(dirp);
1186  return 0;
1187}
1188
1189// This must be hard coded because it's the system's temporary
1190// directory not the java application's temp directory, ala java.io.tmpdir.
1191const char* os::get_temp_directory() {
1192  static char path_buf[MAX_PATH];
1193  if (GetTempPath(MAX_PATH, path_buf) > 0) {
1194    return path_buf;
1195  } else {
1196    path_buf[0] = '\0';
1197    return path_buf;
1198  }
1199}
1200
1201static bool file_exists(const char* filename) {
1202  if (filename == NULL || strlen(filename) == 0) {
1203    return false;
1204  }
1205  return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES;
1206}
1207
1208bool os::dll_build_name(char *buffer, size_t buflen,
1209                        const char* pname, const char* fname) {
1210  bool retval = false;
1211  const size_t pnamelen = pname ? strlen(pname) : 0;
1212  const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0;
1213
1214  // Return error on buffer overflow.
1215  if (pnamelen + strlen(fname) + 10 > buflen) {
1216    return retval;
1217  }
1218
1219  if (pnamelen == 0) {
1220    jio_snprintf(buffer, buflen, "%s.dll", fname);
1221    retval = true;
1222  } else if (c == ':' || c == '\\') {
1223    jio_snprintf(buffer, buflen, "%s%s.dll", pname, fname);
1224    retval = true;
1225  } else if (strchr(pname, *os::path_separator()) != NULL) {
1226    int n;
1227    char** pelements = split_path(pname, &n);
1228    if (pelements == NULL) {
1229      return false;
1230    }
1231    for (int i = 0; i < n; i++) {
1232      char* path = pelements[i];
1233      // Really shouldn't be NULL, but check can't hurt
1234      size_t plen = (path == NULL) ? 0 : strlen(path);
1235      if (plen == 0) {
1236        continue; // skip the empty path values
1237      }
1238      const char lastchar = path[plen - 1];
1239      if (lastchar == ':' || lastchar == '\\') {
1240        jio_snprintf(buffer, buflen, "%s%s.dll", path, fname);
1241      } else {
1242        jio_snprintf(buffer, buflen, "%s\\%s.dll", path, fname);
1243      }
1244      if (file_exists(buffer)) {
1245        retval = true;
1246        break;
1247      }
1248    }
1249    // release the storage
1250    for (int i = 0; i < n; i++) {
1251      if (pelements[i] != NULL) {
1252        FREE_C_HEAP_ARRAY(char, pelements[i]);
1253      }
1254    }
1255    if (pelements != NULL) {
1256      FREE_C_HEAP_ARRAY(char*, pelements);
1257    }
1258  } else {
1259    jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname);
1260    retval = true;
1261  }
1262  return retval;
1263}
1264
1265// Needs to be in os specific directory because windows requires another
1266// header file <direct.h>
1267const char* os::get_current_directory(char *buf, size_t buflen) {
1268  int n = static_cast<int>(buflen);
1269  if (buflen > INT_MAX)  n = INT_MAX;
1270  return _getcwd(buf, n);
1271}
1272
1273//-----------------------------------------------------------
1274// Helper functions for fatal error handler
1275#ifdef _WIN64
1276// Helper routine which returns true if address in
1277// within the NTDLL address space.
1278//
1279static bool _addr_in_ntdll(address addr) {
1280  HMODULE hmod;
1281  MODULEINFO minfo;
1282
1283  hmod = GetModuleHandle("NTDLL.DLL");
1284  if (hmod == NULL) return false;
1285  if (!GetModuleInformation(GetCurrentProcess(), hmod,
1286                                          &minfo, sizeof(MODULEINFO))) {
1287    return false;
1288  }
1289
1290  if ((addr >= minfo.lpBaseOfDll) &&
1291      (addr < (address)((uintptr_t)minfo.lpBaseOfDll + (uintptr_t)minfo.SizeOfImage))) {
1292    return true;
1293  } else {
1294    return false;
1295  }
1296}
1297#endif
1298
1299struct _modinfo {
1300  address addr;
1301  char*   full_path;   // point to a char buffer
1302  int     buflen;      // size of the buffer
1303  address base_addr;
1304};
1305
1306static int _locate_module_by_addr(const char * mod_fname, address base_addr,
1307                                  address top_address, void * param) {
1308  struct _modinfo *pmod = (struct _modinfo *)param;
1309  if (!pmod) return -1;
1310
1311  if (base_addr   <= pmod->addr &&
1312      top_address > pmod->addr) {
1313    // if a buffer is provided, copy path name to the buffer
1314    if (pmod->full_path) {
1315      jio_snprintf(pmod->full_path, pmod->buflen, "%s", mod_fname);
1316    }
1317    pmod->base_addr = base_addr;
1318    return 1;
1319  }
1320  return 0;
1321}
1322
1323bool os::dll_address_to_library_name(address addr, char* buf,
1324                                     int buflen, int* offset) {
1325  // buf is not optional, but offset is optional
1326  assert(buf != NULL, "sanity check");
1327
1328// NOTE: the reason we don't use SymGetModuleInfo() is it doesn't always
1329//       return the full path to the DLL file, sometimes it returns path
1330//       to the corresponding PDB file (debug info); sometimes it only
1331//       returns partial path, which makes life painful.
1332
1333  struct _modinfo mi;
1334  mi.addr      = addr;
1335  mi.full_path = buf;
1336  mi.buflen    = buflen;
1337  if (get_loaded_modules_info(_locate_module_by_addr, (void *)&mi)) {
1338    // buf already contains path name
1339    if (offset) *offset = addr - mi.base_addr;
1340    return true;
1341  }
1342
1343  buf[0] = '\0';
1344  if (offset) *offset = -1;
1345  return false;
1346}
1347
1348bool os::dll_address_to_function_name(address addr, char *buf,
1349                                      int buflen, int *offset,
1350                                      bool demangle) {
1351  // buf is not optional, but offset is optional
1352  assert(buf != NULL, "sanity check");
1353
1354  if (Decoder::decode(addr, buf, buflen, offset, demangle)) {
1355    return true;
1356  }
1357  if (offset != NULL)  *offset  = -1;
1358  buf[0] = '\0';
1359  return false;
1360}
1361
1362// save the start and end address of jvm.dll into param[0] and param[1]
1363static int _locate_jvm_dll(const char* mod_fname, address base_addr,
1364                           address top_address, void * param) {
1365  if (!param) return -1;
1366
1367  if (base_addr   <= (address)_locate_jvm_dll &&
1368      top_address > (address)_locate_jvm_dll) {
1369    ((address*)param)[0] = base_addr;
1370    ((address*)param)[1] = top_address;
1371    return 1;
1372  }
1373  return 0;
1374}
1375
1376address vm_lib_location[2];    // start and end address of jvm.dll
1377
1378// check if addr is inside jvm.dll
1379bool os::address_is_in_vm(address addr) {
1380  if (!vm_lib_location[0] || !vm_lib_location[1]) {
1381    if (!get_loaded_modules_info(_locate_jvm_dll, (void *)vm_lib_location)) {
1382      assert(false, "Can't find jvm module.");
1383      return false;
1384    }
1385  }
1386
1387  return (vm_lib_location[0] <= addr) && (addr < vm_lib_location[1]);
1388}
1389
1390// print module info; param is outputStream*
1391static int _print_module(const char* fname, address base_address,
1392                         address top_address, void* param) {
1393  if (!param) return -1;
1394
1395  outputStream* st = (outputStream*)param;
1396
1397  st->print(PTR_FORMAT " - " PTR_FORMAT " \t%s\n", base_address, top_address, fname);
1398  return 0;
1399}
1400
1401// Loads .dll/.so and
1402// in case of error it checks if .dll/.so was built for the
1403// same architecture as Hotspot is running on
1404void * os::dll_load(const char *name, char *ebuf, int ebuflen) {
1405  void * result = LoadLibrary(name);
1406  if (result != NULL) {
1407    return result;
1408  }
1409
1410  DWORD errcode = GetLastError();
1411  if (errcode == ERROR_MOD_NOT_FOUND) {
1412    strncpy(ebuf, "Can't find dependent libraries", ebuflen - 1);
1413    ebuf[ebuflen - 1] = '\0';
1414    return NULL;
1415  }
1416
1417  // Parsing dll below
1418  // If we can read dll-info and find that dll was built
1419  // for an architecture other than Hotspot is running in
1420  // - then print to buffer "DLL was built for a different architecture"
1421  // else call os::lasterror to obtain system error message
1422
1423  // Read system error message into ebuf
1424  // It may or may not be overwritten below (in the for loop and just above)
1425  lasterror(ebuf, (size_t) ebuflen);
1426  ebuf[ebuflen - 1] = '\0';
1427  int fd = ::open(name, O_RDONLY | O_BINARY, 0);
1428  if (fd < 0) {
1429    return NULL;
1430  }
1431
1432  uint32_t signature_offset;
1433  uint16_t lib_arch = 0;
1434  bool failed_to_get_lib_arch =
1435    ( // Go to position 3c in the dll
1436     (os::seek_to_file_offset(fd, IMAGE_FILE_PTR_TO_SIGNATURE) < 0)
1437     ||
1438     // Read location of signature
1439     (sizeof(signature_offset) !=
1440     (os::read(fd, (void*)&signature_offset, sizeof(signature_offset))))
1441     ||
1442     // Go to COFF File Header in dll
1443     // that is located after "signature" (4 bytes long)
1444     (os::seek_to_file_offset(fd,
1445     signature_offset + IMAGE_FILE_SIGNATURE_LENGTH) < 0)
1446     ||
1447     // Read field that contains code of architecture
1448     // that dll was built for
1449     (sizeof(lib_arch) != (os::read(fd, (void*)&lib_arch, sizeof(lib_arch))))
1450    );
1451
1452  ::close(fd);
1453  if (failed_to_get_lib_arch) {
1454    // file i/o error - report os::lasterror(...) msg
1455    return NULL;
1456  }
1457
1458  typedef struct {
1459    uint16_t arch_code;
1460    char* arch_name;
1461  } arch_t;
1462
1463  static const arch_t arch_array[] = {
1464    {IMAGE_FILE_MACHINE_I386,      (char*)"IA 32"},
1465    {IMAGE_FILE_MACHINE_AMD64,     (char*)"AMD 64"}
1466  };
1467#if (defined _M_AMD64)
1468  static const uint16_t running_arch = IMAGE_FILE_MACHINE_AMD64;
1469#elif (defined _M_IX86)
1470  static const uint16_t running_arch = IMAGE_FILE_MACHINE_I386;
1471#else
1472  #error Method os::dll_load requires that one of following \
1473         is defined :_M_AMD64 or _M_IX86
1474#endif
1475
1476
1477  // Obtain a string for printf operation
1478  // lib_arch_str shall contain string what platform this .dll was built for
1479  // running_arch_str shall string contain what platform Hotspot was built for
1480  char *running_arch_str = NULL, *lib_arch_str = NULL;
1481  for (unsigned int i = 0; i < ARRAY_SIZE(arch_array); i++) {
1482    if (lib_arch == arch_array[i].arch_code) {
1483      lib_arch_str = arch_array[i].arch_name;
1484    }
1485    if (running_arch == arch_array[i].arch_code) {
1486      running_arch_str = arch_array[i].arch_name;
1487    }
1488  }
1489
1490  assert(running_arch_str,
1491         "Didn't find running architecture code in arch_array");
1492
1493  // If the architecture is right
1494  // but some other error took place - report os::lasterror(...) msg
1495  if (lib_arch == running_arch) {
1496    return NULL;
1497  }
1498
1499  if (lib_arch_str != NULL) {
1500    ::_snprintf(ebuf, ebuflen - 1,
1501                "Can't load %s-bit .dll on a %s-bit platform",
1502                lib_arch_str, running_arch_str);
1503  } else {
1504    // don't know what architecture this dll was build for
1505    ::_snprintf(ebuf, ebuflen - 1,
1506                "Can't load this .dll (machine code=0x%x) on a %s-bit platform",
1507                lib_arch, running_arch_str);
1508  }
1509
1510  return NULL;
1511}
1512
1513void os::print_dll_info(outputStream *st) {
1514  st->print_cr("Dynamic libraries:");
1515  get_loaded_modules_info(_print_module, (void *)st);
1516}
1517
1518int os::get_loaded_modules_info(os::LoadedModulesCallbackFunc callback, void *param) {
1519  HANDLE   hProcess;
1520
1521# define MAX_NUM_MODULES 128
1522  HMODULE     modules[MAX_NUM_MODULES];
1523  static char filename[MAX_PATH];
1524  int         result = 0;
1525
1526  int pid = os::current_process_id();
1527  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
1528                         FALSE, pid);
1529  if (hProcess == NULL) return 0;
1530
1531  DWORD size_needed;
1532  if (!EnumProcessModules(hProcess, modules, sizeof(modules), &size_needed)) {
1533    CloseHandle(hProcess);
1534    return 0;
1535  }
1536
1537  // number of modules that are currently loaded
1538  int num_modules = size_needed / sizeof(HMODULE);
1539
1540  for (int i = 0; i < MIN2(num_modules, MAX_NUM_MODULES); i++) {
1541    // Get Full pathname:
1542    if (!GetModuleFileNameEx(hProcess, modules[i], filename, sizeof(filename))) {
1543      filename[0] = '\0';
1544    }
1545
1546    MODULEINFO modinfo;
1547    if (!GetModuleInformation(hProcess, modules[i], &modinfo, sizeof(modinfo))) {
1548      modinfo.lpBaseOfDll = NULL;
1549      modinfo.SizeOfImage = 0;
1550    }
1551
1552    // Invoke callback function
1553    result = callback(filename, (address)modinfo.lpBaseOfDll,
1554                      (address)((u8)modinfo.lpBaseOfDll + (u8)modinfo.SizeOfImage), param);
1555    if (result) break;
1556  }
1557
1558  CloseHandle(hProcess);
1559  return result;
1560}
1561
1562bool os::get_host_name(char* buf, size_t buflen) {
1563  DWORD size = (DWORD)buflen;
1564  return (GetComputerNameEx(ComputerNameDnsHostname, buf, &size) == TRUE);
1565}
1566
1567void os::get_summary_os_info(char* buf, size_t buflen) {
1568  stringStream sst(buf, buflen);
1569  os::win32::print_windows_version(&sst);
1570  // chop off newline character
1571  char* nl = strchr(buf, '\n');
1572  if (nl != NULL) *nl = '\0';
1573}
1574
1575int os::log_vsnprintf(char* buf, size_t len, const char* fmt, va_list args) {
1576  int ret = vsnprintf(buf, len, fmt, args);
1577  // Get the correct buffer size if buf is too small
1578  if (ret < 0) {
1579    return _vscprintf(fmt, args);
1580  }
1581  return ret;
1582}
1583
1584static inline time_t get_mtime(const char* filename) {
1585  struct stat st;
1586  int ret = os::stat(filename, &st);
1587  assert(ret == 0, "failed to stat() file '%s': %s", filename, strerror(errno));
1588  return st.st_mtime;
1589}
1590
1591int os::compare_file_modified_times(const char* file1, const char* file2) {
1592  time_t t1 = get_mtime(file1);
1593  time_t t2 = get_mtime(file2);
1594  return t1 - t2;
1595}
1596
1597void os::print_os_info_brief(outputStream* st) {
1598  os::print_os_info(st);
1599}
1600
1601void os::print_os_info(outputStream* st) {
1602#ifdef ASSERT
1603  char buffer[1024];
1604  st->print("HostName: ");
1605  if (get_host_name(buffer, sizeof(buffer))) {
1606    st->print("%s ", buffer);
1607  } else {
1608    st->print("N/A ");
1609  }
1610#endif
1611  st->print("OS:");
1612  os::win32::print_windows_version(st);
1613}
1614
1615void os::win32::print_windows_version(outputStream* st) {
1616  OSVERSIONINFOEX osvi;
1617  VS_FIXEDFILEINFO *file_info;
1618  TCHAR kernel32_path[MAX_PATH];
1619  UINT len, ret;
1620
1621  // Use the GetVersionEx information to see if we're on a server or
1622  // workstation edition of Windows. Starting with Windows 8.1 we can't
1623  // trust the OS version information returned by this API.
1624  ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
1625  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1626  if (!GetVersionEx((OSVERSIONINFO *)&osvi)) {
1627    st->print_cr("Call to GetVersionEx failed");
1628    return;
1629  }
1630  bool is_workstation = (osvi.wProductType == VER_NT_WORKSTATION);
1631
1632  // Get the full path to \Windows\System32\kernel32.dll and use that for
1633  // determining what version of Windows we're running on.
1634  len = MAX_PATH - (UINT)strlen("\\kernel32.dll") - 1;
1635  ret = GetSystemDirectory(kernel32_path, len);
1636  if (ret == 0 || ret > len) {
1637    st->print_cr("Call to GetSystemDirectory failed");
1638    return;
1639  }
1640  strncat(kernel32_path, "\\kernel32.dll", MAX_PATH - ret);
1641
1642  DWORD version_size = GetFileVersionInfoSize(kernel32_path, NULL);
1643  if (version_size == 0) {
1644    st->print_cr("Call to GetFileVersionInfoSize failed");
1645    return;
1646  }
1647
1648  LPTSTR version_info = (LPTSTR)os::malloc(version_size, mtInternal);
1649  if (version_info == NULL) {
1650    st->print_cr("Failed to allocate version_info");
1651    return;
1652  }
1653
1654  if (!GetFileVersionInfo(kernel32_path, NULL, version_size, version_info)) {
1655    os::free(version_info);
1656    st->print_cr("Call to GetFileVersionInfo failed");
1657    return;
1658  }
1659
1660  if (!VerQueryValue(version_info, TEXT("\\"), (LPVOID*)&file_info, &len)) {
1661    os::free(version_info);
1662    st->print_cr("Call to VerQueryValue failed");
1663    return;
1664  }
1665
1666  int major_version = HIWORD(file_info->dwProductVersionMS);
1667  int minor_version = LOWORD(file_info->dwProductVersionMS);
1668  int build_number = HIWORD(file_info->dwProductVersionLS);
1669  int build_minor = LOWORD(file_info->dwProductVersionLS);
1670  int os_vers = major_version * 1000 + minor_version;
1671  os::free(version_info);
1672
1673  st->print(" Windows ");
1674  switch (os_vers) {
1675
1676  case 6000:
1677    if (is_workstation) {
1678      st->print("Vista");
1679    } else {
1680      st->print("Server 2008");
1681    }
1682    break;
1683
1684  case 6001:
1685    if (is_workstation) {
1686      st->print("7");
1687    } else {
1688      st->print("Server 2008 R2");
1689    }
1690    break;
1691
1692  case 6002:
1693    if (is_workstation) {
1694      st->print("8");
1695    } else {
1696      st->print("Server 2012");
1697    }
1698    break;
1699
1700  case 6003:
1701    if (is_workstation) {
1702      st->print("8.1");
1703    } else {
1704      st->print("Server 2012 R2");
1705    }
1706    break;
1707
1708  case 10000:
1709    if (is_workstation) {
1710      st->print("10");
1711    } else {
1712      st->print("Server 2016");
1713    }
1714    break;
1715
1716  default:
1717    // Unrecognized windows, print out its major and minor versions
1718    st->print("%d.%d", major_version, minor_version);
1719    break;
1720  }
1721
1722  // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
1723  // find out whether we are running on 64 bit processor or not
1724  SYSTEM_INFO si;
1725  ZeroMemory(&si, sizeof(SYSTEM_INFO));
1726  GetNativeSystemInfo(&si);
1727  if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
1728    st->print(" , 64 bit");
1729  }
1730
1731  st->print(" Build %d", build_number);
1732  st->print(" (%d.%d.%d.%d)", major_version, minor_version, build_number, build_minor);
1733  st->cr();
1734}
1735
1736void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) {
1737  // Nothing to do for now.
1738}
1739
1740void os::get_summary_cpu_info(char* buf, size_t buflen) {
1741  HKEY key;
1742  DWORD status = RegOpenKey(HKEY_LOCAL_MACHINE,
1743               "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", &key);
1744  if (status == ERROR_SUCCESS) {
1745    DWORD size = (DWORD)buflen;
1746    status = RegQueryValueEx(key, "ProcessorNameString", NULL, NULL, (byte*)buf, &size);
1747    if (status != ERROR_SUCCESS) {
1748        strncpy(buf, "## __CPU__", buflen);
1749    }
1750    RegCloseKey(key);
1751  } else {
1752    // Put generic cpu info to return
1753    strncpy(buf, "## __CPU__", buflen);
1754  }
1755}
1756
1757void os::print_memory_info(outputStream* st) {
1758  st->print("Memory:");
1759  st->print(" %dk page", os::vm_page_size()>>10);
1760
1761  // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect
1762  // value if total memory is larger than 4GB
1763  MEMORYSTATUSEX ms;
1764  ms.dwLength = sizeof(ms);
1765  GlobalMemoryStatusEx(&ms);
1766
1767  st->print(", physical %uk", os::physical_memory() >> 10);
1768  st->print("(%uk free)", os::available_memory() >> 10);
1769
1770  st->print(", swap %uk", ms.ullTotalPageFile >> 10);
1771  st->print("(%uk free)", ms.ullAvailPageFile >> 10);
1772  st->cr();
1773}
1774
1775void os::print_siginfo(outputStream *st, const void* siginfo) {
1776  const EXCEPTION_RECORD* const er = (EXCEPTION_RECORD*)siginfo;
1777  st->print("siginfo:");
1778
1779  char tmp[64];
1780  if (os::exception_name(er->ExceptionCode, tmp, sizeof(tmp)) == NULL) {
1781    strcpy(tmp, "EXCEPTION_??");
1782  }
1783  st->print(" %s (0x%x)", tmp, er->ExceptionCode);
1784
1785  if ((er->ExceptionCode == EXCEPTION_ACCESS_VIOLATION ||
1786       er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR) &&
1787       er->NumberParameters >= 2) {
1788    switch (er->ExceptionInformation[0]) {
1789    case 0: st->print(", reading address"); break;
1790    case 1: st->print(", writing address"); break;
1791    case 8: st->print(", data execution prevention violation at address"); break;
1792    default: st->print(", ExceptionInformation=" INTPTR_FORMAT,
1793                       er->ExceptionInformation[0]);
1794    }
1795    st->print(" " INTPTR_FORMAT, er->ExceptionInformation[1]);
1796  } else {
1797    int num = er->NumberParameters;
1798    if (num > 0) {
1799      st->print(", ExceptionInformation=");
1800      for (int i = 0; i < num; i++) {
1801        st->print(INTPTR_FORMAT " ", er->ExceptionInformation[i]);
1802      }
1803    }
1804  }
1805  st->cr();
1806}
1807
1808void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
1809  // do nothing
1810}
1811
1812static char saved_jvm_path[MAX_PATH] = {0};
1813
1814// Find the full path to the current module, jvm.dll
1815void os::jvm_path(char *buf, jint buflen) {
1816  // Error checking.
1817  if (buflen < MAX_PATH) {
1818    assert(false, "must use a large-enough buffer");
1819    buf[0] = '\0';
1820    return;
1821  }
1822  // Lazy resolve the path to current module.
1823  if (saved_jvm_path[0] != 0) {
1824    strcpy(buf, saved_jvm_path);
1825    return;
1826  }
1827
1828  buf[0] = '\0';
1829  if (Arguments::sun_java_launcher_is_altjvm()) {
1830    // Support for the java launcher's '-XXaltjvm=<path>' option. Check
1831    // for a JAVA_HOME environment variable and fix up the path so it
1832    // looks like jvm.dll is installed there (append a fake suffix
1833    // hotspot/jvm.dll).
1834    char* java_home_var = ::getenv("JAVA_HOME");
1835    if (java_home_var != NULL && java_home_var[0] != 0 &&
1836        strlen(java_home_var) < (size_t)buflen) {
1837      strncpy(buf, java_home_var, buflen);
1838
1839      // determine if this is a legacy image or modules image
1840      // modules image doesn't have "jre" subdirectory
1841      size_t len = strlen(buf);
1842      char* jrebin_p = buf + len;
1843      jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\");
1844      if (0 != _access(buf, 0)) {
1845        jio_snprintf(jrebin_p, buflen-len, "\\bin\\");
1846      }
1847      len = strlen(buf);
1848      jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll");
1849    }
1850  }
1851
1852  if (buf[0] == '\0') {
1853    GetModuleFileName(vm_lib_handle, buf, buflen);
1854  }
1855  strncpy(saved_jvm_path, buf, MAX_PATH);
1856  saved_jvm_path[MAX_PATH - 1] = '\0';
1857}
1858
1859
1860void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
1861#ifndef _WIN64
1862  st->print("_");
1863#endif
1864}
1865
1866
1867void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
1868#ifndef _WIN64
1869  st->print("@%d", args_size  * sizeof(int));
1870#endif
1871}
1872
1873// This method is a copy of JDK's sysGetLastErrorString
1874// from src/windows/hpi/src/system_md.c
1875
1876size_t os::lasterror(char* buf, size_t len) {
1877  DWORD errval;
1878
1879  if ((errval = GetLastError()) != 0) {
1880    // DOS error
1881    size_t n = (size_t)FormatMessage(
1882                                     FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
1883                                     NULL,
1884                                     errval,
1885                                     0,
1886                                     buf,
1887                                     (DWORD)len,
1888                                     NULL);
1889    if (n > 3) {
1890      // Drop final '.', CR, LF
1891      if (buf[n - 1] == '\n') n--;
1892      if (buf[n - 1] == '\r') n--;
1893      if (buf[n - 1] == '.') n--;
1894      buf[n] = '\0';
1895    }
1896    return n;
1897  }
1898
1899  if (errno != 0) {
1900    // C runtime error that has no corresponding DOS error code
1901    const char* s = os::strerror(errno);
1902    size_t n = strlen(s);
1903    if (n >= len) n = len - 1;
1904    strncpy(buf, s, n);
1905    buf[n] = '\0';
1906    return n;
1907  }
1908
1909  return 0;
1910}
1911
1912int os::get_last_error() {
1913  DWORD error = GetLastError();
1914  if (error == 0) {
1915    error = errno;
1916  }
1917  return (int)error;
1918}
1919
1920WindowsSemaphore::WindowsSemaphore(uint value) {
1921  _semaphore = ::CreateSemaphore(NULL, value, LONG_MAX, NULL);
1922
1923  guarantee(_semaphore != NULL, "CreateSemaphore failed with error code: %lu", GetLastError());
1924}
1925
1926WindowsSemaphore::~WindowsSemaphore() {
1927  ::CloseHandle(_semaphore);
1928}
1929
1930void WindowsSemaphore::signal(uint count) {
1931  if (count > 0) {
1932    BOOL ret = ::ReleaseSemaphore(_semaphore, count, NULL);
1933
1934    assert(ret != 0, "ReleaseSemaphore failed with error code: %lu", GetLastError());
1935  }
1936}
1937
1938void WindowsSemaphore::wait() {
1939  DWORD ret = ::WaitForSingleObject(_semaphore, INFINITE);
1940  assert(ret != WAIT_FAILED,   "WaitForSingleObject failed with error code: %lu", GetLastError());
1941  assert(ret == WAIT_OBJECT_0, "WaitForSingleObject failed with return value: %lu", ret);
1942}
1943
1944bool WindowsSemaphore::trywait() {
1945  DWORD ret = ::WaitForSingleObject(_semaphore, 0);
1946  assert(ret != WAIT_FAILED,   "WaitForSingleObject failed with error code: %lu", GetLastError());
1947  return ret == WAIT_OBJECT_0;
1948}
1949
1950// sun.misc.Signal
1951// NOTE that this is a workaround for an apparent kernel bug where if
1952// a signal handler for SIGBREAK is installed then that signal handler
1953// takes priority over the console control handler for CTRL_CLOSE_EVENT.
1954// See bug 4416763.
1955static void (*sigbreakHandler)(int) = NULL;
1956
1957static void UserHandler(int sig, void *siginfo, void *context) {
1958  os::signal_notify(sig);
1959  // We need to reinstate the signal handler each time...
1960  os::signal(sig, (void*)UserHandler);
1961}
1962
1963void* os::user_handler() {
1964  return (void*) UserHandler;
1965}
1966
1967void* os::signal(int signal_number, void* handler) {
1968  if ((signal_number == SIGBREAK) && (!ReduceSignalUsage)) {
1969    void (*oldHandler)(int) = sigbreakHandler;
1970    sigbreakHandler = (void (*)(int)) handler;
1971    return (void*) oldHandler;
1972  } else {
1973    return (void*)::signal(signal_number, (void (*)(int))handler);
1974  }
1975}
1976
1977void os::signal_raise(int signal_number) {
1978  raise(signal_number);
1979}
1980
1981// The Win32 C runtime library maps all console control events other than ^C
1982// into SIGBREAK, which makes it impossible to distinguish ^BREAK from close,
1983// logoff, and shutdown events.  We therefore install our own console handler
1984// that raises SIGTERM for the latter cases.
1985//
1986static BOOL WINAPI consoleHandler(DWORD event) {
1987  switch (event) {
1988  case CTRL_C_EVENT:
1989    if (VMError::is_error_reported()) {
1990      // Ctrl-C is pressed during error reporting, likely because the error
1991      // handler fails to abort. Let VM die immediately.
1992      os::die();
1993    }
1994
1995    os::signal_raise(SIGINT);
1996    return TRUE;
1997    break;
1998  case CTRL_BREAK_EVENT:
1999    if (sigbreakHandler != NULL) {
2000      (*sigbreakHandler)(SIGBREAK);
2001    }
2002    return TRUE;
2003    break;
2004  case CTRL_LOGOFF_EVENT: {
2005    // Don't terminate JVM if it is running in a non-interactive session,
2006    // such as a service process.
2007    USEROBJECTFLAGS flags;
2008    HANDLE handle = GetProcessWindowStation();
2009    if (handle != NULL &&
2010        GetUserObjectInformation(handle, UOI_FLAGS, &flags,
2011        sizeof(USEROBJECTFLAGS), NULL)) {
2012      // If it is a non-interactive session, let next handler to deal
2013      // with it.
2014      if ((flags.dwFlags & WSF_VISIBLE) == 0) {
2015        return FALSE;
2016      }
2017    }
2018  }
2019  case CTRL_CLOSE_EVENT:
2020  case CTRL_SHUTDOWN_EVENT:
2021    os::signal_raise(SIGTERM);
2022    return TRUE;
2023    break;
2024  default:
2025    break;
2026  }
2027  return FALSE;
2028}
2029
2030// The following code is moved from os.cpp for making this
2031// code platform specific, which it is by its very nature.
2032
2033// Return maximum OS signal used + 1 for internal use only
2034// Used as exit signal for signal_thread
2035int os::sigexitnum_pd() {
2036  return NSIG;
2037}
2038
2039// a counter for each possible signal value, including signal_thread exit signal
2040static volatile jint pending_signals[NSIG+1] = { 0 };
2041static HANDLE sig_sem = NULL;
2042
2043void os::signal_init_pd() {
2044  // Initialize signal structures
2045  memset((void*)pending_signals, 0, sizeof(pending_signals));
2046
2047  sig_sem = ::CreateSemaphore(NULL, 0, NSIG+1, NULL);
2048
2049  // Programs embedding the VM do not want it to attempt to receive
2050  // events like CTRL_LOGOFF_EVENT, which are used to implement the
2051  // shutdown hooks mechanism introduced in 1.3.  For example, when
2052  // the VM is run as part of a Windows NT service (i.e., a servlet
2053  // engine in a web server), the correct behavior is for any console
2054  // control handler to return FALSE, not TRUE, because the OS's
2055  // "final" handler for such events allows the process to continue if
2056  // it is a service (while terminating it if it is not a service).
2057  // To make this behavior uniform and the mechanism simpler, we
2058  // completely disable the VM's usage of these console events if -Xrs
2059  // (=ReduceSignalUsage) is specified.  This means, for example, that
2060  // the CTRL-BREAK thread dump mechanism is also disabled in this
2061  // case.  See bugs 4323062, 4345157, and related bugs.
2062
2063  if (!ReduceSignalUsage) {
2064    // Add a CTRL-C handler
2065    SetConsoleCtrlHandler(consoleHandler, TRUE);
2066  }
2067}
2068
2069void os::signal_notify(int signal_number) {
2070  BOOL ret;
2071  if (sig_sem != NULL) {
2072    Atomic::inc(&pending_signals[signal_number]);
2073    ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
2074    assert(ret != 0, "ReleaseSemaphore() failed");
2075  }
2076}
2077
2078static int check_pending_signals(bool wait_for_signal) {
2079  DWORD ret;
2080  while (true) {
2081    for (int i = 0; i < NSIG + 1; i++) {
2082      jint n = pending_signals[i];
2083      if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
2084        return i;
2085      }
2086    }
2087    if (!wait_for_signal) {
2088      return -1;
2089    }
2090
2091    JavaThread *thread = JavaThread::current();
2092
2093    ThreadBlockInVM tbivm(thread);
2094
2095    bool threadIsSuspended;
2096    do {
2097      thread->set_suspend_equivalent();
2098      // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
2099      ret = ::WaitForSingleObject(sig_sem, INFINITE);
2100      assert(ret == WAIT_OBJECT_0, "WaitForSingleObject() failed");
2101
2102      // were we externally suspended while we were waiting?
2103      threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
2104      if (threadIsSuspended) {
2105        // The semaphore has been incremented, but while we were waiting
2106        // another thread suspended us. We don't want to continue running
2107        // while suspended because that would surprise the thread that
2108        // suspended us.
2109        ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
2110        assert(ret != 0, "ReleaseSemaphore() failed");
2111
2112        thread->java_suspend_self();
2113      }
2114    } while (threadIsSuspended);
2115  }
2116}
2117
2118int os::signal_lookup() {
2119  return check_pending_signals(false);
2120}
2121
2122int os::signal_wait() {
2123  return check_pending_signals(true);
2124}
2125
2126// Implicit OS exception handling
2127
2128LONG Handle_Exception(struct _EXCEPTION_POINTERS* exceptionInfo,
2129                      address handler) {
2130  JavaThread* thread = (JavaThread*) Thread::current_or_null();
2131  // Save pc in thread
2132#ifdef _M_AMD64
2133  // Do not blow up if no thread info available.
2134  if (thread) {
2135    thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Rip);
2136  }
2137  // Set pc to handler
2138  exceptionInfo->ContextRecord->Rip = (DWORD64)handler;
2139#else
2140  // Do not blow up if no thread info available.
2141  if (thread) {
2142    thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Eip);
2143  }
2144  // Set pc to handler
2145  exceptionInfo->ContextRecord->Eip = (DWORD)(DWORD_PTR)handler;
2146#endif
2147
2148  // Continue the execution
2149  return EXCEPTION_CONTINUE_EXECUTION;
2150}
2151
2152
2153// Used for PostMortemDump
2154extern "C" void safepoints();
2155extern "C" void find(int x);
2156extern "C" void events();
2157
2158// According to Windows API documentation, an illegal instruction sequence should generate
2159// the 0xC000001C exception code. However, real world experience shows that occasionnaly
2160// the execution of an illegal instruction can generate the exception code 0xC000001E. This
2161// seems to be an undocumented feature of Win NT 4.0 (and probably other Windows systems).
2162
2163#define EXCEPTION_ILLEGAL_INSTRUCTION_2 0xC000001E
2164
2165// From "Execution Protection in the Windows Operating System" draft 0.35
2166// Once a system header becomes available, the "real" define should be
2167// included or copied here.
2168#define EXCEPTION_INFO_EXEC_VIOLATION 0x08
2169
2170// Windows Vista/2008 heap corruption check
2171#define EXCEPTION_HEAP_CORRUPTION        0xC0000374
2172
2173// All Visual C++ exceptions thrown from code generated by the Microsoft Visual
2174// C++ compiler contain this error code. Because this is a compiler-generated
2175// error, the code is not listed in the Win32 API header files.
2176// The code is actually a cryptic mnemonic device, with the initial "E"
2177// standing for "exception" and the final 3 bytes (0x6D7363) representing the
2178// ASCII values of "msc".
2179
2180#define EXCEPTION_UNCAUGHT_CXX_EXCEPTION    0xE06D7363
2181
2182#define def_excpt(val) { #val, (val) }
2183
2184static const struct { char* name; uint number; } exceptlabels[] = {
2185    def_excpt(EXCEPTION_ACCESS_VIOLATION),
2186    def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT),
2187    def_excpt(EXCEPTION_BREAKPOINT),
2188    def_excpt(EXCEPTION_SINGLE_STEP),
2189    def_excpt(EXCEPTION_ARRAY_BOUNDS_EXCEEDED),
2190    def_excpt(EXCEPTION_FLT_DENORMAL_OPERAND),
2191    def_excpt(EXCEPTION_FLT_DIVIDE_BY_ZERO),
2192    def_excpt(EXCEPTION_FLT_INEXACT_RESULT),
2193    def_excpt(EXCEPTION_FLT_INVALID_OPERATION),
2194    def_excpt(EXCEPTION_FLT_OVERFLOW),
2195    def_excpt(EXCEPTION_FLT_STACK_CHECK),
2196    def_excpt(EXCEPTION_FLT_UNDERFLOW),
2197    def_excpt(EXCEPTION_INT_DIVIDE_BY_ZERO),
2198    def_excpt(EXCEPTION_INT_OVERFLOW),
2199    def_excpt(EXCEPTION_PRIV_INSTRUCTION),
2200    def_excpt(EXCEPTION_IN_PAGE_ERROR),
2201    def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION),
2202    def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION_2),
2203    def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION),
2204    def_excpt(EXCEPTION_STACK_OVERFLOW),
2205    def_excpt(EXCEPTION_INVALID_DISPOSITION),
2206    def_excpt(EXCEPTION_GUARD_PAGE),
2207    def_excpt(EXCEPTION_INVALID_HANDLE),
2208    def_excpt(EXCEPTION_UNCAUGHT_CXX_EXCEPTION),
2209    def_excpt(EXCEPTION_HEAP_CORRUPTION)
2210};
2211
2212#undef def_excpt
2213
2214const char* os::exception_name(int exception_code, char *buf, size_t size) {
2215  uint code = static_cast<uint>(exception_code);
2216  for (uint i = 0; i < ARRAY_SIZE(exceptlabels); ++i) {
2217    if (exceptlabels[i].number == code) {
2218      jio_snprintf(buf, size, "%s", exceptlabels[i].name);
2219      return buf;
2220    }
2221  }
2222
2223  return NULL;
2224}
2225
2226//-----------------------------------------------------------------------------
2227LONG Handle_IDiv_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
2228  // handle exception caused by idiv; should only happen for -MinInt/-1
2229  // (division by zero is handled explicitly)
2230#ifdef  _M_AMD64
2231  PCONTEXT ctx = exceptionInfo->ContextRecord;
2232  address pc = (address)ctx->Rip;
2233  assert(pc[0] >= Assembler::REX && pc[0] <= Assembler::REX_WRXB && pc[1] == 0xF7 || pc[0] == 0xF7, "not an idiv opcode");
2234  assert(pc[0] >= Assembler::REX && pc[0] <= Assembler::REX_WRXB && (pc[2] & ~0x7) == 0xF8 || (pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
2235  if (pc[0] == 0xF7) {
2236    // set correct result values and continue after idiv instruction
2237    ctx->Rip = (DWORD64)pc + 2;        // idiv reg, reg  is 2 bytes
2238  } else {
2239    ctx->Rip = (DWORD64)pc + 3;        // REX idiv reg, reg  is 3 bytes
2240  }
2241  // Do not set ctx->Rax as it already contains the correct value (either 32 or 64 bit, depending on the operation)
2242  // this is the case because the exception only happens for -MinValue/-1 and -MinValue is always in rax because of the
2243  // idiv opcode (0xF7).
2244  ctx->Rdx = (DWORD)0;             // remainder
2245  // Continue the execution
2246#else
2247  PCONTEXT ctx = exceptionInfo->ContextRecord;
2248  address pc = (address)ctx->Eip;
2249  assert(pc[0] == 0xF7, "not an idiv opcode");
2250  assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
2251  assert(ctx->Eax == min_jint, "unexpected idiv exception");
2252  // set correct result values and continue after idiv instruction
2253  ctx->Eip = (DWORD)pc + 2;        // idiv reg, reg  is 2 bytes
2254  ctx->Eax = (DWORD)min_jint;      // result
2255  ctx->Edx = (DWORD)0;             // remainder
2256  // Continue the execution
2257#endif
2258  return EXCEPTION_CONTINUE_EXECUTION;
2259}
2260
2261//-----------------------------------------------------------------------------
2262LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
2263  PCONTEXT ctx = exceptionInfo->ContextRecord;
2264#ifndef  _WIN64
2265  // handle exception caused by native method modifying control word
2266  DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
2267
2268  switch (exception_code) {
2269  case EXCEPTION_FLT_DENORMAL_OPERAND:
2270  case EXCEPTION_FLT_DIVIDE_BY_ZERO:
2271  case EXCEPTION_FLT_INEXACT_RESULT:
2272  case EXCEPTION_FLT_INVALID_OPERATION:
2273  case EXCEPTION_FLT_OVERFLOW:
2274  case EXCEPTION_FLT_STACK_CHECK:
2275  case EXCEPTION_FLT_UNDERFLOW:
2276    jint fp_control_word = (* (jint*) StubRoutines::addr_fpu_cntrl_wrd_std());
2277    if (fp_control_word != ctx->FloatSave.ControlWord) {
2278      // Restore FPCW and mask out FLT exceptions
2279      ctx->FloatSave.ControlWord = fp_control_word | 0xffffffc0;
2280      // Mask out pending FLT exceptions
2281      ctx->FloatSave.StatusWord &=  0xffffff00;
2282      return EXCEPTION_CONTINUE_EXECUTION;
2283    }
2284  }
2285
2286  if (prev_uef_handler != NULL) {
2287    // We didn't handle this exception so pass it to the previous
2288    // UnhandledExceptionFilter.
2289    return (prev_uef_handler)(exceptionInfo);
2290  }
2291#else // !_WIN64
2292  // On Windows, the mxcsr control bits are non-volatile across calls
2293  // See also CR 6192333
2294  //
2295  jint MxCsr = INITIAL_MXCSR;
2296  // we can't use StubRoutines::addr_mxcsr_std()
2297  // because in Win64 mxcsr is not saved there
2298  if (MxCsr != ctx->MxCsr) {
2299    ctx->MxCsr = MxCsr;
2300    return EXCEPTION_CONTINUE_EXECUTION;
2301  }
2302#endif // !_WIN64
2303
2304  return EXCEPTION_CONTINUE_SEARCH;
2305}
2306
2307static inline void report_error(Thread* t, DWORD exception_code,
2308                                address addr, void* siginfo, void* context) {
2309  VMError::report_and_die(t, exception_code, addr, siginfo, context);
2310
2311  // If UseOsErrorReporting, this will return here and save the error file
2312  // somewhere where we can find it in the minidump.
2313}
2314
2315bool os::win32::get_frame_at_stack_banging_point(JavaThread* thread,
2316        struct _EXCEPTION_POINTERS* exceptionInfo, address pc, frame* fr) {
2317  PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2318  address addr = (address) exceptionRecord->ExceptionInformation[1];
2319  if (Interpreter::contains(pc)) {
2320    *fr = os::fetch_frame_from_context((void*)exceptionInfo->ContextRecord);
2321    if (!fr->is_first_java_frame()) {
2322      // get_frame_at_stack_banging_point() is only called when we
2323      // have well defined stacks so java_sender() calls do not need
2324      // to assert safe_for_sender() first.
2325      *fr = fr->java_sender();
2326    }
2327  } else {
2328    // more complex code with compiled code
2329    assert(!Interpreter::contains(pc), "Interpreted methods should have been handled above");
2330    CodeBlob* cb = CodeCache::find_blob(pc);
2331    if (cb == NULL || !cb->is_nmethod() || cb->is_frame_complete_at(pc)) {
2332      // Not sure where the pc points to, fallback to default
2333      // stack overflow handling
2334      return false;
2335    } else {
2336      *fr = os::fetch_frame_from_context((void*)exceptionInfo->ContextRecord);
2337      // in compiled code, the stack banging is performed just after the return pc
2338      // has been pushed on the stack
2339      *fr = frame(fr->sp() + 1, fr->fp(), (address)*(fr->sp()));
2340      if (!fr->is_java_frame()) {
2341        // See java_sender() comment above.
2342        *fr = fr->java_sender();
2343      }
2344    }
2345  }
2346  assert(fr->is_java_frame(), "Safety check");
2347  return true;
2348}
2349
2350//-----------------------------------------------------------------------------
2351LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
2352  if (InterceptOSException) return EXCEPTION_CONTINUE_SEARCH;
2353  DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
2354#ifdef _M_AMD64
2355  address pc = (address) exceptionInfo->ContextRecord->Rip;
2356#else
2357  address pc = (address) exceptionInfo->ContextRecord->Eip;
2358#endif
2359  Thread* t = Thread::current_or_null_safe();
2360
2361  // Handle SafeFetch32 and SafeFetchN exceptions.
2362  if (StubRoutines::is_safefetch_fault(pc)) {
2363    return Handle_Exception(exceptionInfo, StubRoutines::continuation_for_safefetch_fault(pc));
2364  }
2365
2366#ifndef _WIN64
2367  // Execution protection violation - win32 running on AMD64 only
2368  // Handled first to avoid misdiagnosis as a "normal" access violation;
2369  // This is safe to do because we have a new/unique ExceptionInformation
2370  // code for this condition.
2371  if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2372    PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2373    int exception_subcode = (int) exceptionRecord->ExceptionInformation[0];
2374    address addr = (address) exceptionRecord->ExceptionInformation[1];
2375
2376    if (exception_subcode == EXCEPTION_INFO_EXEC_VIOLATION) {
2377      int page_size = os::vm_page_size();
2378
2379      // Make sure the pc and the faulting address are sane.
2380      //
2381      // If an instruction spans a page boundary, and the page containing
2382      // the beginning of the instruction is executable but the following
2383      // page is not, the pc and the faulting address might be slightly
2384      // different - we still want to unguard the 2nd page in this case.
2385      //
2386      // 15 bytes seems to be a (very) safe value for max instruction size.
2387      bool pc_is_near_addr =
2388        (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15);
2389      bool instr_spans_page_boundary =
2390        (align_down((intptr_t) pc ^ (intptr_t) addr,
2391                         (intptr_t) page_size) > 0);
2392
2393      if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) {
2394        static volatile address last_addr =
2395          (address) os::non_memory_address_word();
2396
2397        // In conservative mode, don't unguard unless the address is in the VM
2398        if (UnguardOnExecutionViolation > 0 && addr != last_addr &&
2399            (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) {
2400
2401          // Set memory to RWX and retry
2402          address page_start = align_down(addr, 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_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 = align_up(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_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 = align_up(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_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 = align_up(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_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