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