os_windows.cpp revision 4533:cc12becb22e7
1221420Sdes/*
2224638Sbrooks * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
376259Sgreen * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4126274Sdes *
576259Sgreen * This code is free software; you can redistribute it and/or modify it
6126274Sdes * under the terms of the GNU General Public License version 2 only, as
7126274Sdes * published by the Free Software Foundation.
8126274Sdes *
976259Sgreen * This code is distributed in the hope that it will be useful, but WITHOUT
10126274Sdes * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11126274Sdes * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12126274Sdes * version 2 for more details (a copy is included in the LICENSE file that
13126274Sdes * accompanied this code).
14126274Sdes *
15126274Sdes * You should have received a copy of the GNU General Public License version
16126274Sdes * 2 along with this work; if not, write to the Free Software Foundation,
1776259Sgreen * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1876259Sgreen *
1976259Sgreen * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2076259Sgreen * or visit www.oracle.com if you need additional information or have any
21162852Sdes * questions.
22162852Sdes *
23162852Sdes */
24162852Sdes
25162852Sdes// Must be at least Windows 2000 or XP to use IsDebuggerPresent
26162852Sdes#define _WIN32_WINNT 0x500
27162852Sdes
28162852Sdes// no precompiled headers
29181111Sdes#include "classfile/classLoader.hpp"
30181111Sdes#include "classfile/systemDictionary.hpp"
31181111Sdes#include "classfile/vmSymbols.hpp"
3276259Sgreen#include "code/icBuffer.hpp"
33181111Sdes#include "code/vtableStubs.hpp"
34162852Sdes#include "compiler/compileBroker.hpp"
35162852Sdes#include "compiler/disassembler.hpp"
36162852Sdes#include "interpreter/interpreter.hpp"
37162852Sdes#include "jvm_windows.h"
38162852Sdes#include "memory/allocation.inline.hpp"
39204917Sdes#include "memory/filemap.hpp"
40204917Sdes#include "mutex_windows.inline.hpp"
41204917Sdes#include "oops/oop.inline.hpp"
42146998Sdes#include "os_share_windows.hpp"
43146998Sdes#include "prims/jniFastGetField.hpp"
44146998Sdes#include "prims/jvm.h"
45146998Sdes#include "prims/jvm_misc.hpp"
46146998Sdes#include "runtime/arguments.hpp"
47162852Sdes#include "runtime/extendedPC.hpp"
48162852Sdes#include "runtime/globals.hpp"
49162852Sdes#include "runtime/interfaceSupport.hpp"
50162852Sdes#include "runtime/java.hpp"
51162852Sdes#include "runtime/javaCalls.hpp"
52162852Sdes#include "runtime/mutexLocker.hpp"
53146998Sdes#include "runtime/objectMonitor.hpp"
54181111Sdes#include "runtime/osThread.hpp"
55181111Sdes#include "runtime/perfMemory.hpp"
56181111Sdes#include "runtime/sharedRuntime.hpp"
57181111Sdes#include "runtime/statSampler.hpp"
58181111Sdes#include "runtime/stubRoutines.hpp"
59181111Sdes#include "runtime/thread.inline.hpp"
60181111Sdes#include "runtime/threadCritical.hpp"
61181111Sdes#include "runtime/timer.hpp"
6276259Sgreen#include "services/attachListener.hpp"
6376259Sgreen#include "services/memTracker.hpp"
6476259Sgreen#include "services/runtimeService.hpp"
6592555Sdes#include "utilities/decoder.hpp"
6676259Sgreen#include "utilities/defaultStream.hpp"
6776259Sgreen#include "utilities/events.hpp"
68162852Sdes#include "utilities/growableArray.hpp"
6976259Sgreen#include "utilities/vmError.hpp"
7076259Sgreen
7176259Sgreen#ifdef _DEBUG
72204917Sdes#include <crtdbg.h>
73224638Sbrooks#endif
74204917Sdes
75126274Sdes
76126274Sdes#include <windows.h>
77126274Sdes#include <sys/types.h>
78126274Sdes#include <sys/stat.h>
79126274Sdes#include <sys/timeb.h>
80126274Sdes#include <objidl.h>
81126274Sdes#include <shlobj.h>
82126274Sdes
83126274Sdes#include <malloc.h>
84126274Sdes#include <signal.h>
85128456Sdes#include <direct.h>
86126274Sdes#include <errno.h>
87204917Sdes#include <fcntl.h>
88204917Sdes#include <io.h>
89204917Sdes#include <process.h>              // For _beginthreadex(), _endthreadex()
90204917Sdes#include <imagehlp.h>             // For os::dll_address_to_function_name
91204917Sdes/* for enumerating dll libraries */
92204917Sdes#include <vdmdbg.h>
93137015Sdes
94137015Sdes// for timer info max values which include all bits
95137015Sdes#define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
96137015Sdes
97137015Sdes// For DLL loading/load error detection
98137015Sdes// Values of PE COFF
99204917Sdes#define IMAGE_FILE_PTR_TO_SIGNATURE 0x3c
100204917Sdes#define IMAGE_FILE_SIGNATURE_LENGTH 4
101204917Sdes
102204917Sdesstatic HANDLE main_process;
103204917Sdesstatic HANDLE main_thread;
104204917Sdesstatic int    main_thread_id;
105126274Sdes
106126274Sdesstatic FILETIME process_creation_time;
107126274Sdesstatic FILETIME process_exit_time;
10898937Sdesstatic FILETIME process_user_time;
10998937Sdesstatic FILETIME process_kernel_time;
110126274Sdes
111126274Sdes#ifdef _M_IA64
11276259Sgreen#define __CPU__ ia64
113137015Sdes#elif _M_AMD64
114204917Sdes#define __CPU__ amd64
115204917Sdes#else
116204917Sdes#define __CPU__ i486
117204917Sdes#endif
118204917Sdes
119204917Sdes// save DLL module handle, used by GetModuleFileName
120204917Sdes
121204917SdesHINSTANCE vm_lib_handle;
122204917Sdes
123113908SdesBOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) {
124204917Sdes  switch (reason) {
125137015Sdes    case DLL_PROCESS_ATTACH:
126137015Sdes      vm_lib_handle = hinst;
127126274Sdes      if(ForceTimeHighResolution)
128126274Sdes        timeBeginPeriod(1L);
129126274Sdes      break;
130126274Sdes    case DLL_PROCESS_DETACH:
131126274Sdes      if(ForceTimeHighResolution)
132181111Sdes        timeEndPeriod(1L);
133126274Sdes      break;
134126274Sdes    default:
135126274Sdes      break;
136221420Sdes  }
137126274Sdes  return true;
138126274Sdes}
139126274Sdes
140126274Sdesstatic inline double fileTimeAsDouble(FILETIME* time) {
141126274Sdes  const double high  = (double) ((unsigned int) ~0);
142126274Sdes  const double split = 10000000.0;
143126274Sdes  double result = (time->dwLowDateTime / split) +
144126274Sdes                   time->dwHighDateTime * (high/split);
145126274Sdes  return result;
146126274Sdes}
147126274Sdes
148126274Sdes// Implementation of os
149126274Sdes
150126274Sdesbool os::getenv(const char* name, char* buffer, int len) {
151126274Sdes int result = GetEnvironmentVariable(name, buffer, len);
152126274Sdes return result > 0 && result < len;
153126274Sdes}
154126274Sdes
155126274Sdes
156126274Sdes// No setuid programs under Windows.
157204917Sdesbool os::have_special_privileges() {
158126274Sdes  return false;
159126274Sdes}
160204917Sdes
161204917Sdes
162204917Sdes// This method is  a periodic task to check for misbehaving JNI applications
163204917Sdes// under CheckJNI, we can add any periodic checks here.
164204917Sdes// For Windows at the moment does nothing
165126274Sdesvoid os::run_periodic_checks() {
166204917Sdes  return;
167204917Sdes}
168204917Sdes
169204917Sdes#ifndef _WIN64
170204917Sdes// previous UnhandledExceptionFilter, if there is one
171204917Sdesstatic LPTOP_LEVEL_EXCEPTION_FILTER prev_uef_handler = NULL;
172204917Sdes
173204917SdesLONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo);
174204917Sdes#endif
175204917Sdesvoid os::init_system_properties_values() {
176204917Sdes  /* sysclasspath, java_home, dll_dir */
177204917Sdes  {
178204917Sdes      char *home_path;
179204917Sdes      char *dll_path;
180204917Sdes      char *pslash;
181221420Sdes      char *bin = "\\bin";
182204917Sdes      char home_dir[MAX_PATH];
183204917Sdes
184204917Sdes      if (!getenv("_ALT_JAVA_HOME_DIR", home_dir, MAX_PATH)) {
185204917Sdes          os::jvm_path(home_dir, sizeof(home_dir));
186215116Sdes          // Found the full path to jvm.dll.
187215116Sdes          // Now cut the path to <java_home>/jre if we can.
188204917Sdes          *(strrchr(home_dir, '\\')) = '\0';  /* get rid of \jvm.dll */
189204917Sdes          pslash = strrchr(home_dir, '\\');
190204917Sdes          if (pslash != NULL) {
191204917Sdes              *pslash = '\0';                 /* get rid of \{client|server} */
192204917Sdes              pslash = strrchr(home_dir, '\\');
193204917Sdes              if (pslash != NULL)
194204917Sdes                  *pslash = '\0';             /* get rid of \bin */
195204917Sdes          }
196204917Sdes      }
197204917Sdes
198204917Sdes      home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1, mtInternal);
199204917Sdes      if (home_path == NULL)
200126274Sdes          return;
201126274Sdes      strcpy(home_path, home_dir);
202204917Sdes      Arguments::set_java_home(home_path);
203126274Sdes
204181111Sdes      dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1, mtInternal);
20592555Sdes      if (dll_path == NULL)
206137015Sdes          return;
207137015Sdes      strcpy(dll_path, home_dir);
208146998Sdes      strcat(dll_path, bin);
209137015Sdes      Arguments::set_dll_dir(dll_path);
210146998Sdes
211146998Sdes      if (!set_boot_path('\\', ';'))
212137015Sdes          return;
213137015Sdes  }
214137015Sdes
215137015Sdes  /* library_path */
216181111Sdes  #define EXT_DIR "\\lib\\ext"
217137015Sdes  #define BIN_DIR "\\bin"
218137015Sdes  #define PACKAGE_DIR "\\Sun\\Java"
219137015Sdes  {
220137015Sdes    /* Win32 library search order (See the documentation for LoadLibrary):
221146998Sdes     *
222137015Sdes     * 1. The directory from which application is loaded.
223137015Sdes     * 2. The system wide Java Extensions directory (Java only)
224137015Sdes     * 3. System directory (GetSystemDirectory)
225146998Sdes     * 4. Windows directory (GetWindowsDirectory)
226137015Sdes     * 5. The PATH environment variable
227137015Sdes     * 6. The current directory
228137015Sdes     */
229126274Sdes
230126274Sdes    char *library_path;
231192595Sdes    char tmp[MAX_PATH];
232192595Sdes    char *path_str = ::getenv("PATH");
233192595Sdes
234192595Sdes    library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) +
235192595Sdes        sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10, mtInternal);
236192595Sdes
237192595Sdes    library_path[0] = '\0';
238192595Sdes
239192595Sdes    GetModuleFileName(NULL, tmp, sizeof(tmp));
240204917Sdes    *(strrchr(tmp, '\\')) = '\0';
241192595Sdes    strcat(library_path, tmp);
242192595Sdes
243192595Sdes    GetWindowsDirectory(tmp, sizeof(tmp));
244192595Sdes    strcat(library_path, ";");
245221420Sdes    strcat(library_path, tmp);
246192595Sdes    strcat(library_path, PACKAGE_DIR BIN_DIR);
247204917Sdes
248192595Sdes    GetSystemDirectory(tmp, sizeof(tmp));
249192595Sdes    strcat(library_path, ";");
250192595Sdes    strcat(library_path, tmp);
251204917Sdes
252192595Sdes    GetWindowsDirectory(tmp, sizeof(tmp));
253192595Sdes    strcat(library_path, ";");
254192595Sdes    strcat(library_path, tmp);
255192595Sdes
256192595Sdes    if (path_str) {
257192595Sdes        strcat(library_path, ";");
258192595Sdes        strcat(library_path, path_str);
259192595Sdes    }
260192595Sdes
261192595Sdes    strcat(library_path, ";.");
262126274Sdes
263126274Sdes    Arguments::set_library_path(library_path);
264126274Sdes    FREE_C_HEAP_ARRAY(char, library_path, mtInternal);
265126274Sdes  }
266126274Sdes
267126274Sdes  /* Default extensions directory */
268126274Sdes  {
269126274Sdes    char path[MAX_PATH];
270126274Sdes    char buf[2 * MAX_PATH + 2 * sizeof(EXT_DIR) + sizeof(PACKAGE_DIR) + 1];
271126274Sdes    GetWindowsDirectory(path, MAX_PATH);
272126274Sdes    sprintf(buf, "%s%s;%s%s%s", Arguments::get_java_home(), EXT_DIR,
273126274Sdes        path, PACKAGE_DIR, EXT_DIR);
274221420Sdes    Arguments::set_ext_dirs(buf);
275126274Sdes  }
276126274Sdes  #undef EXT_DIR
277126274Sdes  #undef BIN_DIR
278126274Sdes  #undef PACKAGE_DIR
279126274Sdes
280126274Sdes  /* Default endorsed standards directory. */
281126274Sdes  {
282126274Sdes    #define ENDORSED_DIR "\\lib\\endorsed"
283126274Sdes    size_t len = strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR);
284126274Sdes    char * buf = NEW_C_HEAP_ARRAY(char, len, mtInternal);
285126274Sdes    sprintf(buf, "%s%s", Arguments::get_java_home(), ENDORSED_DIR);
286126274Sdes    Arguments::set_endorsed_dirs(buf);
287126274Sdes    #undef ENDORSED_DIR
288126274Sdes  }
289126274Sdes
290126274Sdes#ifndef _WIN64
291126274Sdes  // set our UnhandledExceptionFilter and save any previous one
292126274Sdes  prev_uef_handler = SetUnhandledExceptionFilter(Handle_FLT_Exception);
293126274Sdes#endif
294126274Sdes
295126274Sdes  // Done
296126274Sdes  return;
297162852Sdes}
298126274Sdes
299126274Sdesvoid os::breakpoint() {
300126274Sdes  DebugBreak();
301126274Sdes}
302126274Sdes
303126274Sdes// Invoked from the BREAKPOINT Macro
304126274Sdesextern "C" void breakpoint() {
305126274Sdes  os::breakpoint();
306126274Sdes}
307126274Sdes
308126274Sdes/*
309126274Sdes * RtlCaptureStackBackTrace Windows API may not exist prior to Windows XP.
310126274Sdes * So far, this method is only used by Native Memory Tracking, which is
311126274Sdes * only supported on Windows XP or later.
312126274Sdes */
313126274Sdesaddress os::get_caller_pc(int n) {
314126274Sdes#ifdef _NMT_NOINLINE_
315126274Sdes  n ++;
316126274Sdes#endif
317126274Sdes  address pc;
318126274Sdes  if (os::Kernel32Dll::RtlCaptureStackBackTrace(n + 1, 1, (PVOID*)&pc, NULL) == 1) {
319126274Sdes    return pc;
320126274Sdes  }
321126274Sdes  return NULL;
322126274Sdes}
323126274Sdes
324126274Sdes
325126274Sdes// os::current_stack_base()
326126274Sdes//
327126274Sdes//   Returns the base of the stack, which is the stack's
328146998Sdes//   starting address.  This function must be called
329126274Sdes//   while running on the stack of the thread being queried.
330126274Sdes
331126274Sdesaddress os::current_stack_base() {
332126274Sdes  MEMORY_BASIC_INFORMATION minfo;
333126274Sdes  address stack_bottom;
334126274Sdes  size_t stack_size;
335126274Sdes
336126274Sdes  VirtualQuery(&minfo, &minfo, sizeof(minfo));
337126274Sdes  stack_bottom =  (address)minfo.AllocationBase;
338126274Sdes  stack_size = minfo.RegionSize;
339126274Sdes
340137015Sdes  // Add up the sizes of all the regions with the same
341126274Sdes  // AllocationBase.
342126274Sdes  while( 1 )
343126274Sdes  {
344137015Sdes    VirtualQuery(stack_bottom+stack_size, &minfo, sizeof(minfo));
345126274Sdes    if ( stack_bottom == (address)minfo.AllocationBase )
346137015Sdes      stack_size += minfo.RegionSize;
347126274Sdes    else
348126274Sdes      break;
349126274Sdes  }
350126274Sdes
351126274Sdes#ifdef _M_IA64
352204917Sdes  // IA64 has memory and register stacks
353204917Sdes  //
354126274Sdes  // This is the stack layout you get on NT/IA64 if you specify 1MB stack limit
355181111Sdes  // at thread creation (1MB backing store growing upwards, 1MB memory stack
356181111Sdes  // growing downwards, 2MB summed up)
357126274Sdes  //
358181111Sdes  // ...
359181111Sdes  // ------- top of stack (high address) -----
360181111Sdes  // |
361204917Sdes  // |      1MB
362204917Sdes  // |      Backing Store (Register Stack)
363181111Sdes  // |
364126274Sdes  // |         / \
365126274Sdes  // |          |
366126274Sdes  // |          |
367126274Sdes  // |          |
368204917Sdes  // ------------------------ stack base -----
369204917Sdes  // |      1MB
370204917Sdes  // |      Memory Stack
371204917Sdes  // |
372126274Sdes  // |          |
373181111Sdes  // |          |
374181111Sdes  // |          |
375126274Sdes  // |         \ /
376126274Sdes  // |
377126274Sdes  // ----- bottom of stack (low address) -----
378181111Sdes  // ...
379126274Sdes
380126274Sdes  stack_size = stack_size / 2;
381126274Sdes#endif
382221420Sdes  return stack_bottom + stack_size;
383221420Sdes}
384221420Sdes
385221420Sdessize_t os::current_stack_size() {
386221420Sdes  size_t sz;
387221420Sdes  MEMORY_BASIC_INFORMATION minfo;
388221420Sdes  VirtualQuery(&minfo, &minfo, sizeof(minfo));
389221420Sdes  sz = (size_t)os::current_stack_base() - (size_t)minfo.AllocationBase;
390221420Sdes  return sz;
391221420Sdes}
392221420Sdes
393221420Sdesstruct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
394221420Sdes  const struct tm* time_struct_ptr = localtime(clock);
395221420Sdes  if (time_struct_ptr != NULL) {
396221420Sdes    *res = *time_struct_ptr;
397221420Sdes    return res;
398221420Sdes  }
399221420Sdes  return NULL;
400221420Sdes}
401221420Sdes
402221420SdesLONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo);
403221420Sdes
404221420Sdes// Thread start routine for all new Java threads
405221420Sdesstatic unsigned __stdcall java_start(Thread* thread) {
406181111Sdes  // Try to randomize the cache line index of hot stack frames.
407126274Sdes  // This helps when threads of the same stack traces evict each other's
408181111Sdes  // cache lines. The threads can be either from the same JVM instance, or
409181111Sdes  // from different JVM instances. The benefit is especially true for
410126274Sdes  // processors with hyperthreading technology.
411181111Sdes  static int counter = 0;
412181111Sdes  int pid = os::current_process_id();
413181111Sdes  _alloca(((pid ^ counter++) & 7) * 128);
414137015Sdes
415204917Sdes  OSThread* osthr = thread->osthread();
416181111Sdes  assert(osthr->get_state() == RUNNABLE, "invalid os thread state");
417181111Sdes
418181111Sdes  if (UseNUMA) {
419181111Sdes    int lgrp_id = os::numa_get_group_id();
420181111Sdes    if (lgrp_id != -1) {
421181111Sdes      thread->set_lgrp_id(lgrp_id);
422181111Sdes    }
423181111Sdes  }
424181111Sdes
425181111Sdes
426181111Sdes  // Install a win32 structured exception handler around every thread created
427181111Sdes  // by VM, so VM can genrate error dump when an exception occurred in non-
428181111Sdes  // Java thread (e.g. VM thread).
429181111Sdes  __try {
430181111Sdes     thread->run();
431204917Sdes  } __except(topLevelExceptionFilter(
432204917Sdes             (_EXCEPTION_POINTERS*)_exception_info())) {
433204917Sdes      // Nothing to do.
434181111Sdes  }
435204917Sdes
436181111Sdes  // One less thread is executing
437181111Sdes  // When the VMThread gets here, the main thread may have already exited
438181111Sdes  // which frees the CodeHeap containing the Atomic::add code
439204917Sdes  if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) {
440181111Sdes    Atomic::dec_ptr((intptr_t*)&os::win32::_os_thread_count);
441181111Sdes  }
442181111Sdes
443181111Sdes  return 0;
444181111Sdes}
445181111Sdes
446181111Sdesstatic OSThread* create_os_thread(Thread* thread, HANDLE thread_handle, int thread_id) {
447181111Sdes  // Allocate the OSThread object
448181111Sdes  OSThread* osthread = new OSThread(NULL, NULL);
449181111Sdes  if (osthread == NULL) return NULL;
450181111Sdes
451181111Sdes  // Initialize support for Java interrupts
452126274Sdes  HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL);
453126274Sdes  if (interrupt_event == NULL) {
454126274Sdes    delete osthread;
455181111Sdes    return NULL;
456126274Sdes  }
457126274Sdes  osthread->set_interrupt_event(interrupt_event);
458126274Sdes
459181111Sdes  // Store info on the Win32 thread into the OSThread
460126274Sdes  osthread->set_thread_handle(thread_handle);
461181111Sdes  osthread->set_thread_id(thread_id);
462181111Sdes
463126274Sdes  if (UseNUMA) {
464181111Sdes    int lgrp_id = os::numa_get_group_id();
465181111Sdes    if (lgrp_id != -1) {
466126274Sdes      thread->set_lgrp_id(lgrp_id);
467181111Sdes    }
468181111Sdes  }
469181111Sdes
470181111Sdes  // Initial thread state is INITIALIZED, not SUSPENDED
471181111Sdes  osthread->set_state(INITIALIZED);
472181111Sdes
473181111Sdes  return osthread;
474181111Sdes}
475181111Sdes
476181111Sdes
477181111Sdesbool os::create_attached_thread(JavaThread* thread) {
478181111Sdes#ifdef ASSERT
479126274Sdes  thread->verify_not_published();
480126274Sdes#endif
481126274Sdes  HANDLE thread_h;
482181111Sdes  if (!DuplicateHandle(main_process, GetCurrentThread(), GetCurrentProcess(),
483126274Sdes                       &thread_h, THREAD_ALL_ACCESS, false, 0)) {
484126274Sdes    fatal("DuplicateHandle failed\n");
485126274Sdes  }
486126274Sdes  OSThread* osthread = create_os_thread(thread, thread_h,
487126274Sdes                                        (int)current_thread_id());
488126274Sdes  if (osthread == NULL) {
489126274Sdes     return false;
490126274Sdes  }
491126274Sdes
492126274Sdes  // Initial thread state is RUNNABLE
493126274Sdes  osthread->set_state(RUNNABLE);
494162852Sdes
495126274Sdes  thread->set_osthread(osthread);
496126274Sdes  return true;
497126274Sdes}
498126274Sdes
499126274Sdesbool os::create_main_thread(JavaThread* thread) {
500126274Sdes#ifdef ASSERT
501126274Sdes  thread->verify_not_published();
502126274Sdes#endif
503126274Sdes  if (_starting_thread == NULL) {
504126274Sdes    _starting_thread = create_os_thread(thread, main_thread, main_thread_id);
505126274Sdes     if (_starting_thread == NULL) {
506126274Sdes        return false;
507162852Sdes     }
508126274Sdes  }
509126274Sdes
510204917Sdes  // The primordial thread is runnable from the start)
511126274Sdes  _starting_thread->set_state(RUNNABLE);
512204917Sdes
513126274Sdes  thread->set_osthread(_starting_thread);
514204917Sdes  return true;
515204917Sdes}
516204917Sdes
517204917Sdes// Allocate and initialize a new OSThread
518204917Sdesbool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
519204917Sdes  unsigned thread_id;
520204917Sdes
521204917Sdes  // Allocate the OSThread object
522204917Sdes  OSThread* osthread = new OSThread(NULL, NULL);
523126274Sdes  if (osthread == NULL) {
524126274Sdes    return false;
525126274Sdes  }
526204917Sdes
527204917Sdes  // Initialize support for Java interrupts
528126274Sdes  HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL);
529126274Sdes  if (interrupt_event == NULL) {
530126274Sdes    delete osthread;
531204917Sdes    return NULL;
532126274Sdes  }
533126274Sdes  osthread->set_interrupt_event(interrupt_event);
534204917Sdes  osthread->set_interrupted(false);
535126274Sdes
536126274Sdes  thread->set_osthread(osthread);
537126274Sdes
538126274Sdes  if (stack_size == 0) {
539126274Sdes    switch (thr_type) {
540204917Sdes    case os::java_thread:
541204917Sdes      // Java threads use ThreadStackSize which default value can be changed with the flag -Xss
542204917Sdes      if (JavaThread::stack_size_at_create() > 0)
543204917Sdes        stack_size = JavaThread::stack_size_at_create();
544204917Sdes      break;
545204917Sdes    case os::compiler_thread:
546204917Sdes      if (CompilerThreadStackSize > 0) {
547126274Sdes        stack_size = (size_t)(CompilerThreadStackSize * K);
548126274Sdes        break;
549126274Sdes      } // else fall through:
550126274Sdes        // use VMThreadStackSize if CompilerThreadStackSize is not defined
551137015Sdes    case os::vm_thread:
552204917Sdes    case os::pgc_thread:
553204917Sdes    case os::cgc_thread:
554204917Sdes    case os::watcher_thread:
555204917Sdes      if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
556126274Sdes      break;
557126274Sdes    }
558126274Sdes  }
559126274Sdes
560126274Sdes  // Create the Win32 thread
561126274Sdes  //
562204917Sdes  // Contrary to what MSDN document says, "stack_size" in _beginthreadex()
563204917Sdes  // does not specify stack size. Instead, it specifies the size of
564126274Sdes  // initially committed space. The stack size is determined by
565204917Sdes  // PE header in the executable. If the committed "stack_size" is larger
566126274Sdes  // than default value in the PE header, the stack is rounded up to the
567204917Sdes  // nearest multiple of 1MB. For example if the launcher has default
568204917Sdes  // stack size of 320k, specifying any size less than 320k does not
569204917Sdes  // affect the actual stack size at all, it only affects the initial
570204917Sdes  // commitment. On the other hand, specifying 'stack_size' larger than
571204917Sdes  // default value may cause significant increase in memory usage, because
572126274Sdes  // not only the stack space will be rounded up to MB, but also the
573126274Sdes  // entire space is committed upfront.
574204917Sdes  //
575204917Sdes  // Finally Windows XP added a new flag 'STACK_SIZE_PARAM_IS_A_RESERVATION'
576204917Sdes  // for CreateThread() that can treat 'stack_size' as stack size. However we
577204917Sdes  // are not supposed to call CreateThread() directly according to MSDN
578204917Sdes  // document because JVM uses C runtime library. The good news is that the
579204917Sdes  // flag appears to work with _beginthredex() as well.
580204917Sdes
581204917Sdes#ifndef STACK_SIZE_PARAM_IS_A_RESERVATION
582204917Sdes#define STACK_SIZE_PARAM_IS_A_RESERVATION  (0x10000)
583126274Sdes#endif
584126274Sdes
585126274Sdes  HANDLE thread_handle =
586126274Sdes    (HANDLE)_beginthreadex(NULL,
587126274Sdes                           (unsigned)stack_size,
588126274Sdes                           (unsigned (__stdcall *)(void*)) java_start,
589126274Sdes                           thread,
590126274Sdes                           CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION,
591126274Sdes                           &thread_id);
592126274Sdes  if (thread_handle == NULL) {
593126274Sdes    // perhaps STACK_SIZE_PARAM_IS_A_RESERVATION is not supported, try again
594204917Sdes    // without the flag.
595204917Sdes    thread_handle =
596126274Sdes    (HANDLE)_beginthreadex(NULL,
597126274Sdes                           (unsigned)stack_size,
598126274Sdes                           (unsigned (__stdcall *)(void*)) java_start,
599204917Sdes                           thread,
600126274Sdes                           CREATE_SUSPENDED,
601126274Sdes                           &thread_id);
602204917Sdes  }
603181111Sdes  if (thread_handle == NULL) {
604126274Sdes    // Need to clean up stuff we've allocated so far
605126274Sdes    CloseHandle(osthread->interrupt_event());
606126274Sdes    thread->set_osthread(NULL);
607126274Sdes    delete osthread;
608126274Sdes    return NULL;
609126274Sdes  }
610126274Sdes
611126274Sdes  Atomic::inc_ptr((intptr_t*)&os::win32::_os_thread_count);
612204917Sdes
613126274Sdes  // Store info on the Win32 thread into the OSThread
614126274Sdes  osthread->set_thread_handle(thread_handle);
615126274Sdes  osthread->set_thread_id(thread_id);
616126274Sdes
617126274Sdes  // Initial thread state is INITIALIZED, not SUSPENDED
618204917Sdes  osthread->set_state(INITIALIZED);
619204917Sdes
620204917Sdes  // The thread is returned suspended (in state INITIALIZED), and is started higher up in the call chain
621204917Sdes  return true;
622126274Sdes}
623204917Sdes
624204917Sdes
625204917Sdes// Free Win32 resources related to the OSThread
626126274Sdesvoid os::free_thread(OSThread* osthread) {
627126274Sdes  assert(osthread != NULL, "osthread not set");
628126274Sdes  CloseHandle(osthread->thread_handle());
629126274Sdes  CloseHandle(osthread->interrupt_event());
630137015Sdes  delete osthread;
631181111Sdes}
632181111Sdes
633181111Sdes
634181111Sdesstatic int    has_performance_count = 0;
635181111Sdesstatic jlong first_filetime;
636204917Sdesstatic jlong initial_performance_count;
637204917Sdesstatic jlong performance_frequency;
638204917Sdes
639204917Sdes
640204917Sdesjlong as_long(LARGE_INTEGER x) {
641126274Sdes  jlong result = 0; // initialization to avoid warning
642126274Sdes  set_high(&result, x.HighPart);
643126274Sdes  set_low(&result,  x.LowPart);
644126274Sdes  return result;
645126274Sdes}
646126274Sdes
647204917Sdes
648204917Sdesjlong os::elapsed_counter() {
649204917Sdes  LARGE_INTEGER count;
650126274Sdes  if (has_performance_count) {
651126274Sdes    QueryPerformanceCounter(&count);
652204917Sdes    return as_long(count) - initial_performance_count;
653204917Sdes  } else {
654204917Sdes    FILETIME wt;
655204917Sdes    GetSystemTimeAsFileTime(&wt);
656204917Sdes    return (jlong_from(wt.dwHighDateTime, wt.dwLowDateTime) - first_filetime);
657126274Sdes  }
658126274Sdes}
659204917Sdes
660204917Sdes
661204917Sdesjlong os::elapsed_frequency() {
662204917Sdes  if (has_performance_count) {
663204917Sdes    return performance_frequency;
664204917Sdes  } else {
665204917Sdes   // the FILETIME time is the number of 100-nanosecond intervals since January 1,1601.
666204917Sdes   return 10000000;
667204917Sdes  }
668126274Sdes}
669126274Sdes
670126274Sdes
671126274Sdesjulong os::available_memory() {
672126274Sdes  return win32::available_memory();
673126274Sdes}
674126274Sdes
675126274Sdesjulong os::win32::available_memory() {
676126274Sdes  // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect
677126274Sdes  // value if total memory is larger than 4GB
678126274Sdes  MEMORYSTATUSEX ms;
679126274Sdes  ms.dwLength = sizeof(ms);
680126274Sdes  GlobalMemoryStatusEx(&ms);
681126274Sdes
682126274Sdes  return (julong)ms.ullAvailPhys;
683126274Sdes}
684137015Sdes
685126274Sdesjulong os::physical_memory() {
686137015Sdes  return win32::physical_memory();
687137015Sdes}
688137015Sdes
689137015Sdesbool os::has_allocatable_memory_limit(julong* limit) {
690137015Sdes  MEMORYSTATUSEX ms;
691137015Sdes  ms.dwLength = sizeof(ms);
692137015Sdes  GlobalMemoryStatusEx(&ms);
693137015Sdes#ifdef _LP64
694137015Sdes  *limit = (julong)ms.ullAvailVirtual;
695126274Sdes  return true;
696126274Sdes#else
697126274Sdes  // Limit to 1400m because of the 2gb address space wall
698126274Sdes  *limit = MIN2((julong)1400*M, (julong)ms.ullAvailVirtual);
699126274Sdes  return true;
700126274Sdes#endif
701149749Sdes}
702149749Sdes
703126274Sdes// VC6 lacks DWORD_PTR
704126274Sdes#if _MSC_VER < 1300
705126274Sdestypedef UINT_PTR DWORD_PTR;
706126274Sdes#endif
707126274Sdes
708137015Sdesint os::active_processor_count() {
709149749Sdes  DWORD_PTR lpProcessAffinityMask = 0;
710126274Sdes  DWORD_PTR lpSystemAffinityMask = 0;
711126274Sdes  int proc_count = processor_count();
712126274Sdes  if (proc_count <= sizeof(UINT_PTR) * BitsPerByte &&
713126274Sdes      GetProcessAffinityMask(GetCurrentProcess(), &lpProcessAffinityMask, &lpSystemAffinityMask)) {
714137015Sdes    // Nof active processors is number of bits in process affinity mask
715137015Sdes    int bitcount = 0;
716137015Sdes    while (lpProcessAffinityMask != 0) {
717137015Sdes      lpProcessAffinityMask = lpProcessAffinityMask & (lpProcessAffinityMask-1);
718126274Sdes      bitcount++;
719126274Sdes    }
720126274Sdes    return bitcount;
721126274Sdes  } else {
722126274Sdes    return proc_count;
723126274Sdes  }
724126274Sdes}
725126274Sdes
726126274Sdesvoid os::set_native_thread_name(const char *name) {
727126274Sdes  // Not yet implemented.
728126274Sdes  return;
729126274Sdes}
730126274Sdes
731126274Sdesbool os::distribute_processes(uint length, uint* distribution) {
732126274Sdes  // Not yet implemented.
733137015Sdes  return false;
734157016Sdes}
735157016Sdes
736137015Sdesbool os::bind_to_processor(uint processor_id) {
737137015Sdes  // Not yet implemented.
738137015Sdes  return false;
739126274Sdes}
740137015Sdes
741126274Sdesstatic void initialize_performance_counter() {
742126274Sdes  LARGE_INTEGER count;
743137015Sdes  if (QueryPerformanceFrequency(&count)) {
744137015Sdes    has_performance_count = 1;
745137015Sdes    performance_frequency = as_long(count);
746126274Sdes    QueryPerformanceCounter(&count);
747126274Sdes    initial_performance_count = as_long(count);
748126274Sdes  } else {
749126274Sdes    has_performance_count = 0;
750137015Sdes    FILETIME wt;
751204917Sdes    GetSystemTimeAsFileTime(&wt);
752137015Sdes    first_filetime = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
753137015Sdes  }
754126274Sdes}
755137015Sdes
756137015Sdes
757204917Sdesdouble os::elapsedTime() {
758204917Sdes  return (double) elapsed_counter() / (double) elapsed_frequency();
759137015Sdes}
760137015Sdes
761137015Sdes
762137015Sdes// Windows format:
763126274Sdes//   The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601.
764126274Sdes// Java format:
765126274Sdes//   Java standards require the number of milliseconds since 1/1/1970
766126274Sdes
767126274Sdes// Constant offset - calculated using offset()
768126274Sdesstatic jlong  _offset   = 116444736000000000;
769126274Sdes// Fake time counter for reproducible results when debugging
770126274Sdesstatic jlong  fake_time = 0;
771126274Sdes
772126274Sdes#ifdef ASSERT
773126274Sdes// Just to be safe, recalculate the offset in debug mode
774126274Sdesstatic jlong _calculated_offset = 0;
775137015Sdesstatic int   _has_calculated_offset = 0;
776126274Sdes
777126274Sdesjlong offset() {
778126274Sdes  if (_has_calculated_offset) return _calculated_offset;
779126274Sdes  SYSTEMTIME java_origin;
780126274Sdes  java_origin.wYear          = 1970;
781126274Sdes  java_origin.wMonth         = 1;
782126274Sdes  java_origin.wDayOfWeek     = 0; // ignored
783126274Sdes  java_origin.wDay           = 1;
784126274Sdes  java_origin.wHour          = 0;
785126274Sdes  java_origin.wMinute        = 0;
786126274Sdes  java_origin.wSecond        = 0;
787221420Sdes  java_origin.wMilliseconds  = 0;
788221420Sdes  FILETIME jot;
789126274Sdes  if (!SystemTimeToFileTime(&java_origin, &jot)) {
790221420Sdes    fatal(err_msg("Error = %d\nWindows error", GetLastError()));
791221420Sdes  }
792221420Sdes  _calculated_offset = jlong_from(jot.dwHighDateTime, jot.dwLowDateTime);
793126274Sdes  _has_calculated_offset = 1;
794126274Sdes  assert(_calculated_offset == _offset, "Calculated and constant time offsets must be equal");
795126274Sdes  return _calculated_offset;
796221420Sdes}
797221420Sdes#else
798221420Sdesjlong offset() {
799146998Sdes  return _offset;
800146998Sdes}
801126274Sdes#endif
802221420Sdes
803126274Sdesjlong windows_to_java_time(FILETIME wt) {
804126274Sdes  jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
805137015Sdes  return (a - offset()) / 10000;
806137015Sdes}
807137015Sdes
808126274SdesFILETIME java_to_windows_time(jlong l) {
809146998Sdes  jlong a = (l * 10000) + offset();
810146998Sdes  FILETIME result;
811126274Sdes  result.dwHighDateTime = high(a);
812221420Sdes  result.dwLowDateTime  = low(a);
813221420Sdes  return result;
814221420Sdes}
815221420Sdes
816221420Sdes// For now, we say that Windows does not support vtime.  I have no idea
817126274Sdes// whether it can actually be made to (DLD, 9/13/05).
818126274Sdes
819221420Sdesbool os::supports_vtime() { return false; }
820221420Sdesbool os::enable_vtime() { return false; }
821221420Sdesbool os::vtime_enabled() { return false; }
822137015Sdesdouble os::elapsedVTime() {
823126274Sdes  // better than nothing, but not much
824126274Sdes  return elapsedTime();
825126274Sdes}
826126274Sdes
827126274Sdesjlong os::javaTimeMillis() {
828126274Sdes  if (UseFakeTimers) {
829126274Sdes    return fake_time++;
830126274Sdes  } else {
831126274Sdes    FILETIME wt;
832146998Sdes    GetSystemTimeAsFileTime(&wt);
833126274Sdes    return windows_to_java_time(wt);
834137015Sdes  }
835221420Sdes}
836221420Sdes
837221420Sdesjlong os::javaTimeNanos() {
838221420Sdes  if (!has_performance_count) {
839221420Sdes    return javaTimeMillis() * NANOSECS_PER_MILLISEC; // the best we can do.
840221420Sdes  } else {
841126274Sdes    LARGE_INTEGER current_count;
842126274Sdes    QueryPerformanceCounter(&current_count);
843126274Sdes    double current = as_long(current_count);
844126274Sdes    double freq = performance_frequency;
845126274Sdes    jlong time = (jlong)((current/freq) * NANOSECS_PER_SEC);
846126274Sdes    return time;
847126274Sdes  }
848126274Sdes}
849126274Sdes
850126274Sdesvoid os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
851126274Sdes  if (!has_performance_count) {
852126274Sdes    // javaTimeMillis() doesn't have much percision,
853126274Sdes    // but it is not going to wrap -- so all 64 bits
854137015Sdes    info_ptr->max_value = ALL_64_BITS;
855126274Sdes
856126274Sdes    // this is a wall clock timer, so may skip
857137015Sdes    info_ptr->may_skip_backward = true;
858126274Sdes    info_ptr->may_skip_forward = true;
859126274Sdes  } else {
860126274Sdes    jlong freq = performance_frequency;
861221420Sdes    if (freq < NANOSECS_PER_SEC) {
862126274Sdes      // the performance counter is 64 bits and we will
863126274Sdes      // be multiplying it -- so no wrap in 64 bits
864126274Sdes      info_ptr->max_value = ALL_64_BITS;
865181111Sdes    } else if (freq > NANOSECS_PER_SEC) {
866181111Sdes      // use the max value the counter can reach to
867181111Sdes      // determine the max value which could be returned
868181111Sdes      julong max_counter = (julong)ALL_64_BITS;
869181111Sdes      info_ptr->max_value = (jlong)(max_counter / (freq / NANOSECS_PER_SEC));
870181111Sdes    } else {
871181111Sdes      // the performance counter is 64 bits and we will
872204917Sdes      // be using it directly -- so no wrap in 64 bits
873181111Sdes      info_ptr->max_value = ALL_64_BITS;
874181111Sdes    }
875181111Sdes
876181111Sdes    // using a counter, so no skipping
877204917Sdes    info_ptr->may_skip_backward = false;
878181111Sdes    info_ptr->may_skip_forward = false;
879181111Sdes  }
880181111Sdes  info_ptr->kind = JVMTI_TIMER_ELAPSED;                // elapsed not CPU time
881181111Sdes}
882181111Sdes
883181111Sdeschar* os::local_time_string(char *buf, size_t buflen) {
884204917Sdes  SYSTEMTIME st;
885181111Sdes  GetLocalTime(&st);
886181111Sdes  jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
887181111Sdes               st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
888181111Sdes  return buf;
889181111Sdes}
890181111Sdes
891181111Sdesbool os::getTimesSecs(double* process_real_time,
892181111Sdes                     double* process_user_time,
893181111Sdes                     double* process_system_time) {
894181111Sdes  HANDLE h_process = GetCurrentProcess();
895181111Sdes  FILETIME create_time, exit_time, kernel_time, user_time;
896181111Sdes  BOOL result = GetProcessTimes(h_process,
897181111Sdes                               &create_time,
898181111Sdes                               &exit_time,
899181111Sdes                               &kernel_time,
900181111Sdes                               &user_time);
901181111Sdes  if (result != 0) {
902181111Sdes    FILETIME wt;
903181111Sdes    GetSystemTimeAsFileTime(&wt);
904181111Sdes    jlong rtc_millis = windows_to_java_time(wt);
905181111Sdes    jlong user_millis = windows_to_java_time(user_time);
906181111Sdes    jlong system_millis = windows_to_java_time(kernel_time);
907181111Sdes    *process_real_time = ((double) rtc_millis) / ((double) MILLIUNITS);
908181111Sdes    *process_user_time = ((double) user_millis) / ((double) MILLIUNITS);
909181111Sdes    *process_system_time = ((double) system_millis) / ((double) MILLIUNITS);
910181111Sdes    return true;
911181111Sdes  } else {
912181111Sdes    return false;
913181111Sdes  }
914181111Sdes}
915181111Sdes
916181111Sdesvoid os::shutdown() {
917181111Sdes
918181111Sdes  // allow PerfMemory to attempt cleanup of any persistent resources
919181111Sdes  perfMemory_exit();
920181111Sdes
921181111Sdes  // flush buffered output, finish log files
922181111Sdes  ostream_abort();
923181111Sdes
924181111Sdes  // Check for abort hook
925181111Sdes  abort_hook_t abort_hook = Arguments::abort_hook();
926181111Sdes  if (abort_hook != NULL) {
927181111Sdes    abort_hook();
928181111Sdes  }
929181111Sdes}
930181111Sdes
931181111Sdes
932181111Sdesstatic BOOL  (WINAPI *_MiniDumpWriteDump)  ( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION,
933181111Sdes                                            PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION);
934181111Sdes
935181111Sdesvoid os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) {
936181111Sdes  HINSTANCE dbghelp;
937181111Sdes  EXCEPTION_POINTERS ep;
938181111Sdes  MINIDUMP_EXCEPTION_INFORMATION mei;
939181111Sdes  MINIDUMP_EXCEPTION_INFORMATION* pmei;
940181111Sdes
941181111Sdes  HANDLE hProcess = GetCurrentProcess();
942181111Sdes  DWORD processId = GetCurrentProcessId();
943181111Sdes  HANDLE dumpFile;
944181111Sdes  MINIDUMP_TYPE dumpType;
945181111Sdes  static const char* cwd;
946181111Sdes
947181111Sdes  // If running on a client version of Windows and user has not explicitly enabled dumping
948181111Sdes  if (!os::win32::is_windows_server() && !CreateMinidumpOnCrash) {
949181111Sdes    VMError::report_coredump_status("Minidumps are not enabled by default on client versions of Windows", false);
950181111Sdes    return;
951181111Sdes    // If running on a server version of Windows and user has explictly disabled dumping
952181111Sdes  } else if (os::win32::is_windows_server() && !FLAG_IS_DEFAULT(CreateMinidumpOnCrash) && !CreateMinidumpOnCrash) {
953181111Sdes    VMError::report_coredump_status("Minidump has been disabled from the command line", false);
954181111Sdes    return;
955181111Sdes  }
956181111Sdes
957181111Sdes  dbghelp = os::win32::load_Windows_dll("DBGHELP.DLL", NULL, 0);
958204917Sdes
959204917Sdes  if (dbghelp == NULL) {
960204917Sdes    VMError::report_coredump_status("Failed to load dbghelp.dll", false);
961181111Sdes    return;
962204917Sdes  }
963204917Sdes
964204917Sdes  _MiniDumpWriteDump = CAST_TO_FN_PTR(
965204917Sdes    BOOL(WINAPI *)( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION,
966204917Sdes    PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION),
967204917Sdes    GetProcAddress(dbghelp, "MiniDumpWriteDump"));
968204917Sdes
969181111Sdes  if (_MiniDumpWriteDump == NULL) {
970181111Sdes    VMError::report_coredump_status("Failed to find MiniDumpWriteDump() in module dbghelp.dll", false);
971181111Sdes    return;
972181111Sdes  }
973204917Sdes
974204917Sdes  dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData);
975181111Sdes
976181111Sdes// Older versions of dbghelp.h doesn't contain all the dumptypes we want, dbghelp.h with
977181111Sdes// API_VERSION_NUMBER 11 or higher contains the ones we want though
978181111Sdes#if API_VERSION_NUMBER >= 11
979181111Sdes  dumpType = (MINIDUMP_TYPE)(dumpType | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo |
980181111Sdes    MiniDumpWithUnloadedModules);
981181111Sdes#endif
982181111Sdes
983181111Sdes  cwd = get_current_directory(NULL, 0);
984181111Sdes  jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp",cwd, current_process_id());
985181111Sdes  dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
986181111Sdes
987181111Sdes  if (dumpFile == INVALID_HANDLE_VALUE) {
988204917Sdes    VMError::report_coredump_status("Failed to create file for dumping", false);
989204917Sdes    return;
990204917Sdes  }
991204917Sdes  if (exceptionRecord != NULL && contextRecord != NULL) {
992181111Sdes    ep.ContextRecord = (PCONTEXT) contextRecord;
993181111Sdes    ep.ExceptionRecord = (PEXCEPTION_RECORD) exceptionRecord;
994181111Sdes
995181111Sdes    mei.ThreadId = GetCurrentThreadId();
996181111Sdes    mei.ExceptionPointers = &ep;
997181111Sdes    pmei = &mei;
998181111Sdes  } else {
999181111Sdes    pmei = NULL;
1000181111Sdes  }
1001181111Sdes
1002181111Sdes
1003181111Sdes  // Older versions of dbghelp.dll (the one shipped with Win2003 for example) may not support all
1004181111Sdes  // the dump types we really want. If first call fails, lets fall back to just use MiniDumpWithFullMemory then.
1005181111Sdes  if (_MiniDumpWriteDump(hProcess, processId, dumpFile, dumpType, pmei, NULL, NULL) == false &&
1006181111Sdes      _MiniDumpWriteDump(hProcess, processId, dumpFile, (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, NULL, NULL) == false) {
1007181111Sdes    VMError::report_coredump_status("Call to MiniDumpWriteDump() failed", false);
1008204917Sdes  } else {
1009204917Sdes    VMError::report_coredump_status(buffer, true);
1010181111Sdes  }
1011181111Sdes
1012181111Sdes  CloseHandle(dumpFile);
1013181111Sdes}
1014181111Sdes
1015181111Sdes
1016181111Sdes
1017181111Sdesvoid os::abort(bool dump_core)
1018181111Sdes{
1019181111Sdes  os::shutdown();
1020181111Sdes  // no core dump on Windows
1021181111Sdes  ::exit(1);
1022181111Sdes}
1023181111Sdes
1024181111Sdes// Die immediately, no exit hook, no abort hook, no cleanup.
1025181111Sdesvoid os::die() {
1026181111Sdes  _exit(-1);
1027181111Sdes}
1028181111Sdes
1029181111Sdes// Directory routines copied from src/win32/native/java/io/dirent_md.c
1030181111Sdes//  * dirent_md.c       1.15 00/02/02
1031181111Sdes//
1032181111Sdes// The declarations for DIR and struct dirent are in jvm_win32.h.
1033181111Sdes
1034181111Sdes/* Caller must have already run dirname through JVM_NativePath, which removes
1035181111Sdes   duplicate slashes and converts all instances of '/' into '\\'. */
1036181111Sdes
1037181111SdesDIR *
1038181111Sdesos::opendir(const char *dirname)
1039181111Sdes{
1040181111Sdes    assert(dirname != NULL, "just checking");   // hotspot change
1041181111Sdes    DIR *dirp = (DIR *)malloc(sizeof(DIR), mtInternal);
1042181111Sdes    DWORD fattr;                                // hotspot change
1043181111Sdes    char alt_dirname[4] = { 0, 0, 0, 0 };
1044181111Sdes
1045181111Sdes    if (dirp == 0) {
1046204917Sdes        errno = ENOMEM;
1047204917Sdes        return 0;
1048181111Sdes    }
1049181111Sdes
1050181111Sdes    /*
1051181111Sdes     * Win32 accepts "\" in its POSIX stat(), but refuses to treat it
1052181111Sdes     * as a directory in FindFirstFile().  We detect this case here and
1053181111Sdes     * prepend the current drive name.
1054181111Sdes     */
1055181111Sdes    if (dirname[1] == '\0' && dirname[0] == '\\') {
1056181111Sdes        alt_dirname[0] = _getdrive() + 'A' - 1;
1057181111Sdes        alt_dirname[1] = ':';
1058181111Sdes        alt_dirname[2] = '\\';
1059181111Sdes        alt_dirname[3] = '\0';
1060181111Sdes        dirname = alt_dirname;
1061181111Sdes    }
1062181111Sdes
1063181111Sdes    dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal);
1064181111Sdes    if (dirp->path == 0) {
1065181111Sdes        free(dirp, mtInternal);
1066181111Sdes        errno = ENOMEM;
1067181111Sdes        return 0;
1068181111Sdes    }
1069181111Sdes    strcpy(dirp->path, dirname);
1070181111Sdes
1071181111Sdes    fattr = GetFileAttributes(dirp->path);
1072181111Sdes    if (fattr == 0xffffffff) {
1073204917Sdes        free(dirp->path, mtInternal);
1074204917Sdes        free(dirp, mtInternal);
1075204917Sdes        errno = ENOENT;
1076204917Sdes        return 0;
1077204917Sdes    } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
1078204917Sdes        free(dirp->path, mtInternal);
1079181111Sdes        free(dirp, mtInternal);
1080181111Sdes        errno = ENOTDIR;
1081181111Sdes        return 0;
1082181111Sdes    }
1083181111Sdes
1084181111Sdes    /* Append "*.*", or possibly "\\*.*", to path */
1085181111Sdes    if (dirp->path[1] == ':'
1086181111Sdes        && (dirp->path[2] == '\0'
1087181111Sdes            || (dirp->path[2] == '\\' && dirp->path[3] == '\0'))) {
1088181111Sdes        /* No '\\' needed for cases like "Z:" or "Z:\" */
1089181111Sdes        strcat(dirp->path, "*.*");
1090181111Sdes    } else {
1091181111Sdes        strcat(dirp->path, "\\*.*");
1092204917Sdes    }
1093204917Sdes
1094181111Sdes    dirp->handle = FindFirstFile(dirp->path, &dirp->find_data);
1095181111Sdes    if (dirp->handle == INVALID_HANDLE_VALUE) {
1096181111Sdes        if (GetLastError() != ERROR_FILE_NOT_FOUND) {
1097181111Sdes            free(dirp->path, mtInternal);
1098181111Sdes            free(dirp, mtInternal);
1099181111Sdes            errno = EACCES;
1100181111Sdes            return 0;
1101181111Sdes        }
1102181111Sdes    }
1103181111Sdes    return dirp;
1104181111Sdes}
1105181111Sdes
1106181111Sdes/* parameter dbuf unused on Windows */
1107181111Sdes
1108181111Sdesstruct dirent *
1109181111Sdesos::readdir(DIR *dirp, dirent *dbuf)
1110181111Sdes{
1111181111Sdes    assert(dirp != NULL, "just checking");      // hotspot change
1112181111Sdes    if (dirp->handle == INVALID_HANDLE_VALUE) {
1113181111Sdes        return 0;
1114181111Sdes    }
1115181111Sdes
1116204917Sdes    strcpy(dirp->dirent.d_name, dirp->find_data.cFileName);
1117221420Sdes
1118126274Sdes    if (!FindNextFile(dirp->handle, &dirp->find_data)) {
1119126274Sdes        if (GetLastError() == ERROR_INVALID_HANDLE) {
1120181111Sdes            errno = EBADF;
1121126274Sdes            return 0;
1122126274Sdes        }
1123181111Sdes        FindClose(dirp->handle);
1124126274Sdes        dirp->handle = INVALID_HANDLE_VALUE;
1125126274Sdes    }
1126126274Sdes
1127126274Sdes    return &dirp->dirent;
1128126274Sdes}
1129126274Sdes
1130126274Sdesint
1131126274Sdesos::closedir(DIR *dirp)
1132126274Sdes{
1133204917Sdes    assert(dirp != NULL, "just checking");      // hotspot change
1134126274Sdes    if (dirp->handle != INVALID_HANDLE_VALUE) {
1135126274Sdes        if (!FindClose(dirp->handle)) {
1136204917Sdes            errno = EBADF;
1137204917Sdes            return -1;
1138204917Sdes        }
1139204917Sdes        dirp->handle = INVALID_HANDLE_VALUE;
1140204917Sdes    }
1141181111Sdes    free(dirp->path, mtInternal);
1142181111Sdes    free(dirp, mtInternal);
1143126274Sdes    return 0;
1144181111Sdes}
1145181111Sdes
1146126274Sdes// This must be hard coded because it's the system's temporary
1147126274Sdes// directory not the java application's temp directory, ala java.io.tmpdir.
1148126274Sdesconst char* os::get_temp_directory() {
1149126274Sdes  static char path_buf[MAX_PATH];
1150126274Sdes  if (GetTempPath(MAX_PATH, path_buf)>0)
1151126274Sdes    return path_buf;
1152126274Sdes  else{
1153126274Sdes    path_buf[0]='\0';
1154126274Sdes    return path_buf;
1155126274Sdes  }
1156126274Sdes}
1157181111Sdes
1158126274Sdesstatic bool file_exists(const char* filename) {
1159126274Sdes  if (filename == NULL || strlen(filename) == 0) {
1160126274Sdes    return false;
1161204917Sdes  }
1162126274Sdes  return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES;
1163181111Sdes}
1164126274Sdes
1165126274Sdesbool os::dll_build_name(char *buffer, size_t buflen,
1166126274Sdes                        const char* pname, const char* fname) {
1167221420Sdes  bool retval = false;
1168221420Sdes  const size_t pnamelen = pname ? strlen(pname) : 0;
1169181111Sdes  const char c = (pnamelen > 0) ? pname[pnamelen-1] : 0;
1170126274Sdes
1171181111Sdes  // Return error on buffer overflow.
1172126274Sdes  if (pnamelen + strlen(fname) + 10 > buflen) {
1173126274Sdes    return retval;
1174181111Sdes  }
1175126274Sdes
1176181111Sdes  if (pnamelen == 0) {
1177181111Sdes    jio_snprintf(buffer, buflen, "%s.dll", fname);
1178181111Sdes    retval = true;
1179181111Sdes  } else if (c == ':' || c == '\\') {
1180181111Sdes    jio_snprintf(buffer, buflen, "%s%s.dll", pname, fname);
1181181111Sdes    retval = true;
1182181111Sdes  } else if (strchr(pname, *os::path_separator()) != NULL) {
1183126274Sdes    int n;
1184221420Sdes    char** pelements = split_path(pname, &n);
1185221420Sdes    if (pelements == NULL) {
1186221420Sdes      return false;
1187221420Sdes    }
1188126274Sdes    for (int i = 0 ; i < n ; i++) {
1189181111Sdes      char* path = pelements[i];
1190126274Sdes      // Really shouldn't be NULL, but check can't hurt
1191126274Sdes      size_t plen = (path == NULL) ? 0 : strlen(path);
1192181111Sdes      if (plen == 0) {
1193126274Sdes        continue; // skip the empty path values
1194181111Sdes      }
1195181111Sdes      const char lastchar = path[plen - 1];
1196181111Sdes      if (lastchar == ':' || lastchar == '\\') {
1197181111Sdes        jio_snprintf(buffer, buflen, "%s%s.dll", path, fname);
1198181111Sdes      } else {
1199126274Sdes        jio_snprintf(buffer, buflen, "%s\\%s.dll", path, fname);
1200126274Sdes      }
1201126274Sdes      if (file_exists(buffer)) {
1202126274Sdes        retval = true;
1203126274Sdes        break;
1204126274Sdes      }
1205126274Sdes    }
1206126274Sdes    // release the storage
1207181111Sdes    for (int i = 0 ; i < n ; i++) {
1208126274Sdes      if (pelements[i] != NULL) {
1209126274Sdes        FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
1210181111Sdes      }
1211126274Sdes    }
1212181111Sdes    if (pelements != NULL) {
1213181111Sdes      FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
1214181111Sdes    }
1215181111Sdes  } else {
1216126274Sdes    jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname);
1217181111Sdes    retval = true;
1218181111Sdes  }
1219181111Sdes  return retval;
1220181111Sdes}
1221181111Sdes
1222181111Sdes// Needs to be in os specific directory because windows requires another
1223181111Sdes// header file <direct.h>
1224181111Sdesconst char* os::get_current_directory(char *buf, int buflen) {
1225181111Sdes  return _getcwd(buf, buflen);
1226181111Sdes}
1227181111Sdes
1228181111Sdes//-----------------------------------------------------------
1229126274Sdes// Helper functions for fatal error handler
1230181111Sdes#ifdef _WIN64
1231126274Sdes// Helper routine which returns true if address in
1232126274Sdes// within the NTDLL address space.
1233181111Sdes//
1234181111Sdesstatic bool _addr_in_ntdll( address addr )
1235126274Sdes{
1236126274Sdes  HMODULE hmod;
1237181111Sdes  MODULEINFO minfo;
1238181111Sdes
1239126274Sdes  hmod = GetModuleHandle("NTDLL.DLL");
1240126274Sdes  if ( hmod == NULL ) return false;
1241126274Sdes  if ( !os::PSApiDll::GetModuleInformation( GetCurrentProcess(), hmod,
1242126274Sdes                               &minfo, sizeof(MODULEINFO)) )
1243126274Sdes    return false;
1244126274Sdes
1245126274Sdes  if ( (addr >= minfo.lpBaseOfDll) &&
1246126274Sdes       (addr < (address)((uintptr_t)minfo.lpBaseOfDll + (uintptr_t)minfo.SizeOfImage)))
1247126274Sdes    return true;
1248181111Sdes  else
1249181111Sdes    return false;
1250164146Sdes}
1251181111Sdes#endif
1252181111Sdes
1253181111Sdes
1254181111Sdes// Enumerate all modules for a given process ID
1255181111Sdes//
1256126274Sdes// Notice that Windows 95/98/Me and Windows NT/2000/XP have
1257126274Sdes// different API for doing this. We use PSAPI.DLL on NT based
1258181111Sdes// Windows and ToolHelp on 95/98/Me.
1259126274Sdes
1260126274Sdes// Callback function that is called by enumerate_modules() on
1261181111Sdes// every DLL module.
1262126274Sdes// Input parameters:
1263126274Sdes//    int       pid,
1264181111Sdes//    char*     module_file_name,
1265126274Sdes//    address   module_base_addr,
1266126274Sdes//    unsigned  module_size,
1267181111Sdes//    void*     param
1268126274Sdestypedef int (*EnumModulesCallbackFunc)(int, char *, address, unsigned, void *);
1269181111Sdes
1270126274Sdes// enumerate_modules for Windows NT, using PSAPI
1271126274Sdesstatic int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void * param)
1272126274Sdes{
1273126274Sdes  HANDLE   hProcess ;
1274126274Sdes
1275126274Sdes# define MAX_NUM_MODULES 128
1276126274Sdes  HMODULE     modules[MAX_NUM_MODULES];
1277126274Sdes  static char filename[ MAX_PATH ];
1278126274Sdes  int         result = 0;
1279126274Sdes
1280126274Sdes  if (!os::PSApiDll::PSApiAvailable()) {
1281126274Sdes    return 0;
1282126274Sdes  }
1283126274Sdes
1284126274Sdes  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
1285126274Sdes                         FALSE, pid ) ;
1286126274Sdes  if (hProcess == NULL) return 0;
1287126274Sdes
1288126274Sdes  DWORD size_needed;
1289126274Sdes  if (!os::PSApiDll::EnumProcessModules(hProcess, modules,
1290126274Sdes                           sizeof(modules), &size_needed)) {
1291221420Sdes      CloseHandle( hProcess );
1292221420Sdes      return 0;
1293192595Sdes  }
1294126274Sdes
1295126274Sdes  // number of modules that are currently loaded
1296126274Sdes  int num_modules = size_needed / sizeof(HMODULE);
1297126274Sdes
1298126274Sdes  for (int i = 0; i < MIN2(num_modules, MAX_NUM_MODULES); i++) {
1299126274Sdes    // Get Full pathname:
1300221420Sdes    if(!os::PSApiDll::GetModuleFileNameEx(hProcess, modules[i],
1301221420Sdes                             filename, sizeof(filename))) {
1302126274Sdes        filename[0] = '\0';
1303126274Sdes    }
1304126274Sdes
1305126274Sdes    MODULEINFO modinfo;
1306126274Sdes    if (!os::PSApiDll::GetModuleInformation(hProcess, modules[i],
1307126274Sdes                               &modinfo, sizeof(modinfo))) {
1308126274Sdes        modinfo.lpBaseOfDll = NULL;
1309126274Sdes        modinfo.SizeOfImage = 0;
1310126274Sdes    }
1311126274Sdes
1312126274Sdes    // Invoke callback function
1313126274Sdes    result = func(pid, filename, (address)modinfo.lpBaseOfDll,
1314126274Sdes                  modinfo.SizeOfImage, param);
1315126274Sdes    if (result) break;
1316126274Sdes  }
1317126274Sdes
1318204917Sdes  CloseHandle( hProcess ) ;
1319126274Sdes  return result;
1320126274Sdes}
1321204917Sdes
1322126274Sdes
1323126274Sdes// enumerate_modules for Windows 95/98/ME, using TOOLHELP
1324126274Sdesstatic int _enumerate_modules_windows( int pid, EnumModulesCallbackFunc func, void *param)
1325126274Sdes{
1326126274Sdes  HANDLE                hSnapShot ;
1327126274Sdes  static MODULEENTRY32  modentry ;
1328126274Sdes  int                   result = 0;
1329221420Sdes
1330221420Sdes  if (!os::Kernel32Dll::HelpToolsAvailable()) {
1331221420Sdes    return 0;
1332126274Sdes  }
1333221420Sdes
1334126274Sdes  // Get a handle to a Toolhelp snapshot of the system
1335126274Sdes  hSnapShot = os::Kernel32Dll::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid ) ;
1336126274Sdes  if( hSnapShot == INVALID_HANDLE_VALUE ) {
1337126274Sdes      return FALSE ;
1338137015Sdes  }
1339126274Sdes
1340126274Sdes  // iterate through all modules
1341126274Sdes  modentry.dwSize = sizeof(MODULEENTRY32) ;
1342126274Sdes  bool not_done = os::Kernel32Dll::Module32First( hSnapShot, &modentry ) != 0;
1343126274Sdes
1344126274Sdes  while( not_done ) {
1345126274Sdes    // invoke the callback
1346126274Sdes    result=func(pid, modentry.szExePath, (address)modentry.modBaseAddr,
1347126274Sdes                modentry.modBaseSize, param);
1348126274Sdes    if (result) break;
1349126274Sdes
1350204917Sdes    modentry.dwSize = sizeof(MODULEENTRY32) ;
1351126274Sdes    not_done = os::Kernel32Dll::Module32Next( hSnapShot, &modentry ) != 0;
1352126274Sdes  }
1353126274Sdes
1354126274Sdes  CloseHandle(hSnapShot);
1355126274Sdes  return result;
1356126274Sdes}
1357126274Sdes
1358126274Sdesint enumerate_modules( int pid, EnumModulesCallbackFunc func, void * param )
1359126274Sdes{
1360126274Sdes  // Get current process ID if caller doesn't provide it.
1361126274Sdes  if (!pid) pid = os::current_process_id();
1362126274Sdes
1363126274Sdes  if (os::win32::is_nt()) return _enumerate_modules_winnt  (pid, func, param);
1364126274Sdes  else                    return _enumerate_modules_windows(pid, func, param);
1365126274Sdes}
1366126274Sdes
1367126274Sdesstruct _modinfo {
1368126274Sdes   address addr;
1369126274Sdes   char*   full_path;   // point to a char buffer
1370126274Sdes   int     buflen;      // size of the buffer
1371126274Sdes   address base_addr;
1372126274Sdes};
1373126274Sdes
1374126274Sdesstatic int _locate_module_by_addr(int pid, char * mod_fname, address base_addr,
1375126274Sdes                                  unsigned size, void * param) {
1376126274Sdes   struct _modinfo *pmod = (struct _modinfo *)param;
1377126274Sdes   if (!pmod) return -1;
1378126274Sdes
1379126274Sdes   if (base_addr     <= pmod->addr &&
1380126274Sdes       base_addr+size > pmod->addr) {
1381126274Sdes     // if a buffer is provided, copy path name to the buffer
1382126274Sdes     if (pmod->full_path) {
1383126274Sdes       jio_snprintf(pmod->full_path, pmod->buflen, "%s", mod_fname);
1384126274Sdes     }
1385215116Sdes     pmod->base_addr = base_addr;
1386126274Sdes     return 1;
1387126274Sdes   }
1388126274Sdes   return 0;
1389126274Sdes}
1390126274Sdes
1391126274Sdesbool os::dll_address_to_library_name(address addr, char* buf,
1392126274Sdes                                     int buflen, int* offset) {
1393126274Sdes// NOTE: the reason we don't use SymGetModuleInfo() is it doesn't always
1394126274Sdes//       return the full path to the DLL file, sometimes it returns path
1395126274Sdes//       to the corresponding PDB file (debug info); sometimes it only
1396126274Sdes//       returns partial path, which makes life painful.
1397181111Sdes
1398181111Sdes   struct _modinfo mi;
1399181111Sdes   mi.addr      = addr;
1400181111Sdes   mi.full_path = buf;
1401181111Sdes   mi.buflen    = buflen;
1402181111Sdes   int pid = os::current_process_id();
1403181111Sdes   if (enumerate_modules(pid, _locate_module_by_addr, (void *)&mi)) {
1404126274Sdes      // buf already contains path name
1405126274Sdes      if (offset) *offset = addr - mi.base_addr;
1406126274Sdes      return true;
1407126274Sdes   } else {
1408126274Sdes      if (buf) buf[0] = '\0';
1409126274Sdes      if (offset) *offset = -1;
1410126274Sdes      return false;
1411126274Sdes   }
1412126274Sdes}
1413126274Sdes
1414126274Sdesbool os::dll_address_to_function_name(address addr, char *buf,
1415126274Sdes                                      int buflen, int *offset) {
1416126274Sdes  if (Decoder::decode(addr, buf, buflen, offset)) {
1417126274Sdes    return true;
1418126274Sdes  }
1419126274Sdes  if (offset != NULL)  *offset  = -1;
1420126274Sdes  if (buf != NULL) buf[0] = '\0';
1421126274Sdes  return false;
1422126274Sdes}
1423126274Sdes
1424126274Sdes// save the start and end address of jvm.dll into param[0] and param[1]
1425126274Sdesstatic int _locate_jvm_dll(int pid, char* mod_fname, address base_addr,
1426126274Sdes                    unsigned size, void * param) {
1427126274Sdes   if (!param) return -1;
1428126274Sdes
1429126274Sdes   if (base_addr     <= (address)_locate_jvm_dll &&
1430126274Sdes       base_addr+size > (address)_locate_jvm_dll) {
1431126274Sdes         ((address*)param)[0] = base_addr;
1432126274Sdes         ((address*)param)[1] = base_addr + size;
1433126274Sdes         return 1;
1434137015Sdes   }
1435126274Sdes   return 0;
1436126274Sdes}
1437126274Sdes
1438126274Sdesaddress vm_lib_location[2];    // start and end address of jvm.dll
1439126274Sdes
1440126274Sdes// check if addr is inside jvm.dll
1441126274Sdesbool os::address_is_in_vm(address addr) {
1442126274Sdes  if (!vm_lib_location[0] || !vm_lib_location[1]) {
1443126274Sdes    int pid = os::current_process_id();
1444126274Sdes    if (!enumerate_modules(pid, _locate_jvm_dll, (void *)vm_lib_location)) {
1445137015Sdes      assert(false, "Can't find jvm module.");
1446126274Sdes      return false;
1447192595Sdes    }
1448192595Sdes  }
1449126274Sdes
1450192595Sdes  return (vm_lib_location[0] <= addr) && (addr < vm_lib_location[1]);
1451126274Sdes}
1452126274Sdes
1453126274Sdes// print module info; param is outputStream*
1454126274Sdesstatic int _print_module(int pid, char* fname, address base,
1455126274Sdes                         unsigned size, void* param) {
1456192595Sdes   if (!param) return -1;
1457192595Sdes
1458126274Sdes   outputStream* st = (outputStream*)param;
1459192595Sdes
1460126274Sdes   address end_addr = base + size;
1461126274Sdes   st->print(PTR_FORMAT " - " PTR_FORMAT " \t%s\n", base, end_addr, fname);
1462126274Sdes   return 0;
1463126274Sdes}
1464126274Sdes
1465126274Sdes// Loads .dll/.so and
1466126274Sdes// in case of error it checks if .dll/.so was built for the
1467126274Sdes// same architecture as Hotspot is running on
1468126274Sdesvoid * os::dll_load(const char *name, char *ebuf, int ebuflen)
1469126274Sdes{
1470126274Sdes  void * result = LoadLibrary(name);
1471126274Sdes  if (result != NULL)
1472126274Sdes  {
1473126274Sdes    return result;
1474126274Sdes  }
1475126274Sdes
1476126274Sdes  DWORD errcode = GetLastError();
1477126274Sdes  if (errcode == ERROR_MOD_NOT_FOUND) {
1478126274Sdes    strncpy(ebuf, "Can't find dependent libraries", ebuflen-1);
1479126274Sdes    ebuf[ebuflen-1]='\0';
1480126274Sdes    return NULL;
1481126274Sdes  }
1482126274Sdes
1483126274Sdes  // Parsing dll below
1484126274Sdes  // If we can read dll-info and find that dll was built
1485126274Sdes  // for an architecture other than Hotspot is running in
1486126274Sdes  // - then print to buffer "DLL was built for a different architecture"
1487126274Sdes  // else call os::lasterror to obtain system error message
1488126274Sdes
1489126274Sdes  // Read system error message into ebuf
1490126274Sdes  // It may or may not be overwritten below (in the for loop and just above)
1491126274Sdes  lasterror(ebuf, (size_t) ebuflen);
1492126274Sdes  ebuf[ebuflen-1]='\0';
1493126274Sdes  int file_descriptor=::open(name, O_RDONLY | O_BINARY, 0);
1494126274Sdes  if (file_descriptor<0)
1495126274Sdes  {
1496126274Sdes    return NULL;
1497126274Sdes  }
1498126274Sdes
1499126274Sdes  uint32_t signature_offset;
1500126274Sdes  uint16_t lib_arch=0;
1501126274Sdes  bool failed_to_get_lib_arch=
1502126274Sdes  (
1503126274Sdes    //Go to position 3c in the dll
1504126274Sdes    (os::seek_to_file_offset(file_descriptor,IMAGE_FILE_PTR_TO_SIGNATURE)<0)
1505126274Sdes    ||
1506126274Sdes    // Read loacation of signature
1507126274Sdes    (sizeof(signature_offset)!=
1508126274Sdes      (os::read(file_descriptor, (void*)&signature_offset,sizeof(signature_offset))))
1509126274Sdes    ||
1510126274Sdes    //Go to COFF File Header in dll
1511126274Sdes    //that is located after"signature" (4 bytes long)
1512126274Sdes    (os::seek_to_file_offset(file_descriptor,
1513126274Sdes      signature_offset+IMAGE_FILE_SIGNATURE_LENGTH)<0)
1514126274Sdes    ||
1515126274Sdes    //Read field that contains code of architecture
1516126274Sdes    // that dll was build for
1517126274Sdes    (sizeof(lib_arch)!=
1518126274Sdes      (os::read(file_descriptor, (void*)&lib_arch,sizeof(lib_arch))))
1519126274Sdes  );
1520126274Sdes
1521126274Sdes  ::close(file_descriptor);
1522146998Sdes  if (failed_to_get_lib_arch)
1523146998Sdes  {
1524146998Sdes    // file i/o error - report os::lasterror(...) msg
1525146998Sdes    return NULL;
1526146998Sdes  }
1527146998Sdes
1528146998Sdes  typedef struct
1529204917Sdes  {
1530204917Sdes    uint16_t arch_code;
1531204917Sdes    char* arch_name;
1532204917Sdes  } arch_t;
1533204917Sdes
1534204917Sdes  static const arch_t arch_array[]={
1535204917Sdes    {IMAGE_FILE_MACHINE_I386,      (char*)"IA 32"},
1536204917Sdes    {IMAGE_FILE_MACHINE_AMD64,     (char*)"AMD 64"},
1537204917Sdes    {IMAGE_FILE_MACHINE_IA64,      (char*)"IA 64"}
1538204917Sdes  };
1539204917Sdes  #if   (defined _M_IA64)
1540204917Sdes    static const uint16_t running_arch=IMAGE_FILE_MACHINE_IA64;
1541204917Sdes  #elif (defined _M_AMD64)
1542204917Sdes    static const uint16_t running_arch=IMAGE_FILE_MACHINE_AMD64;
1543204917Sdes  #elif (defined _M_IX86)
1544204917Sdes    static const uint16_t running_arch=IMAGE_FILE_MACHINE_I386;
1545204917Sdes  #else
1546204917Sdes    #error Method os::dll_load requires that one of following \
1547204917Sdes           is defined :_M_IA64,_M_AMD64 or _M_IX86
1548204917Sdes  #endif
1549204917Sdes
1550204917Sdes
1551204917Sdes  // Obtain a string for printf operation
1552204917Sdes  // lib_arch_str shall contain string what platform this .dll was built for
1553204917Sdes  // running_arch_str shall string contain what platform Hotspot was built for
1554204917Sdes  char *running_arch_str=NULL,*lib_arch_str=NULL;
1555204917Sdes  for (unsigned int i=0;i<ARRAY_SIZE(arch_array);i++)
1556204917Sdes  {
1557204917Sdes    if (lib_arch==arch_array[i].arch_code)
1558204917Sdes      lib_arch_str=arch_array[i].arch_name;
1559204917Sdes    if (running_arch==arch_array[i].arch_code)
1560204917Sdes      running_arch_str=arch_array[i].arch_name;
1561204917Sdes  }
1562204917Sdes
1563204917Sdes  assert(running_arch_str,
1564204917Sdes    "Didn't find runing architecture code in arch_array");
1565204917Sdes
1566204917Sdes  // If the architure is right
1567204917Sdes  // but some other error took place - report os::lasterror(...) msg
1568204917Sdes  if (lib_arch == running_arch)
1569204917Sdes  {
1570204917Sdes    return NULL;
1571204917Sdes  }
1572204917Sdes
1573204917Sdes  if (lib_arch_str!=NULL)
1574204917Sdes  {
1575204917Sdes    ::_snprintf(ebuf, ebuflen-1,
1576204917Sdes      "Can't load %s-bit .dll on a %s-bit platform",
1577204917Sdes      lib_arch_str,running_arch_str);
1578204917Sdes  }
1579204917Sdes  else
1580204917Sdes  {
1581204917Sdes    // don't know what architecture this dll was build for
1582204917Sdes    ::_snprintf(ebuf, ebuflen-1,
1583204917Sdes      "Can't load this .dll (machine code=0x%x) on a %s-bit platform",
1584204917Sdes      lib_arch,running_arch_str);
1585204917Sdes  }
1586204917Sdes
1587204917Sdes  return NULL;
1588204917Sdes}
1589204917Sdes
1590204917Sdes
1591204917Sdesvoid os::print_dll_info(outputStream *st) {
1592204917Sdes   int pid = os::current_process_id();
1593204917Sdes   st->print_cr("Dynamic libraries:");
1594204917Sdes   enumerate_modules(pid, _print_module, (void *)st);
1595204917Sdes}
1596204917Sdes
1597204917Sdesvoid os::print_os_info_brief(outputStream* st) {
1598204917Sdes  os::print_os_info(st);
1599204917Sdes}
1600204917Sdes
1601204917Sdesvoid os::print_os_info(outputStream* st) {
1602204917Sdes  st->print("OS:");
1603204917Sdes
1604204917Sdes  os::win32::print_windows_version(st);
1605204917Sdes}
1606204917Sdes
1607204917Sdesvoid os::win32::print_windows_version(outputStream* st) {
1608204917Sdes  OSVERSIONINFOEX osvi;
1609204917Sdes  ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
1610204917Sdes  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1611204917Sdes
1612204917Sdes  if (!GetVersionEx((OSVERSIONINFO *)&osvi)) {
1613204917Sdes    st->print_cr("N/A");
1614204917Sdes    return;
1615204917Sdes  }
1616204917Sdes
1617204917Sdes  int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion;
1618204917Sdes  if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
1619204917Sdes    switch (os_vers) {
1620204917Sdes    case 3051: st->print(" Windows NT 3.51"); break;
1621204917Sdes    case 4000: st->print(" Windows NT 4.0"); break;
1622204917Sdes    case 5000: st->print(" Windows 2000"); break;
1623204917Sdes    case 5001: st->print(" Windows XP"); break;
1624204917Sdes    case 5002:
1625204917Sdes    case 6000:
1626204917Sdes    case 6001:
1627204917Sdes    case 6002: {
1628204917Sdes      // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
1629204917Sdes      // find out whether we are running on 64 bit processor or not.
1630204917Sdes      SYSTEM_INFO si;
1631204917Sdes      ZeroMemory(&si, sizeof(SYSTEM_INFO));
1632204917Sdes        if (!os::Kernel32Dll::GetNativeSystemInfoAvailable()){
1633204917Sdes          GetSystemInfo(&si);
1634204917Sdes      } else {
1635204917Sdes        os::Kernel32Dll::GetNativeSystemInfo(&si);
1636204917Sdes      }
1637204917Sdes      if (os_vers == 5002) {
1638204917Sdes        if (osvi.wProductType == VER_NT_WORKSTATION &&
1639204917Sdes            si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1640204917Sdes          st->print(" Windows XP x64 Edition");
1641204917Sdes        else
1642204917Sdes            st->print(" Windows Server 2003 family");
1643204917Sdes      } else if (os_vers == 6000) {
1644204917Sdes        if (osvi.wProductType == VER_NT_WORKSTATION)
1645204917Sdes            st->print(" Windows Vista");
1646204917Sdes        else
1647204917Sdes            st->print(" Windows Server 2008");
1648204917Sdes        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1649204917Sdes            st->print(" , 64 bit");
1650204917Sdes      } else if (os_vers == 6001) {
1651204917Sdes        if (osvi.wProductType == VER_NT_WORKSTATION) {
1652204917Sdes            st->print(" Windows 7");
1653204917Sdes        } else {
1654204917Sdes            // Unrecognized windows, print out its major and minor versions
1655204917Sdes            st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1656204917Sdes        }
1657204917Sdes        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1658204917Sdes            st->print(" , 64 bit");
1659204917Sdes      } else if (os_vers == 6002) {
1660204917Sdes        if (osvi.wProductType == VER_NT_WORKSTATION) {
1661204917Sdes            st->print(" Windows 8");
1662204917Sdes        } else {
1663204917Sdes            st->print(" Windows Server 2012");
1664204917Sdes        }
1665204917Sdes        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1666204917Sdes            st->print(" , 64 bit");
1667204917Sdes      } else { // future os
1668204917Sdes        // Unrecognized windows, print out its major and minor versions
1669204917Sdes        st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1670204917Sdes        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1671204917Sdes            st->print(" , 64 bit");
1672204917Sdes      }
1673204917Sdes      break;
1674204917Sdes    }
1675204917Sdes    default: // future windows, print out its major and minor versions
1676204917Sdes      st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1677204917Sdes    }
1678204917Sdes  } else {
1679204917Sdes    switch (os_vers) {
1680204917Sdes    case 4000: st->print(" Windows 95"); break;
1681204917Sdes    case 4010: st->print(" Windows 98"); break;
1682204917Sdes    case 4090: st->print(" Windows Me"); break;
1683204917Sdes    default: // future windows, print out its major and minor versions
1684204917Sdes      st->print(" Windows %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1685204917Sdes    }
1686204917Sdes  }
1687204917Sdes  st->print(" Build %d", osvi.dwBuildNumber);
1688204917Sdes  st->print(" %s", osvi.szCSDVersion);           // service pack
1689204917Sdes  st->cr();
1690204917Sdes}
1691204917Sdes
1692204917Sdesvoid os::pd_print_cpu_info(outputStream* st) {
1693204917Sdes  // Nothing to do for now.
1694204917Sdes}
1695204917Sdes
1696204917Sdesvoid os::print_memory_info(outputStream* st) {
1697204917Sdes  st->print("Memory:");
1698204917Sdes  st->print(" %dk page", os::vm_page_size()>>10);
1699204917Sdes
1700204917Sdes  // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect
1701204917Sdes  // value if total memory is larger than 4GB
1702204917Sdes  MEMORYSTATUSEX ms;
1703204917Sdes  ms.dwLength = sizeof(ms);
1704204917Sdes  GlobalMemoryStatusEx(&ms);
1705204917Sdes
1706204917Sdes  st->print(", physical %uk", os::physical_memory() >> 10);
1707204917Sdes  st->print("(%uk free)", os::available_memory() >> 10);
1708204917Sdes
1709204917Sdes  st->print(", swap %uk", ms.ullTotalPageFile >> 10);
1710204917Sdes  st->print("(%uk free)", ms.ullAvailPageFile >> 10);
1711204917Sdes  st->cr();
1712204917Sdes}
1713204917Sdes
1714204917Sdesvoid os::print_siginfo(outputStream *st, void *siginfo) {
1715204917Sdes  EXCEPTION_RECORD* er = (EXCEPTION_RECORD*)siginfo;
1716204917Sdes  st->print("siginfo:");
1717204917Sdes  st->print(" ExceptionCode=0x%x", er->ExceptionCode);
1718204917Sdes
1719204917Sdes  if (er->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
1720204917Sdes      er->NumberParameters >= 2) {
1721204917Sdes      switch (er->ExceptionInformation[0]) {
1722204917Sdes      case 0: st->print(", reading address"); break;
1723204917Sdes      case 1: st->print(", writing address"); break;
1724204917Sdes      default: st->print(", ExceptionInformation=" INTPTR_FORMAT,
1725204917Sdes                            er->ExceptionInformation[0]);
1726204917Sdes      }
1727204917Sdes      st->print(" " INTPTR_FORMAT, er->ExceptionInformation[1]);
1728204917Sdes  } else if (er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR &&
1729204917Sdes             er->NumberParameters >= 2 && UseSharedSpaces) {
1730204917Sdes    FileMapInfo* mapinfo = FileMapInfo::current_info();
1731204917Sdes    if (mapinfo->is_in_shared_space((void*)er->ExceptionInformation[1])) {
1732204917Sdes      st->print("\n\nError accessing class data sharing archive."       \
1733204917Sdes                " Mapped file inaccessible during execution, "          \
1734204917Sdes                " possible disk/network problem.");
1735204917Sdes    }
1736204917Sdes  } else {
1737204917Sdes    int num = er->NumberParameters;
1738204917Sdes    if (num > 0) {
1739204917Sdes      st->print(", ExceptionInformation=");
1740204917Sdes      for (int i = 0; i < num; i++) {
1741204917Sdes        st->print(INTPTR_FORMAT " ", er->ExceptionInformation[i]);
1742204917Sdes      }
1743204917Sdes    }
1744204917Sdes  }
1745204917Sdes  st->cr();
1746204917Sdes}
1747204917Sdes
1748204917Sdesvoid os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
1749204917Sdes  // do nothing
1750204917Sdes}
1751204917Sdes
1752204917Sdesstatic char saved_jvm_path[MAX_PATH] = {0};
1753204917Sdes
1754204917Sdes// Find the full path to the current module, jvm.dll
1755204917Sdesvoid os::jvm_path(char *buf, jint buflen) {
1756204917Sdes  // Error checking.
1757204917Sdes  if (buflen < MAX_PATH) {
1758204917Sdes    assert(false, "must use a large-enough buffer");
1759204917Sdes    buf[0] = '\0';
1760204917Sdes    return;
1761204917Sdes  }
1762221420Sdes  // Lazy resolve the path to current module.
1763204917Sdes  if (saved_jvm_path[0] != 0) {
1764204917Sdes    strcpy(buf, saved_jvm_path);
1765204917Sdes    return;
1766204917Sdes  }
1767204917Sdes
1768204917Sdes  buf[0] = '\0';
1769204917Sdes  if (Arguments::created_by_gamma_launcher()) {
1770204917Sdes     // Support for the gamma launcher. Check for an
1771204917Sdes     // JAVA_HOME environment variable
1772204917Sdes     // and fix up the path so it looks like
1773204917Sdes     // libjvm.so is installed there (append a fake suffix
1774204917Sdes     // hotspot/libjvm.so).
1775204917Sdes     char* java_home_var = ::getenv("JAVA_HOME");
1776204917Sdes     if (java_home_var != NULL && java_home_var[0] != 0) {
1777204917Sdes
1778204917Sdes        strncpy(buf, java_home_var, buflen);
1779204917Sdes
1780204917Sdes        // determine if this is a legacy image or modules image
1781204917Sdes        // modules image doesn't have "jre" subdirectory
1782204917Sdes        size_t len = strlen(buf);
1783204917Sdes        char* jrebin_p = buf + len;
1784204917Sdes        jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\");
1785204917Sdes        if (0 != _access(buf, 0)) {
1786204917Sdes          jio_snprintf(jrebin_p, buflen-len, "\\bin\\");
1787204917Sdes        }
1788204917Sdes        len = strlen(buf);
1789204917Sdes        jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll");
1790204917Sdes     }
1791204917Sdes  }
1792204917Sdes
1793204917Sdes  if(buf[0] == '\0') {
1794204917Sdes  GetModuleFileName(vm_lib_handle, buf, buflen);
1795204917Sdes  }
1796204917Sdes  strcpy(saved_jvm_path, buf);
1797204917Sdes}
1798204917Sdes
1799204917Sdes
1800204917Sdesvoid os::print_jni_name_prefix_on(outputStream* st, int args_size) {
1801204917Sdes#ifndef _WIN64
1802204917Sdes  st->print("_");
1803204917Sdes#endif
1804204917Sdes}
1805204917Sdes
1806204917Sdes
1807204917Sdesvoid os::print_jni_name_suffix_on(outputStream* st, int args_size) {
1808204917Sdes#ifndef _WIN64
1809204917Sdes  st->print("@%d", args_size  * sizeof(int));
1810204917Sdes#endif
1811204917Sdes}
1812204917Sdes
1813204917Sdes// This method is a copy of JDK's sysGetLastErrorString
1814204917Sdes// from src/windows/hpi/src/system_md.c
1815204917Sdes
1816204917Sdessize_t os::lasterror(char* buf, size_t len) {
1817204917Sdes  DWORD errval;
1818204917Sdes
1819204917Sdes  if ((errval = GetLastError()) != 0) {
1820204917Sdes    // DOS error
1821204917Sdes    size_t n = (size_t)FormatMessage(
1822204917Sdes          FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
1823204917Sdes          NULL,
1824204917Sdes          errval,
1825204917Sdes          0,
1826204917Sdes          buf,
1827204917Sdes          (DWORD)len,
1828204917Sdes          NULL);
1829204917Sdes    if (n > 3) {
1830204917Sdes      // Drop final '.', CR, LF
1831204917Sdes      if (buf[n - 1] == '\n') n--;
1832204917Sdes      if (buf[n - 1] == '\r') n--;
1833204917Sdes      if (buf[n - 1] == '.') n--;
1834204917Sdes      buf[n] = '\0';
1835204917Sdes    }
1836204917Sdes    return n;
1837204917Sdes  }
1838204917Sdes
1839204917Sdes  if (errno != 0) {
1840204917Sdes    // C runtime error that has no corresponding DOS error code
1841204917Sdes    const char* s = strerror(errno);
1842204917Sdes    size_t n = strlen(s);
1843204917Sdes    if (n >= len) n = len - 1;
1844204917Sdes    strncpy(buf, s, n);
1845204917Sdes    buf[n] = '\0';
1846204917Sdes    return n;
1847204917Sdes  }
1848204917Sdes
1849204917Sdes  return 0;
1850204917Sdes}
1851204917Sdes
1852204917Sdesint os::get_last_error() {
1853204917Sdes  DWORD error = GetLastError();
1854204917Sdes  if (error == 0)
1855204917Sdes    error = errno;
1856204917Sdes  return (int)error;
1857204917Sdes}
1858204917Sdes
1859204917Sdes// sun.misc.Signal
1860204917Sdes// NOTE that this is a workaround for an apparent kernel bug where if
1861204917Sdes// a signal handler for SIGBREAK is installed then that signal handler
1862126274Sdes// takes priority over the console control handler for CTRL_CLOSE_EVENT.
1863204917Sdes// See bug 4416763.
1864126274Sdesstatic void (*sigbreakHandler)(int) = NULL;
1865204917Sdes
1866126274Sdesstatic void UserHandler(int sig, void *siginfo, void *context) {
1867126274Sdes  os::signal_notify(sig);
1868149749Sdes  // We need to reinstate the signal handler each time...
1869146998Sdes  os::signal(sig, (void*)UserHandler);
1870146998Sdes}
1871146998Sdes
1872146998Sdesvoid* os::user_handler() {
1873146998Sdes  return (void*) UserHandler;
1874204917Sdes}
1875126274Sdes
1876146998Sdesvoid* os::signal(int signal_number, void* handler) {
1877146998Sdes  if ((signal_number == SIGBREAK) && (!ReduceSignalUsage)) {
1878146998Sdes    void (*oldHandler)(int) = sigbreakHandler;
1879146998Sdes    sigbreakHandler = (void (*)(int)) handler;
1880146998Sdes    return (void*) oldHandler;
1881146998Sdes  } else {
1882146998Sdes    return (void*)::signal(signal_number, (void (*)(int))handler);
1883146998Sdes  }
1884146998Sdes}
1885146998Sdes
1886146998Sdesvoid os::signal_raise(int signal_number) {
1887146998Sdes  raise(signal_number);
1888146998Sdes}
1889204917Sdes
1890204917Sdes// The Win32 C runtime library maps all console control events other than ^C
1891204917Sdes// into SIGBREAK, which makes it impossible to distinguish ^BREAK from close,
1892221420Sdes// logoff, and shutdown events.  We therefore install our own console handler
1893204917Sdes// that raises SIGTERM for the latter cases.
1894204917Sdes//
1895204917Sdesstatic BOOL WINAPI consoleHandler(DWORD event) {
1896204917Sdes  switch(event) {
1897146998Sdes    case CTRL_C_EVENT:
1898146998Sdes      if (is_error_reported()) {
1899146998Sdes        // Ctrl-C is pressed during error reporting, likely because the error
1900204917Sdes        // handler fails to abort. Let VM die immediately.
1901204917Sdes        os::die();
1902126274Sdes      }
1903126274Sdes
1904126274Sdes      os::signal_raise(SIGINT);
1905126274Sdes      return TRUE;
1906204917Sdes      break;
1907126274Sdes    case CTRL_BREAK_EVENT:
1908126274Sdes      if (sigbreakHandler != NULL) {
1909126274Sdes        (*sigbreakHandler)(SIGBREAK);
1910126274Sdes      }
1911204917Sdes      return TRUE;
1912204917Sdes      break;
1913146998Sdes    case CTRL_LOGOFF_EVENT: {
1914204917Sdes      // Don't terminate JVM if it is running in a non-interactive session,
1915162852Sdes      // such as a service process.
1916126274Sdes      USEROBJECTFLAGS flags;
1917146998Sdes      HANDLE handle = GetProcessWindowStation();
1918126274Sdes      if (handle != NULL &&
1919126274Sdes          GetUserObjectInformation(handle, UOI_FLAGS, &flags,
1920126274Sdes            sizeof( USEROBJECTFLAGS), NULL)) {
1921126274Sdes        // If it is a non-interactive session, let next handler to deal
1922126274Sdes        // with it.
1923126274Sdes        if ((flags.dwFlags & WSF_VISIBLE) == 0) {
1924126274Sdes          return FALSE;
1925204917Sdes        }
1926204917Sdes      }
1927126274Sdes    }
1928204917Sdes    case CTRL_CLOSE_EVENT:
1929162852Sdes    case CTRL_SHUTDOWN_EVENT:
1930126274Sdes      os::signal_raise(SIGTERM);
1931126274Sdes      return TRUE;
1932126274Sdes      break;
1933126274Sdes    default:
1934126274Sdes      break;
1935149749Sdes  }
1936126274Sdes  return FALSE;
1937126274Sdes}
1938126274Sdes
1939149749Sdes/*
1940149749Sdes * The following code is moved from os.cpp for making this
1941126274Sdes * code platform specific, which it is by its very nature.
1942126274Sdes */
1943149749Sdes
1944126274Sdes// Return maximum OS signal used + 1 for internal use only
1945126274Sdes// Used as exit signal for signal_thread
1946126274Sdesint os::sigexitnum_pd(){
1947126274Sdes  return NSIG;
1948137015Sdes}
1949137015Sdes
1950146998Sdes// a counter for each possible signal value, including signal_thread exit signal
1951149749Sdesstatic volatile jint pending_signals[NSIG+1] = { 0 };
1952149749Sdesstatic HANDLE sig_sem = NULL;
1953146998Sdes
1954149749Sdesvoid os::signal_init_pd() {
1955149749Sdes  // Initialize signal structures
1956146998Sdes  memset((void*)pending_signals, 0, sizeof(pending_signals));
1957146998Sdes
1958149749Sdes  sig_sem = ::CreateSemaphore(NULL, 0, NSIG+1, NULL);
1959149749Sdes
1960149749Sdes  // Programs embedding the VM do not want it to attempt to receive
1961149749Sdes  // events like CTRL_LOGOFF_EVENT, which are used to implement the
1962149749Sdes  // shutdown hooks mechanism introduced in 1.3.  For example, when
1963149749Sdes  // the VM is run as part of a Windows NT service (i.e., a servlet
1964146998Sdes  // engine in a web server), the correct behavior is for any console
1965146998Sdes  // control handler to return FALSE, not TRUE, because the OS's
1966146998Sdes  // "final" handler for such events allows the process to continue if
1967146998Sdes  // it is a service (while terminating it if it is not a service).
1968126274Sdes  // To make this behavior uniform and the mechanism simpler, we
1969204917Sdes  // completely disable the VM's usage of these console events if -Xrs
1970204917Sdes  // (=ReduceSignalUsage) is specified.  This means, for example, that
1971149749Sdes  // the CTRL-BREAK thread dump mechanism is also disabled in this
1972149749Sdes  // case.  See bugs 4323062, 4345157, and related bugs.
1973149749Sdes
1974146998Sdes  if (!ReduceSignalUsage) {
1975146998Sdes    // Add a CTRL-C handler
1976146998Sdes    SetConsoleCtrlHandler(consoleHandler, TRUE);
1977146998Sdes  }
1978146998Sdes}
1979146998Sdes
1980126274Sdesvoid os::signal_notify(int signal_number) {
1981126274Sdes  BOOL ret;
1982126274Sdes  if (sig_sem != NULL) {
1983126274Sdes    Atomic::inc(&pending_signals[signal_number]);
1984126274Sdes    ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
1985126274Sdes    assert(ret != 0, "ReleaseSemaphore() failed");
1986137015Sdes  }
1987137015Sdes}
1988137015Sdes
1989137015Sdesstatic int check_pending_signals(bool wait_for_signal) {
1990204917Sdes  DWORD ret;
1991204917Sdes  while (true) {
1992126274Sdes    for (int i = 0; i < NSIG + 1; i++) {
1993126274Sdes      jint n = pending_signals[i];
1994126274Sdes      if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
1995204917Sdes        return i;
1996162852Sdes      }
1997126274Sdes    }
1998149749Sdes    if (!wait_for_signal) {
1999149749Sdes      return -1;
2000149749Sdes    }
2001149749Sdes
2002149749Sdes    JavaThread *thread = JavaThread::current();
2003126274Sdes
2004126274Sdes    ThreadBlockInVM tbivm(thread);
2005126274Sdes
2006126274Sdes    bool threadIsSuspended;
2007126274Sdes    do {
2008124208Sdes      thread->set_suspend_equivalent();
2009124208Sdes      // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
201076259Sgreen      ret = ::WaitForSingleObject(sig_sem, INFINITE);
201199060Sdes      assert(ret == WAIT_OBJECT_0, "WaitForSingleObject() failed");
201276259Sgreen
201376259Sgreen      // were we externally suspended while we were waiting?
201499060Sdes      threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
201576259Sgreen      if (threadIsSuspended) {
201676259Sgreen        //
201776259Sgreen        // The semaphore has been incremented, but while we were waiting
201876259Sgreen        // another thread suspended us. We don't want to continue running
201976259Sgreen        // while suspended because that would surprise the thread that
202076259Sgreen        // suspended us.
202176259Sgreen        //
202276259Sgreen        ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
202399060Sdes        assert(ret != 0, "ReleaseSemaphore() failed");
202476259Sgreen
202576259Sgreen        thread->java_suspend_self();
202676259Sgreen      }
202776259Sgreen    } while (threadIsSuspended);
202876259Sgreen  }
202976259Sgreen}
2030124208Sdes
203176259Sgreenint os::signal_lookup() {
2032124208Sdes  return check_pending_signals(false);
203376259Sgreen}
203476259Sgreen
203576259Sgreenint os::signal_wait() {
2036137015Sdes  return check_pending_signals(true);
203776259Sgreen}
203876259Sgreen
203976259Sgreen// Implicit OS exception handling
204076259Sgreen
204176259SgreenLONG Handle_Exception(struct _EXCEPTION_POINTERS* exceptionInfo, address handler) {
2042137015Sdes  JavaThread* thread = JavaThread::current();
2043137015Sdes  // Save pc in thread
2044137015Sdes#ifdef _M_IA64
2045137015Sdes  // Do not blow up if no thread info available.
2046137015Sdes  if (thread) {
2047204917Sdes    // Saving PRECISE pc (with slot information) in thread.
2048204917Sdes    uint64_t precise_pc = (uint64_t) exceptionInfo->ExceptionRecord->ExceptionAddress;
2049137015Sdes    // Convert precise PC into "Unix" format
2050137015Sdes    precise_pc = (precise_pc & 0xFFFFFFFFFFFFFFF0) | ((precise_pc & 0xF) >> 2);
2051204917Sdes    thread->set_saved_exception_pc((address)precise_pc);
2052137015Sdes  }
205392555Sdes  // Set pc to handler
2054137015Sdes  exceptionInfo->ContextRecord->StIIP = (DWORD64)handler;
205576259Sgreen  // Clear out psr.ri (= Restart Instruction) in order to continue
205676259Sgreen  // at the beginning of the target bundle.
2057124208Sdes  exceptionInfo->ContextRecord->StIPSR &= 0xFFFFF9FFFFFFFFFF;
2058124208Sdes  assert(((DWORD64)handler & 0xF) == 0, "Target address must point to the beginning of a bundle!");
2059124208Sdes#elif _M_AMD64
206076259Sgreen  // Do not blow up if no thread info available.
206176259Sgreen  if (thread) {
206276259Sgreen    thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Rip);
206376259Sgreen  }
206492555Sdes  // Set pc to handler
206576259Sgreen  exceptionInfo->ContextRecord->Rip = (DWORD64)handler;
206676259Sgreen#else
206792555Sdes  // Do not blow up if no thread info available.
206898675Sdes  if (thread) {
206992555Sdes    thread->set_saved_exception_pc((address)(DWORD_PTR)exceptionInfo->ContextRecord->Eip);
2070204917Sdes  }
2071204917Sdes  // Set pc to handler
2072221420Sdes  exceptionInfo->ContextRecord->Eip = (DWORD)(DWORD_PTR)handler;
2073204917Sdes#endif
2074204917Sdes
2075204917Sdes  // Continue the execution
2076192595Sdes  return EXCEPTION_CONTINUE_EXECUTION;
2077192595Sdes}
2078204917Sdes
2079204917Sdes
208076259Sgreen// Used for PostMortemDump
208176259Sgreenextern "C" void safepoints();
208276259Sgreenextern "C" void find(int x);
208376259Sgreenextern "C" void events();
208476259Sgreen
208576259Sgreen// According to Windows API documentation, an illegal instruction sequence should generate
2086113908Sdes// the 0xC000001C exception code. However, real world experience shows that occasionnaly
2087204917Sdes// the execution of an illegal instruction can generate the exception code 0xC000001E. This
208892555Sdes// seems to be an undocumented feature of Win NT 4.0 (and probably other Windows systems).
208992555Sdes
209092555Sdes#define EXCEPTION_ILLEGAL_INSTRUCTION_2 0xC000001E
2091221420Sdes
209292555Sdes// From "Execution Protection in the Windows Operating System" draft 0.35
209392555Sdes// Once a system header becomes available, the "real" define should be
209476259Sgreen// included or copied here.
209576259Sgreen#define EXCEPTION_INFO_EXEC_VIOLATION 0x08
2096204917Sdes
2097204917Sdes// Handle NAT Bit consumption on IA64.
2098204917Sdes#ifdef _M_IA64
2099221420Sdes#define EXCEPTION_REG_NAT_CONSUMPTION    STATUS_REG_NAT_CONSUMPTION
210076259Sgreen#endif
2101157016Sdes
2102157016Sdes// Windows Vista/2008 heap corruption check
2103157016Sdes#define EXCEPTION_HEAP_CORRUPTION        0xC0000374
2104124208Sdes
2105157016Sdes#define def_excpt(val) #val, val
210692555Sdes
2107162852Sdesstruct siglabel {
210892555Sdes  char *name;
210992555Sdes  int   number;
2110157016Sdes};
211192555Sdes
2112126274Sdes// All Visual C++ exceptions thrown from code generated by the Microsoft Visual
211392555Sdes// C++ compiler contain this error code. Because this is a compiler-generated
2114126274Sdes// error, the code is not listed in the Win32 API header files.
211576259Sgreen// The code is actually a cryptic mnemonic device, with the initial "E"
2116204917Sdes// standing for "exception" and the final 3 bytes (0x6D7363) representing the
2117221420Sdes// ASCII values of "msc".
211876259Sgreen
2119204917Sdes#define EXCEPTION_UNCAUGHT_CXX_EXCEPTION    0xE06D7363
2120204917Sdes
2121204917Sdes
212276259Sgreenstruct siglabel exceptlabels[] = {
2123204917Sdes    def_excpt(EXCEPTION_ACCESS_VIOLATION),
212476259Sgreen    def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT),
2125204917Sdes    def_excpt(EXCEPTION_BREAKPOINT),
2126204917Sdes    def_excpt(EXCEPTION_SINGLE_STEP),
2127204917Sdes    def_excpt(EXCEPTION_ARRAY_BOUNDS_EXCEEDED),
2128204917Sdes    def_excpt(EXCEPTION_FLT_DENORMAL_OPERAND),
2129204917Sdes    def_excpt(EXCEPTION_FLT_DIVIDE_BY_ZERO),
2130204917Sdes    def_excpt(EXCEPTION_FLT_INEXACT_RESULT),
2131204917Sdes    def_excpt(EXCEPTION_FLT_INVALID_OPERATION),
2132204917Sdes    def_excpt(EXCEPTION_FLT_OVERFLOW),
2133204917Sdes    def_excpt(EXCEPTION_FLT_STACK_CHECK),
2134204917Sdes    def_excpt(EXCEPTION_FLT_UNDERFLOW),
2135204917Sdes    def_excpt(EXCEPTION_INT_DIVIDE_BY_ZERO),
2136204917Sdes    def_excpt(EXCEPTION_INT_OVERFLOW),
2137204917Sdes    def_excpt(EXCEPTION_PRIV_INSTRUCTION),
2138204917Sdes    def_excpt(EXCEPTION_IN_PAGE_ERROR),
2139204917Sdes    def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION),
214076259Sgreen    def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION_2),
214192555Sdes    def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION),
214292555Sdes    def_excpt(EXCEPTION_STACK_OVERFLOW),
214392555Sdes    def_excpt(EXCEPTION_INVALID_DISPOSITION),
214492555Sdes    def_excpt(EXCEPTION_GUARD_PAGE),
214592555Sdes    def_excpt(EXCEPTION_INVALID_HANDLE),
214676259Sgreen    def_excpt(EXCEPTION_UNCAUGHT_CXX_EXCEPTION),
214776259Sgreen    def_excpt(EXCEPTION_HEAP_CORRUPTION),
214892555Sdes#ifdef _M_IA64
214976259Sgreen    def_excpt(EXCEPTION_REG_NAT_CONSUMPTION),
215076259Sgreen#endif
215176259Sgreen    NULL, 0
2152204917Sdes};
2153204917Sdes
215476259Sgreenconst char* os::exception_name(int exception_code, char *buf, size_t size) {
2155204917Sdes  for (int i = 0; exceptlabels[i].name != NULL; i++) {
2156204917Sdes    if (exceptlabels[i].number == exception_code) {
2157204917Sdes       jio_snprintf(buf, size, "%s", exceptlabels[i].name);
2158204917Sdes       return buf;
215976259Sgreen    }
216076259Sgreen  }
2161126274Sdes
2162126274Sdes  return NULL;
2163126274Sdes}
2164126274Sdes
2165137015Sdes//-----------------------------------------------------------------------------
2166149749SdesLONG Handle_IDiv_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
2167126274Sdes  // handle exception caused by idiv; should only happen for -MinInt/-1
2168113908Sdes  // (division by zero is handled explicitly)
2169126274Sdes#ifdef _M_IA64
2170146998Sdes  assert(0, "Fix Handle_IDiv_Exception");
217176259Sgreen#elif _M_AMD64
2172204917Sdes  PCONTEXT ctx = exceptionInfo->ContextRecord;
2173204917Sdes  address pc = (address)ctx->Rip;
2174204917Sdes  assert(pc[0] == 0xF7, "not an idiv opcode");
2175204917Sdes  assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
217692555Sdes  assert(ctx->Rax == min_jint, "unexpected idiv exception");
217792555Sdes  // set correct result values and continue after idiv instruction
2178221420Sdes  ctx->Rip = (DWORD)pc + 2;        // idiv reg, reg  is 2 bytes
2179221420Sdes  ctx->Rax = (DWORD)min_jint;      // result
2180221420Sdes  ctx->Rdx = (DWORD)0;             // remainder
2181221420Sdes  // Continue the execution
2182221420Sdes#else
2183221420Sdes  PCONTEXT ctx = exceptionInfo->ContextRecord;
2184221420Sdes  address pc = (address)ctx->Eip;
2185204917Sdes  assert(pc[0] == 0xF7, "not an idiv opcode");
2186204917Sdes  assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
218792555Sdes  assert(ctx->Eax == min_jint, "unexpected idiv exception");
218892555Sdes  // set correct result values and continue after idiv instruction
218992555Sdes  ctx->Eip = (DWORD)pc + 2;        // idiv reg, reg  is 2 bytes
219092555Sdes  ctx->Eax = (DWORD)min_jint;      // result
219198675Sdes  ctx->Edx = (DWORD)0;             // remainder
219292555Sdes  // Continue the execution
219392555Sdes#endif
2194204917Sdes  return EXCEPTION_CONTINUE_EXECUTION;
2195204917Sdes}
2196204917Sdes
2197204917Sdes#ifndef  _WIN64
2198204917Sdes//-----------------------------------------------------------------------------
2199204917SdesLONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
2200204917Sdes  // handle exception caused by native method modifying control word
220176259Sgreen  PCONTEXT ctx = exceptionInfo->ContextRecord;
220276259Sgreen  DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
220376259Sgreen
220476259Sgreen  switch (exception_code) {
220576259Sgreen    case EXCEPTION_FLT_DENORMAL_OPERAND:
220676259Sgreen    case EXCEPTION_FLT_DIVIDE_BY_ZERO:
2207128456Sdes    case EXCEPTION_FLT_INEXACT_RESULT:
2208128456Sdes    case EXCEPTION_FLT_INVALID_OPERATION:
2209128456Sdes    case EXCEPTION_FLT_OVERFLOW:
221098675Sdes    case EXCEPTION_FLT_STACK_CHECK:
221198675Sdes    case EXCEPTION_FLT_UNDERFLOW:
221292555Sdes      jint fp_control_word = (* (jint*) StubRoutines::addr_fpu_cntrl_wrd_std());
221392555Sdes      if (fp_control_word != ctx->FloatSave.ControlWord) {
221492555Sdes        // Restore FPCW and mask out FLT exceptions
221576259Sgreen        ctx->FloatSave.ControlWord = fp_control_word | 0xffffffc0;
221692555Sdes        // Mask out pending FLT exceptions
221792555Sdes        ctx->FloatSave.StatusWord &=  0xffffff00;
221876259Sgreen        return EXCEPTION_CONTINUE_EXECUTION;
2219113908Sdes      }
222092555Sdes  }
222192555Sdes
222292555Sdes  if (prev_uef_handler != NULL) {
222392555Sdes    // We didn't handle this exception so pass it to the previous
222492555Sdes    // UnhandledExceptionFilter.
222592555Sdes    return (prev_uef_handler)(exceptionInfo);
222692555Sdes  }
2227204917Sdes
2228204917Sdes  return EXCEPTION_CONTINUE_SEARCH;
222992555Sdes}
223092555Sdes#else //_WIN64
2231126274Sdes/*
2232126274Sdes  On Windows, the mxcsr control bits are non-volatile across calls
2233126274Sdes  See also CR 6192333
2234126274Sdes  If EXCEPTION_FLT_* happened after some native method modified
2235126274Sdes  mxcsr - it is not a jvm fault.
223692555Sdes  However should we decide to restore of mxcsr after a faulty
223792555Sdes  native method we can uncomment following code
223892555Sdes      jint MxCsr = INITIAL_MXCSR;
223976259Sgreen        // we can't use StubRoutines::addr_mxcsr_std()
224076259Sgreen        // because in Win64 mxcsr is not saved there
224176259Sgreen      if (MxCsr != ctx->MxCsr) {
224292555Sdes        ctx->MxCsr = MxCsr;
224376259Sgreen        return EXCEPTION_CONTINUE_EXECUTION;
224492555Sdes      }
224592555Sdes
224692555Sdes*/
224776259Sgreen#endif //_WIN64
2248204917Sdes
224992555Sdes
225098675Sdes// Fatal error reporting is single threaded so we can make this a
225192555Sdes// static and preallocated.  If it's more than MAX_PATH silently ignore
225276259Sgreen// it.
2253124208Sdesstatic char saved_error_file[MAX_PATH] = {0};
225492555Sdes
225592555Sdesvoid os::set_error_file(const char *logfile) {
225692555Sdes  if (strlen(logfile) <= MAX_PATH) {
225776259Sgreen    strncpy(saved_error_file, logfile, MAX_PATH);
2258124208Sdes  }
225992555Sdes}
2260157016Sdes
226176259Sgreenstatic inline void report_error(Thread* t, DWORD exception_code,
2262221420Sdes                                address addr, void* siginfo, void* context) {
2263204917Sdes  VMError err(t, exception_code, addr, siginfo, context);
2264204917Sdes  err.report_and_die();
226576259Sgreen
2266204917Sdes  // If UseOsErrorReporting, this will return here and save the error file
2267204917Sdes  // somewhere where we can find it in the minidump.
2268204917Sdes}
2269204917Sdes
2270204917Sdes//-----------------------------------------------------------------------------
2271204917SdesLONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
2272204917Sdes  if (InterceptOSException) return EXCEPTION_CONTINUE_SEARCH;
2273204917Sdes  DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
2274204917Sdes#ifdef _M_IA64
227598937Sdes  // On Itanium, we need the "precise pc", which has the slot number coded
2276149749Sdes  // into the least 4 bits: 0000=slot0, 0100=slot1, 1000=slot2 (Windows format).
2277149749Sdes  address pc = (address) exceptionInfo->ExceptionRecord->ExceptionAddress;
227898937Sdes  // Convert the pc to "Unix format", which has the slot number coded
227998937Sdes  // into the least 2 bits: 0000=slot0, 0001=slot1, 0010=slot2
228076259Sgreen  // This is needed for IA64 because "relocation" / "implicit null check" / "poll instruction"
228176259Sgreen  // information is saved in the Unix format.
2282126274Sdes  address pc_unix_format = (address) ((((uint64_t)pc) & 0xFFFFFFFFFFFFFFF0) | ((((uint64_t)pc) & 0xF) >> 2));
228376259Sgreen#elif _M_AMD64
228476259Sgreen  address pc = (address) exceptionInfo->ContextRecord->Rip;
228598675Sdes#else
228698675Sdes  address pc = (address) exceptionInfo->ContextRecord->Eip;
228798675Sdes#endif
228898675Sdes  Thread* t = ThreadLocalStorage::get_thread_slow();          // slow & steady
228976259Sgreen
2290113908Sdes#ifndef _WIN64
229176259Sgreen  // Execution protection violation - win32 running on AMD64 only
2292  // Handled first to avoid misdiagnosis as a "normal" access violation;
2293  // This is safe to do because we have a new/unique ExceptionInformation
2294  // code for this condition.
2295  if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2296    PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2297    int exception_subcode = (int) exceptionRecord->ExceptionInformation[0];
2298    address addr = (address) exceptionRecord->ExceptionInformation[1];
2299
2300    if (exception_subcode == EXCEPTION_INFO_EXEC_VIOLATION) {
2301      int page_size = os::vm_page_size();
2302
2303      // Make sure the pc and the faulting address are sane.
2304      //
2305      // If an instruction spans a page boundary, and the page containing
2306      // the beginning of the instruction is executable but the following
2307      // page is not, the pc and the faulting address might be slightly
2308      // different - we still want to unguard the 2nd page in this case.
2309      //
2310      // 15 bytes seems to be a (very) safe value for max instruction size.
2311      bool pc_is_near_addr =
2312        (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15);
2313      bool instr_spans_page_boundary =
2314        (align_size_down((intptr_t) pc ^ (intptr_t) addr,
2315                         (intptr_t) page_size) > 0);
2316
2317      if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) {
2318        static volatile address last_addr =
2319          (address) os::non_memory_address_word();
2320
2321        // In conservative mode, don't unguard unless the address is in the VM
2322        if (UnguardOnExecutionViolation > 0 && addr != last_addr &&
2323            (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) {
2324
2325          // Set memory to RWX and retry
2326          address page_start =
2327            (address) align_size_down((intptr_t) addr, (intptr_t) page_size);
2328          bool res = os::protect_memory((char*) page_start, page_size,
2329                                        os::MEM_PROT_RWX);
2330
2331          if (PrintMiscellaneous && Verbose) {
2332            char buf[256];
2333            jio_snprintf(buf, sizeof(buf), "Execution protection violation "
2334                         "at " INTPTR_FORMAT
2335                         ", unguarding " INTPTR_FORMAT ": %s", addr,
2336                         page_start, (res ? "success" : strerror(errno)));
2337            tty->print_raw_cr(buf);
2338          }
2339
2340          // Set last_addr so if we fault again at the same address, we don't
2341          // end up in an endless loop.
2342          //
2343          // There are two potential complications here.  Two threads trapping
2344          // at the same address at the same time could cause one of the
2345          // threads to think it already unguarded, and abort the VM.  Likely
2346          // very rare.
2347          //
2348          // The other race involves two threads alternately trapping at
2349          // different addresses and failing to unguard the page, resulting in
2350          // an endless loop.  This condition is probably even more unlikely
2351          // than the first.
2352          //
2353          // Although both cases could be avoided by using locks or thread
2354          // local last_addr, these solutions are unnecessary complication:
2355          // this handler is a best-effort safety net, not a complete solution.
2356          // It is disabled by default and should only be used as a workaround
2357          // in case we missed any no-execute-unsafe VM code.
2358
2359          last_addr = addr;
2360
2361          return EXCEPTION_CONTINUE_EXECUTION;
2362        }
2363      }
2364
2365      // Last unguard failed or not unguarding
2366      tty->print_raw_cr("Execution protection violation");
2367      report_error(t, exception_code, addr, exceptionInfo->ExceptionRecord,
2368                   exceptionInfo->ContextRecord);
2369      return EXCEPTION_CONTINUE_SEARCH;
2370    }
2371  }
2372#endif // _WIN64
2373
2374  // Check to see if we caught the safepoint code in the
2375  // process of write protecting the memory serialization page.
2376  // It write enables the page immediately after protecting it
2377  // so just return.
2378  if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
2379    JavaThread* thread = (JavaThread*) t;
2380    PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2381    address addr = (address) exceptionRecord->ExceptionInformation[1];
2382    if ( os::is_memory_serialize_page(thread, addr) ) {
2383      // Block current thread until the memory serialize page permission restored.
2384      os::block_on_serialize_page_trap();
2385      return EXCEPTION_CONTINUE_EXECUTION;
2386    }
2387  }
2388
2389  if (t != NULL && t->is_Java_thread()) {
2390    JavaThread* thread = (JavaThread*) t;
2391    bool in_java = thread->thread_state() == _thread_in_Java;
2392
2393    // Handle potential stack overflows up front.
2394    if (exception_code == EXCEPTION_STACK_OVERFLOW) {
2395      if (os::uses_stack_guard_pages()) {
2396#ifdef _M_IA64
2397        // Use guard page for register stack.
2398        PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2399        address addr = (address) exceptionRecord->ExceptionInformation[1];
2400        // Check for a register stack overflow on Itanium
2401        if (thread->addr_inside_register_stack_red_zone(addr)) {
2402          // Fatal red zone violation happens if the Java program
2403          // catches a StackOverflow error and does so much processing
2404          // that it runs beyond the unprotected yellow guard zone. As
2405          // a result, we are out of here.
2406          fatal("ERROR: Unrecoverable stack overflow happened. JVM will exit.");
2407        } else if(thread->addr_inside_register_stack(addr)) {
2408          // Disable the yellow zone which sets the state that
2409          // we've got a stack overflow problem.
2410          if (thread->stack_yellow_zone_enabled()) {
2411            thread->disable_stack_yellow_zone();
2412          }
2413          // Give us some room to process the exception.
2414          thread->disable_register_stack_guard();
2415          // Tracing with +Verbose.
2416          if (Verbose) {
2417            tty->print_cr("SOF Compiled Register Stack overflow at " INTPTR_FORMAT " (SIGSEGV)", pc);
2418            tty->print_cr("Register Stack access at " INTPTR_FORMAT, addr);
2419            tty->print_cr("Register Stack base " INTPTR_FORMAT, thread->register_stack_base());
2420            tty->print_cr("Register Stack [" INTPTR_FORMAT "," INTPTR_FORMAT "]",
2421                          thread->register_stack_base(),
2422                          thread->register_stack_base() + thread->stack_size());
2423          }
2424
2425          // Reguard the permanent register stack red zone just to be sure.
2426          // We saw Windows silently disabling this without telling us.
2427          thread->enable_register_stack_red_zone();
2428
2429          return Handle_Exception(exceptionInfo,
2430            SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2431        }
2432#endif
2433        if (thread->stack_yellow_zone_enabled()) {
2434          // Yellow zone violation.  The o/s has unprotected the first yellow
2435          // zone page for us.  Note:  must call disable_stack_yellow_zone to
2436          // update the enabled status, even if the zone contains only one page.
2437          thread->disable_stack_yellow_zone();
2438          // If not in java code, return and hope for the best.
2439          return in_java ? Handle_Exception(exceptionInfo,
2440            SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW))
2441            :  EXCEPTION_CONTINUE_EXECUTION;
2442        } else {
2443          // Fatal red zone violation.
2444          thread->disable_stack_red_zone();
2445          tty->print_raw_cr("An unrecoverable stack overflow has occurred.");
2446          report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2447                       exceptionInfo->ContextRecord);
2448          return EXCEPTION_CONTINUE_SEARCH;
2449        }
2450      } else if (in_java) {
2451        // JVM-managed guard pages cannot be used on win95/98.  The o/s provides
2452        // a one-time-only guard page, which it has released to us.  The next
2453        // stack overflow on this thread will result in an ACCESS_VIOLATION.
2454        return Handle_Exception(exceptionInfo,
2455          SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2456      } else {
2457        // Can only return and hope for the best.  Further stack growth will
2458        // result in an ACCESS_VIOLATION.
2459        return EXCEPTION_CONTINUE_EXECUTION;
2460      }
2461    } else if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2462      // Either stack overflow or null pointer exception.
2463      if (in_java) {
2464        PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2465        address addr = (address) exceptionRecord->ExceptionInformation[1];
2466        address stack_end = thread->stack_base() - thread->stack_size();
2467        if (addr < stack_end && addr >= stack_end - os::vm_page_size()) {
2468          // Stack overflow.
2469          assert(!os::uses_stack_guard_pages(),
2470            "should be caught by red zone code above.");
2471          return Handle_Exception(exceptionInfo,
2472            SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2473        }
2474        //
2475        // Check for safepoint polling and implicit null
2476        // We only expect null pointers in the stubs (vtable)
2477        // the rest are checked explicitly now.
2478        //
2479        CodeBlob* cb = CodeCache::find_blob(pc);
2480        if (cb != NULL) {
2481          if (os::is_poll_address(addr)) {
2482            address stub = SharedRuntime::get_poll_stub(pc);
2483            return Handle_Exception(exceptionInfo, stub);
2484          }
2485        }
2486        {
2487#ifdef _WIN64
2488          //
2489          // If it's a legal stack address map the entire region in
2490          //
2491          PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2492          address addr = (address) exceptionRecord->ExceptionInformation[1];
2493          if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() ) {
2494                  addr = (address)((uintptr_t)addr &
2495                         (~((uintptr_t)os::vm_page_size() - (uintptr_t)1)));
2496                  os::commit_memory((char *)addr, thread->stack_base() - addr,
2497                                    false );
2498                  return EXCEPTION_CONTINUE_EXECUTION;
2499          }
2500          else
2501#endif
2502          {
2503            // Null pointer exception.
2504#ifdef _M_IA64
2505            // Process implicit null checks in compiled code. Note: Implicit null checks
2506            // can happen even if "ImplicitNullChecks" is disabled, e.g. in vtable stubs.
2507            if (CodeCache::contains((void*) pc_unix_format) && !MacroAssembler::needs_explicit_null_check((intptr_t) addr)) {
2508              CodeBlob *cb = CodeCache::find_blob_unsafe(pc_unix_format);
2509              // Handle implicit null check in UEP method entry
2510              if (cb && (cb->is_frame_complete_at(pc) ||
2511                         (cb->is_nmethod() && ((nmethod *)cb)->inlinecache_check_contains(pc)))) {
2512                if (Verbose) {
2513                  intptr_t *bundle_start = (intptr_t*) ((intptr_t) pc_unix_format & 0xFFFFFFFFFFFFFFF0);
2514                  tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", pc_unix_format);
2515                  tty->print_cr("      to addr " INTPTR_FORMAT, addr);
2516                  tty->print_cr("      bundle is " INTPTR_FORMAT " (high), " INTPTR_FORMAT " (low)",
2517                                *(bundle_start + 1), *bundle_start);
2518                }
2519                return Handle_Exception(exceptionInfo,
2520                  SharedRuntime::continuation_for_implicit_exception(thread, pc_unix_format, SharedRuntime::IMPLICIT_NULL));
2521              }
2522            }
2523
2524            // Implicit null checks were processed above.  Hence, we should not reach
2525            // here in the usual case => die!
2526            if (Verbose) tty->print_raw_cr("Access violation, possible null pointer exception");
2527            report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2528                         exceptionInfo->ContextRecord);
2529            return EXCEPTION_CONTINUE_SEARCH;
2530
2531#else // !IA64
2532
2533            // Windows 98 reports faulting addresses incorrectly
2534            if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr) ||
2535                !os::win32::is_nt()) {
2536              address stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
2537              if (stub != NULL) return Handle_Exception(exceptionInfo, stub);
2538            }
2539            report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2540                         exceptionInfo->ContextRecord);
2541            return EXCEPTION_CONTINUE_SEARCH;
2542#endif
2543          }
2544        }
2545      }
2546
2547#ifdef _WIN64
2548      // Special care for fast JNI field accessors.
2549      // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks
2550      // in and the heap gets shrunk before the field access.
2551      if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2552        address addr = JNI_FastGetField::find_slowcase_pc(pc);
2553        if (addr != (address)-1) {
2554          return Handle_Exception(exceptionInfo, addr);
2555        }
2556      }
2557#endif
2558
2559      // Stack overflow or null pointer exception in native code.
2560      report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2561                   exceptionInfo->ContextRecord);
2562      return EXCEPTION_CONTINUE_SEARCH;
2563    } // /EXCEPTION_ACCESS_VIOLATION
2564    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2565#if defined _M_IA64
2566    else if ((exception_code == EXCEPTION_ILLEGAL_INSTRUCTION ||
2567              exception_code == EXCEPTION_ILLEGAL_INSTRUCTION_2)) {
2568      M37 handle_wrong_method_break(0, NativeJump::HANDLE_WRONG_METHOD, PR0);
2569
2570      // Compiled method patched to be non entrant? Following conditions must apply:
2571      // 1. must be first instruction in bundle
2572      // 2. must be a break instruction with appropriate code
2573      if((((uint64_t) pc & 0x0F) == 0) &&
2574         (((IPF_Bundle*) pc)->get_slot0() == handle_wrong_method_break.bits())) {
2575        return Handle_Exception(exceptionInfo,
2576                                (address)SharedRuntime::get_handle_wrong_method_stub());
2577      }
2578    } // /EXCEPTION_ILLEGAL_INSTRUCTION
2579#endif
2580
2581
2582    if (in_java) {
2583      switch (exception_code) {
2584      case EXCEPTION_INT_DIVIDE_BY_ZERO:
2585        return Handle_Exception(exceptionInfo, SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO));
2586
2587      case EXCEPTION_INT_OVERFLOW:
2588        return Handle_IDiv_Exception(exceptionInfo);
2589
2590      } // switch
2591    }
2592#ifndef _WIN64
2593    if (((thread->thread_state() == _thread_in_Java) ||
2594        (thread->thread_state() == _thread_in_native)) &&
2595        exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION)
2596    {
2597      LONG result=Handle_FLT_Exception(exceptionInfo);
2598      if (result==EXCEPTION_CONTINUE_EXECUTION) return result;
2599    }
2600#endif //_WIN64
2601  }
2602
2603  if (exception_code != EXCEPTION_BREAKPOINT) {
2604    report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2605                 exceptionInfo->ContextRecord);
2606  }
2607  return EXCEPTION_CONTINUE_SEARCH;
2608}
2609
2610#ifndef _WIN64
2611// Special care for fast JNI accessors.
2612// jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in and
2613// the heap gets shrunk before the field access.
2614// Need to install our own structured exception handler since native code may
2615// install its own.
2616LONG WINAPI fastJNIAccessorExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
2617  DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
2618  if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2619    address pc = (address) exceptionInfo->ContextRecord->Eip;
2620    address addr = JNI_FastGetField::find_slowcase_pc(pc);
2621    if (addr != (address)-1) {
2622      return Handle_Exception(exceptionInfo, addr);
2623    }
2624  }
2625  return EXCEPTION_CONTINUE_SEARCH;
2626}
2627
2628#define DEFINE_FAST_GETFIELD(Return,Fieldname,Result) \
2629Return JNICALL jni_fast_Get##Result##Field_wrapper(JNIEnv *env, jobject obj, jfieldID fieldID) { \
2630  __try { \
2631    return (*JNI_FastGetField::jni_fast_Get##Result##Field_fp)(env, obj, fieldID); \
2632  } __except(fastJNIAccessorExceptionFilter((_EXCEPTION_POINTERS*)_exception_info())) { \
2633  } \
2634  return 0; \
2635}
2636
2637DEFINE_FAST_GETFIELD(jboolean, bool,   Boolean)
2638DEFINE_FAST_GETFIELD(jbyte,    byte,   Byte)
2639DEFINE_FAST_GETFIELD(jchar,    char,   Char)
2640DEFINE_FAST_GETFIELD(jshort,   short,  Short)
2641DEFINE_FAST_GETFIELD(jint,     int,    Int)
2642DEFINE_FAST_GETFIELD(jlong,    long,   Long)
2643DEFINE_FAST_GETFIELD(jfloat,   float,  Float)
2644DEFINE_FAST_GETFIELD(jdouble,  double, Double)
2645
2646address os::win32::fast_jni_accessor_wrapper(BasicType type) {
2647  switch (type) {
2648    case T_BOOLEAN: return (address)jni_fast_GetBooleanField_wrapper;
2649    case T_BYTE:    return (address)jni_fast_GetByteField_wrapper;
2650    case T_CHAR:    return (address)jni_fast_GetCharField_wrapper;
2651    case T_SHORT:   return (address)jni_fast_GetShortField_wrapper;
2652    case T_INT:     return (address)jni_fast_GetIntField_wrapper;
2653    case T_LONG:    return (address)jni_fast_GetLongField_wrapper;
2654    case T_FLOAT:   return (address)jni_fast_GetFloatField_wrapper;
2655    case T_DOUBLE:  return (address)jni_fast_GetDoubleField_wrapper;
2656    default:        ShouldNotReachHere();
2657  }
2658  return (address)-1;
2659}
2660#endif
2661
2662// Virtual Memory
2663
2664int os::vm_page_size() { return os::win32::vm_page_size(); }
2665int os::vm_allocation_granularity() {
2666  return os::win32::vm_allocation_granularity();
2667}
2668
2669// Windows large page support is available on Windows 2003. In order to use
2670// large page memory, the administrator must first assign additional privilege
2671// to the user:
2672//   + select Control Panel -> Administrative Tools -> Local Security Policy
2673//   + select Local Policies -> User Rights Assignment
2674//   + double click "Lock pages in memory", add users and/or groups
2675//   + reboot
2676// Note the above steps are needed for administrator as well, as administrators
2677// by default do not have the privilege to lock pages in memory.
2678//
2679// Note about Windows 2003: although the API supports committing large page
2680// memory on a page-by-page basis and VirtualAlloc() returns success under this
2681// scenario, I found through experiment it only uses large page if the entire
2682// memory region is reserved and committed in a single VirtualAlloc() call.
2683// This makes Windows large page support more or less like Solaris ISM, in
2684// that the entire heap must be committed upfront. This probably will change
2685// in the future, if so the code below needs to be revisited.
2686
2687#ifndef MEM_LARGE_PAGES
2688#define MEM_LARGE_PAGES 0x20000000
2689#endif
2690
2691static HANDLE    _hProcess;
2692static HANDLE    _hToken;
2693
2694// Container for NUMA node list info
2695class NUMANodeListHolder {
2696private:
2697  int *_numa_used_node_list;  // allocated below
2698  int _numa_used_node_count;
2699
2700  void free_node_list() {
2701    if (_numa_used_node_list != NULL) {
2702      FREE_C_HEAP_ARRAY(int, _numa_used_node_list, mtInternal);
2703    }
2704  }
2705
2706public:
2707  NUMANodeListHolder() {
2708    _numa_used_node_count = 0;
2709    _numa_used_node_list = NULL;
2710    // do rest of initialization in build routine (after function pointers are set up)
2711  }
2712
2713  ~NUMANodeListHolder() {
2714    free_node_list();
2715  }
2716
2717  bool build() {
2718    DWORD_PTR proc_aff_mask;
2719    DWORD_PTR sys_aff_mask;
2720    if (!GetProcessAffinityMask(GetCurrentProcess(), &proc_aff_mask, &sys_aff_mask)) return false;
2721    ULONG highest_node_number;
2722    if (!os::Kernel32Dll::GetNumaHighestNodeNumber(&highest_node_number)) return false;
2723    free_node_list();
2724    _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1, mtInternal);
2725    for (unsigned int i = 0; i <= highest_node_number; i++) {
2726      ULONGLONG proc_mask_numa_node;
2727      if (!os::Kernel32Dll::GetNumaNodeProcessorMask(i, &proc_mask_numa_node)) return false;
2728      if ((proc_aff_mask & proc_mask_numa_node)!=0) {
2729        _numa_used_node_list[_numa_used_node_count++] = i;
2730      }
2731    }
2732    return (_numa_used_node_count > 1);
2733  }
2734
2735  int get_count() {return _numa_used_node_count;}
2736  int get_node_list_entry(int n) {
2737    // for indexes out of range, returns -1
2738    return (n < _numa_used_node_count ? _numa_used_node_list[n] : -1);
2739  }
2740
2741} numa_node_list_holder;
2742
2743
2744
2745static size_t _large_page_size = 0;
2746
2747static bool resolve_functions_for_large_page_init() {
2748  return os::Kernel32Dll::GetLargePageMinimumAvailable() &&
2749    os::Advapi32Dll::AdvapiAvailable();
2750}
2751
2752static bool request_lock_memory_privilege() {
2753  _hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,
2754                                os::current_process_id());
2755
2756  LUID luid;
2757  if (_hProcess != NULL &&
2758      os::Advapi32Dll::OpenProcessToken(_hProcess, TOKEN_ADJUST_PRIVILEGES, &_hToken) &&
2759      os::Advapi32Dll::LookupPrivilegeValue(NULL, "SeLockMemoryPrivilege", &luid)) {
2760
2761    TOKEN_PRIVILEGES tp;
2762    tp.PrivilegeCount = 1;
2763    tp.Privileges[0].Luid = luid;
2764    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
2765
2766    // AdjustTokenPrivileges() may return TRUE even when it couldn't change the
2767    // privilege. Check GetLastError() too. See MSDN document.
2768    if (os::Advapi32Dll::AdjustTokenPrivileges(_hToken, false, &tp, sizeof(tp), NULL, NULL) &&
2769        (GetLastError() == ERROR_SUCCESS)) {
2770      return true;
2771    }
2772  }
2773
2774  return false;
2775}
2776
2777static void cleanup_after_large_page_init() {
2778  if (_hProcess) CloseHandle(_hProcess);
2779  _hProcess = NULL;
2780  if (_hToken) CloseHandle(_hToken);
2781  _hToken = NULL;
2782}
2783
2784static bool numa_interleaving_init() {
2785  bool success = false;
2786  bool use_numa_interleaving_specified = !FLAG_IS_DEFAULT(UseNUMAInterleaving);
2787
2788  // print a warning if UseNUMAInterleaving flag is specified on command line
2789  bool warn_on_failure = use_numa_interleaving_specified;
2790# define WARN(msg) if (warn_on_failure) { warning(msg); }
2791
2792  // NUMAInterleaveGranularity cannot be less than vm_allocation_granularity (or _large_page_size if using large pages)
2793  size_t min_interleave_granularity = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
2794  NUMAInterleaveGranularity = align_size_up(NUMAInterleaveGranularity, min_interleave_granularity);
2795
2796  if (os::Kernel32Dll::NumaCallsAvailable()) {
2797    if (numa_node_list_holder.build()) {
2798      if (PrintMiscellaneous && Verbose) {
2799        tty->print("NUMA UsedNodeCount=%d, namely ", numa_node_list_holder.get_count());
2800        for (int i = 0; i < numa_node_list_holder.get_count(); i++) {
2801          tty->print("%d ", numa_node_list_holder.get_node_list_entry(i));
2802        }
2803        tty->print("\n");
2804      }
2805      success = true;
2806    } else {
2807      WARN("Process does not cover multiple NUMA nodes.");
2808    }
2809  } else {
2810    WARN("NUMA Interleaving is not supported by the operating system.");
2811  }
2812  if (!success) {
2813    if (use_numa_interleaving_specified) WARN("...Ignoring UseNUMAInterleaving flag.");
2814  }
2815  return success;
2816#undef WARN
2817}
2818
2819// this routine is used whenever we need to reserve a contiguous VA range
2820// but we need to make separate VirtualAlloc calls for each piece of the range
2821// Reasons for doing this:
2822//  * UseLargePagesIndividualAllocation was set (normally only needed on WS2003 but possible to be set otherwise)
2823//  * UseNUMAInterleaving requires a separate node for each piece
2824static char* allocate_pages_individually(size_t bytes, char* addr, DWORD flags, DWORD prot,
2825                                         bool should_inject_error=false) {
2826  char * p_buf;
2827  // note: at setup time we guaranteed that NUMAInterleaveGranularity was aligned up to a page size
2828  size_t page_size = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
2829  size_t chunk_size = UseNUMAInterleaving ? NUMAInterleaveGranularity : page_size;
2830
2831  // first reserve enough address space in advance since we want to be
2832  // able to break a single contiguous virtual address range into multiple
2833  // large page commits but WS2003 does not allow reserving large page space
2834  // so we just use 4K pages for reserve, this gives us a legal contiguous
2835  // address space. then we will deallocate that reservation, and re alloc
2836  // using large pages
2837  const size_t size_of_reserve = bytes + chunk_size;
2838  if (bytes > size_of_reserve) {
2839    // Overflowed.
2840    return NULL;
2841  }
2842  p_buf = (char *) VirtualAlloc(addr,
2843                                size_of_reserve,  // size of Reserve
2844                                MEM_RESERVE,
2845                                PAGE_READWRITE);
2846  // If reservation failed, return NULL
2847  if (p_buf == NULL) return NULL;
2848  MemTracker::record_virtual_memory_reserve((address)p_buf, size_of_reserve, CALLER_PC);
2849  os::release_memory(p_buf, bytes + chunk_size);
2850
2851  // we still need to round up to a page boundary (in case we are using large pages)
2852  // but not to a chunk boundary (in case InterleavingGranularity doesn't align with page size)
2853  // instead we handle this in the bytes_to_rq computation below
2854  p_buf = (char *) align_size_up((size_t)p_buf, page_size);
2855
2856  // now go through and allocate one chunk at a time until all bytes are
2857  // allocated
2858  size_t  bytes_remaining = bytes;
2859  // An overflow of align_size_up() would have been caught above
2860  // in the calculation of size_of_reserve.
2861  char * next_alloc_addr = p_buf;
2862  HANDLE hProc = GetCurrentProcess();
2863
2864#ifdef ASSERT
2865  // Variable for the failure injection
2866  long ran_num = os::random();
2867  size_t fail_after = ran_num % bytes;
2868#endif
2869
2870  int count=0;
2871  while (bytes_remaining) {
2872    // select bytes_to_rq to get to the next chunk_size boundary
2873
2874    size_t bytes_to_rq = MIN2(bytes_remaining, chunk_size - ((size_t)next_alloc_addr % chunk_size));
2875    // Note allocate and commit
2876    char * p_new;
2877
2878#ifdef ASSERT
2879    bool inject_error_now = should_inject_error && (bytes_remaining <= fail_after);
2880#else
2881    const bool inject_error_now = false;
2882#endif
2883
2884    if (inject_error_now) {
2885      p_new = NULL;
2886    } else {
2887      if (!UseNUMAInterleaving) {
2888        p_new = (char *) VirtualAlloc(next_alloc_addr,
2889                                      bytes_to_rq,
2890                                      flags,
2891                                      prot);
2892      } else {
2893        // get the next node to use from the used_node_list
2894        assert(numa_node_list_holder.get_count() > 0, "Multiple NUMA nodes expected");
2895        DWORD node = numa_node_list_holder.get_node_list_entry(count % numa_node_list_holder.get_count());
2896        p_new = (char *)os::Kernel32Dll::VirtualAllocExNuma(hProc,
2897                                                            next_alloc_addr,
2898                                                            bytes_to_rq,
2899                                                            flags,
2900                                                            prot,
2901                                                            node);
2902      }
2903    }
2904
2905    if (p_new == NULL) {
2906      // Free any allocated pages
2907      if (next_alloc_addr > p_buf) {
2908        // Some memory was committed so release it.
2909        size_t bytes_to_release = bytes - bytes_remaining;
2910        // NMT has yet to record any individual blocks, so it
2911        // need to create a dummy 'reserve' record to match
2912        // the release.
2913        MemTracker::record_virtual_memory_reserve((address)p_buf,
2914          bytes_to_release, CALLER_PC);
2915        os::release_memory(p_buf, bytes_to_release);
2916      }
2917#ifdef ASSERT
2918      if (should_inject_error) {
2919        if (TracePageSizes && Verbose) {
2920          tty->print_cr("Reserving pages individually failed.");
2921        }
2922      }
2923#endif
2924      return NULL;
2925    }
2926
2927    bytes_remaining -= bytes_to_rq;
2928    next_alloc_addr += bytes_to_rq;
2929    count++;
2930  }
2931  // Although the memory is allocated individually, it is returned as one.
2932  // NMT records it as one block.
2933  address pc = CALLER_PC;
2934  MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, pc);
2935  if ((flags & MEM_COMMIT) != 0) {
2936    MemTracker::record_virtual_memory_commit((address)p_buf, bytes, pc);
2937  }
2938
2939  // made it this far, success
2940  return p_buf;
2941}
2942
2943
2944
2945void os::large_page_init() {
2946  if (!UseLargePages) return;
2947
2948  // print a warning if any large page related flag is specified on command line
2949  bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) ||
2950                         !FLAG_IS_DEFAULT(LargePageSizeInBytes);
2951  bool success = false;
2952
2953# define WARN(msg) if (warn_on_failure) { warning(msg); }
2954  if (resolve_functions_for_large_page_init()) {
2955    if (request_lock_memory_privilege()) {
2956      size_t s = os::Kernel32Dll::GetLargePageMinimum();
2957      if (s) {
2958#if defined(IA32) || defined(AMD64)
2959        if (s > 4*M || LargePageSizeInBytes > 4*M) {
2960          WARN("JVM cannot use large pages bigger than 4mb.");
2961        } else {
2962#endif
2963          if (LargePageSizeInBytes && LargePageSizeInBytes % s == 0) {
2964            _large_page_size = LargePageSizeInBytes;
2965          } else {
2966            _large_page_size = s;
2967          }
2968          success = true;
2969#if defined(IA32) || defined(AMD64)
2970        }
2971#endif
2972      } else {
2973        WARN("Large page is not supported by the processor.");
2974      }
2975    } else {
2976      WARN("JVM cannot use large page memory because it does not have enough privilege to lock pages in memory.");
2977    }
2978  } else {
2979    WARN("Large page is not supported by the operating system.");
2980  }
2981#undef WARN
2982
2983  const size_t default_page_size = (size_t) vm_page_size();
2984  if (success && _large_page_size > default_page_size) {
2985    _page_sizes[0] = _large_page_size;
2986    _page_sizes[1] = default_page_size;
2987    _page_sizes[2] = 0;
2988  }
2989
2990  cleanup_after_large_page_init();
2991  UseLargePages = success;
2992}
2993
2994// On win32, one cannot release just a part of reserved memory, it's an
2995// all or nothing deal.  When we split a reservation, we must break the
2996// reservation into two reservations.
2997void os::pd_split_reserved_memory(char *base, size_t size, size_t split,
2998                              bool realloc) {
2999  if (size > 0) {
3000    release_memory(base, size);
3001    if (realloc) {
3002      reserve_memory(split, base);
3003    }
3004    if (size != split) {
3005      reserve_memory(size - split, base + split);
3006    }
3007  }
3008}
3009
3010// Multiple threads can race in this code but it's not possible to unmap small sections of
3011// virtual space to get requested alignment, like posix-like os's.
3012// Windows prevents multiple thread from remapping over each other so this loop is thread-safe.
3013char* os::reserve_memory_aligned(size_t size, size_t alignment) {
3014  assert((alignment & (os::vm_allocation_granularity() - 1)) == 0,
3015      "Alignment must be a multiple of allocation granularity (page size)");
3016  assert((size & (alignment -1)) == 0, "size must be 'alignment' aligned");
3017
3018  size_t extra_size = size + alignment;
3019  assert(extra_size >= size, "overflow, size is too large to allow alignment");
3020
3021  char* aligned_base = NULL;
3022
3023  do {
3024    char* extra_base = os::reserve_memory(extra_size, NULL, alignment);
3025    if (extra_base == NULL) {
3026      return NULL;
3027    }
3028    // Do manual alignment
3029    aligned_base = (char*) align_size_up((uintptr_t) extra_base, alignment);
3030
3031    os::release_memory(extra_base, extra_size);
3032
3033    aligned_base = os::reserve_memory(size, aligned_base);
3034
3035  } while (aligned_base == NULL);
3036
3037  return aligned_base;
3038}
3039
3040char* os::pd_reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
3041  assert((size_t)addr % os::vm_allocation_granularity() == 0,
3042         "reserve alignment");
3043  assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size");
3044  char* res;
3045  // note that if UseLargePages is on, all the areas that require interleaving
3046  // will go thru reserve_memory_special rather than thru here.
3047  bool use_individual = (UseNUMAInterleaving && !UseLargePages);
3048  if (!use_individual) {
3049    res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE);
3050  } else {
3051    elapsedTimer reserveTimer;
3052    if( Verbose && PrintMiscellaneous ) reserveTimer.start();
3053    // in numa interleaving, we have to allocate pages individually
3054    // (well really chunks of NUMAInterleaveGranularity size)
3055    res = allocate_pages_individually(bytes, addr, MEM_RESERVE, PAGE_READWRITE);
3056    if (res == NULL) {
3057      warning("NUMA page allocation failed");
3058    }
3059    if( Verbose && PrintMiscellaneous ) {
3060      reserveTimer.stop();
3061      tty->print_cr("reserve_memory of %Ix bytes took " JLONG_FORMAT " ms (" JLONG_FORMAT " ticks)", bytes,
3062                    reserveTimer.milliseconds(), reserveTimer.ticks());
3063    }
3064  }
3065  assert(res == NULL || addr == NULL || addr == res,
3066         "Unexpected address from reserve.");
3067
3068  return res;
3069}
3070
3071// Reserve memory at an arbitrary address, only if that area is
3072// available (and not reserved for something else).
3073char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
3074  // Windows os::reserve_memory() fails of the requested address range is
3075  // not avilable.
3076  return reserve_memory(bytes, requested_addr);
3077}
3078
3079size_t os::large_page_size() {
3080  return _large_page_size;
3081}
3082
3083bool os::can_commit_large_page_memory() {
3084  // Windows only uses large page memory when the entire region is reserved
3085  // and committed in a single VirtualAlloc() call. This may change in the
3086  // future, but with Windows 2003 it's not possible to commit on demand.
3087  return false;
3088}
3089
3090bool os::can_execute_large_page_memory() {
3091  return true;
3092}
3093
3094char* os::reserve_memory_special(size_t bytes, char* addr, bool exec) {
3095
3096  const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
3097  const DWORD flags = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
3098
3099  // with large pages, there are two cases where we need to use Individual Allocation
3100  // 1) the UseLargePagesIndividualAllocation flag is set (set by default on WS2003)
3101  // 2) NUMA Interleaving is enabled, in which case we use a different node for each page
3102  if (UseLargePagesIndividualAllocation || UseNUMAInterleaving) {
3103    if (TracePageSizes && Verbose) {
3104       tty->print_cr("Reserving large pages individually.");
3105    }
3106    char * p_buf = allocate_pages_individually(bytes, addr, flags, prot, LargePagesIndividualAllocationInjectError);
3107    if (p_buf == NULL) {
3108      // give an appropriate warning message
3109      if (UseNUMAInterleaving) {
3110        warning("NUMA large page allocation failed, UseLargePages flag ignored");
3111      }
3112      if (UseLargePagesIndividualAllocation) {
3113        warning("Individually allocated large pages failed, "
3114                "use -XX:-UseLargePagesIndividualAllocation to turn off");
3115      }
3116      return NULL;
3117    }
3118
3119    return p_buf;
3120
3121  } else {
3122    // normal policy just allocate it all at once
3123    DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
3124    char * res = (char *)VirtualAlloc(NULL, bytes, flag, prot);
3125    if (res != NULL) {
3126      address pc = CALLER_PC;
3127      MemTracker::record_virtual_memory_reserve((address)res, bytes, pc);
3128      MemTracker::record_virtual_memory_commit((address)res, bytes, pc);
3129    }
3130
3131    return res;
3132  }
3133}
3134
3135bool os::release_memory_special(char* base, size_t bytes) {
3136  assert(base != NULL, "Sanity check");
3137  // Memory allocated via reserve_memory_special() is committed
3138  MemTracker::record_virtual_memory_uncommit((address)base, bytes);
3139  return release_memory(base, bytes);
3140}
3141
3142void os::print_statistics() {
3143}
3144
3145bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) {
3146  if (bytes == 0) {
3147    // Don't bother the OS with noops.
3148    return true;
3149  }
3150  assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries");
3151  assert(bytes % os::vm_page_size() == 0, "commit in page-sized chunks");
3152  // Don't attempt to print anything if the OS call fails. We're
3153  // probably low on resources, so the print itself may cause crashes.
3154
3155  // unless we have NUMAInterleaving enabled, the range of a commit
3156  // is always within a reserve covered by a single VirtualAlloc
3157  // in that case we can just do a single commit for the requested size
3158  if (!UseNUMAInterleaving) {
3159    if (VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) == NULL) return false;
3160    if (exec) {
3161      DWORD oldprot;
3162      // Windows doc says to use VirtualProtect to get execute permissions
3163      if (!VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &oldprot)) return false;
3164    }
3165    return true;
3166  } else {
3167
3168    // when NUMAInterleaving is enabled, the commit might cover a range that
3169    // came from multiple VirtualAlloc reserves (using allocate_pages_individually).
3170    // VirtualQuery can help us determine that.  The RegionSize that VirtualQuery
3171    // returns represents the number of bytes that can be committed in one step.
3172    size_t bytes_remaining = bytes;
3173    char * next_alloc_addr = addr;
3174    while (bytes_remaining > 0) {
3175      MEMORY_BASIC_INFORMATION alloc_info;
3176      VirtualQuery(next_alloc_addr, &alloc_info, sizeof(alloc_info));
3177      size_t bytes_to_rq = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize);
3178      if (VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_COMMIT, PAGE_READWRITE) == NULL)
3179        return false;
3180      if (exec) {
3181        DWORD oldprot;
3182        if (!VirtualProtect(next_alloc_addr, bytes_to_rq, PAGE_EXECUTE_READWRITE, &oldprot))
3183          return false;
3184      }
3185      bytes_remaining -= bytes_to_rq;
3186      next_alloc_addr += bytes_to_rq;
3187    }
3188  }
3189  // if we made it this far, return true
3190  return true;
3191}
3192
3193bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint,
3194                       bool exec) {
3195  return commit_memory(addr, size, exec);
3196}
3197
3198bool os::pd_uncommit_memory(char* addr, size_t bytes) {
3199  if (bytes == 0) {
3200    // Don't bother the OS with noops.
3201    return true;
3202  }
3203  assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries");
3204  assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks");
3205  return (VirtualFree(addr, bytes, MEM_DECOMMIT) != 0);
3206}
3207
3208bool os::pd_release_memory(char* addr, size_t bytes) {
3209  return VirtualFree(addr, 0, MEM_RELEASE) != 0;
3210}
3211
3212bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
3213  return os::commit_memory(addr, size);
3214}
3215
3216bool os::remove_stack_guard_pages(char* addr, size_t size) {
3217  return os::uncommit_memory(addr, size);
3218}
3219
3220// Set protections specified
3221bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
3222                        bool is_committed) {
3223  unsigned int p = 0;
3224  switch (prot) {
3225  case MEM_PROT_NONE: p = PAGE_NOACCESS; break;
3226  case MEM_PROT_READ: p = PAGE_READONLY; break;
3227  case MEM_PROT_RW:   p = PAGE_READWRITE; break;
3228  case MEM_PROT_RWX:  p = PAGE_EXECUTE_READWRITE; break;
3229  default:
3230    ShouldNotReachHere();
3231  }
3232
3233  DWORD old_status;
3234
3235  // Strange enough, but on Win32 one can change protection only for committed
3236  // memory, not a big deal anyway, as bytes less or equal than 64K
3237  if (!is_committed && !commit_memory(addr, bytes, prot == MEM_PROT_RWX)) {
3238    fatal("cannot commit protection page");
3239  }
3240  // One cannot use os::guard_memory() here, as on Win32 guard page
3241  // have different (one-shot) semantics, from MSDN on PAGE_GUARD:
3242  //
3243  // Pages in the region become guard pages. Any attempt to access a guard page
3244  // causes the system to raise a STATUS_GUARD_PAGE exception and turn off
3245  // the guard page status. Guard pages thus act as a one-time access alarm.
3246  return VirtualProtect(addr, bytes, p, &old_status) != 0;
3247}
3248
3249bool os::guard_memory(char* addr, size_t bytes) {
3250  DWORD old_status;
3251  return VirtualProtect(addr, bytes, PAGE_READWRITE | PAGE_GUARD, &old_status) != 0;
3252}
3253
3254bool os::unguard_memory(char* addr, size_t bytes) {
3255  DWORD old_status;
3256  return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0;
3257}
3258
3259void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
3260void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { }
3261void os::numa_make_global(char *addr, size_t bytes)    { }
3262void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint)    { }
3263bool os::numa_topology_changed()                       { return false; }
3264size_t os::numa_get_groups_num()                       { return MAX2(numa_node_list_holder.get_count(), 1); }
3265int os::numa_get_group_id()                            { return 0; }
3266size_t os::numa_get_leaf_groups(int *ids, size_t size) {
3267  if (numa_node_list_holder.get_count() == 0 && size > 0) {
3268    // Provide an answer for UMA systems
3269    ids[0] = 0;
3270    return 1;
3271  } else {
3272    // check for size bigger than actual groups_num
3273    size = MIN2(size, numa_get_groups_num());
3274    for (int i = 0; i < (int)size; i++) {
3275      ids[i] = numa_node_list_holder.get_node_list_entry(i);
3276    }
3277    return size;
3278  }
3279}
3280
3281bool os::get_page_info(char *start, page_info* info) {
3282  return false;
3283}
3284
3285char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
3286  return end;
3287}
3288
3289char* os::non_memory_address_word() {
3290  // Must never look like an address returned by reserve_memory,
3291  // even in its subfields (as defined by the CPU immediate fields,
3292  // if the CPU splits constants across multiple instructions).
3293  return (char*)-1;
3294}
3295
3296#define MAX_ERROR_COUNT 100
3297#define SYS_THREAD_ERROR 0xffffffffUL
3298
3299void os::pd_start_thread(Thread* thread) {
3300  DWORD ret = ResumeThread(thread->osthread()->thread_handle());
3301  // Returns previous suspend state:
3302  // 0:  Thread was not suspended
3303  // 1:  Thread is running now
3304  // >1: Thread is still suspended.
3305  assert(ret != SYS_THREAD_ERROR, "StartThread failed"); // should propagate back
3306}
3307
3308class HighResolutionInterval {
3309  // The default timer resolution seems to be 10 milliseconds.
3310  // (Where is this written down?)
3311  // If someone wants to sleep for only a fraction of the default,
3312  // then we set the timer resolution down to 1 millisecond for
3313  // the duration of their interval.
3314  // We carefully set the resolution back, since otherwise we
3315  // seem to incur an overhead (3%?) that we don't need.
3316  // CONSIDER: if ms is small, say 3, then we should run with a high resolution time.
3317  // Buf if ms is large, say 500, or 503, we should avoid the call to timeBeginPeriod().
3318  // Alternatively, we could compute the relative error (503/500 = .6%) and only use
3319  // timeBeginPeriod() if the relative error exceeded some threshold.
3320  // timeBeginPeriod() has been linked to problems with clock drift on win32 systems and
3321  // to decreased efficiency related to increased timer "tick" rates.  We want to minimize
3322  // (a) calls to timeBeginPeriod() and timeEndPeriod() and (b) time spent with high
3323  // resolution timers running.
3324private:
3325    jlong resolution;
3326public:
3327  HighResolutionInterval(jlong ms) {
3328    resolution = ms % 10L;
3329    if (resolution != 0) {
3330      MMRESULT result = timeBeginPeriod(1L);
3331    }
3332  }
3333  ~HighResolutionInterval() {
3334    if (resolution != 0) {
3335      MMRESULT result = timeEndPeriod(1L);
3336    }
3337    resolution = 0L;
3338  }
3339};
3340
3341int os::sleep(Thread* thread, jlong ms, bool interruptable) {
3342  jlong limit = (jlong) MAXDWORD;
3343
3344  while(ms > limit) {
3345    int res;
3346    if ((res = sleep(thread, limit, interruptable)) != OS_TIMEOUT)
3347      return res;
3348    ms -= limit;
3349  }
3350
3351  assert(thread == Thread::current(),  "thread consistency check");
3352  OSThread* osthread = thread->osthread();
3353  OSThreadWaitState osts(osthread, false /* not Object.wait() */);
3354  int result;
3355  if (interruptable) {
3356    assert(thread->is_Java_thread(), "must be java thread");
3357    JavaThread *jt = (JavaThread *) thread;
3358    ThreadBlockInVM tbivm(jt);
3359
3360    jt->set_suspend_equivalent();
3361    // cleared by handle_special_suspend_equivalent_condition() or
3362    // java_suspend_self() via check_and_wait_while_suspended()
3363
3364    HANDLE events[1];
3365    events[0] = osthread->interrupt_event();
3366    HighResolutionInterval *phri=NULL;
3367    if(!ForceTimeHighResolution)
3368      phri = new HighResolutionInterval( ms );
3369    if (WaitForMultipleObjects(1, events, FALSE, (DWORD)ms) == WAIT_TIMEOUT) {
3370      result = OS_TIMEOUT;
3371    } else {
3372      ResetEvent(osthread->interrupt_event());
3373      osthread->set_interrupted(false);
3374      result = OS_INTRPT;
3375    }
3376    delete phri; //if it is NULL, harmless
3377
3378    // were we externally suspended while we were waiting?
3379    jt->check_and_wait_while_suspended();
3380  } else {
3381    assert(!thread->is_Java_thread(), "must not be java thread");
3382    Sleep((long) ms);
3383    result = OS_TIMEOUT;
3384  }
3385  return result;
3386}
3387
3388// Sleep forever; naked call to OS-specific sleep; use with CAUTION
3389void os::infinite_sleep() {
3390  while (true) {    // sleep forever ...
3391    Sleep(100000);  // ... 100 seconds at a time
3392  }
3393}
3394
3395typedef BOOL (WINAPI * STTSignature)(void) ;
3396
3397os::YieldResult os::NakedYield() {
3398  // Use either SwitchToThread() or Sleep(0)
3399  // Consider passing back the return value from SwitchToThread().
3400  if (os::Kernel32Dll::SwitchToThreadAvailable()) {
3401    return SwitchToThread() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ;
3402  } else {
3403    Sleep(0);
3404  }
3405  return os::YIELD_UNKNOWN ;
3406}
3407
3408void os::yield() {  os::NakedYield(); }
3409
3410void os::yield_all(int attempts) {
3411  // Yields to all threads, including threads with lower priorities
3412  Sleep(1);
3413}
3414
3415// Win32 only gives you access to seven real priorities at a time,
3416// so we compress Java's ten down to seven.  It would be better
3417// if we dynamically adjusted relative priorities.
3418
3419int os::java_to_os_priority[CriticalPriority + 1] = {
3420  THREAD_PRIORITY_IDLE,                         // 0  Entry should never be used
3421  THREAD_PRIORITY_LOWEST,                       // 1  MinPriority
3422  THREAD_PRIORITY_LOWEST,                       // 2
3423  THREAD_PRIORITY_BELOW_NORMAL,                 // 3
3424  THREAD_PRIORITY_BELOW_NORMAL,                 // 4
3425  THREAD_PRIORITY_NORMAL,                       // 5  NormPriority
3426  THREAD_PRIORITY_NORMAL,                       // 6
3427  THREAD_PRIORITY_ABOVE_NORMAL,                 // 7
3428  THREAD_PRIORITY_ABOVE_NORMAL,                 // 8
3429  THREAD_PRIORITY_HIGHEST,                      // 9  NearMaxPriority
3430  THREAD_PRIORITY_HIGHEST,                      // 10 MaxPriority
3431  THREAD_PRIORITY_HIGHEST                       // 11 CriticalPriority
3432};
3433
3434int prio_policy1[CriticalPriority + 1] = {
3435  THREAD_PRIORITY_IDLE,                         // 0  Entry should never be used
3436  THREAD_PRIORITY_LOWEST,                       // 1  MinPriority
3437  THREAD_PRIORITY_LOWEST,                       // 2
3438  THREAD_PRIORITY_BELOW_NORMAL,                 // 3
3439  THREAD_PRIORITY_BELOW_NORMAL,                 // 4
3440  THREAD_PRIORITY_NORMAL,                       // 5  NormPriority
3441  THREAD_PRIORITY_ABOVE_NORMAL,                 // 6
3442  THREAD_PRIORITY_ABOVE_NORMAL,                 // 7
3443  THREAD_PRIORITY_HIGHEST,                      // 8
3444  THREAD_PRIORITY_HIGHEST,                      // 9  NearMaxPriority
3445  THREAD_PRIORITY_TIME_CRITICAL,                // 10 MaxPriority
3446  THREAD_PRIORITY_TIME_CRITICAL                 // 11 CriticalPriority
3447};
3448
3449static int prio_init() {
3450  // If ThreadPriorityPolicy is 1, switch tables
3451  if (ThreadPriorityPolicy == 1) {
3452    int i;
3453    for (i = 0; i < CriticalPriority + 1; i++) {
3454      os::java_to_os_priority[i] = prio_policy1[i];
3455    }
3456  }
3457  if (UseCriticalJavaThreadPriority) {
3458    os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority] ;
3459  }
3460  return 0;
3461}
3462
3463OSReturn os::set_native_priority(Thread* thread, int priority) {
3464  if (!UseThreadPriorities) return OS_OK;
3465  bool ret = SetThreadPriority(thread->osthread()->thread_handle(), priority) != 0;
3466  return ret ? OS_OK : OS_ERR;
3467}
3468
3469OSReturn os::get_native_priority(const Thread* const thread, int* priority_ptr) {
3470  if ( !UseThreadPriorities ) {
3471    *priority_ptr = java_to_os_priority[NormPriority];
3472    return OS_OK;
3473  }
3474  int os_prio = GetThreadPriority(thread->osthread()->thread_handle());
3475  if (os_prio == THREAD_PRIORITY_ERROR_RETURN) {
3476    assert(false, "GetThreadPriority failed");
3477    return OS_ERR;
3478  }
3479  *priority_ptr = os_prio;
3480  return OS_OK;
3481}
3482
3483
3484// Hint to the underlying OS that a task switch would not be good.
3485// Void return because it's a hint and can fail.
3486void os::hint_no_preempt() {}
3487
3488void os::interrupt(Thread* thread) {
3489  assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
3490         "possibility of dangling Thread pointer");
3491
3492  OSThread* osthread = thread->osthread();
3493  osthread->set_interrupted(true);
3494  // More than one thread can get here with the same value of osthread,
3495  // resulting in multiple notifications.  We do, however, want the store
3496  // to interrupted() to be visible to other threads before we post
3497  // the interrupt event.
3498  OrderAccess::release();
3499  SetEvent(osthread->interrupt_event());
3500  // For JSR166:  unpark after setting status
3501  if (thread->is_Java_thread())
3502    ((JavaThread*)thread)->parker()->unpark();
3503
3504  ParkEvent * ev = thread->_ParkEvent ;
3505  if (ev != NULL) ev->unpark() ;
3506
3507}
3508
3509
3510bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
3511  assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
3512         "possibility of dangling Thread pointer");
3513
3514  OSThread* osthread = thread->osthread();
3515  bool interrupted = osthread->interrupted();
3516  // There is no synchronization between the setting of the interrupt
3517  // and it being cleared here. It is critical - see 6535709 - that
3518  // we only clear the interrupt state, and reset the interrupt event,
3519  // if we are going to report that we were indeed interrupted - else
3520  // an interrupt can be "lost", leading to spurious wakeups or lost wakeups
3521  // depending on the timing
3522  if (interrupted && clear_interrupted) {
3523    osthread->set_interrupted(false);
3524    ResetEvent(osthread->interrupt_event());
3525  } // Otherwise leave the interrupted state alone
3526
3527  return interrupted;
3528}
3529
3530// Get's a pc (hint) for a running thread. Currently used only for profiling.
3531ExtendedPC os::get_thread_pc(Thread* thread) {
3532  CONTEXT context;
3533  context.ContextFlags = CONTEXT_CONTROL;
3534  HANDLE handle = thread->osthread()->thread_handle();
3535#ifdef _M_IA64
3536  assert(0, "Fix get_thread_pc");
3537  return ExtendedPC(NULL);
3538#else
3539  if (GetThreadContext(handle, &context)) {
3540#ifdef _M_AMD64
3541    return ExtendedPC((address) context.Rip);
3542#else
3543    return ExtendedPC((address) context.Eip);
3544#endif
3545  } else {
3546    return ExtendedPC(NULL);
3547  }
3548#endif
3549}
3550
3551// GetCurrentThreadId() returns DWORD
3552intx os::current_thread_id()          { return GetCurrentThreadId(); }
3553
3554static int _initial_pid = 0;
3555
3556int os::current_process_id()
3557{
3558  return (_initial_pid ? _initial_pid : _getpid());
3559}
3560
3561int    os::win32::_vm_page_size       = 0;
3562int    os::win32::_vm_allocation_granularity = 0;
3563int    os::win32::_processor_type     = 0;
3564// Processor level is not available on non-NT systems, use vm_version instead
3565int    os::win32::_processor_level    = 0;
3566julong os::win32::_physical_memory    = 0;
3567size_t os::win32::_default_stack_size = 0;
3568
3569         intx os::win32::_os_thread_limit    = 0;
3570volatile intx os::win32::_os_thread_count    = 0;
3571
3572bool   os::win32::_is_nt              = false;
3573bool   os::win32::_is_windows_2003    = false;
3574bool   os::win32::_is_windows_server  = false;
3575
3576void os::win32::initialize_system_info() {
3577  SYSTEM_INFO si;
3578  GetSystemInfo(&si);
3579  _vm_page_size    = si.dwPageSize;
3580  _vm_allocation_granularity = si.dwAllocationGranularity;
3581  _processor_type  = si.dwProcessorType;
3582  _processor_level = si.wProcessorLevel;
3583  set_processor_count(si.dwNumberOfProcessors);
3584
3585  MEMORYSTATUSEX ms;
3586  ms.dwLength = sizeof(ms);
3587
3588  // also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual,
3589  // dwMemoryLoad (% of memory in use)
3590  GlobalMemoryStatusEx(&ms);
3591  _physical_memory = ms.ullTotalPhys;
3592
3593  OSVERSIONINFOEX oi;
3594  oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
3595  GetVersionEx((OSVERSIONINFO*)&oi);
3596  switch(oi.dwPlatformId) {
3597    case VER_PLATFORM_WIN32_WINDOWS: _is_nt = false; break;
3598    case VER_PLATFORM_WIN32_NT:
3599      _is_nt = true;
3600      {
3601        int os_vers = oi.dwMajorVersion * 1000 + oi.dwMinorVersion;
3602        if (os_vers == 5002) {
3603          _is_windows_2003 = true;
3604        }
3605        if (oi.wProductType == VER_NT_DOMAIN_CONTROLLER ||
3606          oi.wProductType == VER_NT_SERVER) {
3607            _is_windows_server = true;
3608        }
3609      }
3610      break;
3611    default: fatal("Unknown platform");
3612  }
3613
3614  _default_stack_size = os::current_stack_size();
3615  assert(_default_stack_size > (size_t) _vm_page_size, "invalid stack size");
3616  assert((_default_stack_size & (_vm_page_size - 1)) == 0,
3617    "stack size not a multiple of page size");
3618
3619  initialize_performance_counter();
3620
3621  // Win95/Win98 scheduler bug work-around. The Win95/98 scheduler is
3622  // known to deadlock the system, if the VM issues to thread operations with
3623  // a too high frequency, e.g., such as changing the priorities.
3624  // The 6000 seems to work well - no deadlocks has been notices on the test
3625  // programs that we have seen experience this problem.
3626  if (!os::win32::is_nt()) {
3627    StarvationMonitorInterval = 6000;
3628  }
3629}
3630
3631
3632HINSTANCE os::win32::load_Windows_dll(const char* name, char *ebuf, int ebuflen) {
3633  char path[MAX_PATH];
3634  DWORD size;
3635  DWORD pathLen = (DWORD)sizeof(path);
3636  HINSTANCE result = NULL;
3637
3638  // only allow library name without path component
3639  assert(strchr(name, '\\') == NULL, "path not allowed");
3640  assert(strchr(name, ':') == NULL, "path not allowed");
3641  if (strchr(name, '\\') != NULL || strchr(name, ':') != NULL) {
3642    jio_snprintf(ebuf, ebuflen,
3643      "Invalid parameter while calling os::win32::load_windows_dll(): cannot take path: %s", name);
3644    return NULL;
3645  }
3646
3647  // search system directory
3648  if ((size = GetSystemDirectory(path, pathLen)) > 0) {
3649    strcat(path, "\\");
3650    strcat(path, name);
3651    if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
3652      return result;
3653    }
3654  }
3655
3656  // try Windows directory
3657  if ((size = GetWindowsDirectory(path, pathLen)) > 0) {
3658    strcat(path, "\\");
3659    strcat(path, name);
3660    if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
3661      return result;
3662    }
3663  }
3664
3665  jio_snprintf(ebuf, ebuflen,
3666    "os::win32::load_windows_dll() cannot load %s from system directories.", name);
3667  return NULL;
3668}
3669
3670void os::win32::setmode_streams() {
3671  _setmode(_fileno(stdin), _O_BINARY);
3672  _setmode(_fileno(stdout), _O_BINARY);
3673  _setmode(_fileno(stderr), _O_BINARY);
3674}
3675
3676
3677bool os::is_debugger_attached() {
3678  return IsDebuggerPresent() ? true : false;
3679}
3680
3681
3682void os::wait_for_keypress_at_exit(void) {
3683  if (PauseAtExit) {
3684    fprintf(stderr, "Press any key to continue...\n");
3685    fgetc(stdin);
3686  }
3687}
3688
3689
3690int os::message_box(const char* title, const char* message) {
3691  int result = MessageBox(NULL, message, title,
3692                          MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY);
3693  return result == IDYES;
3694}
3695
3696int os::allocate_thread_local_storage() {
3697  return TlsAlloc();
3698}
3699
3700
3701void os::free_thread_local_storage(int index) {
3702  TlsFree(index);
3703}
3704
3705
3706void os::thread_local_storage_at_put(int index, void* value) {
3707  TlsSetValue(index, value);
3708  assert(thread_local_storage_at(index) == value, "Just checking");
3709}
3710
3711
3712void* os::thread_local_storage_at(int index) {
3713  return TlsGetValue(index);
3714}
3715
3716
3717#ifndef PRODUCT
3718#ifndef _WIN64
3719// Helpers to check whether NX protection is enabled
3720int nx_exception_filter(_EXCEPTION_POINTERS *pex) {
3721  if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
3722      pex->ExceptionRecord->NumberParameters > 0 &&
3723      pex->ExceptionRecord->ExceptionInformation[0] ==
3724      EXCEPTION_INFO_EXEC_VIOLATION) {
3725    return EXCEPTION_EXECUTE_HANDLER;
3726  }
3727  return EXCEPTION_CONTINUE_SEARCH;
3728}
3729
3730void nx_check_protection() {
3731  // If NX is enabled we'll get an exception calling into code on the stack
3732  char code[] = { (char)0xC3 }; // ret
3733  void *code_ptr = (void *)code;
3734  __try {
3735    __asm call code_ptr
3736  } __except(nx_exception_filter((_EXCEPTION_POINTERS*)_exception_info())) {
3737    tty->print_raw_cr("NX protection detected.");
3738  }
3739}
3740#endif // _WIN64
3741#endif // PRODUCT
3742
3743// this is called _before_ the global arguments have been parsed
3744void os::init(void) {
3745  _initial_pid = _getpid();
3746
3747  init_random(1234567);
3748
3749  win32::initialize_system_info();
3750  win32::setmode_streams();
3751  init_page_sizes((size_t) win32::vm_page_size());
3752
3753  // For better scalability on MP systems (must be called after initialize_system_info)
3754#ifndef PRODUCT
3755  if (is_MP()) {
3756    NoYieldsInMicrolock = true;
3757  }
3758#endif
3759  // This may be overridden later when argument processing is done.
3760  FLAG_SET_ERGO(bool, UseLargePagesIndividualAllocation,
3761    os::win32::is_windows_2003());
3762
3763  // Initialize main_process and main_thread
3764  main_process = GetCurrentProcess();  // Remember main_process is a pseudo handle
3765 if (!DuplicateHandle(main_process, GetCurrentThread(), main_process,
3766                       &main_thread, THREAD_ALL_ACCESS, false, 0)) {
3767    fatal("DuplicateHandle failed\n");
3768  }
3769  main_thread_id = (int) GetCurrentThreadId();
3770}
3771
3772// To install functions for atexit processing
3773extern "C" {
3774  static void perfMemory_exit_helper() {
3775    perfMemory_exit();
3776  }
3777}
3778
3779static jint initSock();
3780
3781// this is called _after_ the global arguments have been parsed
3782jint os::init_2(void) {
3783  // Allocate a single page and mark it as readable for safepoint polling
3784  address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY);
3785  guarantee( polling_page != NULL, "Reserve Failed for polling page");
3786
3787  address return_page  = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY);
3788  guarantee( return_page != NULL, "Commit Failed for polling page");
3789
3790  os::set_polling_page( polling_page );
3791
3792#ifndef PRODUCT
3793  if( Verbose && PrintMiscellaneous )
3794    tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
3795#endif
3796
3797  if (!UseMembar) {
3798    address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE);
3799    guarantee( mem_serialize_page != NULL, "Reserve Failed for memory serialize page");
3800
3801    return_page  = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE);
3802    guarantee( return_page != NULL, "Commit Failed for memory serialize page");
3803
3804    os::set_memory_serialize_page( mem_serialize_page );
3805
3806#ifndef PRODUCT
3807    if(Verbose && PrintMiscellaneous)
3808      tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
3809#endif
3810  }
3811
3812  os::large_page_init();
3813
3814  // Setup Windows Exceptions
3815
3816  // for debugging float code generation bugs
3817  if (ForceFloatExceptions) {
3818#ifndef  _WIN64
3819    static long fp_control_word = 0;
3820    __asm { fstcw fp_control_word }
3821    // see Intel PPro Manual, Vol. 2, p 7-16
3822    const long precision = 0x20;
3823    const long underflow = 0x10;
3824    const long overflow  = 0x08;
3825    const long zero_div  = 0x04;
3826    const long denorm    = 0x02;
3827    const long invalid   = 0x01;
3828    fp_control_word |= invalid;
3829    __asm { fldcw fp_control_word }
3830#endif
3831  }
3832
3833  // If stack_commit_size is 0, windows will reserve the default size,
3834  // but only commit a small portion of it.
3835  size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size());
3836  size_t default_reserve_size = os::win32::default_stack_size();
3837  size_t actual_reserve_size = stack_commit_size;
3838  if (stack_commit_size < default_reserve_size) {
3839    // If stack_commit_size == 0, we want this too
3840    actual_reserve_size = default_reserve_size;
3841  }
3842
3843  // Check minimum allowable stack size for thread creation and to initialize
3844  // the java system classes, including StackOverflowError - depends on page
3845  // size.  Add a page for compiler2 recursion in main thread.
3846  // Add in 2*BytesPerWord times page size to account for VM stack during
3847  // class initialization depending on 32 or 64 bit VM.
3848  size_t min_stack_allowed =
3849            (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
3850            2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size();
3851  if (actual_reserve_size < min_stack_allowed) {
3852    tty->print_cr("\nThe stack size specified is too small, "
3853                  "Specify at least %dk",
3854                  min_stack_allowed / K);
3855    return JNI_ERR;
3856  }
3857
3858  JavaThread::set_stack_size_at_create(stack_commit_size);
3859
3860  // Calculate theoretical max. size of Threads to guard gainst artifical
3861  // out-of-memory situations, where all available address-space has been
3862  // reserved by thread stacks.
3863  assert(actual_reserve_size != 0, "Must have a stack");
3864
3865  // Calculate the thread limit when we should start doing Virtual Memory
3866  // banging. Currently when the threads will have used all but 200Mb of space.
3867  //
3868  // TODO: consider performing a similar calculation for commit size instead
3869  // as reserve size, since on a 64-bit platform we'll run into that more
3870  // often than running out of virtual memory space.  We can use the
3871  // lower value of the two calculations as the os_thread_limit.
3872  size_t max_address_space = ((size_t)1 << (BitsPerWord - 1)) - (200 * K * K);
3873  win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size);
3874
3875  // at exit methods are called in the reverse order of their registration.
3876  // there is no limit to the number of functions registered. atexit does
3877  // not set errno.
3878
3879  if (PerfAllowAtExitRegistration) {
3880    // only register atexit functions if PerfAllowAtExitRegistration is set.
3881    // atexit functions can be delayed until process exit time, which
3882    // can be problematic for embedded VM situations. Embedded VMs should
3883    // call DestroyJavaVM() to assure that VM resources are released.
3884
3885    // note: perfMemory_exit_helper atexit function may be removed in
3886    // the future if the appropriate cleanup code can be added to the
3887    // VM_Exit VMOperation's doit method.
3888    if (atexit(perfMemory_exit_helper) != 0) {
3889      warning("os::init_2 atexit(perfMemory_exit_helper) failed");
3890    }
3891  }
3892
3893#ifndef _WIN64
3894  // Print something if NX is enabled (win32 on AMD64)
3895  NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection());
3896#endif
3897
3898  // initialize thread priority policy
3899  prio_init();
3900
3901  if (UseNUMA && !ForceNUMA) {
3902    UseNUMA = false; // We don't fully support this yet
3903  }
3904
3905  if (UseNUMAInterleaving) {
3906    // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag
3907    bool success = numa_interleaving_init();
3908    if (!success) UseNUMAInterleaving = false;
3909  }
3910
3911  if (initSock() != JNI_OK) {
3912    return JNI_ERR;
3913  }
3914
3915  return JNI_OK;
3916}
3917
3918void os::init_3(void) {
3919  return;
3920}
3921
3922// Mark the polling page as unreadable
3923void os::make_polling_page_unreadable(void) {
3924  DWORD old_status;
3925  if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_NOACCESS, &old_status) )
3926    fatal("Could not disable polling page");
3927};
3928
3929// Mark the polling page as readable
3930void os::make_polling_page_readable(void) {
3931  DWORD old_status;
3932  if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_READONLY, &old_status) )
3933    fatal("Could not enable polling page");
3934};
3935
3936
3937int os::stat(const char *path, struct stat *sbuf) {
3938  char pathbuf[MAX_PATH];
3939  if (strlen(path) > MAX_PATH - 1) {
3940    errno = ENAMETOOLONG;
3941    return -1;
3942  }
3943  os::native_path(strcpy(pathbuf, path));
3944  int ret = ::stat(pathbuf, sbuf);
3945  if (sbuf != NULL && UseUTCFileTimestamp) {
3946    // Fix for 6539723.  st_mtime returned from stat() is dependent on
3947    // the system timezone and so can return different values for the
3948    // same file if/when daylight savings time changes.  This adjustment
3949    // makes sure the same timestamp is returned regardless of the TZ.
3950    //
3951    // See:
3952    // http://msdn.microsoft.com/library/
3953    //   default.asp?url=/library/en-us/sysinfo/base/
3954    //   time_zone_information_str.asp
3955    // and
3956    // http://msdn.microsoft.com/library/default.asp?url=
3957    //   /library/en-us/sysinfo/base/settimezoneinformation.asp
3958    //
3959    // NOTE: there is a insidious bug here:  If the timezone is changed
3960    // after the call to stat() but before 'GetTimeZoneInformation()', then
3961    // the adjustment we do here will be wrong and we'll return the wrong
3962    // value (which will likely end up creating an invalid class data
3963    // archive).  Absent a better API for this, or some time zone locking
3964    // mechanism, we'll have to live with this risk.
3965    TIME_ZONE_INFORMATION tz;
3966    DWORD tzid = GetTimeZoneInformation(&tz);
3967    int daylightBias =
3968      (tzid == TIME_ZONE_ID_DAYLIGHT) ?  tz.DaylightBias : tz.StandardBias;
3969    sbuf->st_mtime += (tz.Bias + daylightBias) * 60;
3970  }
3971  return ret;
3972}
3973
3974
3975#define FT2INT64(ft) \
3976  ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime))
3977
3978
3979// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
3980// are used by JVM M&M and JVMTI to get user+sys or user CPU time
3981// of a thread.
3982//
3983// current_thread_cpu_time() and thread_cpu_time(Thread*) returns
3984// the fast estimate available on the platform.
3985
3986// current_thread_cpu_time() is not optimized for Windows yet
3987jlong os::current_thread_cpu_time() {
3988  // return user + sys since the cost is the same
3989  return os::thread_cpu_time(Thread::current(), true /* user+sys */);
3990}
3991
3992jlong os::thread_cpu_time(Thread* thread) {
3993  // consistent with what current_thread_cpu_time() returns.
3994  return os::thread_cpu_time(thread, true /* user+sys */);
3995}
3996
3997jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
3998  return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
3999}
4000
4001jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) {
4002  // This code is copy from clasic VM -> hpi::sysThreadCPUTime
4003  // If this function changes, os::is_thread_cpu_time_supported() should too
4004  if (os::win32::is_nt()) {
4005    FILETIME CreationTime;
4006    FILETIME ExitTime;
4007    FILETIME KernelTime;
4008    FILETIME UserTime;
4009
4010    if ( GetThreadTimes(thread->osthread()->thread_handle(),
4011                    &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
4012      return -1;
4013    else
4014      if (user_sys_cpu_time) {
4015        return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100;
4016      } else {
4017        return FT2INT64(UserTime) * 100;
4018      }
4019  } else {
4020    return (jlong) timeGetTime() * 1000000;
4021  }
4022}
4023
4024void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4025  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
4026  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
4027  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
4028  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
4029}
4030
4031void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
4032  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
4033  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
4034  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
4035  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
4036}
4037
4038bool os::is_thread_cpu_time_supported() {
4039  // see os::thread_cpu_time
4040  if (os::win32::is_nt()) {
4041    FILETIME CreationTime;
4042    FILETIME ExitTime;
4043    FILETIME KernelTime;
4044    FILETIME UserTime;
4045
4046    if ( GetThreadTimes(GetCurrentThread(),
4047                    &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
4048      return false;
4049    else
4050      return true;
4051  } else {
4052    return false;
4053  }
4054}
4055
4056// Windows does't provide a loadavg primitive so this is stubbed out for now.
4057// It does have primitives (PDH API) to get CPU usage and run queue length.
4058// "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length"
4059// If we wanted to implement loadavg on Windows, we have a few options:
4060//
4061// a) Query CPU usage and run queue length and "fake" an answer by
4062//    returning the CPU usage if it's under 100%, and the run queue
4063//    length otherwise.  It turns out that querying is pretty slow
4064//    on Windows, on the order of 200 microseconds on a fast machine.
4065//    Note that on the Windows the CPU usage value is the % usage
4066//    since the last time the API was called (and the first call
4067//    returns 100%), so we'd have to deal with that as well.
4068//
4069// b) Sample the "fake" answer using a sampling thread and store
4070//    the answer in a global variable.  The call to loadavg would
4071//    just return the value of the global, avoiding the slow query.
4072//
4073// c) Sample a better answer using exponential decay to smooth the
4074//    value.  This is basically the algorithm used by UNIX kernels.
4075//
4076// Note that sampling thread starvation could affect both (b) and (c).
4077int os::loadavg(double loadavg[], int nelem) {
4078  return -1;
4079}
4080
4081
4082// DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield()
4083bool os::dont_yield() {
4084  return DontYieldALot;
4085}
4086
4087// This method is a slightly reworked copy of JDK's sysOpen
4088// from src/windows/hpi/src/sys_api_md.c
4089
4090int os::open(const char *path, int oflag, int mode) {
4091  char pathbuf[MAX_PATH];
4092
4093  if (strlen(path) > MAX_PATH - 1) {
4094    errno = ENAMETOOLONG;
4095          return -1;
4096  }
4097  os::native_path(strcpy(pathbuf, path));
4098  return ::open(pathbuf, oflag | O_BINARY | O_NOINHERIT, mode);
4099}
4100
4101// Is a (classpath) directory empty?
4102bool os::dir_is_empty(const char* path) {
4103  WIN32_FIND_DATA fd;
4104  HANDLE f = FindFirstFile(path, &fd);
4105  if (f == INVALID_HANDLE_VALUE) {
4106    return true;
4107  }
4108  FindClose(f);
4109  return false;
4110}
4111
4112// create binary file, rewriting existing file if required
4113int os::create_binary_file(const char* path, bool rewrite_existing) {
4114  int oflags = _O_CREAT | _O_WRONLY | _O_BINARY;
4115  if (!rewrite_existing) {
4116    oflags |= _O_EXCL;
4117  }
4118  return ::open(path, oflags, _S_IREAD | _S_IWRITE);
4119}
4120
4121// return current position of file pointer
4122jlong os::current_file_offset(int fd) {
4123  return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR);
4124}
4125
4126// move file pointer to the specified offset
4127jlong os::seek_to_file_offset(int fd, jlong offset) {
4128  return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET);
4129}
4130
4131
4132jlong os::lseek(int fd, jlong offset, int whence) {
4133  return (jlong) ::_lseeki64(fd, offset, whence);
4134}
4135
4136// This method is a slightly reworked copy of JDK's sysNativePath
4137// from src/windows/hpi/src/path_md.c
4138
4139/* Convert a pathname to native format.  On win32, this involves forcing all
4140   separators to be '\\' rather than '/' (both are legal inputs, but Win95
4141   sometimes rejects '/') and removing redundant separators.  The input path is
4142   assumed to have been converted into the character encoding used by the local
4143   system.  Because this might be a double-byte encoding, care is taken to
4144   treat double-byte lead characters correctly.
4145
4146   This procedure modifies the given path in place, as the result is never
4147   longer than the original.  There is no error return; this operation always
4148   succeeds. */
4149char * os::native_path(char *path) {
4150  char *src = path, *dst = path, *end = path;
4151  char *colon = NULL;           /* If a drive specifier is found, this will
4152                                        point to the colon following the drive
4153                                        letter */
4154
4155  /* Assumption: '/', '\\', ':', and drive letters are never lead bytes */
4156  assert(((!::IsDBCSLeadByte('/'))
4157    && (!::IsDBCSLeadByte('\\'))
4158    && (!::IsDBCSLeadByte(':'))),
4159    "Illegal lead byte");
4160
4161  /* Check for leading separators */
4162#define isfilesep(c) ((c) == '/' || (c) == '\\')
4163  while (isfilesep(*src)) {
4164    src++;
4165  }
4166
4167  if (::isalpha(*src) && !::IsDBCSLeadByte(*src) && src[1] == ':') {
4168    /* Remove leading separators if followed by drive specifier.  This
4169      hack is necessary to support file URLs containing drive
4170      specifiers (e.g., "file://c:/path").  As a side effect,
4171      "/c:/path" can be used as an alternative to "c:/path". */
4172    *dst++ = *src++;
4173    colon = dst;
4174    *dst++ = ':';
4175    src++;
4176  } else {
4177    src = path;
4178    if (isfilesep(src[0]) && isfilesep(src[1])) {
4179      /* UNC pathname: Retain first separator; leave src pointed at
4180         second separator so that further separators will be collapsed
4181         into the second separator.  The result will be a pathname
4182         beginning with "\\\\" followed (most likely) by a host name. */
4183      src = dst = path + 1;
4184      path[0] = '\\';     /* Force first separator to '\\' */
4185    }
4186  }
4187
4188  end = dst;
4189
4190  /* Remove redundant separators from remainder of path, forcing all
4191      separators to be '\\' rather than '/'. Also, single byte space
4192      characters are removed from the end of the path because those
4193      are not legal ending characters on this operating system.
4194  */
4195  while (*src != '\0') {
4196    if (isfilesep(*src)) {
4197      *dst++ = '\\'; src++;
4198      while (isfilesep(*src)) src++;
4199      if (*src == '\0') {
4200        /* Check for trailing separator */
4201        end = dst;
4202        if (colon == dst - 2) break;                      /* "z:\\" */
4203        if (dst == path + 1) break;                       /* "\\" */
4204        if (dst == path + 2 && isfilesep(path[0])) {
4205          /* "\\\\" is not collapsed to "\\" because "\\\\" marks the
4206            beginning of a UNC pathname.  Even though it is not, by
4207            itself, a valid UNC pathname, we leave it as is in order
4208            to be consistent with the path canonicalizer as well
4209            as the win32 APIs, which treat this case as an invalid
4210            UNC pathname rather than as an alias for the root
4211            directory of the current drive. */
4212          break;
4213        }
4214        end = --dst;  /* Path does not denote a root directory, so
4215                                    remove trailing separator */
4216        break;
4217      }
4218      end = dst;
4219    } else {
4220      if (::IsDBCSLeadByte(*src)) { /* Copy a double-byte character */
4221        *dst++ = *src++;
4222        if (*src) *dst++ = *src++;
4223        end = dst;
4224      } else {         /* Copy a single-byte character */
4225        char c = *src++;
4226        *dst++ = c;
4227        /* Space is not a legal ending character */
4228        if (c != ' ') end = dst;
4229      }
4230    }
4231  }
4232
4233  *end = '\0';
4234
4235  /* For "z:", add "." to work around a bug in the C runtime library */
4236  if (colon == dst - 1) {
4237          path[2] = '.';
4238          path[3] = '\0';
4239  }
4240
4241  return path;
4242}
4243
4244// This code is a copy of JDK's sysSetLength
4245// from src/windows/hpi/src/sys_api_md.c
4246
4247int os::ftruncate(int fd, jlong length) {
4248  HANDLE h = (HANDLE)::_get_osfhandle(fd);
4249  long high = (long)(length >> 32);
4250  DWORD ret;
4251
4252  if (h == (HANDLE)(-1)) {
4253    return -1;
4254  }
4255
4256  ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN);
4257  if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) {
4258      return -1;
4259  }
4260
4261  if (::SetEndOfFile(h) == FALSE) {
4262    return -1;
4263  }
4264
4265  return 0;
4266}
4267
4268
4269// This code is a copy of JDK's sysSync
4270// from src/windows/hpi/src/sys_api_md.c
4271// except for the legacy workaround for a bug in Win 98
4272
4273int os::fsync(int fd) {
4274  HANDLE handle = (HANDLE)::_get_osfhandle(fd);
4275
4276  if ( (!::FlushFileBuffers(handle)) &&
4277         (GetLastError() != ERROR_ACCESS_DENIED) ) {
4278    /* from winerror.h */
4279    return -1;
4280  }
4281  return 0;
4282}
4283
4284static int nonSeekAvailable(int, long *);
4285static int stdinAvailable(int, long *);
4286
4287#define S_ISCHR(mode)   (((mode) & _S_IFCHR) == _S_IFCHR)
4288#define S_ISFIFO(mode)  (((mode) & _S_IFIFO) == _S_IFIFO)
4289
4290// This code is a copy of JDK's sysAvailable
4291// from src/windows/hpi/src/sys_api_md.c
4292
4293int os::available(int fd, jlong *bytes) {
4294  jlong cur, end;
4295  struct _stati64 stbuf64;
4296
4297  if (::_fstati64(fd, &stbuf64) >= 0) {
4298    int mode = stbuf64.st_mode;
4299    if (S_ISCHR(mode) || S_ISFIFO(mode)) {
4300      int ret;
4301      long lpbytes;
4302      if (fd == 0) {
4303        ret = stdinAvailable(fd, &lpbytes);
4304      } else {
4305        ret = nonSeekAvailable(fd, &lpbytes);
4306      }
4307      (*bytes) = (jlong)(lpbytes);
4308      return ret;
4309    }
4310    if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) {
4311      return FALSE;
4312    } else if ((end = ::_lseeki64(fd, 0L, SEEK_END)) == -1) {
4313      return FALSE;
4314    } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) {
4315      return FALSE;
4316    }
4317    *bytes = end - cur;
4318    return TRUE;
4319  } else {
4320    return FALSE;
4321  }
4322}
4323
4324// This code is a copy of JDK's nonSeekAvailable
4325// from src/windows/hpi/src/sys_api_md.c
4326
4327static int nonSeekAvailable(int fd, long *pbytes) {
4328  /* This is used for available on non-seekable devices
4329    * (like both named and anonymous pipes, such as pipes
4330    *  connected to an exec'd process).
4331    * Standard Input is a special case.
4332    *
4333    */
4334  HANDLE han;
4335
4336  if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) {
4337    return FALSE;
4338  }
4339
4340  if (! ::PeekNamedPipe(han, NULL, 0, NULL, (LPDWORD)pbytes, NULL)) {
4341        /* PeekNamedPipe fails when at EOF.  In that case we
4342         * simply make *pbytes = 0 which is consistent with the
4343         * behavior we get on Solaris when an fd is at EOF.
4344         * The only alternative is to raise an Exception,
4345         * which isn't really warranted.
4346         */
4347    if (::GetLastError() != ERROR_BROKEN_PIPE) {
4348      return FALSE;
4349    }
4350    *pbytes = 0;
4351  }
4352  return TRUE;
4353}
4354
4355#define MAX_INPUT_EVENTS 2000
4356
4357// This code is a copy of JDK's stdinAvailable
4358// from src/windows/hpi/src/sys_api_md.c
4359
4360static int stdinAvailable(int fd, long *pbytes) {
4361  HANDLE han;
4362  DWORD numEventsRead = 0;      /* Number of events read from buffer */
4363  DWORD numEvents = 0;  /* Number of events in buffer */
4364  DWORD i = 0;          /* Loop index */
4365  DWORD curLength = 0;  /* Position marker */
4366  DWORD actualLength = 0;       /* Number of bytes readable */
4367  BOOL error = FALSE;         /* Error holder */
4368  INPUT_RECORD *lpBuffer;     /* Pointer to records of input events */
4369
4370  if ((han = ::GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) {
4371        return FALSE;
4372  }
4373
4374  /* Construct an array of input records in the console buffer */
4375  error = ::GetNumberOfConsoleInputEvents(han, &numEvents);
4376  if (error == 0) {
4377    return nonSeekAvailable(fd, pbytes);
4378  }
4379
4380  /* lpBuffer must fit into 64K or else PeekConsoleInput fails */
4381  if (numEvents > MAX_INPUT_EVENTS) {
4382    numEvents = MAX_INPUT_EVENTS;
4383  }
4384
4385  lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD), mtInternal);
4386  if (lpBuffer == NULL) {
4387    return FALSE;
4388  }
4389
4390  error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
4391  if (error == 0) {
4392    os::free(lpBuffer, mtInternal);
4393    return FALSE;
4394  }
4395
4396  /* Examine input records for the number of bytes available */
4397  for(i=0; i<numEvents; i++) {
4398    if (lpBuffer[i].EventType == KEY_EVENT) {
4399
4400      KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *)
4401                                      &(lpBuffer[i].Event);
4402      if (keyRecord->bKeyDown == TRUE) {
4403        CHAR *keyPressed = (CHAR *) &(keyRecord->uChar);
4404        curLength++;
4405        if (*keyPressed == '\r') {
4406          actualLength = curLength;
4407        }
4408      }
4409    }
4410  }
4411
4412  if(lpBuffer != NULL) {
4413    os::free(lpBuffer, mtInternal);
4414  }
4415
4416  *pbytes = (long) actualLength;
4417  return TRUE;
4418}
4419
4420// Map a block of memory.
4421char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
4422                     char *addr, size_t bytes, bool read_only,
4423                     bool allow_exec) {
4424  HANDLE hFile;
4425  char* base;
4426
4427  hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
4428                     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
4429  if (hFile == NULL) {
4430    if (PrintMiscellaneous && Verbose) {
4431      DWORD err = GetLastError();
4432      tty->print_cr("CreateFile() failed: GetLastError->%ld.", err);
4433    }
4434    return NULL;
4435  }
4436
4437  if (allow_exec) {
4438    // CreateFileMapping/MapViewOfFileEx can't map executable memory
4439    // unless it comes from a PE image (which the shared archive is not.)
4440    // Even VirtualProtect refuses to give execute access to mapped memory
4441    // that was not previously executable.
4442    //
4443    // Instead, stick the executable region in anonymous memory.  Yuck.
4444    // Penalty is that ~4 pages will not be shareable - in the future
4445    // we might consider DLLizing the shared archive with a proper PE
4446    // header so that mapping executable + sharing is possible.
4447
4448    base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE,
4449                                PAGE_READWRITE);
4450    if (base == NULL) {
4451      if (PrintMiscellaneous && Verbose) {
4452        DWORD err = GetLastError();
4453        tty->print_cr("VirtualAlloc() failed: GetLastError->%ld.", err);
4454      }
4455      CloseHandle(hFile);
4456      return NULL;
4457    }
4458
4459    DWORD bytes_read;
4460    OVERLAPPED overlapped;
4461    overlapped.Offset = (DWORD)file_offset;
4462    overlapped.OffsetHigh = 0;
4463    overlapped.hEvent = NULL;
4464    // ReadFile guarantees that if the return value is true, the requested
4465    // number of bytes were read before returning.
4466    bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0;
4467    if (!res) {
4468      if (PrintMiscellaneous && Verbose) {
4469        DWORD err = GetLastError();
4470        tty->print_cr("ReadFile() failed: GetLastError->%ld.", err);
4471      }
4472      release_memory(base, bytes);
4473      CloseHandle(hFile);
4474      return NULL;
4475    }
4476  } else {
4477    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0,
4478                                    NULL /*file_name*/);
4479    if (hMap == NULL) {
4480      if (PrintMiscellaneous && Verbose) {
4481        DWORD err = GetLastError();
4482        tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.", err);
4483      }
4484      CloseHandle(hFile);
4485      return NULL;
4486    }
4487
4488    DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY;
4489    base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset,
4490                                  (DWORD)bytes, addr);
4491    if (base == NULL) {
4492      if (PrintMiscellaneous && Verbose) {
4493        DWORD err = GetLastError();
4494        tty->print_cr("MapViewOfFileEx() failed: GetLastError->%ld.", err);
4495      }
4496      CloseHandle(hMap);
4497      CloseHandle(hFile);
4498      return NULL;
4499    }
4500
4501    if (CloseHandle(hMap) == 0) {
4502      if (PrintMiscellaneous && Verbose) {
4503        DWORD err = GetLastError();
4504        tty->print_cr("CloseHandle(hMap) failed: GetLastError->%ld.", err);
4505      }
4506      CloseHandle(hFile);
4507      return base;
4508    }
4509  }
4510
4511  if (allow_exec) {
4512    DWORD old_protect;
4513    DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE;
4514    bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0;
4515
4516    if (!res) {
4517      if (PrintMiscellaneous && Verbose) {
4518        DWORD err = GetLastError();
4519        tty->print_cr("VirtualProtect() failed: GetLastError->%ld.", err);
4520      }
4521      // Don't consider this a hard error, on IA32 even if the
4522      // VirtualProtect fails, we should still be able to execute
4523      CloseHandle(hFile);
4524      return base;
4525    }
4526  }
4527
4528  if (CloseHandle(hFile) == 0) {
4529    if (PrintMiscellaneous && Verbose) {
4530      DWORD err = GetLastError();
4531      tty->print_cr("CloseHandle(hFile) failed: GetLastError->%ld.", err);
4532    }
4533    return base;
4534  }
4535
4536  return base;
4537}
4538
4539
4540// Remap a block of memory.
4541char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset,
4542                       char *addr, size_t bytes, bool read_only,
4543                       bool allow_exec) {
4544  // This OS does not allow existing memory maps to be remapped so we
4545  // have to unmap the memory before we remap it.
4546  if (!os::unmap_memory(addr, bytes)) {
4547    return NULL;
4548  }
4549
4550  // There is a very small theoretical window between the unmap_memory()
4551  // call above and the map_memory() call below where a thread in native
4552  // code may be able to access an address that is no longer mapped.
4553
4554  return os::map_memory(fd, file_name, file_offset, addr, bytes,
4555           read_only, allow_exec);
4556}
4557
4558
4559// Unmap a block of memory.
4560// Returns true=success, otherwise false.
4561
4562bool os::pd_unmap_memory(char* addr, size_t bytes) {
4563  BOOL result = UnmapViewOfFile(addr);
4564  if (result == 0) {
4565    if (PrintMiscellaneous && Verbose) {
4566      DWORD err = GetLastError();
4567      tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err);
4568    }
4569    return false;
4570  }
4571  return true;
4572}
4573
4574void os::pause() {
4575  char filename[MAX_PATH];
4576  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4577    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
4578  } else {
4579    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4580  }
4581
4582  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4583  if (fd != -1) {
4584    struct stat buf;
4585    ::close(fd);
4586    while (::stat(filename, &buf) == 0) {
4587      Sleep(100);
4588    }
4589  } else {
4590    jio_fprintf(stderr,
4591      "Could not open pause file '%s', continuing immediately.\n", filename);
4592  }
4593}
4594
4595// An Event wraps a win32 "CreateEvent" kernel handle.
4596//
4597// We have a number of choices regarding "CreateEvent" win32 handle leakage:
4598//
4599// 1:  When a thread dies return the Event to the EventFreeList, clear the ParkHandle
4600//     field, and call CloseHandle() on the win32 event handle.  Unpark() would
4601//     need to be modified to tolerate finding a NULL (invalid) win32 event handle.
4602//     In addition, an unpark() operation might fetch the handle field, but the
4603//     event could recycle between the fetch and the SetEvent() operation.
4604//     SetEvent() would either fail because the handle was invalid, or inadvertently work,
4605//     as the win32 handle value had been recycled.  In an ideal world calling SetEvent()
4606//     on an stale but recycled handle would be harmless, but in practice this might
4607//     confuse other non-Sun code, so it's not a viable approach.
4608//
4609// 2:  Once a win32 event handle is associated with an Event, it remains associated
4610//     with the Event.  The event handle is never closed.  This could be construed
4611//     as handle leakage, but only up to the maximum # of threads that have been extant
4612//     at any one time.  This shouldn't be an issue, as windows platforms typically
4613//     permit a process to have hundreds of thousands of open handles.
4614//
4615// 3:  Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList
4616//     and release unused handles.
4617//
4618// 4:  Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle.
4619//     It's not clear, however, that we wouldn't be trading one type of leak for another.
4620//
4621// 5.  Use an RCU-like mechanism (Read-Copy Update).
4622//     Or perhaps something similar to Maged Michael's "Hazard pointers".
4623//
4624// We use (2).
4625//
4626// TODO-FIXME:
4627// 1.  Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation.
4628// 2.  Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks
4629//     to recover from (or at least detect) the dreaded Windows 841176 bug.
4630// 3.  Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent
4631//     into a single win32 CreateEvent() handle.
4632//
4633// _Event transitions in park()
4634//   -1 => -1 : illegal
4635//    1 =>  0 : pass - return immediately
4636//    0 => -1 : block
4637//
4638// _Event serves as a restricted-range semaphore :
4639//    -1 : thread is blocked
4640//     0 : neutral  - thread is running or ready
4641//     1 : signaled - thread is running or ready
4642//
4643// Another possible encoding of _Event would be
4644// with explicit "PARKED" and "SIGNALED" bits.
4645
4646int os::PlatformEvent::park (jlong Millis) {
4647    guarantee (_ParkHandle != NULL , "Invariant") ;
4648    guarantee (Millis > 0          , "Invariant") ;
4649    int v ;
4650
4651    // CONSIDER: defer assigning a CreateEvent() handle to the Event until
4652    // the initial park() operation.
4653
4654    for (;;) {
4655        v = _Event ;
4656        if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
4657    }
4658    guarantee ((v == 0) || (v == 1), "invariant") ;
4659    if (v != 0) return OS_OK ;
4660
4661    // Do this the hard way by blocking ...
4662    // TODO: consider a brief spin here, gated on the success of recent
4663    // spin attempts by this thread.
4664    //
4665    // We decompose long timeouts into series of shorter timed waits.
4666    // Evidently large timo values passed in WaitForSingleObject() are problematic on some
4667    // versions of Windows.  See EventWait() for details.  This may be superstition.  Or not.
4668    // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time
4669    // with os::javaTimeNanos().  Furthermore, we assume that spurious returns from
4670    // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend
4671    // to happen early in the wait interval.  Specifically, after a spurious wakeup (rv ==
4672    // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate
4673    // for the already waited time.  This policy does not admit any new outcomes.
4674    // In the future, however, we might want to track the accumulated wait time and
4675    // adjust Millis accordingly if we encounter a spurious wakeup.
4676
4677    const int MAXTIMEOUT = 0x10000000 ;
4678    DWORD rv = WAIT_TIMEOUT ;
4679    while (_Event < 0 && Millis > 0) {
4680       DWORD prd = Millis ;     // set prd = MAX (Millis, MAXTIMEOUT)
4681       if (Millis > MAXTIMEOUT) {
4682          prd = MAXTIMEOUT ;
4683       }
4684       rv = ::WaitForSingleObject (_ParkHandle, prd) ;
4685       assert (rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed") ;
4686       if (rv == WAIT_TIMEOUT) {
4687           Millis -= prd ;
4688       }
4689    }
4690    v = _Event ;
4691    _Event = 0 ;
4692    // see comment at end of os::PlatformEvent::park() below:
4693    OrderAccess::fence() ;
4694    // If we encounter a nearly simultanous timeout expiry and unpark()
4695    // we return OS_OK indicating we awoke via unpark().
4696    // Implementor's license -- returning OS_TIMEOUT would be equally valid, however.
4697    return (v >= 0) ? OS_OK : OS_TIMEOUT ;
4698}
4699
4700void os::PlatformEvent::park () {
4701    guarantee (_ParkHandle != NULL, "Invariant") ;
4702    // Invariant: Only the thread associated with the Event/PlatformEvent
4703    // may call park().
4704    int v ;
4705    for (;;) {
4706        v = _Event ;
4707        if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
4708    }
4709    guarantee ((v == 0) || (v == 1), "invariant") ;
4710    if (v != 0) return ;
4711
4712    // Do this the hard way by blocking ...
4713    // TODO: consider a brief spin here, gated on the success of recent
4714    // spin attempts by this thread.
4715    while (_Event < 0) {
4716       DWORD rv = ::WaitForSingleObject (_ParkHandle, INFINITE) ;
4717       assert (rv == WAIT_OBJECT_0, "WaitForSingleObject failed") ;
4718    }
4719
4720    // Usually we'll find _Event == 0 at this point, but as
4721    // an optional optimization we clear it, just in case can
4722    // multiple unpark() operations drove _Event up to 1.
4723    _Event = 0 ;
4724    OrderAccess::fence() ;
4725    guarantee (_Event >= 0, "invariant") ;
4726}
4727
4728void os::PlatformEvent::unpark() {
4729  guarantee (_ParkHandle != NULL, "Invariant") ;
4730
4731  // Transitions for _Event:
4732  //    0 :=> 1
4733  //    1 :=> 1
4734  //   -1 :=> either 0 or 1; must signal target thread
4735  //          That is, we can safely transition _Event from -1 to either
4736  //          0 or 1. Forcing 1 is slightly more efficient for back-to-back
4737  //          unpark() calls.
4738  // See also: "Semaphores in Plan 9" by Mullender & Cox
4739  //
4740  // Note: Forcing a transition from "-1" to "1" on an unpark() means
4741  // that it will take two back-to-back park() calls for the owning
4742  // thread to block. This has the benefit of forcing a spurious return
4743  // from the first park() call after an unpark() call which will help
4744  // shake out uses of park() and unpark() without condition variables.
4745
4746  if (Atomic::xchg(1, &_Event) >= 0) return;
4747
4748  ::SetEvent(_ParkHandle);
4749}
4750
4751
4752// JSR166
4753// -------------------------------------------------------
4754
4755/*
4756 * The Windows implementation of Park is very straightforward: Basic
4757 * operations on Win32 Events turn out to have the right semantics to
4758 * use them directly. We opportunistically resuse the event inherited
4759 * from Monitor.
4760 */
4761
4762
4763void Parker::park(bool isAbsolute, jlong time) {
4764  guarantee (_ParkEvent != NULL, "invariant") ;
4765  // First, demultiplex/decode time arguments
4766  if (time < 0) { // don't wait
4767    return;
4768  }
4769  else if (time == 0 && !isAbsolute) {
4770    time = INFINITE;
4771  }
4772  else if  (isAbsolute) {
4773    time -= os::javaTimeMillis(); // convert to relative time
4774    if (time <= 0) // already elapsed
4775      return;
4776  }
4777  else { // relative
4778    time /= 1000000; // Must coarsen from nanos to millis
4779    if (time == 0)   // Wait for the minimal time unit if zero
4780      time = 1;
4781  }
4782
4783  JavaThread* thread = (JavaThread*)(Thread::current());
4784  assert(thread->is_Java_thread(), "Must be JavaThread");
4785  JavaThread *jt = (JavaThread *)thread;
4786
4787  // Don't wait if interrupted or already triggered
4788  if (Thread::is_interrupted(thread, false) ||
4789    WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) {
4790    ResetEvent(_ParkEvent);
4791    return;
4792  }
4793  else {
4794    ThreadBlockInVM tbivm(jt);
4795    OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
4796    jt->set_suspend_equivalent();
4797
4798    WaitForSingleObject(_ParkEvent,  time);
4799    ResetEvent(_ParkEvent);
4800
4801    // If externally suspended while waiting, re-suspend
4802    if (jt->handle_special_suspend_equivalent_condition()) {
4803      jt->java_suspend_self();
4804    }
4805  }
4806}
4807
4808void Parker::unpark() {
4809  guarantee (_ParkEvent != NULL, "invariant") ;
4810  SetEvent(_ParkEvent);
4811}
4812
4813// Run the specified command in a separate process. Return its exit value,
4814// or -1 on failure (e.g. can't create a new process).
4815int os::fork_and_exec(char* cmd) {
4816  STARTUPINFO si;
4817  PROCESS_INFORMATION pi;
4818
4819  memset(&si, 0, sizeof(si));
4820  si.cb = sizeof(si);
4821  memset(&pi, 0, sizeof(pi));
4822  BOOL rslt = CreateProcess(NULL,   // executable name - use command line
4823                            cmd,    // command line
4824                            NULL,   // process security attribute
4825                            NULL,   // thread security attribute
4826                            TRUE,   // inherits system handles
4827                            0,      // no creation flags
4828                            NULL,   // use parent's environment block
4829                            NULL,   // use parent's starting directory
4830                            &si,    // (in) startup information
4831                            &pi);   // (out) process information
4832
4833  if (rslt) {
4834    // Wait until child process exits.
4835    WaitForSingleObject(pi.hProcess, INFINITE);
4836
4837    DWORD exit_code;
4838    GetExitCodeProcess(pi.hProcess, &exit_code);
4839
4840    // Close process and thread handles.
4841    CloseHandle(pi.hProcess);
4842    CloseHandle(pi.hThread);
4843
4844    return (int)exit_code;
4845  } else {
4846    return -1;
4847  }
4848}
4849
4850//--------------------------------------------------------------------------------------------------
4851// Non-product code
4852
4853static int mallocDebugIntervalCounter = 0;
4854static int mallocDebugCounter = 0;
4855bool os::check_heap(bool force) {
4856  if (++mallocDebugCounter < MallocVerifyStart && !force) return true;
4857  if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) {
4858    // Note: HeapValidate executes two hardware breakpoints when it finds something
4859    // wrong; at these points, eax contains the address of the offending block (I think).
4860    // To get to the exlicit error message(s) below, just continue twice.
4861    HANDLE heap = GetProcessHeap();
4862    { HeapLock(heap);
4863      PROCESS_HEAP_ENTRY phe;
4864      phe.lpData = NULL;
4865      while (HeapWalk(heap, &phe) != 0) {
4866        if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) &&
4867            !HeapValidate(heap, 0, phe.lpData)) {
4868          tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter);
4869          tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData);
4870          fatal("corrupted C heap");
4871        }
4872      }
4873      DWORD err = GetLastError();
4874      if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) {
4875        fatal(err_msg("heap walk aborted with error %d", err));
4876      }
4877      HeapUnlock(heap);
4878    }
4879    mallocDebugIntervalCounter = 0;
4880  }
4881  return true;
4882}
4883
4884
4885bool os::find(address addr, outputStream* st) {
4886  // Nothing yet
4887  return false;
4888}
4889
4890LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) {
4891  DWORD exception_code = e->ExceptionRecord->ExceptionCode;
4892
4893  if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
4894    JavaThread* thread = (JavaThread*)ThreadLocalStorage::get_thread_slow();
4895    PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord;
4896    address addr = (address) exceptionRecord->ExceptionInformation[1];
4897
4898    if (os::is_memory_serialize_page(thread, addr))
4899      return EXCEPTION_CONTINUE_EXECUTION;
4900  }
4901
4902  return EXCEPTION_CONTINUE_SEARCH;
4903}
4904
4905// We don't build a headless jre for Windows
4906bool os::is_headless_jre() { return false; }
4907
4908static jint initSock() {
4909  WSADATA wsadata;
4910
4911  if (!os::WinSock2Dll::WinSock2Available()) {
4912    jio_fprintf(stderr, "Could not load Winsock (error: %d)\n",
4913      ::GetLastError());
4914    return JNI_ERR;
4915  }
4916
4917  if (os::WinSock2Dll::WSAStartup(MAKEWORD(2,2), &wsadata) != 0) {
4918    jio_fprintf(stderr, "Could not initialize Winsock (error: %d)\n",
4919      ::GetLastError());
4920    return JNI_ERR;
4921  }
4922  return JNI_OK;
4923}
4924
4925struct hostent* os::get_host_by_name(char* name) {
4926  return (struct hostent*)os::WinSock2Dll::gethostbyname(name);
4927}
4928
4929int os::socket_close(int fd) {
4930  return ::closesocket(fd);
4931}
4932
4933int os::socket_available(int fd, jint *pbytes) {
4934  int ret = ::ioctlsocket(fd, FIONREAD, (u_long*)pbytes);
4935  return (ret < 0) ? 0 : 1;
4936}
4937
4938int os::socket(int domain, int type, int protocol) {
4939  return ::socket(domain, type, protocol);
4940}
4941
4942int os::listen(int fd, int count) {
4943  return ::listen(fd, count);
4944}
4945
4946int os::connect(int fd, struct sockaddr* him, socklen_t len) {
4947  return ::connect(fd, him, len);
4948}
4949
4950int os::accept(int fd, struct sockaddr* him, socklen_t* len) {
4951  return ::accept(fd, him, len);
4952}
4953
4954int os::sendto(int fd, char* buf, size_t len, uint flags,
4955               struct sockaddr* to, socklen_t tolen) {
4956
4957  return ::sendto(fd, buf, (int)len, flags, to, tolen);
4958}
4959
4960int os::recvfrom(int fd, char *buf, size_t nBytes, uint flags,
4961                 sockaddr* from, socklen_t* fromlen) {
4962
4963  return ::recvfrom(fd, buf, (int)nBytes, flags, from, fromlen);
4964}
4965
4966int os::recv(int fd, char* buf, size_t nBytes, uint flags) {
4967  return ::recv(fd, buf, (int)nBytes, flags);
4968}
4969
4970int os::send(int fd, char* buf, size_t nBytes, uint flags) {
4971  return ::send(fd, buf, (int)nBytes, flags);
4972}
4973
4974int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) {
4975  return ::send(fd, buf, (int)nBytes, flags);
4976}
4977
4978int os::timeout(int fd, long timeout) {
4979  fd_set tbl;
4980  struct timeval t;
4981
4982  t.tv_sec  = timeout / 1000;
4983  t.tv_usec = (timeout % 1000) * 1000;
4984
4985  tbl.fd_count    = 1;
4986  tbl.fd_array[0] = fd;
4987
4988  return ::select(1, &tbl, 0, 0, &t);
4989}
4990
4991int os::get_host_name(char* name, int namelen) {
4992  return ::gethostname(name, namelen);
4993}
4994
4995int os::socket_shutdown(int fd, int howto) {
4996  return ::shutdown(fd, howto);
4997}
4998
4999int os::bind(int fd, struct sockaddr* him, socklen_t len) {
5000  return ::bind(fd, him, len);
5001}
5002
5003int os::get_sock_name(int fd, struct sockaddr* him, socklen_t* len) {
5004  return ::getsockname(fd, him, len);
5005}
5006
5007int os::get_sock_opt(int fd, int level, int optname,
5008                     char* optval, socklen_t* optlen) {
5009  return ::getsockopt(fd, level, optname, optval, optlen);
5010}
5011
5012int os::set_sock_opt(int fd, int level, int optname,
5013                     const char* optval, socklen_t optlen) {
5014  return ::setsockopt(fd, level, optname, optval, optlen);
5015}
5016
5017
5018// Kernel32 API
5019typedef SIZE_T (WINAPI* GetLargePageMinimum_Fn)(void);
5020typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
5021typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG);
5022typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG);
5023typedef USHORT (WINAPI* RtlCaptureStackBackTrace_Fn)(ULONG, ULONG, PVOID*, PULONG);
5024
5025GetLargePageMinimum_Fn      os::Kernel32Dll::_GetLargePageMinimum = NULL;
5026VirtualAllocExNuma_Fn       os::Kernel32Dll::_VirtualAllocExNuma = NULL;
5027GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL;
5028GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL;
5029RtlCaptureStackBackTrace_Fn os::Kernel32Dll::_RtlCaptureStackBackTrace = NULL;
5030
5031
5032BOOL                        os::Kernel32Dll::initialized = FALSE;
5033SIZE_T os::Kernel32Dll::GetLargePageMinimum() {
5034  assert(initialized && _GetLargePageMinimum != NULL,
5035    "GetLargePageMinimumAvailable() not yet called");
5036  return _GetLargePageMinimum();
5037}
5038
5039BOOL os::Kernel32Dll::GetLargePageMinimumAvailable() {
5040  if (!initialized) {
5041    initialize();
5042  }
5043  return _GetLargePageMinimum != NULL;
5044}
5045
5046BOOL os::Kernel32Dll::NumaCallsAvailable() {
5047  if (!initialized) {
5048    initialize();
5049  }
5050  return _VirtualAllocExNuma != NULL;
5051}
5052
5053LPVOID os::Kernel32Dll::VirtualAllocExNuma(HANDLE hProc, LPVOID addr, SIZE_T bytes, DWORD flags, DWORD prot, DWORD node) {
5054  assert(initialized && _VirtualAllocExNuma != NULL,
5055    "NUMACallsAvailable() not yet called");
5056
5057  return _VirtualAllocExNuma(hProc, addr, bytes, flags, prot, node);
5058}
5059
5060BOOL os::Kernel32Dll::GetNumaHighestNodeNumber(PULONG ptr_highest_node_number) {
5061  assert(initialized && _GetNumaHighestNodeNumber != NULL,
5062    "NUMACallsAvailable() not yet called");
5063
5064  return _GetNumaHighestNodeNumber(ptr_highest_node_number);
5065}
5066
5067BOOL os::Kernel32Dll::GetNumaNodeProcessorMask(UCHAR node, PULONGLONG proc_mask) {
5068  assert(initialized && _GetNumaNodeProcessorMask != NULL,
5069    "NUMACallsAvailable() not yet called");
5070
5071  return _GetNumaNodeProcessorMask(node, proc_mask);
5072}
5073
5074USHORT os::Kernel32Dll::RtlCaptureStackBackTrace(ULONG FrameToSkip,
5075  ULONG FrameToCapture, PVOID* BackTrace, PULONG BackTraceHash) {
5076    if (!initialized) {
5077      initialize();
5078    }
5079
5080    if (_RtlCaptureStackBackTrace != NULL) {
5081      return _RtlCaptureStackBackTrace(FrameToSkip, FrameToCapture,
5082        BackTrace, BackTraceHash);
5083    } else {
5084      return 0;
5085    }
5086}
5087
5088void os::Kernel32Dll::initializeCommon() {
5089  if (!initialized) {
5090    HMODULE handle = ::GetModuleHandle("Kernel32.dll");
5091    assert(handle != NULL, "Just check");
5092    _GetLargePageMinimum = (GetLargePageMinimum_Fn)::GetProcAddress(handle, "GetLargePageMinimum");
5093    _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma");
5094    _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber");
5095    _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask");
5096    _RtlCaptureStackBackTrace = (RtlCaptureStackBackTrace_Fn)::GetProcAddress(handle, "RtlCaptureStackBackTrace");
5097    initialized = TRUE;
5098  }
5099}
5100
5101
5102
5103#ifndef JDK6_OR_EARLIER
5104
5105void os::Kernel32Dll::initialize() {
5106  initializeCommon();
5107}
5108
5109
5110// Kernel32 API
5111inline BOOL os::Kernel32Dll::SwitchToThread() {
5112  return ::SwitchToThread();
5113}
5114
5115inline BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
5116  return true;
5117}
5118
5119  // Help tools
5120inline BOOL os::Kernel32Dll::HelpToolsAvailable() {
5121  return true;
5122}
5123
5124inline HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
5125  return ::CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
5126}
5127
5128inline BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5129  return ::Module32First(hSnapshot, lpme);
5130}
5131
5132inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5133  return ::Module32Next(hSnapshot, lpme);
5134}
5135
5136
5137inline BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
5138  return true;
5139}
5140
5141inline void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
5142  ::GetNativeSystemInfo(lpSystemInfo);
5143}
5144
5145// PSAPI API
5146inline BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
5147  return ::EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
5148}
5149
5150inline DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
5151  return ::GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
5152}
5153
5154inline BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
5155  return ::GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
5156}
5157
5158inline BOOL os::PSApiDll::PSApiAvailable() {
5159  return true;
5160}
5161
5162
5163// WinSock2 API
5164inline BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
5165  return ::WSAStartup(wVersionRequested, lpWSAData);
5166}
5167
5168inline struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
5169  return ::gethostbyname(name);
5170}
5171
5172inline BOOL os::WinSock2Dll::WinSock2Available() {
5173  return true;
5174}
5175
5176// Advapi API
5177inline BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
5178   BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
5179   PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
5180     return ::AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
5181       BufferLength, PreviousState, ReturnLength);
5182}
5183
5184inline BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
5185  PHANDLE TokenHandle) {
5186    return ::OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
5187}
5188
5189inline BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
5190  return ::LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
5191}
5192
5193inline BOOL os::Advapi32Dll::AdvapiAvailable() {
5194  return true;
5195}
5196
5197#else
5198// Kernel32 API
5199typedef BOOL (WINAPI* SwitchToThread_Fn)(void);
5200typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD);
5201typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32);
5202typedef BOOL (WINAPI* Module32Next_Fn)(HANDLE,LPMODULEENTRY32);
5203typedef void (WINAPI* GetNativeSystemInfo_Fn)(LPSYSTEM_INFO);
5204
5205SwitchToThread_Fn           os::Kernel32Dll::_SwitchToThread = NULL;
5206CreateToolhelp32Snapshot_Fn os::Kernel32Dll::_CreateToolhelp32Snapshot = NULL;
5207Module32First_Fn            os::Kernel32Dll::_Module32First = NULL;
5208Module32Next_Fn             os::Kernel32Dll::_Module32Next = NULL;
5209GetNativeSystemInfo_Fn      os::Kernel32Dll::_GetNativeSystemInfo = NULL;
5210
5211void os::Kernel32Dll::initialize() {
5212  if (!initialized) {
5213    HMODULE handle = ::GetModuleHandle("Kernel32.dll");
5214    assert(handle != NULL, "Just check");
5215
5216    _SwitchToThread = (SwitchToThread_Fn)::GetProcAddress(handle, "SwitchToThread");
5217    _CreateToolhelp32Snapshot = (CreateToolhelp32Snapshot_Fn)
5218      ::GetProcAddress(handle, "CreateToolhelp32Snapshot");
5219    _Module32First = (Module32First_Fn)::GetProcAddress(handle, "Module32First");
5220    _Module32Next = (Module32Next_Fn)::GetProcAddress(handle, "Module32Next");
5221    _GetNativeSystemInfo = (GetNativeSystemInfo_Fn)::GetProcAddress(handle, "GetNativeSystemInfo");
5222    initializeCommon();  // resolve the functions that always need resolving
5223
5224    initialized = TRUE;
5225  }
5226}
5227
5228BOOL os::Kernel32Dll::SwitchToThread() {
5229  assert(initialized && _SwitchToThread != NULL,
5230    "SwitchToThreadAvailable() not yet called");
5231  return _SwitchToThread();
5232}
5233
5234
5235BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
5236  if (!initialized) {
5237    initialize();
5238  }
5239  return _SwitchToThread != NULL;
5240}
5241
5242// Help tools
5243BOOL os::Kernel32Dll::HelpToolsAvailable() {
5244  if (!initialized) {
5245    initialize();
5246  }
5247  return _CreateToolhelp32Snapshot != NULL &&
5248         _Module32First != NULL &&
5249         _Module32Next != NULL;
5250}
5251
5252HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
5253  assert(initialized && _CreateToolhelp32Snapshot != NULL,
5254    "HelpToolsAvailable() not yet called");
5255
5256  return _CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
5257}
5258
5259BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5260  assert(initialized && _Module32First != NULL,
5261    "HelpToolsAvailable() not yet called");
5262
5263  return _Module32First(hSnapshot, lpme);
5264}
5265
5266inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5267  assert(initialized && _Module32Next != NULL,
5268    "HelpToolsAvailable() not yet called");
5269
5270  return _Module32Next(hSnapshot, lpme);
5271}
5272
5273
5274BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
5275  if (!initialized) {
5276    initialize();
5277  }
5278  return _GetNativeSystemInfo != NULL;
5279}
5280
5281void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
5282  assert(initialized && _GetNativeSystemInfo != NULL,
5283    "GetNativeSystemInfoAvailable() not yet called");
5284
5285  _GetNativeSystemInfo(lpSystemInfo);
5286}
5287
5288// PSAPI API
5289
5290
5291typedef BOOL (WINAPI *EnumProcessModules_Fn)(HANDLE, HMODULE *, DWORD, LPDWORD);
5292typedef BOOL (WINAPI *GetModuleFileNameEx_Fn)(HANDLE, HMODULE, LPTSTR, DWORD);;
5293typedef BOOL (WINAPI *GetModuleInformation_Fn)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
5294
5295EnumProcessModules_Fn   os::PSApiDll::_EnumProcessModules = NULL;
5296GetModuleFileNameEx_Fn  os::PSApiDll::_GetModuleFileNameEx = NULL;
5297GetModuleInformation_Fn os::PSApiDll::_GetModuleInformation = NULL;
5298BOOL                    os::PSApiDll::initialized = FALSE;
5299
5300void os::PSApiDll::initialize() {
5301  if (!initialized) {
5302    HMODULE handle = os::win32::load_Windows_dll("PSAPI.DLL", NULL, 0);
5303    if (handle != NULL) {
5304      _EnumProcessModules = (EnumProcessModules_Fn)::GetProcAddress(handle,
5305        "EnumProcessModules");
5306      _GetModuleFileNameEx = (GetModuleFileNameEx_Fn)::GetProcAddress(handle,
5307        "GetModuleFileNameExA");
5308      _GetModuleInformation = (GetModuleInformation_Fn)::GetProcAddress(handle,
5309        "GetModuleInformation");
5310    }
5311    initialized = TRUE;
5312  }
5313}
5314
5315
5316
5317BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
5318  assert(initialized && _EnumProcessModules != NULL,
5319    "PSApiAvailable() not yet called");
5320  return _EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
5321}
5322
5323DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
5324  assert(initialized && _GetModuleFileNameEx != NULL,
5325    "PSApiAvailable() not yet called");
5326  return _GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
5327}
5328
5329BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
5330  assert(initialized && _GetModuleInformation != NULL,
5331    "PSApiAvailable() not yet called");
5332  return _GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
5333}
5334
5335BOOL os::PSApiDll::PSApiAvailable() {
5336  if (!initialized) {
5337    initialize();
5338  }
5339  return _EnumProcessModules != NULL &&
5340    _GetModuleFileNameEx != NULL &&
5341    _GetModuleInformation != NULL;
5342}
5343
5344
5345// WinSock2 API
5346typedef int (PASCAL FAR* WSAStartup_Fn)(WORD, LPWSADATA);
5347typedef struct hostent *(PASCAL FAR *gethostbyname_Fn)(...);
5348
5349WSAStartup_Fn    os::WinSock2Dll::_WSAStartup = NULL;
5350gethostbyname_Fn os::WinSock2Dll::_gethostbyname = NULL;
5351BOOL             os::WinSock2Dll::initialized = FALSE;
5352
5353void os::WinSock2Dll::initialize() {
5354  if (!initialized) {
5355    HMODULE handle = os::win32::load_Windows_dll("ws2_32.dll", NULL, 0);
5356    if (handle != NULL) {
5357      _WSAStartup = (WSAStartup_Fn)::GetProcAddress(handle, "WSAStartup");
5358      _gethostbyname = (gethostbyname_Fn)::GetProcAddress(handle, "gethostbyname");
5359    }
5360    initialized = TRUE;
5361  }
5362}
5363
5364
5365BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
5366  assert(initialized && _WSAStartup != NULL,
5367    "WinSock2Available() not yet called");
5368  return _WSAStartup(wVersionRequested, lpWSAData);
5369}
5370
5371struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
5372  assert(initialized && _gethostbyname != NULL,
5373    "WinSock2Available() not yet called");
5374  return _gethostbyname(name);
5375}
5376
5377BOOL os::WinSock2Dll::WinSock2Available() {
5378  if (!initialized) {
5379    initialize();
5380  }
5381  return _WSAStartup != NULL &&
5382    _gethostbyname != NULL;
5383}
5384
5385typedef BOOL (WINAPI *AdjustTokenPrivileges_Fn)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
5386typedef BOOL (WINAPI *OpenProcessToken_Fn)(HANDLE, DWORD, PHANDLE);
5387typedef BOOL (WINAPI *LookupPrivilegeValue_Fn)(LPCTSTR, LPCTSTR, PLUID);
5388
5389AdjustTokenPrivileges_Fn os::Advapi32Dll::_AdjustTokenPrivileges = NULL;
5390OpenProcessToken_Fn      os::Advapi32Dll::_OpenProcessToken = NULL;
5391LookupPrivilegeValue_Fn  os::Advapi32Dll::_LookupPrivilegeValue = NULL;
5392BOOL                     os::Advapi32Dll::initialized = FALSE;
5393
5394void os::Advapi32Dll::initialize() {
5395  if (!initialized) {
5396    HMODULE handle = os::win32::load_Windows_dll("advapi32.dll", NULL, 0);
5397    if (handle != NULL) {
5398      _AdjustTokenPrivileges = (AdjustTokenPrivileges_Fn)::GetProcAddress(handle,
5399        "AdjustTokenPrivileges");
5400      _OpenProcessToken = (OpenProcessToken_Fn)::GetProcAddress(handle,
5401        "OpenProcessToken");
5402      _LookupPrivilegeValue = (LookupPrivilegeValue_Fn)::GetProcAddress(handle,
5403        "LookupPrivilegeValueA");
5404    }
5405    initialized = TRUE;
5406  }
5407}
5408
5409BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
5410   BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
5411   PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
5412   assert(initialized && _AdjustTokenPrivileges != NULL,
5413     "AdvapiAvailable() not yet called");
5414   return _AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
5415       BufferLength, PreviousState, ReturnLength);
5416}
5417
5418BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
5419  PHANDLE TokenHandle) {
5420   assert(initialized && _OpenProcessToken != NULL,
5421     "AdvapiAvailable() not yet called");
5422    return _OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
5423}
5424
5425BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
5426   assert(initialized && _LookupPrivilegeValue != NULL,
5427     "AdvapiAvailable() not yet called");
5428  return _LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
5429}
5430
5431BOOL os::Advapi32Dll::AdvapiAvailable() {
5432  if (!initialized) {
5433    initialize();
5434  }
5435  return _AdjustTokenPrivileges != NULL &&
5436    _OpenProcessToken != NULL &&
5437    _LookupPrivilegeValue != NULL;
5438}
5439
5440#endif
5441