os_windows.cpp revision 10867:5469b15d97f4
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        log_develop_debug(pagesize)("Reserving pages individually failed.");
3010      }
3011#endif
3012      return NULL;
3013    }
3014
3015    bytes_remaining -= bytes_to_rq;
3016    next_alloc_addr += bytes_to_rq;
3017    count++;
3018  }
3019  // Although the memory is allocated individually, it is returned as one.
3020  // NMT records it as one block.
3021  if ((flags & MEM_COMMIT) != 0) {
3022    MemTracker::record_virtual_memory_reserve_and_commit((address)p_buf, bytes, CALLER_PC);
3023  } else {
3024    MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, CALLER_PC);
3025  }
3026
3027  // made it this far, success
3028  return p_buf;
3029}
3030
3031
3032
3033void os::large_page_init() {
3034  if (!UseLargePages) return;
3035
3036  // print a warning if any large page related flag is specified on command line
3037  bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) ||
3038                         !FLAG_IS_DEFAULT(LargePageSizeInBytes);
3039  bool success = false;
3040
3041#define WARN(msg) if (warn_on_failure) { warning(msg); }
3042  if (request_lock_memory_privilege()) {
3043    size_t s = GetLargePageMinimum();
3044    if (s) {
3045#if defined(IA32) || defined(AMD64)
3046      if (s > 4*M || LargePageSizeInBytes > 4*M) {
3047        WARN("JVM cannot use large pages bigger than 4mb.");
3048      } else {
3049#endif
3050        if (LargePageSizeInBytes && LargePageSizeInBytes % s == 0) {
3051          _large_page_size = LargePageSizeInBytes;
3052        } else {
3053          _large_page_size = s;
3054        }
3055        success = true;
3056#if defined(IA32) || defined(AMD64)
3057      }
3058#endif
3059    } else {
3060      WARN("Large page is not supported by the processor.");
3061    }
3062  } else {
3063    WARN("JVM cannot use large page memory because it does not have enough privilege to lock pages in memory.");
3064  }
3065#undef WARN
3066
3067  const size_t default_page_size = (size_t) vm_page_size();
3068  if (success && _large_page_size > default_page_size) {
3069    _page_sizes[0] = _large_page_size;
3070    _page_sizes[1] = default_page_size;
3071    _page_sizes[2] = 0;
3072  }
3073
3074  cleanup_after_large_page_init();
3075  UseLargePages = success;
3076}
3077
3078// On win32, one cannot release just a part of reserved memory, it's an
3079// all or nothing deal.  When we split a reservation, we must break the
3080// reservation into two reservations.
3081void os::pd_split_reserved_memory(char *base, size_t size, size_t split,
3082                                  bool realloc) {
3083  if (size > 0) {
3084    release_memory(base, size);
3085    if (realloc) {
3086      reserve_memory(split, base);
3087    }
3088    if (size != split) {
3089      reserve_memory(size - split, base + split);
3090    }
3091  }
3092}
3093
3094// Multiple threads can race in this code but it's not possible to unmap small sections of
3095// virtual space to get requested alignment, like posix-like os's.
3096// Windows prevents multiple thread from remapping over each other so this loop is thread-safe.
3097char* os::reserve_memory_aligned(size_t size, size_t alignment) {
3098  assert((alignment & (os::vm_allocation_granularity() - 1)) == 0,
3099         "Alignment must be a multiple of allocation granularity (page size)");
3100  assert((size & (alignment -1)) == 0, "size must be 'alignment' aligned");
3101
3102  size_t extra_size = size + alignment;
3103  assert(extra_size >= size, "overflow, size is too large to allow alignment");
3104
3105  char* aligned_base = NULL;
3106
3107  do {
3108    char* extra_base = os::reserve_memory(extra_size, NULL, alignment);
3109    if (extra_base == NULL) {
3110      return NULL;
3111    }
3112    // Do manual alignment
3113    aligned_base = (char*) align_size_up((uintptr_t) extra_base, alignment);
3114
3115    os::release_memory(extra_base, extra_size);
3116
3117    aligned_base = os::reserve_memory(size, aligned_base);
3118
3119  } while (aligned_base == NULL);
3120
3121  return aligned_base;
3122}
3123
3124char* os::pd_reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
3125  assert((size_t)addr % os::vm_allocation_granularity() == 0,
3126         "reserve alignment");
3127  assert(bytes % os::vm_page_size() == 0, "reserve page size");
3128  char* res;
3129  // note that if UseLargePages is on, all the areas that require interleaving
3130  // will go thru reserve_memory_special rather than thru here.
3131  bool use_individual = (UseNUMAInterleaving && !UseLargePages);
3132  if (!use_individual) {
3133    res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE);
3134  } else {
3135    elapsedTimer reserveTimer;
3136    if (Verbose && PrintMiscellaneous) reserveTimer.start();
3137    // in numa interleaving, we have to allocate pages individually
3138    // (well really chunks of NUMAInterleaveGranularity size)
3139    res = allocate_pages_individually(bytes, addr, MEM_RESERVE, PAGE_READWRITE);
3140    if (res == NULL) {
3141      warning("NUMA page allocation failed");
3142    }
3143    if (Verbose && PrintMiscellaneous) {
3144      reserveTimer.stop();
3145      tty->print_cr("reserve_memory of %Ix bytes took " JLONG_FORMAT " ms (" JLONG_FORMAT " ticks)", bytes,
3146                    reserveTimer.milliseconds(), reserveTimer.ticks());
3147    }
3148  }
3149  assert(res == NULL || addr == NULL || addr == res,
3150         "Unexpected address from reserve.");
3151
3152  return res;
3153}
3154
3155// Reserve memory at an arbitrary address, only if that area is
3156// available (and not reserved for something else).
3157char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
3158  // Windows os::reserve_memory() fails of the requested address range is
3159  // not avilable.
3160  return reserve_memory(bytes, requested_addr);
3161}
3162
3163size_t os::large_page_size() {
3164  return _large_page_size;
3165}
3166
3167bool os::can_commit_large_page_memory() {
3168  // Windows only uses large page memory when the entire region is reserved
3169  // and committed in a single VirtualAlloc() call. This may change in the
3170  // future, but with Windows 2003 it's not possible to commit on demand.
3171  return false;
3172}
3173
3174bool os::can_execute_large_page_memory() {
3175  return true;
3176}
3177
3178char* os::reserve_memory_special(size_t bytes, size_t alignment, char* addr,
3179                                 bool exec) {
3180  assert(UseLargePages, "only for large pages");
3181
3182  if (!is_size_aligned(bytes, os::large_page_size()) || alignment > os::large_page_size()) {
3183    return NULL; // Fallback to small pages.
3184  }
3185
3186  const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
3187  const DWORD flags = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
3188
3189  // with large pages, there are two cases where we need to use Individual Allocation
3190  // 1) the UseLargePagesIndividualAllocation flag is set (set by default on WS2003)
3191  // 2) NUMA Interleaving is enabled, in which case we use a different node for each page
3192  if (UseLargePagesIndividualAllocation || UseNUMAInterleaving) {
3193    log_debug(pagesize)("Reserving large pages individually.");
3194
3195    char * p_buf = allocate_pages_individually(bytes, addr, flags, prot, LargePagesIndividualAllocationInjectError);
3196    if (p_buf == NULL) {
3197      // give an appropriate warning message
3198      if (UseNUMAInterleaving) {
3199        warning("NUMA large page allocation failed, UseLargePages flag ignored");
3200      }
3201      if (UseLargePagesIndividualAllocation) {
3202        warning("Individually allocated large pages failed, "
3203                "use -XX:-UseLargePagesIndividualAllocation to turn off");
3204      }
3205      return NULL;
3206    }
3207
3208    return p_buf;
3209
3210  } else {
3211    log_debug(pagesize)("Reserving large pages in a single large chunk.");
3212
3213    // normal policy just allocate it all at once
3214    DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
3215    char * res = (char *)VirtualAlloc(addr, bytes, flag, prot);
3216    if (res != NULL) {
3217      MemTracker::record_virtual_memory_reserve_and_commit((address)res, bytes, CALLER_PC);
3218    }
3219
3220    return res;
3221  }
3222}
3223
3224bool os::release_memory_special(char* base, size_t bytes) {
3225  assert(base != NULL, "Sanity check");
3226  return release_memory(base, bytes);
3227}
3228
3229void os::print_statistics() {
3230}
3231
3232static void warn_fail_commit_memory(char* addr, size_t bytes, bool exec) {
3233  int err = os::get_last_error();
3234  char buf[256];
3235  size_t buf_len = os::lasterror(buf, sizeof(buf));
3236  warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
3237          ", %d) failed; error='%s' (DOS error/errno=%d)", addr, bytes,
3238          exec, buf_len != 0 ? buf : "<no_error_string>", err);
3239}
3240
3241bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) {
3242  if (bytes == 0) {
3243    // Don't bother the OS with noops.
3244    return true;
3245  }
3246  assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries");
3247  assert(bytes % os::vm_page_size() == 0, "commit in page-sized chunks");
3248  // Don't attempt to print anything if the OS call fails. We're
3249  // probably low on resources, so the print itself may cause crashes.
3250
3251  // unless we have NUMAInterleaving enabled, the range of a commit
3252  // is always within a reserve covered by a single VirtualAlloc
3253  // in that case we can just do a single commit for the requested size
3254  if (!UseNUMAInterleaving) {
3255    if (VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) == NULL) {
3256      NOT_PRODUCT(warn_fail_commit_memory(addr, bytes, exec);)
3257      return false;
3258    }
3259    if (exec) {
3260      DWORD oldprot;
3261      // Windows doc says to use VirtualProtect to get execute permissions
3262      if (!VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &oldprot)) {
3263        NOT_PRODUCT(warn_fail_commit_memory(addr, bytes, exec);)
3264        return false;
3265      }
3266    }
3267    return true;
3268  } else {
3269
3270    // when NUMAInterleaving is enabled, the commit might cover a range that
3271    // came from multiple VirtualAlloc reserves (using allocate_pages_individually).
3272    // VirtualQuery can help us determine that.  The RegionSize that VirtualQuery
3273    // returns represents the number of bytes that can be committed in one step.
3274    size_t bytes_remaining = bytes;
3275    char * next_alloc_addr = addr;
3276    while (bytes_remaining > 0) {
3277      MEMORY_BASIC_INFORMATION alloc_info;
3278      VirtualQuery(next_alloc_addr, &alloc_info, sizeof(alloc_info));
3279      size_t bytes_to_rq = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize);
3280      if (VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_COMMIT,
3281                       PAGE_READWRITE) == NULL) {
3282        NOT_PRODUCT(warn_fail_commit_memory(next_alloc_addr, bytes_to_rq,
3283                                            exec);)
3284        return false;
3285      }
3286      if (exec) {
3287        DWORD oldprot;
3288        if (!VirtualProtect(next_alloc_addr, bytes_to_rq,
3289                            PAGE_EXECUTE_READWRITE, &oldprot)) {
3290          NOT_PRODUCT(warn_fail_commit_memory(next_alloc_addr, bytes_to_rq,
3291                                              exec);)
3292          return false;
3293        }
3294      }
3295      bytes_remaining -= bytes_to_rq;
3296      next_alloc_addr += bytes_to_rq;
3297    }
3298  }
3299  // if we made it this far, return true
3300  return true;
3301}
3302
3303bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
3304                          bool exec) {
3305  // alignment_hint is ignored on this OS
3306  return pd_commit_memory(addr, size, exec);
3307}
3308
3309void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
3310                                  const char* mesg) {
3311  assert(mesg != NULL, "mesg must be specified");
3312  if (!pd_commit_memory(addr, size, exec)) {
3313    warn_fail_commit_memory(addr, size, exec);
3314    vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "%s", mesg);
3315  }
3316}
3317
3318void os::pd_commit_memory_or_exit(char* addr, size_t size,
3319                                  size_t alignment_hint, bool exec,
3320                                  const char* mesg) {
3321  // alignment_hint is ignored on this OS
3322  pd_commit_memory_or_exit(addr, size, exec, mesg);
3323}
3324
3325bool os::pd_uncommit_memory(char* addr, size_t bytes) {
3326  if (bytes == 0) {
3327    // Don't bother the OS with noops.
3328    return true;
3329  }
3330  assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries");
3331  assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks");
3332  return (VirtualFree(addr, bytes, MEM_DECOMMIT) != 0);
3333}
3334
3335bool os::pd_release_memory(char* addr, size_t bytes) {
3336  return VirtualFree(addr, 0, MEM_RELEASE) != 0;
3337}
3338
3339bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
3340  return os::commit_memory(addr, size, !ExecMem);
3341}
3342
3343bool os::remove_stack_guard_pages(char* addr, size_t size) {
3344  return os::uncommit_memory(addr, size);
3345}
3346
3347static bool protect_pages_individually(char* addr, size_t bytes, unsigned int p, DWORD *old_status) {
3348  uint count = 0;
3349  bool ret = false;
3350  size_t bytes_remaining = bytes;
3351  char * next_protect_addr = addr;
3352
3353  // Use VirtualQuery() to get the chunk size.
3354  while (bytes_remaining) {
3355    MEMORY_BASIC_INFORMATION alloc_info;
3356    if (VirtualQuery(next_protect_addr, &alloc_info, sizeof(alloc_info)) == 0) {
3357      return false;
3358    }
3359
3360    size_t bytes_to_protect = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize);
3361    // We used different API at allocate_pages_individually() based on UseNUMAInterleaving,
3362    // but we don't distinguish here as both cases are protected by same API.
3363    ret = VirtualProtect(next_protect_addr, bytes_to_protect, p, old_status) != 0;
3364    warning("Failed protecting pages individually for chunk #%u", count);
3365    if (!ret) {
3366      return false;
3367    }
3368
3369    bytes_remaining -= bytes_to_protect;
3370    next_protect_addr += bytes_to_protect;
3371    count++;
3372  }
3373  return ret;
3374}
3375
3376// Set protections specified
3377bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
3378                        bool is_committed) {
3379  unsigned int p = 0;
3380  switch (prot) {
3381  case MEM_PROT_NONE: p = PAGE_NOACCESS; break;
3382  case MEM_PROT_READ: p = PAGE_READONLY; break;
3383  case MEM_PROT_RW:   p = PAGE_READWRITE; break;
3384  case MEM_PROT_RWX:  p = PAGE_EXECUTE_READWRITE; break;
3385  default:
3386    ShouldNotReachHere();
3387  }
3388
3389  DWORD old_status;
3390
3391  // Strange enough, but on Win32 one can change protection only for committed
3392  // memory, not a big deal anyway, as bytes less or equal than 64K
3393  if (!is_committed) {
3394    commit_memory_or_exit(addr, bytes, prot == MEM_PROT_RWX,
3395                          "cannot commit protection page");
3396  }
3397  // One cannot use os::guard_memory() here, as on Win32 guard page
3398  // have different (one-shot) semantics, from MSDN on PAGE_GUARD:
3399  //
3400  // Pages in the region become guard pages. Any attempt to access a guard page
3401  // causes the system to raise a STATUS_GUARD_PAGE exception and turn off
3402  // the guard page status. Guard pages thus act as a one-time access alarm.
3403  bool ret;
3404  if (UseNUMAInterleaving) {
3405    // If UseNUMAInterleaving is enabled, the pages may have been allocated a chunk at a time,
3406    // so we must protect the chunks individually.
3407    ret = protect_pages_individually(addr, bytes, p, &old_status);
3408  } else {
3409    ret = VirtualProtect(addr, bytes, p, &old_status) != 0;
3410  }
3411#ifdef ASSERT
3412  if (!ret) {
3413    int err = os::get_last_error();
3414    char buf[256];
3415    size_t buf_len = os::lasterror(buf, sizeof(buf));
3416    warning("INFO: os::protect_memory(" PTR_FORMAT ", " SIZE_FORMAT
3417          ") failed; error='%s' (DOS error/errno=%d)", addr, bytes,
3418          buf_len != 0 ? buf : "<no_error_string>", err);
3419  }
3420#endif
3421  return ret;
3422}
3423
3424bool os::guard_memory(char* addr, size_t bytes) {
3425  DWORD old_status;
3426  return VirtualProtect(addr, bytes, PAGE_READWRITE | PAGE_GUARD, &old_status) != 0;
3427}
3428
3429bool os::unguard_memory(char* addr, size_t bytes) {
3430  DWORD old_status;
3431  return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0;
3432}
3433
3434void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
3435void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { }
3436void os::numa_make_global(char *addr, size_t bytes)    { }
3437void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint)    { }
3438bool os::numa_topology_changed()                       { return false; }
3439size_t os::numa_get_groups_num()                       { return MAX2(numa_node_list_holder.get_count(), 1); }
3440int os::numa_get_group_id()                            { return 0; }
3441size_t os::numa_get_leaf_groups(int *ids, size_t size) {
3442  if (numa_node_list_holder.get_count() == 0 && size > 0) {
3443    // Provide an answer for UMA systems
3444    ids[0] = 0;
3445    return 1;
3446  } else {
3447    // check for size bigger than actual groups_num
3448    size = MIN2(size, numa_get_groups_num());
3449    for (int i = 0; i < (int)size; i++) {
3450      ids[i] = numa_node_list_holder.get_node_list_entry(i);
3451    }
3452    return size;
3453  }
3454}
3455
3456bool os::get_page_info(char *start, page_info* info) {
3457  return false;
3458}
3459
3460char *os::scan_pages(char *start, char* end, page_info* page_expected,
3461                     page_info* page_found) {
3462  return end;
3463}
3464
3465char* os::non_memory_address_word() {
3466  // Must never look like an address returned by reserve_memory,
3467  // even in its subfields (as defined by the CPU immediate fields,
3468  // if the CPU splits constants across multiple instructions).
3469  return (char*)-1;
3470}
3471
3472#define MAX_ERROR_COUNT 100
3473#define SYS_THREAD_ERROR 0xffffffffUL
3474
3475void os::pd_start_thread(Thread* thread) {
3476  DWORD ret = ResumeThread(thread->osthread()->thread_handle());
3477  // Returns previous suspend state:
3478  // 0:  Thread was not suspended
3479  // 1:  Thread is running now
3480  // >1: Thread is still suspended.
3481  assert(ret != SYS_THREAD_ERROR, "StartThread failed"); // should propagate back
3482}
3483
3484class HighResolutionInterval : public CHeapObj<mtThread> {
3485  // The default timer resolution seems to be 10 milliseconds.
3486  // (Where is this written down?)
3487  // If someone wants to sleep for only a fraction of the default,
3488  // then we set the timer resolution down to 1 millisecond for
3489  // the duration of their interval.
3490  // We carefully set the resolution back, since otherwise we
3491  // seem to incur an overhead (3%?) that we don't need.
3492  // CONSIDER: if ms is small, say 3, then we should run with a high resolution time.
3493  // Buf if ms is large, say 500, or 503, we should avoid the call to timeBeginPeriod().
3494  // Alternatively, we could compute the relative error (503/500 = .6%) and only use
3495  // timeBeginPeriod() if the relative error exceeded some threshold.
3496  // timeBeginPeriod() has been linked to problems with clock drift on win32 systems and
3497  // to decreased efficiency related to increased timer "tick" rates.  We want to minimize
3498  // (a) calls to timeBeginPeriod() and timeEndPeriod() and (b) time spent with high
3499  // resolution timers running.
3500 private:
3501  jlong resolution;
3502 public:
3503  HighResolutionInterval(jlong ms) {
3504    resolution = ms % 10L;
3505    if (resolution != 0) {
3506      MMRESULT result = timeBeginPeriod(1L);
3507    }
3508  }
3509  ~HighResolutionInterval() {
3510    if (resolution != 0) {
3511      MMRESULT result = timeEndPeriod(1L);
3512    }
3513    resolution = 0L;
3514  }
3515};
3516
3517int os::sleep(Thread* thread, jlong ms, bool interruptable) {
3518  jlong limit = (jlong) MAXDWORD;
3519
3520  while (ms > limit) {
3521    int res;
3522    if ((res = sleep(thread, limit, interruptable)) != OS_TIMEOUT) {
3523      return res;
3524    }
3525    ms -= limit;
3526  }
3527
3528  assert(thread == Thread::current(), "thread consistency check");
3529  OSThread* osthread = thread->osthread();
3530  OSThreadWaitState osts(osthread, false /* not Object.wait() */);
3531  int result;
3532  if (interruptable) {
3533    assert(thread->is_Java_thread(), "must be java thread");
3534    JavaThread *jt = (JavaThread *) thread;
3535    ThreadBlockInVM tbivm(jt);
3536
3537    jt->set_suspend_equivalent();
3538    // cleared by handle_special_suspend_equivalent_condition() or
3539    // java_suspend_self() via check_and_wait_while_suspended()
3540
3541    HANDLE events[1];
3542    events[0] = osthread->interrupt_event();
3543    HighResolutionInterval *phri=NULL;
3544    if (!ForceTimeHighResolution) {
3545      phri = new HighResolutionInterval(ms);
3546    }
3547    if (WaitForMultipleObjects(1, events, FALSE, (DWORD)ms) == WAIT_TIMEOUT) {
3548      result = OS_TIMEOUT;
3549    } else {
3550      ResetEvent(osthread->interrupt_event());
3551      osthread->set_interrupted(false);
3552      result = OS_INTRPT;
3553    }
3554    delete phri; //if it is NULL, harmless
3555
3556    // were we externally suspended while we were waiting?
3557    jt->check_and_wait_while_suspended();
3558  } else {
3559    assert(!thread->is_Java_thread(), "must not be java thread");
3560    Sleep((long) ms);
3561    result = OS_TIMEOUT;
3562  }
3563  return result;
3564}
3565
3566// Short sleep, direct OS call.
3567//
3568// ms = 0, means allow others (if any) to run.
3569//
3570void os::naked_short_sleep(jlong ms) {
3571  assert(ms < 1000, "Un-interruptable sleep, short time use only");
3572  Sleep(ms);
3573}
3574
3575// Sleep forever; naked call to OS-specific sleep; use with CAUTION
3576void os::infinite_sleep() {
3577  while (true) {    // sleep forever ...
3578    Sleep(100000);  // ... 100 seconds at a time
3579  }
3580}
3581
3582typedef BOOL (WINAPI * STTSignature)(void);
3583
3584void os::naked_yield() {
3585  // Consider passing back the return value from SwitchToThread().
3586  SwitchToThread();
3587}
3588
3589// Win32 only gives you access to seven real priorities at a time,
3590// so we compress Java's ten down to seven.  It would be better
3591// if we dynamically adjusted relative priorities.
3592
3593int os::java_to_os_priority[CriticalPriority + 1] = {
3594  THREAD_PRIORITY_IDLE,                         // 0  Entry should never be used
3595  THREAD_PRIORITY_LOWEST,                       // 1  MinPriority
3596  THREAD_PRIORITY_LOWEST,                       // 2
3597  THREAD_PRIORITY_BELOW_NORMAL,                 // 3
3598  THREAD_PRIORITY_BELOW_NORMAL,                 // 4
3599  THREAD_PRIORITY_NORMAL,                       // 5  NormPriority
3600  THREAD_PRIORITY_NORMAL,                       // 6
3601  THREAD_PRIORITY_ABOVE_NORMAL,                 // 7
3602  THREAD_PRIORITY_ABOVE_NORMAL,                 // 8
3603  THREAD_PRIORITY_HIGHEST,                      // 9  NearMaxPriority
3604  THREAD_PRIORITY_HIGHEST,                      // 10 MaxPriority
3605  THREAD_PRIORITY_HIGHEST                       // 11 CriticalPriority
3606};
3607
3608int prio_policy1[CriticalPriority + 1] = {
3609  THREAD_PRIORITY_IDLE,                         // 0  Entry should never be used
3610  THREAD_PRIORITY_LOWEST,                       // 1  MinPriority
3611  THREAD_PRIORITY_LOWEST,                       // 2
3612  THREAD_PRIORITY_BELOW_NORMAL,                 // 3
3613  THREAD_PRIORITY_BELOW_NORMAL,                 // 4
3614  THREAD_PRIORITY_NORMAL,                       // 5  NormPriority
3615  THREAD_PRIORITY_ABOVE_NORMAL,                 // 6
3616  THREAD_PRIORITY_ABOVE_NORMAL,                 // 7
3617  THREAD_PRIORITY_HIGHEST,                      // 8
3618  THREAD_PRIORITY_HIGHEST,                      // 9  NearMaxPriority
3619  THREAD_PRIORITY_TIME_CRITICAL,                // 10 MaxPriority
3620  THREAD_PRIORITY_TIME_CRITICAL                 // 11 CriticalPriority
3621};
3622
3623static int prio_init() {
3624  // If ThreadPriorityPolicy is 1, switch tables
3625  if (ThreadPriorityPolicy == 1) {
3626    int i;
3627    for (i = 0; i < CriticalPriority + 1; i++) {
3628      os::java_to_os_priority[i] = prio_policy1[i];
3629    }
3630  }
3631  if (UseCriticalJavaThreadPriority) {
3632    os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority];
3633  }
3634  return 0;
3635}
3636
3637OSReturn os::set_native_priority(Thread* thread, int priority) {
3638  if (!UseThreadPriorities) return OS_OK;
3639  bool ret = SetThreadPriority(thread->osthread()->thread_handle(), priority) != 0;
3640  return ret ? OS_OK : OS_ERR;
3641}
3642
3643OSReturn os::get_native_priority(const Thread* const thread,
3644                                 int* priority_ptr) {
3645  if (!UseThreadPriorities) {
3646    *priority_ptr = java_to_os_priority[NormPriority];
3647    return OS_OK;
3648  }
3649  int os_prio = GetThreadPriority(thread->osthread()->thread_handle());
3650  if (os_prio == THREAD_PRIORITY_ERROR_RETURN) {
3651    assert(false, "GetThreadPriority failed");
3652    return OS_ERR;
3653  }
3654  *priority_ptr = os_prio;
3655  return OS_OK;
3656}
3657
3658
3659// Hint to the underlying OS that a task switch would not be good.
3660// Void return because it's a hint and can fail.
3661void os::hint_no_preempt() {}
3662
3663void os::interrupt(Thread* thread) {
3664  assert(!thread->is_Java_thread() || Thread::current() == thread ||
3665         Threads_lock->owned_by_self(),
3666         "possibility of dangling Thread pointer");
3667
3668  OSThread* osthread = thread->osthread();
3669  osthread->set_interrupted(true);
3670  // More than one thread can get here with the same value of osthread,
3671  // resulting in multiple notifications.  We do, however, want the store
3672  // to interrupted() to be visible to other threads before we post
3673  // the interrupt event.
3674  OrderAccess::release();
3675  SetEvent(osthread->interrupt_event());
3676  // For JSR166:  unpark after setting status
3677  if (thread->is_Java_thread()) {
3678    ((JavaThread*)thread)->parker()->unpark();
3679  }
3680
3681  ParkEvent * ev = thread->_ParkEvent;
3682  if (ev != NULL) ev->unpark();
3683}
3684
3685
3686bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
3687  assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
3688         "possibility of dangling Thread pointer");
3689
3690  OSThread* osthread = thread->osthread();
3691  // There is no synchronization between the setting of the interrupt
3692  // and it being cleared here. It is critical - see 6535709 - that
3693  // we only clear the interrupt state, and reset the interrupt event,
3694  // if we are going to report that we were indeed interrupted - else
3695  // an interrupt can be "lost", leading to spurious wakeups or lost wakeups
3696  // depending on the timing. By checking thread interrupt event to see
3697  // if the thread gets real interrupt thus prevent spurious wakeup.
3698  bool interrupted = osthread->interrupted() && (WaitForSingleObject(osthread->interrupt_event(), 0) == WAIT_OBJECT_0);
3699  if (interrupted && clear_interrupted) {
3700    osthread->set_interrupted(false);
3701    ResetEvent(osthread->interrupt_event());
3702  } // Otherwise leave the interrupted state alone
3703
3704  return interrupted;
3705}
3706
3707// Get's a pc (hint) for a running thread. Currently used only for profiling.
3708ExtendedPC os::get_thread_pc(Thread* thread) {
3709  CONTEXT context;
3710  context.ContextFlags = CONTEXT_CONTROL;
3711  HANDLE handle = thread->osthread()->thread_handle();
3712#ifdef _M_IA64
3713  assert(0, "Fix get_thread_pc");
3714  return ExtendedPC(NULL);
3715#else
3716  if (GetThreadContext(handle, &context)) {
3717#ifdef _M_AMD64
3718    return ExtendedPC((address) context.Rip);
3719#else
3720    return ExtendedPC((address) context.Eip);
3721#endif
3722  } else {
3723    return ExtendedPC(NULL);
3724  }
3725#endif
3726}
3727
3728// GetCurrentThreadId() returns DWORD
3729intx os::current_thread_id()  { return GetCurrentThreadId(); }
3730
3731static int _initial_pid = 0;
3732
3733int os::current_process_id() {
3734  return (_initial_pid ? _initial_pid : _getpid());
3735}
3736
3737int    os::win32::_vm_page_size              = 0;
3738int    os::win32::_vm_allocation_granularity = 0;
3739int    os::win32::_processor_type            = 0;
3740// Processor level is not available on non-NT systems, use vm_version instead
3741int    os::win32::_processor_level           = 0;
3742julong os::win32::_physical_memory           = 0;
3743size_t os::win32::_default_stack_size        = 0;
3744
3745intx          os::win32::_os_thread_limit    = 0;
3746volatile intx os::win32::_os_thread_count    = 0;
3747
3748bool   os::win32::_is_windows_server         = false;
3749
3750// 6573254
3751// Currently, the bug is observed across all the supported Windows releases,
3752// including the latest one (as of this writing - Windows Server 2012 R2)
3753bool   os::win32::_has_exit_bug              = true;
3754
3755void os::win32::initialize_system_info() {
3756  SYSTEM_INFO si;
3757  GetSystemInfo(&si);
3758  _vm_page_size    = si.dwPageSize;
3759  _vm_allocation_granularity = si.dwAllocationGranularity;
3760  _processor_type  = si.dwProcessorType;
3761  _processor_level = si.wProcessorLevel;
3762  set_processor_count(si.dwNumberOfProcessors);
3763
3764  MEMORYSTATUSEX ms;
3765  ms.dwLength = sizeof(ms);
3766
3767  // also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual,
3768  // dwMemoryLoad (% of memory in use)
3769  GlobalMemoryStatusEx(&ms);
3770  _physical_memory = ms.ullTotalPhys;
3771
3772  OSVERSIONINFOEX oi;
3773  oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
3774  GetVersionEx((OSVERSIONINFO*)&oi);
3775  switch (oi.dwPlatformId) {
3776  case VER_PLATFORM_WIN32_NT:
3777    {
3778      int os_vers = oi.dwMajorVersion * 1000 + oi.dwMinorVersion;
3779      if (oi.wProductType == VER_NT_DOMAIN_CONTROLLER ||
3780          oi.wProductType == VER_NT_SERVER) {
3781        _is_windows_server = true;
3782      }
3783    }
3784    break;
3785  default: fatal("Unknown platform");
3786  }
3787
3788  _default_stack_size = os::current_stack_size();
3789  assert(_default_stack_size > (size_t) _vm_page_size, "invalid stack size");
3790  assert((_default_stack_size & (_vm_page_size - 1)) == 0,
3791         "stack size not a multiple of page size");
3792
3793  initialize_performance_counter();
3794}
3795
3796
3797HINSTANCE os::win32::load_Windows_dll(const char* name, char *ebuf,
3798                                      int ebuflen) {
3799  char path[MAX_PATH];
3800  DWORD size;
3801  DWORD pathLen = (DWORD)sizeof(path);
3802  HINSTANCE result = NULL;
3803
3804  // only allow library name without path component
3805  assert(strchr(name, '\\') == NULL, "path not allowed");
3806  assert(strchr(name, ':') == NULL, "path not allowed");
3807  if (strchr(name, '\\') != NULL || strchr(name, ':') != NULL) {
3808    jio_snprintf(ebuf, ebuflen,
3809                 "Invalid parameter while calling os::win32::load_windows_dll(): cannot take path: %s", name);
3810    return NULL;
3811  }
3812
3813  // search system directory
3814  if ((size = GetSystemDirectory(path, pathLen)) > 0) {
3815    if (size >= pathLen) {
3816      return NULL; // truncated
3817    }
3818    if (jio_snprintf(path + size, pathLen - size, "\\%s", name) == -1) {
3819      return NULL; // truncated
3820    }
3821    if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
3822      return result;
3823    }
3824  }
3825
3826  // try Windows directory
3827  if ((size = GetWindowsDirectory(path, pathLen)) > 0) {
3828    if (size >= pathLen) {
3829      return NULL; // truncated
3830    }
3831    if (jio_snprintf(path + size, pathLen - size, "\\%s", name) == -1) {
3832      return NULL; // truncated
3833    }
3834    if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
3835      return result;
3836    }
3837  }
3838
3839  jio_snprintf(ebuf, ebuflen,
3840               "os::win32::load_windows_dll() cannot load %s from system directories.", name);
3841  return NULL;
3842}
3843
3844#define MAXIMUM_THREADS_TO_KEEP (16 * MAXIMUM_WAIT_OBJECTS)
3845#define EXIT_TIMEOUT 300000 /* 5 minutes */
3846
3847static BOOL CALLBACK init_crit_sect_call(PINIT_ONCE, PVOID pcrit_sect, PVOID*) {
3848  InitializeCriticalSection((CRITICAL_SECTION*)pcrit_sect);
3849  return TRUE;
3850}
3851
3852int os::win32::exit_process_or_thread(Ept what, int exit_code) {
3853  // Basic approach:
3854  //  - Each exiting thread registers its intent to exit and then does so.
3855  //  - A thread trying to terminate the process must wait for all
3856  //    threads currently exiting to complete their exit.
3857
3858  if (os::win32::has_exit_bug()) {
3859    // The array holds handles of the threads that have started exiting by calling
3860    // _endthreadex().
3861    // Should be large enough to avoid blocking the exiting thread due to lack of
3862    // a free slot.
3863    static HANDLE handles[MAXIMUM_THREADS_TO_KEEP];
3864    static int handle_count = 0;
3865
3866    static INIT_ONCE init_once_crit_sect = INIT_ONCE_STATIC_INIT;
3867    static CRITICAL_SECTION crit_sect;
3868    static volatile jint process_exiting = 0;
3869    int i, j;
3870    DWORD res;
3871    HANDLE hproc, hthr;
3872
3873    // The first thread that reached this point, initializes the critical section.
3874    if (!InitOnceExecuteOnce(&init_once_crit_sect, init_crit_sect_call, &crit_sect, NULL)) {
3875      warning("crit_sect initialization failed in %s: %d\n", __FILE__, __LINE__);
3876    } else if (OrderAccess::load_acquire(&process_exiting) == 0) {
3877      if (what != EPT_THREAD) {
3878        // Atomically set process_exiting before the critical section
3879        // to increase the visibility between racing threads.
3880        Atomic::cmpxchg((jint)GetCurrentThreadId(), &process_exiting, 0);
3881      }
3882      EnterCriticalSection(&crit_sect);
3883
3884      if (what == EPT_THREAD && OrderAccess::load_acquire(&process_exiting) == 0) {
3885        // Remove from the array those handles of the threads that have completed exiting.
3886        for (i = 0, j = 0; i < handle_count; ++i) {
3887          res = WaitForSingleObject(handles[i], 0 /* don't wait */);
3888          if (res == WAIT_TIMEOUT) {
3889            handles[j++] = handles[i];
3890          } else {
3891            if (res == WAIT_FAILED) {
3892              warning("WaitForSingleObject failed (%u) in %s: %d\n",
3893                      GetLastError(), __FILE__, __LINE__);
3894            }
3895            // Don't keep the handle, if we failed waiting for it.
3896            CloseHandle(handles[i]);
3897          }
3898        }
3899
3900        // If there's no free slot in the array of the kept handles, we'll have to
3901        // wait until at least one thread completes exiting.
3902        if ((handle_count = j) == MAXIMUM_THREADS_TO_KEEP) {
3903          // Raise the priority of the oldest exiting thread to increase its chances
3904          // to complete sooner.
3905          SetThreadPriority(handles[0], THREAD_PRIORITY_ABOVE_NORMAL);
3906          res = WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, handles, FALSE, EXIT_TIMEOUT);
3907          if (res >= WAIT_OBJECT_0 && res < (WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS)) {
3908            i = (res - WAIT_OBJECT_0);
3909            handle_count = MAXIMUM_THREADS_TO_KEEP - 1;
3910            for (; i < handle_count; ++i) {
3911              handles[i] = handles[i + 1];
3912            }
3913          } else {
3914            warning("WaitForMultipleObjects %s (%u) in %s: %d\n",
3915                    (res == WAIT_FAILED ? "failed" : "timed out"),
3916                    GetLastError(), __FILE__, __LINE__);
3917            // Don't keep handles, if we failed waiting for them.
3918            for (i = 0; i < MAXIMUM_THREADS_TO_KEEP; ++i) {
3919              CloseHandle(handles[i]);
3920            }
3921            handle_count = 0;
3922          }
3923        }
3924
3925        // Store a duplicate of the current thread handle in the array of handles.
3926        hproc = GetCurrentProcess();
3927        hthr = GetCurrentThread();
3928        if (!DuplicateHandle(hproc, hthr, hproc, &handles[handle_count],
3929                             0, FALSE, DUPLICATE_SAME_ACCESS)) {
3930          warning("DuplicateHandle failed (%u) in %s: %d\n",
3931                  GetLastError(), __FILE__, __LINE__);
3932        } else {
3933          ++handle_count;
3934        }
3935
3936        // The current exiting thread has stored its handle in the array, and now
3937        // should leave the critical section before calling _endthreadex().
3938
3939      } else if (what != EPT_THREAD && handle_count > 0) {
3940        jlong start_time, finish_time, timeout_left;
3941        // Before ending the process, make sure all the threads that had called
3942        // _endthreadex() completed.
3943
3944        // Set the priority level of the current thread to the same value as
3945        // the priority level of exiting threads.
3946        // This is to ensure it will be given a fair chance to execute if
3947        // the timeout expires.
3948        hthr = GetCurrentThread();
3949        SetThreadPriority(hthr, THREAD_PRIORITY_ABOVE_NORMAL);
3950        start_time = os::javaTimeNanos();
3951        finish_time = start_time + ((jlong)EXIT_TIMEOUT * 1000000L);
3952        for (i = 0; ; ) {
3953          int portion_count = handle_count - i;
3954          if (portion_count > MAXIMUM_WAIT_OBJECTS) {
3955            portion_count = MAXIMUM_WAIT_OBJECTS;
3956          }
3957          for (j = 0; j < portion_count; ++j) {
3958            SetThreadPriority(handles[i + j], THREAD_PRIORITY_ABOVE_NORMAL);
3959          }
3960          timeout_left = (finish_time - start_time) / 1000000L;
3961          if (timeout_left < 0) {
3962            timeout_left = 0;
3963          }
3964          res = WaitForMultipleObjects(portion_count, handles + i, TRUE, timeout_left);
3965          if (res == WAIT_FAILED || res == WAIT_TIMEOUT) {
3966            warning("WaitForMultipleObjects %s (%u) in %s: %d\n",
3967                    (res == WAIT_FAILED ? "failed" : "timed out"),
3968                    GetLastError(), __FILE__, __LINE__);
3969            // Reset portion_count so we close the remaining
3970            // handles due to this error.
3971            portion_count = handle_count - i;
3972          }
3973          for (j = 0; j < portion_count; ++j) {
3974            CloseHandle(handles[i + j]);
3975          }
3976          if ((i += portion_count) >= handle_count) {
3977            break;
3978          }
3979          start_time = os::javaTimeNanos();
3980        }
3981        handle_count = 0;
3982      }
3983
3984      LeaveCriticalSection(&crit_sect);
3985    }
3986
3987    if (OrderAccess::load_acquire(&process_exiting) != 0 &&
3988        process_exiting != (jint)GetCurrentThreadId()) {
3989      // Some other thread is about to call exit(), so we
3990      // don't let the current thread proceed to exit() or _endthreadex()
3991      while (true) {
3992        SuspendThread(GetCurrentThread());
3993        // Avoid busy-wait loop, if SuspendThread() failed.
3994        Sleep(EXIT_TIMEOUT);
3995      }
3996    }
3997  }
3998
3999  // We are here if either
4000  // - there's no 'race at exit' bug on this OS release;
4001  // - initialization of the critical section failed (unlikely);
4002  // - the current thread has stored its handle and left the critical section;
4003  // - the process-exiting thread has raised the flag and left the critical section.
4004  if (what == EPT_THREAD) {
4005    _endthreadex((unsigned)exit_code);
4006  } else if (what == EPT_PROCESS) {
4007    ::exit(exit_code);
4008  } else {
4009    _exit(exit_code);
4010  }
4011
4012  // Should not reach here
4013  return exit_code;
4014}
4015
4016#undef EXIT_TIMEOUT
4017
4018void os::win32::setmode_streams() {
4019  _setmode(_fileno(stdin), _O_BINARY);
4020  _setmode(_fileno(stdout), _O_BINARY);
4021  _setmode(_fileno(stderr), _O_BINARY);
4022}
4023
4024
4025bool os::is_debugger_attached() {
4026  return IsDebuggerPresent() ? true : false;
4027}
4028
4029
4030void os::wait_for_keypress_at_exit(void) {
4031  if (PauseAtExit) {
4032    fprintf(stderr, "Press any key to continue...\n");
4033    fgetc(stdin);
4034  }
4035}
4036
4037
4038bool os::message_box(const char* title, const char* message) {
4039  int result = MessageBox(NULL, message, title,
4040                          MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY);
4041  return result == IDYES;
4042}
4043
4044#ifndef PRODUCT
4045#ifndef _WIN64
4046// Helpers to check whether NX protection is enabled
4047int nx_exception_filter(_EXCEPTION_POINTERS *pex) {
4048  if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
4049      pex->ExceptionRecord->NumberParameters > 0 &&
4050      pex->ExceptionRecord->ExceptionInformation[0] ==
4051      EXCEPTION_INFO_EXEC_VIOLATION) {
4052    return EXCEPTION_EXECUTE_HANDLER;
4053  }
4054  return EXCEPTION_CONTINUE_SEARCH;
4055}
4056
4057void nx_check_protection() {
4058  // If NX is enabled we'll get an exception calling into code on the stack
4059  char code[] = { (char)0xC3 }; // ret
4060  void *code_ptr = (void *)code;
4061  __try {
4062    __asm call code_ptr
4063  } __except(nx_exception_filter((_EXCEPTION_POINTERS*)_exception_info())) {
4064    tty->print_raw_cr("NX protection detected.");
4065  }
4066}
4067#endif // _WIN64
4068#endif // PRODUCT
4069
4070// This is called _before_ the global arguments have been parsed
4071void os::init(void) {
4072  _initial_pid = _getpid();
4073
4074  init_random(1234567);
4075
4076  win32::initialize_system_info();
4077  win32::setmode_streams();
4078  init_page_sizes((size_t) win32::vm_page_size());
4079
4080  // This may be overridden later when argument processing is done.
4081  FLAG_SET_ERGO(bool, UseLargePagesIndividualAllocation, false);
4082
4083  // Initialize main_process and main_thread
4084  main_process = GetCurrentProcess();  // Remember main_process is a pseudo handle
4085  if (!DuplicateHandle(main_process, GetCurrentThread(), main_process,
4086                       &main_thread, THREAD_ALL_ACCESS, false, 0)) {
4087    fatal("DuplicateHandle failed\n");
4088  }
4089  main_thread_id = (int) GetCurrentThreadId();
4090
4091  // initialize fast thread access - only used for 32-bit
4092  win32::initialize_thread_ptr_offset();
4093}
4094
4095// To install functions for atexit processing
4096extern "C" {
4097  static void perfMemory_exit_helper() {
4098    perfMemory_exit();
4099  }
4100}
4101
4102static jint initSock();
4103
4104// this is called _after_ the global arguments have been parsed
4105jint os::init_2(void) {
4106  // Allocate a single page and mark it as readable for safepoint polling
4107  address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY);
4108  guarantee(polling_page != NULL, "Reserve Failed for polling page");
4109
4110  address return_page  = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY);
4111  guarantee(return_page != NULL, "Commit Failed for polling page");
4112
4113  os::set_polling_page(polling_page);
4114  log_info(os)("SafePoint Polling address: " INTPTR_FORMAT, p2i(polling_page));
4115
4116  if (!UseMembar) {
4117    address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE);
4118    guarantee(mem_serialize_page != NULL, "Reserve Failed for memory serialize page");
4119
4120    return_page  = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE);
4121    guarantee(return_page != NULL, "Commit Failed for memory serialize page");
4122
4123    os::set_memory_serialize_page(mem_serialize_page);
4124    log_info(os)("Memory Serialize Page address: " INTPTR_FORMAT, p2i(mem_serialize_page));
4125  }
4126
4127  // Setup Windows Exceptions
4128
4129  // for debugging float code generation bugs
4130  if (ForceFloatExceptions) {
4131#ifndef  _WIN64
4132    static long fp_control_word = 0;
4133    __asm { fstcw fp_control_word }
4134    // see Intel PPro Manual, Vol. 2, p 7-16
4135    const long precision = 0x20;
4136    const long underflow = 0x10;
4137    const long overflow  = 0x08;
4138    const long zero_div  = 0x04;
4139    const long denorm    = 0x02;
4140    const long invalid   = 0x01;
4141    fp_control_word |= invalid;
4142    __asm { fldcw fp_control_word }
4143#endif
4144  }
4145
4146  // If stack_commit_size is 0, windows will reserve the default size,
4147  // but only commit a small portion of it.
4148  size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size());
4149  size_t default_reserve_size = os::win32::default_stack_size();
4150  size_t actual_reserve_size = stack_commit_size;
4151  if (stack_commit_size < default_reserve_size) {
4152    // If stack_commit_size == 0, we want this too
4153    actual_reserve_size = default_reserve_size;
4154  }
4155
4156  // Check minimum allowable stack size for thread creation and to initialize
4157  // the java system classes, including StackOverflowError - depends on page
4158  // size.  Add a page for compiler2 recursion in main thread.
4159  // Add in 2*BytesPerWord times page size to account for VM stack during
4160  // class initialization depending on 32 or 64 bit VM.
4161  size_t min_stack_allowed =
4162            (size_t)(JavaThread::stack_yellow_zone_size() + JavaThread::stack_red_zone_size() +
4163                     JavaThread::stack_shadow_zone_size() +
4164                     (2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size());
4165  if (actual_reserve_size < min_stack_allowed) {
4166    tty->print_cr("\nThe stack size specified is too small, "
4167                  "Specify at least %dk",
4168                  min_stack_allowed / K);
4169    return JNI_ERR;
4170  }
4171
4172  JavaThread::set_stack_size_at_create(stack_commit_size);
4173
4174  // Calculate theoretical max. size of Threads to guard gainst artifical
4175  // out-of-memory situations, where all available address-space has been
4176  // reserved by thread stacks.
4177  assert(actual_reserve_size != 0, "Must have a stack");
4178
4179  // Calculate the thread limit when we should start doing Virtual Memory
4180  // banging. Currently when the threads will have used all but 200Mb of space.
4181  //
4182  // TODO: consider performing a similar calculation for commit size instead
4183  // as reserve size, since on a 64-bit platform we'll run into that more
4184  // often than running out of virtual memory space.  We can use the
4185  // lower value of the two calculations as the os_thread_limit.
4186  size_t max_address_space = ((size_t)1 << (BitsPerWord - 1)) - (200 * K * K);
4187  win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size);
4188
4189  // at exit methods are called in the reverse order of their registration.
4190  // there is no limit to the number of functions registered. atexit does
4191  // not set errno.
4192
4193  if (PerfAllowAtExitRegistration) {
4194    // only register atexit functions if PerfAllowAtExitRegistration is set.
4195    // atexit functions can be delayed until process exit time, which
4196    // can be problematic for embedded VM situations. Embedded VMs should
4197    // call DestroyJavaVM() to assure that VM resources are released.
4198
4199    // note: perfMemory_exit_helper atexit function may be removed in
4200    // the future if the appropriate cleanup code can be added to the
4201    // VM_Exit VMOperation's doit method.
4202    if (atexit(perfMemory_exit_helper) != 0) {
4203      warning("os::init_2 atexit(perfMemory_exit_helper) failed");
4204    }
4205  }
4206
4207#ifndef _WIN64
4208  // Print something if NX is enabled (win32 on AMD64)
4209  NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection());
4210#endif
4211
4212  // initialize thread priority policy
4213  prio_init();
4214
4215  if (UseNUMA && !ForceNUMA) {
4216    UseNUMA = false; // We don't fully support this yet
4217  }
4218
4219  if (UseNUMAInterleaving) {
4220    // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag
4221    bool success = numa_interleaving_init();
4222    if (!success) UseNUMAInterleaving = false;
4223  }
4224
4225  if (initSock() != JNI_OK) {
4226    return JNI_ERR;
4227  }
4228
4229  return JNI_OK;
4230}
4231
4232// Mark the polling page as unreadable
4233void os::make_polling_page_unreadable(void) {
4234  DWORD old_status;
4235  if (!VirtualProtect((char *)_polling_page, os::vm_page_size(),
4236                      PAGE_NOACCESS, &old_status)) {
4237    fatal("Could not disable polling page");
4238  }
4239}
4240
4241// Mark the polling page as readable
4242void os::make_polling_page_readable(void) {
4243  DWORD old_status;
4244  if (!VirtualProtect((char *)_polling_page, os::vm_page_size(),
4245                      PAGE_READONLY, &old_status)) {
4246    fatal("Could not enable polling page");
4247  }
4248}
4249
4250
4251int os::stat(const char *path, struct stat *sbuf) {
4252  char pathbuf[MAX_PATH];
4253  if (strlen(path) > MAX_PATH - 1) {
4254    errno = ENAMETOOLONG;
4255    return -1;
4256  }
4257  os::native_path(strcpy(pathbuf, path));
4258  int ret = ::stat(pathbuf, sbuf);
4259  if (sbuf != NULL && UseUTCFileTimestamp) {
4260    // Fix for 6539723.  st_mtime returned from stat() is dependent on
4261    // the system timezone and so can return different values for the
4262    // same file if/when daylight savings time changes.  This adjustment
4263    // makes sure the same timestamp is returned regardless of the TZ.
4264    //
4265    // See:
4266    // http://msdn.microsoft.com/library/
4267    //   default.asp?url=/library/en-us/sysinfo/base/
4268    //   time_zone_information_str.asp
4269    // and
4270    // http://msdn.microsoft.com/library/default.asp?url=
4271    //   /library/en-us/sysinfo/base/settimezoneinformation.asp
4272    //
4273    // NOTE: there is a insidious bug here:  If the timezone is changed
4274    // after the call to stat() but before 'GetTimeZoneInformation()', then
4275    // the adjustment we do here will be wrong and we'll return the wrong
4276    // value (which will likely end up creating an invalid class data
4277    // archive).  Absent a better API for this, or some time zone locking
4278    // mechanism, we'll have to live with this risk.
4279    TIME_ZONE_INFORMATION tz;
4280    DWORD tzid = GetTimeZoneInformation(&tz);
4281    int daylightBias =
4282      (tzid == TIME_ZONE_ID_DAYLIGHT) ?  tz.DaylightBias : tz.StandardBias;
4283    sbuf->st_mtime += (tz.Bias + daylightBias) * 60;
4284  }
4285  return ret;
4286}
4287
4288
4289#define FT2INT64(ft) \
4290  ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime))
4291
4292
4293// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
4294// are used by JVM M&M and JVMTI to get user+sys or user CPU time
4295// of a thread.
4296//
4297// current_thread_cpu_time() and thread_cpu_time(Thread*) returns
4298// the fast estimate available on the platform.
4299
4300// current_thread_cpu_time() is not optimized for Windows yet
4301jlong os::current_thread_cpu_time() {
4302  // return user + sys since the cost is the same
4303  return os::thread_cpu_time(Thread::current(), true /* user+sys */);
4304}
4305
4306jlong os::thread_cpu_time(Thread* thread) {
4307  // consistent with what current_thread_cpu_time() returns.
4308  return os::thread_cpu_time(thread, true /* user+sys */);
4309}
4310
4311jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
4312  return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
4313}
4314
4315jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) {
4316  // This code is copy from clasic VM -> hpi::sysThreadCPUTime
4317  // If this function changes, os::is_thread_cpu_time_supported() should too
4318  FILETIME CreationTime;
4319  FILETIME ExitTime;
4320  FILETIME KernelTime;
4321  FILETIME UserTime;
4322
4323  if (GetThreadTimes(thread->osthread()->thread_handle(), &CreationTime,
4324                      &ExitTime, &KernelTime, &UserTime) == 0) {
4325    return -1;
4326  } else if (user_sys_cpu_time) {
4327    return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100;
4328  } else {
4329    return FT2INT64(UserTime) * 100;
4330  }
4331}
4332
4333void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4334  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
4335  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
4336  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
4337  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
4338}
4339
4340void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4341  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
4342  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
4343  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
4344  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
4345}
4346
4347bool os::is_thread_cpu_time_supported() {
4348  // see os::thread_cpu_time
4349  FILETIME CreationTime;
4350  FILETIME ExitTime;
4351  FILETIME KernelTime;
4352  FILETIME UserTime;
4353
4354  if (GetThreadTimes(GetCurrentThread(), &CreationTime, &ExitTime,
4355                      &KernelTime, &UserTime) == 0) {
4356    return false;
4357  } else {
4358    return true;
4359  }
4360}
4361
4362// Windows does't provide a loadavg primitive so this is stubbed out for now.
4363// It does have primitives (PDH API) to get CPU usage and run queue length.
4364// "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length"
4365// If we wanted to implement loadavg on Windows, we have a few options:
4366//
4367// a) Query CPU usage and run queue length and "fake" an answer by
4368//    returning the CPU usage if it's under 100%, and the run queue
4369//    length otherwise.  It turns out that querying is pretty slow
4370//    on Windows, on the order of 200 microseconds on a fast machine.
4371//    Note that on the Windows the CPU usage value is the % usage
4372//    since the last time the API was called (and the first call
4373//    returns 100%), so we'd have to deal with that as well.
4374//
4375// b) Sample the "fake" answer using a sampling thread and store
4376//    the answer in a global variable.  The call to loadavg would
4377//    just return the value of the global, avoiding the slow query.
4378//
4379// c) Sample a better answer using exponential decay to smooth the
4380//    value.  This is basically the algorithm used by UNIX kernels.
4381//
4382// Note that sampling thread starvation could affect both (b) and (c).
4383int os::loadavg(double loadavg[], int nelem) {
4384  return -1;
4385}
4386
4387
4388// DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield()
4389bool os::dont_yield() {
4390  return DontYieldALot;
4391}
4392
4393// This method is a slightly reworked copy of JDK's sysOpen
4394// from src/windows/hpi/src/sys_api_md.c
4395
4396int os::open(const char *path, int oflag, int mode) {
4397  char pathbuf[MAX_PATH];
4398
4399  if (strlen(path) > MAX_PATH - 1) {
4400    errno = ENAMETOOLONG;
4401    return -1;
4402  }
4403  os::native_path(strcpy(pathbuf, path));
4404  return ::open(pathbuf, oflag | O_BINARY | O_NOINHERIT, mode);
4405}
4406
4407FILE* os::open(int fd, const char* mode) {
4408  return ::_fdopen(fd, mode);
4409}
4410
4411// Is a (classpath) directory empty?
4412bool os::dir_is_empty(const char* path) {
4413  WIN32_FIND_DATA fd;
4414  HANDLE f = FindFirstFile(path, &fd);
4415  if (f == INVALID_HANDLE_VALUE) {
4416    return true;
4417  }
4418  FindClose(f);
4419  return false;
4420}
4421
4422// create binary file, rewriting existing file if required
4423int os::create_binary_file(const char* path, bool rewrite_existing) {
4424  int oflags = _O_CREAT | _O_WRONLY | _O_BINARY;
4425  if (!rewrite_existing) {
4426    oflags |= _O_EXCL;
4427  }
4428  return ::open(path, oflags, _S_IREAD | _S_IWRITE);
4429}
4430
4431// return current position of file pointer
4432jlong os::current_file_offset(int fd) {
4433  return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR);
4434}
4435
4436// move file pointer to the specified offset
4437jlong os::seek_to_file_offset(int fd, jlong offset) {
4438  return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET);
4439}
4440
4441
4442jlong os::lseek(int fd, jlong offset, int whence) {
4443  return (jlong) ::_lseeki64(fd, offset, whence);
4444}
4445
4446size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) {
4447  OVERLAPPED ov;
4448  DWORD nread;
4449  BOOL result;
4450
4451  ZeroMemory(&ov, sizeof(ov));
4452  ov.Offset = (DWORD)offset;
4453  ov.OffsetHigh = (DWORD)(offset >> 32);
4454
4455  HANDLE h = (HANDLE)::_get_osfhandle(fd);
4456
4457  result = ReadFile(h, (LPVOID)buf, nBytes, &nread, &ov);
4458
4459  return result ? nread : 0;
4460}
4461
4462
4463// This method is a slightly reworked copy of JDK's sysNativePath
4464// from src/windows/hpi/src/path_md.c
4465
4466// Convert a pathname to native format.  On win32, this involves forcing all
4467// separators to be '\\' rather than '/' (both are legal inputs, but Win95
4468// sometimes rejects '/') and removing redundant separators.  The input path is
4469// assumed to have been converted into the character encoding used by the local
4470// system.  Because this might be a double-byte encoding, care is taken to
4471// treat double-byte lead characters correctly.
4472//
4473// This procedure modifies the given path in place, as the result is never
4474// longer than the original.  There is no error return; this operation always
4475// succeeds.
4476char * os::native_path(char *path) {
4477  char *src = path, *dst = path, *end = path;
4478  char *colon = NULL;  // If a drive specifier is found, this will
4479                       // point to the colon following the drive letter
4480
4481  // Assumption: '/', '\\', ':', and drive letters are never lead bytes
4482  assert(((!::IsDBCSLeadByte('/')) && (!::IsDBCSLeadByte('\\'))
4483          && (!::IsDBCSLeadByte(':'))), "Illegal lead byte");
4484
4485  // Check for leading separators
4486#define isfilesep(c) ((c) == '/' || (c) == '\\')
4487  while (isfilesep(*src)) {
4488    src++;
4489  }
4490
4491  if (::isalpha(*src) && !::IsDBCSLeadByte(*src) && src[1] == ':') {
4492    // Remove leading separators if followed by drive specifier.  This
4493    // hack is necessary to support file URLs containing drive
4494    // specifiers (e.g., "file://c:/path").  As a side effect,
4495    // "/c:/path" can be used as an alternative to "c:/path".
4496    *dst++ = *src++;
4497    colon = dst;
4498    *dst++ = ':';
4499    src++;
4500  } else {
4501    src = path;
4502    if (isfilesep(src[0]) && isfilesep(src[1])) {
4503      // UNC pathname: Retain first separator; leave src pointed at
4504      // second separator so that further separators will be collapsed
4505      // into the second separator.  The result will be a pathname
4506      // beginning with "\\\\" followed (most likely) by a host name.
4507      src = dst = path + 1;
4508      path[0] = '\\';     // Force first separator to '\\'
4509    }
4510  }
4511
4512  end = dst;
4513
4514  // Remove redundant separators from remainder of path, forcing all
4515  // separators to be '\\' rather than '/'. Also, single byte space
4516  // characters are removed from the end of the path because those
4517  // are not legal ending characters on this operating system.
4518  //
4519  while (*src != '\0') {
4520    if (isfilesep(*src)) {
4521      *dst++ = '\\'; src++;
4522      while (isfilesep(*src)) src++;
4523      if (*src == '\0') {
4524        // Check for trailing separator
4525        end = dst;
4526        if (colon == dst - 2) break;  // "z:\\"
4527        if (dst == path + 1) break;   // "\\"
4528        if (dst == path + 2 && isfilesep(path[0])) {
4529          // "\\\\" is not collapsed to "\\" because "\\\\" marks the
4530          // beginning of a UNC pathname.  Even though it is not, by
4531          // itself, a valid UNC pathname, we leave it as is in order
4532          // to be consistent with the path canonicalizer as well
4533          // as the win32 APIs, which treat this case as an invalid
4534          // UNC pathname rather than as an alias for the root
4535          // directory of the current drive.
4536          break;
4537        }
4538        end = --dst;  // Path does not denote a root directory, so
4539                      // remove trailing separator
4540        break;
4541      }
4542      end = dst;
4543    } else {
4544      if (::IsDBCSLeadByte(*src)) {  // Copy a double-byte character
4545        *dst++ = *src++;
4546        if (*src) *dst++ = *src++;
4547        end = dst;
4548      } else {  // Copy a single-byte character
4549        char c = *src++;
4550        *dst++ = c;
4551        // Space is not a legal ending character
4552        if (c != ' ') end = dst;
4553      }
4554    }
4555  }
4556
4557  *end = '\0';
4558
4559  // For "z:", add "." to work around a bug in the C runtime library
4560  if (colon == dst - 1) {
4561    path[2] = '.';
4562    path[3] = '\0';
4563  }
4564
4565  return path;
4566}
4567
4568// This code is a copy of JDK's sysSetLength
4569// from src/windows/hpi/src/sys_api_md.c
4570
4571int os::ftruncate(int fd, jlong length) {
4572  HANDLE h = (HANDLE)::_get_osfhandle(fd);
4573  long high = (long)(length >> 32);
4574  DWORD ret;
4575
4576  if (h == (HANDLE)(-1)) {
4577    return -1;
4578  }
4579
4580  ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN);
4581  if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) {
4582    return -1;
4583  }
4584
4585  if (::SetEndOfFile(h) == FALSE) {
4586    return -1;
4587  }
4588
4589  return 0;
4590}
4591
4592
4593// This code is a copy of JDK's sysSync
4594// from src/windows/hpi/src/sys_api_md.c
4595// except for the legacy workaround for a bug in Win 98
4596
4597int os::fsync(int fd) {
4598  HANDLE handle = (HANDLE)::_get_osfhandle(fd);
4599
4600  if ((!::FlushFileBuffers(handle)) &&
4601      (GetLastError() != ERROR_ACCESS_DENIED)) {
4602    // from winerror.h
4603    return -1;
4604  }
4605  return 0;
4606}
4607
4608static int nonSeekAvailable(int, long *);
4609static int stdinAvailable(int, long *);
4610
4611#define S_ISCHR(mode)   (((mode) & _S_IFCHR) == _S_IFCHR)
4612#define S_ISFIFO(mode)  (((mode) & _S_IFIFO) == _S_IFIFO)
4613
4614// This code is a copy of JDK's sysAvailable
4615// from src/windows/hpi/src/sys_api_md.c
4616
4617int os::available(int fd, jlong *bytes) {
4618  jlong cur, end;
4619  struct _stati64 stbuf64;
4620
4621  if (::_fstati64(fd, &stbuf64) >= 0) {
4622    int mode = stbuf64.st_mode;
4623    if (S_ISCHR(mode) || S_ISFIFO(mode)) {
4624      int ret;
4625      long lpbytes;
4626      if (fd == 0) {
4627        ret = stdinAvailable(fd, &lpbytes);
4628      } else {
4629        ret = nonSeekAvailable(fd, &lpbytes);
4630      }
4631      (*bytes) = (jlong)(lpbytes);
4632      return ret;
4633    }
4634    if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) {
4635      return FALSE;
4636    } else if ((end = ::_lseeki64(fd, 0L, SEEK_END)) == -1) {
4637      return FALSE;
4638    } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) {
4639      return FALSE;
4640    }
4641    *bytes = end - cur;
4642    return TRUE;
4643  } else {
4644    return FALSE;
4645  }
4646}
4647
4648// This code is a copy of JDK's nonSeekAvailable
4649// from src/windows/hpi/src/sys_api_md.c
4650
4651static int nonSeekAvailable(int fd, long *pbytes) {
4652  // This is used for available on non-seekable devices
4653  // (like both named and anonymous pipes, such as pipes
4654  //  connected to an exec'd process).
4655  // Standard Input is a special case.
4656  HANDLE han;
4657
4658  if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) {
4659    return FALSE;
4660  }
4661
4662  if (! ::PeekNamedPipe(han, NULL, 0, NULL, (LPDWORD)pbytes, NULL)) {
4663    // PeekNamedPipe fails when at EOF.  In that case we
4664    // simply make *pbytes = 0 which is consistent with the
4665    // behavior we get on Solaris when an fd is at EOF.
4666    // The only alternative is to raise an Exception,
4667    // which isn't really warranted.
4668    //
4669    if (::GetLastError() != ERROR_BROKEN_PIPE) {
4670      return FALSE;
4671    }
4672    *pbytes = 0;
4673  }
4674  return TRUE;
4675}
4676
4677#define MAX_INPUT_EVENTS 2000
4678
4679// This code is a copy of JDK's stdinAvailable
4680// from src/windows/hpi/src/sys_api_md.c
4681
4682static int stdinAvailable(int fd, long *pbytes) {
4683  HANDLE han;
4684  DWORD numEventsRead = 0;  // Number of events read from buffer
4685  DWORD numEvents = 0;      // Number of events in buffer
4686  DWORD i = 0;              // Loop index
4687  DWORD curLength = 0;      // Position marker
4688  DWORD actualLength = 0;   // Number of bytes readable
4689  BOOL error = FALSE;       // Error holder
4690  INPUT_RECORD *lpBuffer;   // Pointer to records of input events
4691
4692  if ((han = ::GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) {
4693    return FALSE;
4694  }
4695
4696  // Construct an array of input records in the console buffer
4697  error = ::GetNumberOfConsoleInputEvents(han, &numEvents);
4698  if (error == 0) {
4699    return nonSeekAvailable(fd, pbytes);
4700  }
4701
4702  // lpBuffer must fit into 64K or else PeekConsoleInput fails
4703  if (numEvents > MAX_INPUT_EVENTS) {
4704    numEvents = MAX_INPUT_EVENTS;
4705  }
4706
4707  lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal);
4708  if (lpBuffer == NULL) {
4709    return FALSE;
4710  }
4711
4712  error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
4713  if (error == 0) {
4714    os::free(lpBuffer);
4715    return FALSE;
4716  }
4717
4718  // Examine input records for the number of bytes available
4719  for (i=0; i<numEvents; i++) {
4720    if (lpBuffer[i].EventType == KEY_EVENT) {
4721
4722      KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *)
4723                                      &(lpBuffer[i].Event);
4724      if (keyRecord->bKeyDown == TRUE) {
4725        CHAR *keyPressed = (CHAR *) &(keyRecord->uChar);
4726        curLength++;
4727        if (*keyPressed == '\r') {
4728          actualLength = curLength;
4729        }
4730      }
4731    }
4732  }
4733
4734  if (lpBuffer != NULL) {
4735    os::free(lpBuffer);
4736  }
4737
4738  *pbytes = (long) actualLength;
4739  return TRUE;
4740}
4741
4742// Map a block of memory.
4743char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
4744                        char *addr, size_t bytes, bool read_only,
4745                        bool allow_exec) {
4746  HANDLE hFile;
4747  char* base;
4748
4749  hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
4750                     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
4751  if (hFile == NULL) {
4752    log_info(os)("CreateFile() failed: GetLastError->%ld.", GetLastError());
4753    return NULL;
4754  }
4755
4756  if (allow_exec) {
4757    // CreateFileMapping/MapViewOfFileEx can't map executable memory
4758    // unless it comes from a PE image (which the shared archive is not.)
4759    // Even VirtualProtect refuses to give execute access to mapped memory
4760    // that was not previously executable.
4761    //
4762    // Instead, stick the executable region in anonymous memory.  Yuck.
4763    // Penalty is that ~4 pages will not be shareable - in the future
4764    // we might consider DLLizing the shared archive with a proper PE
4765    // header so that mapping executable + sharing is possible.
4766
4767    base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE,
4768                                PAGE_READWRITE);
4769    if (base == NULL) {
4770      log_info(os)("VirtualAlloc() failed: GetLastError->%ld.", GetLastError());
4771      CloseHandle(hFile);
4772      return NULL;
4773    }
4774
4775    DWORD bytes_read;
4776    OVERLAPPED overlapped;
4777    overlapped.Offset = (DWORD)file_offset;
4778    overlapped.OffsetHigh = 0;
4779    overlapped.hEvent = NULL;
4780    // ReadFile guarantees that if the return value is true, the requested
4781    // number of bytes were read before returning.
4782    bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0;
4783    if (!res) {
4784      log_info(os)("ReadFile() failed: GetLastError->%ld.", GetLastError());
4785      release_memory(base, bytes);
4786      CloseHandle(hFile);
4787      return NULL;
4788    }
4789  } else {
4790    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0,
4791                                    NULL /* file_name */);
4792    if (hMap == NULL) {
4793      log_info(os)("CreateFileMapping() failed: GetLastError->%ld.", GetLastError());
4794      CloseHandle(hFile);
4795      return NULL;
4796    }
4797
4798    DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY;
4799    base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset,
4800                                  (DWORD)bytes, addr);
4801    if (base == NULL) {
4802      log_info(os)("MapViewOfFileEx() failed: GetLastError->%ld.", GetLastError());
4803      CloseHandle(hMap);
4804      CloseHandle(hFile);
4805      return NULL;
4806    }
4807
4808    if (CloseHandle(hMap) == 0) {
4809      log_info(os)("CloseHandle(hMap) failed: GetLastError->%ld.", GetLastError());
4810      CloseHandle(hFile);
4811      return base;
4812    }
4813  }
4814
4815  if (allow_exec) {
4816    DWORD old_protect;
4817    DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE;
4818    bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0;
4819
4820    if (!res) {
4821      log_info(os)("VirtualProtect() failed: GetLastError->%ld.", GetLastError());
4822      // Don't consider this a hard error, on IA32 even if the
4823      // VirtualProtect fails, we should still be able to execute
4824      CloseHandle(hFile);
4825      return base;
4826    }
4827  }
4828
4829  if (CloseHandle(hFile) == 0) {
4830    log_info(os)("CloseHandle(hFile) failed: GetLastError->%ld.", GetLastError());
4831    return base;
4832  }
4833
4834  return base;
4835}
4836
4837
4838// Remap a block of memory.
4839char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
4840                          char *addr, size_t bytes, bool read_only,
4841                          bool allow_exec) {
4842  // This OS does not allow existing memory maps to be remapped so we
4843  // have to unmap the memory before we remap it.
4844  if (!os::unmap_memory(addr, bytes)) {
4845    return NULL;
4846  }
4847
4848  // There is a very small theoretical window between the unmap_memory()
4849  // call above and the map_memory() call below where a thread in native
4850  // code may be able to access an address that is no longer mapped.
4851
4852  return os::map_memory(fd, file_name, file_offset, addr, bytes,
4853                        read_only, allow_exec);
4854}
4855
4856
4857// Unmap a block of memory.
4858// Returns true=success, otherwise false.
4859
4860bool os::pd_unmap_memory(char* addr, size_t bytes) {
4861  MEMORY_BASIC_INFORMATION mem_info;
4862  if (VirtualQuery(addr, &mem_info, sizeof(mem_info)) == 0) {
4863    log_info(os)("VirtualQuery() failed: GetLastError->%ld.", GetLastError());
4864    return false;
4865  }
4866
4867  // Executable memory was not mapped using CreateFileMapping/MapViewOfFileEx.
4868  // Instead, executable region was allocated using VirtualAlloc(). See
4869  // pd_map_memory() above.
4870  //
4871  // The following flags should match the 'exec_access' flages used for
4872  // VirtualProtect() in pd_map_memory().
4873  if (mem_info.Protect == PAGE_EXECUTE_READ ||
4874      mem_info.Protect == PAGE_EXECUTE_READWRITE) {
4875    return pd_release_memory(addr, bytes);
4876  }
4877
4878  BOOL result = UnmapViewOfFile(addr);
4879  if (result == 0) {
4880    log_info(os)("UnmapViewOfFile() failed: GetLastError->%ld.", GetLastError());
4881    return false;
4882  }
4883  return true;
4884}
4885
4886void os::pause() {
4887  char filename[MAX_PATH];
4888  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4889    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
4890  } else {
4891    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4892  }
4893
4894  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4895  if (fd != -1) {
4896    struct stat buf;
4897    ::close(fd);
4898    while (::stat(filename, &buf) == 0) {
4899      Sleep(100);
4900    }
4901  } else {
4902    jio_fprintf(stderr,
4903                "Could not open pause file '%s', continuing immediately.\n", filename);
4904  }
4905}
4906
4907os::WatcherThreadCrashProtection::WatcherThreadCrashProtection() {
4908  assert(Thread::current()->is_Watcher_thread(), "Must be WatcherThread");
4909}
4910
4911// See the caveats for this class in os_windows.hpp
4912// Protects the callback call so that raised OS EXCEPTIONS causes a jump back
4913// into this method and returns false. If no OS EXCEPTION was raised, returns
4914// true.
4915// The callback is supposed to provide the method that should be protected.
4916//
4917bool os::WatcherThreadCrashProtection::call(os::CrashProtectionCallback& cb) {
4918  assert(Thread::current()->is_Watcher_thread(), "Only for WatcherThread");
4919  assert(!WatcherThread::watcher_thread()->has_crash_protection(),
4920         "crash_protection already set?");
4921
4922  bool success = true;
4923  __try {
4924    WatcherThread::watcher_thread()->set_crash_protection(this);
4925    cb.call();
4926  } __except(EXCEPTION_EXECUTE_HANDLER) {
4927    // only for protection, nothing to do
4928    success = false;
4929  }
4930  WatcherThread::watcher_thread()->set_crash_protection(NULL);
4931  return success;
4932}
4933
4934// An Event wraps a win32 "CreateEvent" kernel handle.
4935//
4936// We have a number of choices regarding "CreateEvent" win32 handle leakage:
4937//
4938// 1:  When a thread dies return the Event to the EventFreeList, clear the ParkHandle
4939//     field, and call CloseHandle() on the win32 event handle.  Unpark() would
4940//     need to be modified to tolerate finding a NULL (invalid) win32 event handle.
4941//     In addition, an unpark() operation might fetch the handle field, but the
4942//     event could recycle between the fetch and the SetEvent() operation.
4943//     SetEvent() would either fail because the handle was invalid, or inadvertently work,
4944//     as the win32 handle value had been recycled.  In an ideal world calling SetEvent()
4945//     on an stale but recycled handle would be harmless, but in practice this might
4946//     confuse other non-Sun code, so it's not a viable approach.
4947//
4948// 2:  Once a win32 event handle is associated with an Event, it remains associated
4949//     with the Event.  The event handle is never closed.  This could be construed
4950//     as handle leakage, but only up to the maximum # of threads that have been extant
4951//     at any one time.  This shouldn't be an issue, as windows platforms typically
4952//     permit a process to have hundreds of thousands of open handles.
4953//
4954// 3:  Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList
4955//     and release unused handles.
4956//
4957// 4:  Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle.
4958//     It's not clear, however, that we wouldn't be trading one type of leak for another.
4959//
4960// 5.  Use an RCU-like mechanism (Read-Copy Update).
4961//     Or perhaps something similar to Maged Michael's "Hazard pointers".
4962//
4963// We use (2).
4964//
4965// TODO-FIXME:
4966// 1.  Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation.
4967// 2.  Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks
4968//     to recover from (or at least detect) the dreaded Windows 841176 bug.
4969// 3.  Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent
4970//     into a single win32 CreateEvent() handle.
4971//
4972// Assumption:
4973//    Only one parker can exist on an event, which is why we allocate
4974//    them per-thread. Multiple unparkers can coexist.
4975//
4976// _Event transitions in park()
4977//   -1 => -1 : illegal
4978//    1 =>  0 : pass - return immediately
4979//    0 => -1 : block; then set _Event to 0 before returning
4980//
4981// _Event transitions in unpark()
4982//    0 => 1 : just return
4983//    1 => 1 : just return
4984//   -1 => either 0 or 1; must signal target thread
4985//         That is, we can safely transition _Event from -1 to either
4986//         0 or 1.
4987//
4988// _Event serves as a restricted-range semaphore.
4989//   -1 : thread is blocked, i.e. there is a waiter
4990//    0 : neutral: thread is running or ready,
4991//        could have been signaled after a wait started
4992//    1 : signaled - thread is running or ready
4993//
4994// Another possible encoding of _Event would be with
4995// explicit "PARKED" == 01b and "SIGNALED" == 10b bits.
4996//
4997
4998int os::PlatformEvent::park(jlong Millis) {
4999  // Transitions for _Event:
5000  //   -1 => -1 : illegal
5001  //    1 =>  0 : pass - return immediately
5002  //    0 => -1 : block; then set _Event to 0 before returning
5003
5004  guarantee(_ParkHandle != NULL , "Invariant");
5005  guarantee(Millis > 0          , "Invariant");
5006
5007  // CONSIDER: defer assigning a CreateEvent() handle to the Event until
5008  // the initial park() operation.
5009  // Consider: use atomic decrement instead of CAS-loop
5010
5011  int v;
5012  for (;;) {
5013    v = _Event;
5014    if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
5015  }
5016  guarantee((v == 0) || (v == 1), "invariant");
5017  if (v != 0) return OS_OK;
5018
5019  // Do this the hard way by blocking ...
5020  // TODO: consider a brief spin here, gated on the success of recent
5021  // spin attempts by this thread.
5022  //
5023  // We decompose long timeouts into series of shorter timed waits.
5024  // Evidently large timo values passed in WaitForSingleObject() are problematic on some
5025  // versions of Windows.  See EventWait() for details.  This may be superstition.  Or not.
5026  // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time
5027  // with os::javaTimeNanos().  Furthermore, we assume that spurious returns from
5028  // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend
5029  // to happen early in the wait interval.  Specifically, after a spurious wakeup (rv ==
5030  // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate
5031  // for the already waited time.  This policy does not admit any new outcomes.
5032  // In the future, however, we might want to track the accumulated wait time and
5033  // adjust Millis accordingly if we encounter a spurious wakeup.
5034
5035  const int MAXTIMEOUT = 0x10000000;
5036  DWORD rv = WAIT_TIMEOUT;
5037  while (_Event < 0 && Millis > 0) {
5038    DWORD prd = Millis;     // set prd = MAX (Millis, MAXTIMEOUT)
5039    if (Millis > MAXTIMEOUT) {
5040      prd = MAXTIMEOUT;
5041    }
5042    rv = ::WaitForSingleObject(_ParkHandle, prd);
5043    assert(rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed");
5044    if (rv == WAIT_TIMEOUT) {
5045      Millis -= prd;
5046    }
5047  }
5048  v = _Event;
5049  _Event = 0;
5050  // see comment at end of os::PlatformEvent::park() below:
5051  OrderAccess::fence();
5052  // If we encounter a nearly simultanous timeout expiry and unpark()
5053  // we return OS_OK indicating we awoke via unpark().
5054  // Implementor's license -- returning OS_TIMEOUT would be equally valid, however.
5055  return (v >= 0) ? OS_OK : OS_TIMEOUT;
5056}
5057
5058void os::PlatformEvent::park() {
5059  // Transitions for _Event:
5060  //   -1 => -1 : illegal
5061  //    1 =>  0 : pass - return immediately
5062  //    0 => -1 : block; then set _Event to 0 before returning
5063
5064  guarantee(_ParkHandle != NULL, "Invariant");
5065  // Invariant: Only the thread associated with the Event/PlatformEvent
5066  // may call park().
5067  // Consider: use atomic decrement instead of CAS-loop
5068  int v;
5069  for (;;) {
5070    v = _Event;
5071    if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
5072  }
5073  guarantee((v == 0) || (v == 1), "invariant");
5074  if (v != 0) return;
5075
5076  // Do this the hard way by blocking ...
5077  // TODO: consider a brief spin here, gated on the success of recent
5078  // spin attempts by this thread.
5079  while (_Event < 0) {
5080    DWORD rv = ::WaitForSingleObject(_ParkHandle, INFINITE);
5081    assert(rv == WAIT_OBJECT_0, "WaitForSingleObject failed");
5082  }
5083
5084  // Usually we'll find _Event == 0 at this point, but as
5085  // an optional optimization we clear it, just in case can
5086  // multiple unpark() operations drove _Event up to 1.
5087  _Event = 0;
5088  OrderAccess::fence();
5089  guarantee(_Event >= 0, "invariant");
5090}
5091
5092void os::PlatformEvent::unpark() {
5093  guarantee(_ParkHandle != NULL, "Invariant");
5094
5095  // Transitions for _Event:
5096  //    0 => 1 : just return
5097  //    1 => 1 : just return
5098  //   -1 => either 0 or 1; must signal target thread
5099  //         That is, we can safely transition _Event from -1 to either
5100  //         0 or 1.
5101  // See also: "Semaphores in Plan 9" by Mullender & Cox
5102  //
5103  // Note: Forcing a transition from "-1" to "1" on an unpark() means
5104  // that it will take two back-to-back park() calls for the owning
5105  // thread to block. This has the benefit of forcing a spurious return
5106  // from the first park() call after an unpark() call which will help
5107  // shake out uses of park() and unpark() without condition variables.
5108
5109  if (Atomic::xchg(1, &_Event) >= 0) return;
5110
5111  ::SetEvent(_ParkHandle);
5112}
5113
5114
5115// JSR166
5116// -------------------------------------------------------
5117
5118// The Windows implementation of Park is very straightforward: Basic
5119// operations on Win32 Events turn out to have the right semantics to
5120// use them directly. We opportunistically resuse the event inherited
5121// from Monitor.
5122
5123void Parker::park(bool isAbsolute, jlong time) {
5124  guarantee(_ParkEvent != NULL, "invariant");
5125  // First, demultiplex/decode time arguments
5126  if (time < 0) { // don't wait
5127    return;
5128  } else if (time == 0 && !isAbsolute) {
5129    time = INFINITE;
5130  } else if (isAbsolute) {
5131    time -= os::javaTimeMillis(); // convert to relative time
5132    if (time <= 0) {  // already elapsed
5133      return;
5134    }
5135  } else { // relative
5136    time /= 1000000;  // Must coarsen from nanos to millis
5137    if (time == 0) {  // Wait for the minimal time unit if zero
5138      time = 1;
5139    }
5140  }
5141
5142  JavaThread* thread = JavaThread::current();
5143
5144  // Don't wait if interrupted or already triggered
5145  if (Thread::is_interrupted(thread, false) ||
5146      WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) {
5147    ResetEvent(_ParkEvent);
5148    return;
5149  } else {
5150    ThreadBlockInVM tbivm(thread);
5151    OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
5152    thread->set_suspend_equivalent();
5153
5154    WaitForSingleObject(_ParkEvent, time);
5155    ResetEvent(_ParkEvent);
5156
5157    // If externally suspended while waiting, re-suspend
5158    if (thread->handle_special_suspend_equivalent_condition()) {
5159      thread->java_suspend_self();
5160    }
5161  }
5162}
5163
5164void Parker::unpark() {
5165  guarantee(_ParkEvent != NULL, "invariant");
5166  SetEvent(_ParkEvent);
5167}
5168
5169// Run the specified command in a separate process. Return its exit value,
5170// or -1 on failure (e.g. can't create a new process).
5171int os::fork_and_exec(char* cmd) {
5172  STARTUPINFO si;
5173  PROCESS_INFORMATION pi;
5174
5175  memset(&si, 0, sizeof(si));
5176  si.cb = sizeof(si);
5177  memset(&pi, 0, sizeof(pi));
5178  BOOL rslt = CreateProcess(NULL,   // executable name - use command line
5179                            cmd,    // command line
5180                            NULL,   // process security attribute
5181                            NULL,   // thread security attribute
5182                            TRUE,   // inherits system handles
5183                            0,      // no creation flags
5184                            NULL,   // use parent's environment block
5185                            NULL,   // use parent's starting directory
5186                            &si,    // (in) startup information
5187                            &pi);   // (out) process information
5188
5189  if (rslt) {
5190    // Wait until child process exits.
5191    WaitForSingleObject(pi.hProcess, INFINITE);
5192
5193    DWORD exit_code;
5194    GetExitCodeProcess(pi.hProcess, &exit_code);
5195
5196    // Close process and thread handles.
5197    CloseHandle(pi.hProcess);
5198    CloseHandle(pi.hThread);
5199
5200    return (int)exit_code;
5201  } else {
5202    return -1;
5203  }
5204}
5205
5206//--------------------------------------------------------------------------------------------------
5207// Non-product code
5208
5209static int mallocDebugIntervalCounter = 0;
5210static int mallocDebugCounter = 0;
5211bool os::check_heap(bool force) {
5212  if (++mallocDebugCounter < MallocVerifyStart && !force) return true;
5213  if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) {
5214    // Note: HeapValidate executes two hardware breakpoints when it finds something
5215    // wrong; at these points, eax contains the address of the offending block (I think).
5216    // To get to the exlicit error message(s) below, just continue twice.
5217    //
5218    // Note:  we want to check the CRT heap, which is not necessarily located in the
5219    // process default heap.
5220    HANDLE heap = (HANDLE) _get_heap_handle();
5221    if (!heap) {
5222      return true;
5223    }
5224
5225    // If we fail to lock the heap, then gflags.exe has been used
5226    // or some other special heap flag has been set that prevents
5227    // locking. We don't try to walk a heap we can't lock.
5228    if (HeapLock(heap) != 0) {
5229      PROCESS_HEAP_ENTRY phe;
5230      phe.lpData = NULL;
5231      while (HeapWalk(heap, &phe) != 0) {
5232        if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) &&
5233            !HeapValidate(heap, 0, phe.lpData)) {
5234          tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter);
5235          tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData);
5236          HeapUnlock(heap);
5237          fatal("corrupted C heap");
5238        }
5239      }
5240      DWORD err = GetLastError();
5241      if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) {
5242        HeapUnlock(heap);
5243        fatal("heap walk aborted with error %d", err);
5244      }
5245      HeapUnlock(heap);
5246    }
5247    mallocDebugIntervalCounter = 0;
5248  }
5249  return true;
5250}
5251
5252
5253bool os::find(address addr, outputStream* st) {
5254  int offset = -1;
5255  bool result = false;
5256  char buf[256];
5257  if (os::dll_address_to_library_name(addr, buf, sizeof(buf), &offset)) {
5258    st->print(PTR_FORMAT " ", addr);
5259    if (strlen(buf) < sizeof(buf) - 1) {
5260      char* p = strrchr(buf, '\\');
5261      if (p) {
5262        st->print("%s", p + 1);
5263      } else {
5264        st->print("%s", buf);
5265      }
5266    } else {
5267        // The library name is probably truncated. Let's omit the library name.
5268        // See also JDK-8147512.
5269    }
5270    if (os::dll_address_to_function_name(addr, buf, sizeof(buf), &offset)) {
5271      st->print("::%s + 0x%x", buf, offset);
5272    }
5273    st->cr();
5274    result = true;
5275  }
5276  return result;
5277}
5278
5279LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) {
5280  DWORD exception_code = e->ExceptionRecord->ExceptionCode;
5281
5282  if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
5283    JavaThread* thread = JavaThread::current();
5284    PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord;
5285    address addr = (address) exceptionRecord->ExceptionInformation[1];
5286
5287    if (os::is_memory_serialize_page(thread, addr)) {
5288      return EXCEPTION_CONTINUE_EXECUTION;
5289    }
5290  }
5291
5292  return EXCEPTION_CONTINUE_SEARCH;
5293}
5294
5295// We don't build a headless jre for Windows
5296bool os::is_headless_jre() { return false; }
5297
5298static jint initSock() {
5299  WSADATA wsadata;
5300
5301  if (WSAStartup(MAKEWORD(2,2), &wsadata) != 0) {
5302    jio_fprintf(stderr, "Could not initialize Winsock (error: %d)\n",
5303                ::GetLastError());
5304    return JNI_ERR;
5305  }
5306  return JNI_OK;
5307}
5308
5309struct hostent* os::get_host_by_name(char* name) {
5310  return (struct hostent*)gethostbyname(name);
5311}
5312
5313int os::socket_close(int fd) {
5314  return ::closesocket(fd);
5315}
5316
5317int os::socket(int domain, int type, int protocol) {
5318  return ::socket(domain, type, protocol);
5319}
5320
5321int os::connect(int fd, struct sockaddr* him, socklen_t len) {
5322  return ::connect(fd, him, len);
5323}
5324
5325int os::recv(int fd, char* buf, size_t nBytes, uint flags) {
5326  return ::recv(fd, buf, (int)nBytes, flags);
5327}
5328
5329int os::send(int fd, char* buf, size_t nBytes, uint flags) {
5330  return ::send(fd, buf, (int)nBytes, flags);
5331}
5332
5333int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) {
5334  return ::send(fd, buf, (int)nBytes, flags);
5335}
5336
5337// WINDOWS CONTEXT Flags for THREAD_SAMPLING
5338#if defined(IA32)
5339  #define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS)
5340#elif defined (AMD64)
5341  #define sampling_context_flags (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
5342#endif
5343
5344// returns true if thread could be suspended,
5345// false otherwise
5346static bool do_suspend(HANDLE* h) {
5347  if (h != NULL) {
5348    if (SuspendThread(*h) != ~0) {
5349      return true;
5350    }
5351  }
5352  return false;
5353}
5354
5355// resume the thread
5356// calling resume on an active thread is a no-op
5357static void do_resume(HANDLE* h) {
5358  if (h != NULL) {
5359    ResumeThread(*h);
5360  }
5361}
5362
5363// retrieve a suspend/resume context capable handle
5364// from the tid. Caller validates handle return value.
5365void get_thread_handle_for_extended_context(HANDLE* h,
5366                                            OSThread::thread_id_t tid) {
5367  if (h != NULL) {
5368    *h = OpenThread(THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, FALSE, tid);
5369  }
5370}
5371
5372// Thread sampling implementation
5373//
5374void os::SuspendedThreadTask::internal_do_task() {
5375  CONTEXT    ctxt;
5376  HANDLE     h = NULL;
5377
5378  // get context capable handle for thread
5379  get_thread_handle_for_extended_context(&h, _thread->osthread()->thread_id());
5380
5381  // sanity
5382  if (h == NULL || h == INVALID_HANDLE_VALUE) {
5383    return;
5384  }
5385
5386  // suspend the thread
5387  if (do_suspend(&h)) {
5388    ctxt.ContextFlags = sampling_context_flags;
5389    // get thread context
5390    GetThreadContext(h, &ctxt);
5391    SuspendedThreadTaskContext context(_thread, &ctxt);
5392    // pass context to Thread Sampling impl
5393    do_task(context);
5394    // resume thread
5395    do_resume(&h);
5396  }
5397
5398  // close handle
5399  CloseHandle(h);
5400}
5401
5402bool os::start_debugging(char *buf, int buflen) {
5403  int len = (int)strlen(buf);
5404  char *p = &buf[len];
5405
5406  jio_snprintf(p, buflen-len,
5407             "\n\n"
5408             "Do you want to debug the problem?\n\n"
5409             "To debug, attach Visual Studio to process %d; then switch to thread 0x%x\n"
5410             "Select 'Yes' to launch Visual Studio automatically (PATH must include msdev)\n"
5411             "Otherwise, select 'No' to abort...",
5412             os::current_process_id(), os::current_thread_id());
5413
5414  bool yes = os::message_box("Unexpected Error", buf);
5415
5416  if (yes) {
5417    // os::breakpoint() calls DebugBreak(), which causes a breakpoint
5418    // exception. If VM is running inside a debugger, the debugger will
5419    // catch the exception. Otherwise, the breakpoint exception will reach
5420    // the default windows exception handler, which can spawn a debugger and
5421    // automatically attach to the dying VM.
5422    os::breakpoint();
5423    yes = false;
5424  }
5425  return yes;
5426}
5427
5428void* os::get_default_process_handle() {
5429  return (void*)GetModuleHandle(NULL);
5430}
5431
5432// Builds a platform dependent Agent_OnLoad_<lib_name> function name
5433// which is used to find statically linked in agents.
5434// Additionally for windows, takes into account __stdcall names.
5435// Parameters:
5436//            sym_name: Symbol in library we are looking for
5437//            lib_name: Name of library to look in, NULL for shared libs.
5438//            is_absolute_path == true if lib_name is absolute path to agent
5439//                                     such as "C:/a/b/L.dll"
5440//            == false if only the base name of the library is passed in
5441//               such as "L"
5442char* os::build_agent_function_name(const char *sym_name, const char *lib_name,
5443                                    bool is_absolute_path) {
5444  char *agent_entry_name;
5445  size_t len;
5446  size_t name_len;
5447  size_t prefix_len = strlen(JNI_LIB_PREFIX);
5448  size_t suffix_len = strlen(JNI_LIB_SUFFIX);
5449  const char *start;
5450
5451  if (lib_name != NULL) {
5452    len = name_len = strlen(lib_name);
5453    if (is_absolute_path) {
5454      // Need to strip path, prefix and suffix
5455      if ((start = strrchr(lib_name, *os::file_separator())) != NULL) {
5456        lib_name = ++start;
5457      } else {
5458        // Need to check for drive prefix
5459        if ((start = strchr(lib_name, ':')) != NULL) {
5460          lib_name = ++start;
5461        }
5462      }
5463      if (len <= (prefix_len + suffix_len)) {
5464        return NULL;
5465      }
5466      lib_name += prefix_len;
5467      name_len = strlen(lib_name) - suffix_len;
5468    }
5469  }
5470  len = (lib_name != NULL ? name_len : 0) + strlen(sym_name) + 2;
5471  agent_entry_name = NEW_C_HEAP_ARRAY_RETURN_NULL(char, len, mtThread);
5472  if (agent_entry_name == NULL) {
5473    return NULL;
5474  }
5475  if (lib_name != NULL) {
5476    const char *p = strrchr(sym_name, '@');
5477    if (p != NULL && p != sym_name) {
5478      // sym_name == _Agent_OnLoad@XX
5479      strncpy(agent_entry_name, sym_name, (p - sym_name));
5480      agent_entry_name[(p-sym_name)] = '\0';
5481      // agent_entry_name == _Agent_OnLoad
5482      strcat(agent_entry_name, "_");
5483      strncat(agent_entry_name, lib_name, name_len);
5484      strcat(agent_entry_name, p);
5485      // agent_entry_name == _Agent_OnLoad_lib_name@XX
5486    } else {
5487      strcpy(agent_entry_name, sym_name);
5488      strcat(agent_entry_name, "_");
5489      strncat(agent_entry_name, lib_name, name_len);
5490    }
5491  } else {
5492    strcpy(agent_entry_name, sym_name);
5493  }
5494  return agent_entry_name;
5495}
5496
5497#ifndef PRODUCT
5498
5499// test the code path in reserve_memory_special() that tries to allocate memory in a single
5500// contiguous memory block at a particular address.
5501// The test first tries to find a good approximate address to allocate at by using the same
5502// method to allocate some memory at any address. The test then tries to allocate memory in
5503// the vicinity (not directly after it to avoid possible by-chance use of that location)
5504// This is of course only some dodgy assumption, there is no guarantee that the vicinity of
5505// the previously allocated memory is available for allocation. The only actual failure
5506// that is reported is when the test tries to allocate at a particular location but gets a
5507// different valid one. A NULL return value at this point is not considered an error but may
5508// be legitimate.
5509// If -XX:+VerboseInternalVMTests is enabled, print some explanatory messages.
5510void TestReserveMemorySpecial_test() {
5511  if (!UseLargePages) {
5512    if (VerboseInternalVMTests) {
5513      tty->print("Skipping test because large pages are disabled");
5514    }
5515    return;
5516  }
5517  // save current value of globals
5518  bool old_use_large_pages_individual_allocation = UseLargePagesIndividualAllocation;
5519  bool old_use_numa_interleaving = UseNUMAInterleaving;
5520
5521  // set globals to make sure we hit the correct code path
5522  UseLargePagesIndividualAllocation = UseNUMAInterleaving = false;
5523
5524  // do an allocation at an address selected by the OS to get a good one.
5525  const size_t large_allocation_size = os::large_page_size() * 4;
5526  char* result = os::reserve_memory_special(large_allocation_size, os::large_page_size(), NULL, false);
5527  if (result == NULL) {
5528    if (VerboseInternalVMTests) {
5529      tty->print("Failed to allocate control block with size " SIZE_FORMAT ". Skipping remainder of test.",
5530                          large_allocation_size);
5531    }
5532  } else {
5533    os::release_memory_special(result, large_allocation_size);
5534
5535    // allocate another page within the recently allocated memory area which seems to be a good location. At least
5536    // we managed to get it once.
5537    const size_t expected_allocation_size = os::large_page_size();
5538    char* expected_location = result + os::large_page_size();
5539    char* actual_location = os::reserve_memory_special(expected_allocation_size, os::large_page_size(), expected_location, false);
5540    if (actual_location == NULL) {
5541      if (VerboseInternalVMTests) {
5542        tty->print("Failed to allocate any memory at " PTR_FORMAT " size " SIZE_FORMAT ". Skipping remainder of test.",
5543                            expected_location, large_allocation_size);
5544      }
5545    } else {
5546      // release memory
5547      os::release_memory_special(actual_location, expected_allocation_size);
5548      // only now check, after releasing any memory to avoid any leaks.
5549      assert(actual_location == expected_location,
5550             "Failed to allocate memory at requested location " PTR_FORMAT " of size " SIZE_FORMAT ", is " PTR_FORMAT " instead",
5551             expected_location, expected_allocation_size, actual_location);
5552    }
5553  }
5554
5555  // restore globals
5556  UseLargePagesIndividualAllocation = old_use_large_pages_individual_allocation;
5557  UseNUMAInterleaving = old_use_numa_interleaving;
5558}
5559#endif // PRODUCT
5560
5561/*
5562  All the defined signal names for Windows.
5563
5564  NOTE that not all of these names are accepted by FindSignal!
5565
5566  For various reasons some of these may be rejected at runtime.
5567
5568  Here are the names currently accepted by a user of sun.misc.Signal with
5569  1.4.1 (ignoring potential interaction with use of chaining, etc):
5570
5571     (LIST TBD)
5572
5573*/
5574int os::get_signal_number(const char* name) {
5575  static const struct {
5576    char* name;
5577    int   number;
5578  } siglabels [] =
5579    // derived from version 6.0 VC98/include/signal.h
5580  {"ABRT",      SIGABRT,        // abnormal termination triggered by abort cl
5581  "FPE",        SIGFPE,         // floating point exception
5582  "SEGV",       SIGSEGV,        // segment violation
5583  "INT",        SIGINT,         // interrupt
5584  "TERM",       SIGTERM,        // software term signal from kill
5585  "BREAK",      SIGBREAK,       // Ctrl-Break sequence
5586  "ILL",        SIGILL};        // illegal instruction
5587  for (unsigned i = 0; i < ARRAY_SIZE(siglabels); ++i) {
5588    if (strcmp(name, siglabels[i].name) == 0) {
5589      return siglabels[i].number;
5590    }
5591  }
5592  return -1;
5593}
5594
5595// Fast current thread access
5596
5597int os::win32::_thread_ptr_offset = 0;
5598
5599static void call_wrapper_dummy() {}
5600
5601// We need to call the os_exception_wrapper once so that it sets
5602// up the offset from FS of the thread pointer.
5603void os::win32::initialize_thread_ptr_offset() {
5604  os::os_exception_wrapper((java_call_t)call_wrapper_dummy,
5605                           NULL, NULL, NULL, NULL);
5606}
5607