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