os_windows.cpp revision 3394:de909f001528
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_brief(outputStream* st) {
1566  os::print_os_info(st);
1567}
1568
1569void os::print_os_info(outputStream* st) {
1570  st->print("OS:");
1571
1572  os::win32::print_windows_version(st);
1573}
1574
1575void os::win32::print_windows_version(outputStream* st) {
1576  OSVERSIONINFOEX osvi;
1577  ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
1578  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1579
1580  if (!GetVersionEx((OSVERSIONINFO *)&osvi)) {
1581    st->print_cr("N/A");
1582    return;
1583  }
1584
1585  int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion;
1586  if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
1587    switch (os_vers) {
1588    case 3051: st->print(" Windows NT 3.51"); break;
1589    case 4000: st->print(" Windows NT 4.0"); break;
1590    case 5000: st->print(" Windows 2000"); break;
1591    case 5001: st->print(" Windows XP"); break;
1592    case 5002:
1593    case 6000:
1594    case 6001:
1595    case 6002: {
1596      // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
1597      // find out whether we are running on 64 bit processor or not.
1598      SYSTEM_INFO si;
1599      ZeroMemory(&si, sizeof(SYSTEM_INFO));
1600        if (!os::Kernel32Dll::GetNativeSystemInfoAvailable()){
1601          GetSystemInfo(&si);
1602      } else {
1603        os::Kernel32Dll::GetNativeSystemInfo(&si);
1604      }
1605      if (os_vers == 5002) {
1606        if (osvi.wProductType == VER_NT_WORKSTATION &&
1607            si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1608          st->print(" Windows XP x64 Edition");
1609        else
1610            st->print(" Windows Server 2003 family");
1611      } else if (os_vers == 6000) {
1612        if (osvi.wProductType == VER_NT_WORKSTATION)
1613            st->print(" Windows Vista");
1614        else
1615            st->print(" Windows Server 2008");
1616        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1617            st->print(" , 64 bit");
1618      } else if (os_vers == 6001) {
1619        if (osvi.wProductType == VER_NT_WORKSTATION) {
1620            st->print(" Windows 7");
1621        } else {
1622            // Unrecognized windows, print out its major and minor versions
1623            st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1624        }
1625        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1626            st->print(" , 64 bit");
1627      } else if (os_vers == 6002) {
1628        if (osvi.wProductType == VER_NT_WORKSTATION) {
1629            st->print(" Windows 8");
1630        } else {
1631            st->print(" Windows Server 2012");
1632        }
1633        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1634            st->print(" , 64 bit");
1635      } else { // future os
1636        // Unrecognized windows, print out its major and minor versions
1637        st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1638        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
1639            st->print(" , 64 bit");
1640      }
1641      break;
1642    }
1643    default: // future windows, print out its major and minor versions
1644      st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1645    }
1646  } else {
1647    switch (os_vers) {
1648    case 4000: st->print(" Windows 95"); break;
1649    case 4010: st->print(" Windows 98"); break;
1650    case 4090: st->print(" Windows Me"); break;
1651    default: // future windows, print out its major and minor versions
1652      st->print(" Windows %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1653    }
1654  }
1655  st->print(" Build %d", osvi.dwBuildNumber);
1656  st->print(" %s", osvi.szCSDVersion);           // service pack
1657  st->cr();
1658}
1659
1660void os::pd_print_cpu_info(outputStream* st) {
1661  // Nothing to do for now.
1662}
1663
1664void os::print_memory_info(outputStream* st) {
1665  st->print("Memory:");
1666  st->print(" %dk page", os::vm_page_size()>>10);
1667
1668  // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect
1669  // value if total memory is larger than 4GB
1670  MEMORYSTATUSEX ms;
1671  ms.dwLength = sizeof(ms);
1672  GlobalMemoryStatusEx(&ms);
1673
1674  st->print(", physical %uk", os::physical_memory() >> 10);
1675  st->print("(%uk free)", os::available_memory() >> 10);
1676
1677  st->print(", swap %uk", ms.ullTotalPageFile >> 10);
1678  st->print("(%uk free)", ms.ullAvailPageFile >> 10);
1679  st->cr();
1680}
1681
1682void os::print_siginfo(outputStream *st, void *siginfo) {
1683  EXCEPTION_RECORD* er = (EXCEPTION_RECORD*)siginfo;
1684  st->print("siginfo:");
1685  st->print(" ExceptionCode=0x%x", er->ExceptionCode);
1686
1687  if (er->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
1688      er->NumberParameters >= 2) {
1689      switch (er->ExceptionInformation[0]) {
1690      case 0: st->print(", reading address"); break;
1691      case 1: st->print(", writing address"); break;
1692      default: st->print(", ExceptionInformation=" INTPTR_FORMAT,
1693                            er->ExceptionInformation[0]);
1694      }
1695      st->print(" " INTPTR_FORMAT, er->ExceptionInformation[1]);
1696  } else if (er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR &&
1697             er->NumberParameters >= 2 && UseSharedSpaces) {
1698    FileMapInfo* mapinfo = FileMapInfo::current_info();
1699    if (mapinfo->is_in_shared_space((void*)er->ExceptionInformation[1])) {
1700      st->print("\n\nError accessing class data sharing archive."       \
1701                " Mapped file inaccessible during execution, "          \
1702                " possible disk/network problem.");
1703    }
1704  } else {
1705    int num = er->NumberParameters;
1706    if (num > 0) {
1707      st->print(", ExceptionInformation=");
1708      for (int i = 0; i < num; i++) {
1709        st->print(INTPTR_FORMAT " ", er->ExceptionInformation[i]);
1710      }
1711    }
1712  }
1713  st->cr();
1714}
1715
1716void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
1717  // do nothing
1718}
1719
1720static char saved_jvm_path[MAX_PATH] = {0};
1721
1722// Find the full path to the current module, jvm.dll or jvm_g.dll
1723void os::jvm_path(char *buf, jint buflen) {
1724  // Error checking.
1725  if (buflen < MAX_PATH) {
1726    assert(false, "must use a large-enough buffer");
1727    buf[0] = '\0';
1728    return;
1729  }
1730  // Lazy resolve the path to current module.
1731  if (saved_jvm_path[0] != 0) {
1732    strcpy(buf, saved_jvm_path);
1733    return;
1734  }
1735
1736  buf[0] = '\0';
1737  if (Arguments::created_by_gamma_launcher()) {
1738     // Support for the gamma launcher. Check for an
1739     // JAVA_HOME environment variable
1740     // and fix up the path so it looks like
1741     // libjvm.so is installed there (append a fake suffix
1742     // hotspot/libjvm.so).
1743     char* java_home_var = ::getenv("JAVA_HOME");
1744     if (java_home_var != NULL && java_home_var[0] != 0) {
1745
1746        strncpy(buf, java_home_var, buflen);
1747
1748        // determine if this is a legacy image or modules image
1749        // modules image doesn't have "jre" subdirectory
1750        size_t len = strlen(buf);
1751        char* jrebin_p = buf + len;
1752        jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\");
1753        if (0 != _access(buf, 0)) {
1754          jio_snprintf(jrebin_p, buflen-len, "\\bin\\");
1755        }
1756        len = strlen(buf);
1757        jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll");
1758     }
1759  }
1760
1761  if(buf[0] == '\0') {
1762  GetModuleFileName(vm_lib_handle, buf, buflen);
1763  }
1764  strcpy(saved_jvm_path, buf);
1765}
1766
1767
1768void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
1769#ifndef _WIN64
1770  st->print("_");
1771#endif
1772}
1773
1774
1775void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
1776#ifndef _WIN64
1777  st->print("@%d", args_size  * sizeof(int));
1778#endif
1779}
1780
1781// This method is a copy of JDK's sysGetLastErrorString
1782// from src/windows/hpi/src/system_md.c
1783
1784size_t os::lasterror(char* buf, size_t len) {
1785  DWORD errval;
1786
1787  if ((errval = GetLastError()) != 0) {
1788    // DOS error
1789    size_t n = (size_t)FormatMessage(
1790          FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
1791          NULL,
1792          errval,
1793          0,
1794          buf,
1795          (DWORD)len,
1796          NULL);
1797    if (n > 3) {
1798      // Drop final '.', CR, LF
1799      if (buf[n - 1] == '\n') n--;
1800      if (buf[n - 1] == '\r') n--;
1801      if (buf[n - 1] == '.') n--;
1802      buf[n] = '\0';
1803    }
1804    return n;
1805  }
1806
1807  if (errno != 0) {
1808    // C runtime error that has no corresponding DOS error code
1809    const char* s = strerror(errno);
1810    size_t n = strlen(s);
1811    if (n >= len) n = len - 1;
1812    strncpy(buf, s, n);
1813    buf[n] = '\0';
1814    return n;
1815  }
1816
1817  return 0;
1818}
1819
1820int os::get_last_error() {
1821  DWORD error = GetLastError();
1822  if (error == 0)
1823    error = errno;
1824  return (int)error;
1825}
1826
1827// sun.misc.Signal
1828// NOTE that this is a workaround for an apparent kernel bug where if
1829// a signal handler for SIGBREAK is installed then that signal handler
1830// takes priority over the console control handler for CTRL_CLOSE_EVENT.
1831// See bug 4416763.
1832static void (*sigbreakHandler)(int) = NULL;
1833
1834static void UserHandler(int sig, void *siginfo, void *context) {
1835  os::signal_notify(sig);
1836  // We need to reinstate the signal handler each time...
1837  os::signal(sig, (void*)UserHandler);
1838}
1839
1840void* os::user_handler() {
1841  return (void*) UserHandler;
1842}
1843
1844void* os::signal(int signal_number, void* handler) {
1845  if ((signal_number == SIGBREAK) && (!ReduceSignalUsage)) {
1846    void (*oldHandler)(int) = sigbreakHandler;
1847    sigbreakHandler = (void (*)(int)) handler;
1848    return (void*) oldHandler;
1849  } else {
1850    return (void*)::signal(signal_number, (void (*)(int))handler);
1851  }
1852}
1853
1854void os::signal_raise(int signal_number) {
1855  raise(signal_number);
1856}
1857
1858// The Win32 C runtime library maps all console control events other than ^C
1859// into SIGBREAK, which makes it impossible to distinguish ^BREAK from close,
1860// logoff, and shutdown events.  We therefore install our own console handler
1861// that raises SIGTERM for the latter cases.
1862//
1863static BOOL WINAPI consoleHandler(DWORD event) {
1864  switch(event) {
1865    case CTRL_C_EVENT:
1866      if (is_error_reported()) {
1867        // Ctrl-C is pressed during error reporting, likely because the error
1868        // handler fails to abort. Let VM die immediately.
1869        os::die();
1870      }
1871
1872      os::signal_raise(SIGINT);
1873      return TRUE;
1874      break;
1875    case CTRL_BREAK_EVENT:
1876      if (sigbreakHandler != NULL) {
1877        (*sigbreakHandler)(SIGBREAK);
1878      }
1879      return TRUE;
1880      break;
1881    case CTRL_CLOSE_EVENT:
1882    case CTRL_LOGOFF_EVENT:
1883    case CTRL_SHUTDOWN_EVENT:
1884      os::signal_raise(SIGTERM);
1885      return TRUE;
1886      break;
1887    default:
1888      break;
1889  }
1890  return FALSE;
1891}
1892
1893/*
1894 * The following code is moved from os.cpp for making this
1895 * code platform specific, which it is by its very nature.
1896 */
1897
1898// Return maximum OS signal used + 1 for internal use only
1899// Used as exit signal for signal_thread
1900int os::sigexitnum_pd(){
1901  return NSIG;
1902}
1903
1904// a counter for each possible signal value, including signal_thread exit signal
1905static volatile jint pending_signals[NSIG+1] = { 0 };
1906static HANDLE sig_sem;
1907
1908void os::signal_init_pd() {
1909  // Initialize signal structures
1910  memset((void*)pending_signals, 0, sizeof(pending_signals));
1911
1912  sig_sem = ::CreateSemaphore(NULL, 0, NSIG+1, NULL);
1913
1914  // Programs embedding the VM do not want it to attempt to receive
1915  // events like CTRL_LOGOFF_EVENT, which are used to implement the
1916  // shutdown hooks mechanism introduced in 1.3.  For example, when
1917  // the VM is run as part of a Windows NT service (i.e., a servlet
1918  // engine in a web server), the correct behavior is for any console
1919  // control handler to return FALSE, not TRUE, because the OS's
1920  // "final" handler for such events allows the process to continue if
1921  // it is a service (while terminating it if it is not a service).
1922  // To make this behavior uniform and the mechanism simpler, we
1923  // completely disable the VM's usage of these console events if -Xrs
1924  // (=ReduceSignalUsage) is specified.  This means, for example, that
1925  // the CTRL-BREAK thread dump mechanism is also disabled in this
1926  // case.  See bugs 4323062, 4345157, and related bugs.
1927
1928  if (!ReduceSignalUsage) {
1929    // Add a CTRL-C handler
1930    SetConsoleCtrlHandler(consoleHandler, TRUE);
1931  }
1932}
1933
1934void os::signal_notify(int signal_number) {
1935  BOOL ret;
1936
1937  Atomic::inc(&pending_signals[signal_number]);
1938  ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
1939  assert(ret != 0, "ReleaseSemaphore() failed");
1940}
1941
1942static int check_pending_signals(bool wait_for_signal) {
1943  DWORD ret;
1944  while (true) {
1945    for (int i = 0; i < NSIG + 1; i++) {
1946      jint n = pending_signals[i];
1947      if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
1948        return i;
1949      }
1950    }
1951    if (!wait_for_signal) {
1952      return -1;
1953    }
1954
1955    JavaThread *thread = JavaThread::current();
1956
1957    ThreadBlockInVM tbivm(thread);
1958
1959    bool threadIsSuspended;
1960    do {
1961      thread->set_suspend_equivalent();
1962      // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
1963      ret = ::WaitForSingleObject(sig_sem, INFINITE);
1964      assert(ret == WAIT_OBJECT_0, "WaitForSingleObject() failed");
1965
1966      // were we externally suspended while we were waiting?
1967      threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
1968      if (threadIsSuspended) {
1969        //
1970        // The semaphore has been incremented, but while we were waiting
1971        // another thread suspended us. We don't want to continue running
1972        // while suspended because that would surprise the thread that
1973        // suspended us.
1974        //
1975        ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
1976        assert(ret != 0, "ReleaseSemaphore() failed");
1977
1978        thread->java_suspend_self();
1979      }
1980    } while (threadIsSuspended);
1981  }
1982}
1983
1984int os::signal_lookup() {
1985  return check_pending_signals(false);
1986}
1987
1988int os::signal_wait() {
1989  return check_pending_signals(true);
1990}
1991
1992// Implicit OS exception handling
1993
1994LONG Handle_Exception(struct _EXCEPTION_POINTERS* exceptionInfo, address handler) {
1995  JavaThread* thread = JavaThread::current();
1996  // Save pc in thread
1997#ifdef _M_IA64
1998  thread->set_saved_exception_pc((address)exceptionInfo->ContextRecord->StIIP);
1999  // Set pc to handler
2000  exceptionInfo->ContextRecord->StIIP = (DWORD64)handler;
2001#elif _M_AMD64
2002  thread->set_saved_exception_pc((address)exceptionInfo->ContextRecord->Rip);
2003  // Set pc to handler
2004  exceptionInfo->ContextRecord->Rip = (DWORD64)handler;
2005#else
2006  thread->set_saved_exception_pc((address)exceptionInfo->ContextRecord->Eip);
2007  // Set pc to handler
2008  exceptionInfo->ContextRecord->Eip = (LONG)handler;
2009#endif
2010
2011  // Continue the execution
2012  return EXCEPTION_CONTINUE_EXECUTION;
2013}
2014
2015
2016// Used for PostMortemDump
2017extern "C" void safepoints();
2018extern "C" void find(int x);
2019extern "C" void events();
2020
2021// According to Windows API documentation, an illegal instruction sequence should generate
2022// the 0xC000001C exception code. However, real world experience shows that occasionnaly
2023// the execution of an illegal instruction can generate the exception code 0xC000001E. This
2024// seems to be an undocumented feature of Win NT 4.0 (and probably other Windows systems).
2025
2026#define EXCEPTION_ILLEGAL_INSTRUCTION_2 0xC000001E
2027
2028// From "Execution Protection in the Windows Operating System" draft 0.35
2029// Once a system header becomes available, the "real" define should be
2030// included or copied here.
2031#define EXCEPTION_INFO_EXEC_VIOLATION 0x08
2032
2033#define def_excpt(val) #val, val
2034
2035struct siglabel {
2036  char *name;
2037  int   number;
2038};
2039
2040// All Visual C++ exceptions thrown from code generated by the Microsoft Visual
2041// C++ compiler contain this error code. Because this is a compiler-generated
2042// error, the code is not listed in the Win32 API header files.
2043// The code is actually a cryptic mnemonic device, with the initial "E"
2044// standing for "exception" and the final 3 bytes (0x6D7363) representing the
2045// ASCII values of "msc".
2046
2047#define EXCEPTION_UNCAUGHT_CXX_EXCEPTION    0xE06D7363
2048
2049
2050struct siglabel exceptlabels[] = {
2051    def_excpt(EXCEPTION_ACCESS_VIOLATION),
2052    def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT),
2053    def_excpt(EXCEPTION_BREAKPOINT),
2054    def_excpt(EXCEPTION_SINGLE_STEP),
2055    def_excpt(EXCEPTION_ARRAY_BOUNDS_EXCEEDED),
2056    def_excpt(EXCEPTION_FLT_DENORMAL_OPERAND),
2057    def_excpt(EXCEPTION_FLT_DIVIDE_BY_ZERO),
2058    def_excpt(EXCEPTION_FLT_INEXACT_RESULT),
2059    def_excpt(EXCEPTION_FLT_INVALID_OPERATION),
2060    def_excpt(EXCEPTION_FLT_OVERFLOW),
2061    def_excpt(EXCEPTION_FLT_STACK_CHECK),
2062    def_excpt(EXCEPTION_FLT_UNDERFLOW),
2063    def_excpt(EXCEPTION_INT_DIVIDE_BY_ZERO),
2064    def_excpt(EXCEPTION_INT_OVERFLOW),
2065    def_excpt(EXCEPTION_PRIV_INSTRUCTION),
2066    def_excpt(EXCEPTION_IN_PAGE_ERROR),
2067    def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION),
2068    def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION_2),
2069    def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION),
2070    def_excpt(EXCEPTION_STACK_OVERFLOW),
2071    def_excpt(EXCEPTION_INVALID_DISPOSITION),
2072    def_excpt(EXCEPTION_GUARD_PAGE),
2073    def_excpt(EXCEPTION_INVALID_HANDLE),
2074    def_excpt(EXCEPTION_UNCAUGHT_CXX_EXCEPTION),
2075    NULL, 0
2076};
2077
2078const char* os::exception_name(int exception_code, char *buf, size_t size) {
2079  for (int i = 0; exceptlabels[i].name != NULL; i++) {
2080    if (exceptlabels[i].number == exception_code) {
2081       jio_snprintf(buf, size, "%s", exceptlabels[i].name);
2082       return buf;
2083    }
2084  }
2085
2086  return NULL;
2087}
2088
2089//-----------------------------------------------------------------------------
2090LONG Handle_IDiv_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
2091  // handle exception caused by idiv; should only happen for -MinInt/-1
2092  // (division by zero is handled explicitly)
2093#ifdef _M_IA64
2094  assert(0, "Fix Handle_IDiv_Exception");
2095#elif _M_AMD64
2096  PCONTEXT ctx = exceptionInfo->ContextRecord;
2097  address pc = (address)ctx->Rip;
2098  assert(pc[0] == 0xF7, "not an idiv opcode");
2099  assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
2100  assert(ctx->Rax == min_jint, "unexpected idiv exception");
2101  // set correct result values and continue after idiv instruction
2102  ctx->Rip = (DWORD)pc + 2;        // idiv reg, reg  is 2 bytes
2103  ctx->Rax = (DWORD)min_jint;      // result
2104  ctx->Rdx = (DWORD)0;             // remainder
2105  // Continue the execution
2106#else
2107  PCONTEXT ctx = exceptionInfo->ContextRecord;
2108  address pc = (address)ctx->Eip;
2109  assert(pc[0] == 0xF7, "not an idiv opcode");
2110  assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
2111  assert(ctx->Eax == min_jint, "unexpected idiv exception");
2112  // set correct result values and continue after idiv instruction
2113  ctx->Eip = (DWORD)pc + 2;        // idiv reg, reg  is 2 bytes
2114  ctx->Eax = (DWORD)min_jint;      // result
2115  ctx->Edx = (DWORD)0;             // remainder
2116  // Continue the execution
2117#endif
2118  return EXCEPTION_CONTINUE_EXECUTION;
2119}
2120
2121#ifndef  _WIN64
2122//-----------------------------------------------------------------------------
2123LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
2124  // handle exception caused by native method modifying control word
2125  PCONTEXT ctx = exceptionInfo->ContextRecord;
2126  DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
2127
2128  switch (exception_code) {
2129    case EXCEPTION_FLT_DENORMAL_OPERAND:
2130    case EXCEPTION_FLT_DIVIDE_BY_ZERO:
2131    case EXCEPTION_FLT_INEXACT_RESULT:
2132    case EXCEPTION_FLT_INVALID_OPERATION:
2133    case EXCEPTION_FLT_OVERFLOW:
2134    case EXCEPTION_FLT_STACK_CHECK:
2135    case EXCEPTION_FLT_UNDERFLOW:
2136      jint fp_control_word = (* (jint*) StubRoutines::addr_fpu_cntrl_wrd_std());
2137      if (fp_control_word != ctx->FloatSave.ControlWord) {
2138        // Restore FPCW and mask out FLT exceptions
2139        ctx->FloatSave.ControlWord = fp_control_word | 0xffffffc0;
2140        // Mask out pending FLT exceptions
2141        ctx->FloatSave.StatusWord &=  0xffffff00;
2142        return EXCEPTION_CONTINUE_EXECUTION;
2143      }
2144  }
2145
2146  if (prev_uef_handler != NULL) {
2147    // We didn't handle this exception so pass it to the previous
2148    // UnhandledExceptionFilter.
2149    return (prev_uef_handler)(exceptionInfo);
2150  }
2151
2152  return EXCEPTION_CONTINUE_SEARCH;
2153}
2154#else //_WIN64
2155/*
2156  On Windows, the mxcsr control bits are non-volatile across calls
2157  See also CR 6192333
2158  If EXCEPTION_FLT_* happened after some native method modified
2159  mxcsr - it is not a jvm fault.
2160  However should we decide to restore of mxcsr after a faulty
2161  native method we can uncomment following code
2162      jint MxCsr = INITIAL_MXCSR;
2163        // we can't use StubRoutines::addr_mxcsr_std()
2164        // because in Win64 mxcsr is not saved there
2165      if (MxCsr != ctx->MxCsr) {
2166        ctx->MxCsr = MxCsr;
2167        return EXCEPTION_CONTINUE_EXECUTION;
2168      }
2169
2170*/
2171#endif //_WIN64
2172
2173
2174// Fatal error reporting is single threaded so we can make this a
2175// static and preallocated.  If it's more than MAX_PATH silently ignore
2176// it.
2177static char saved_error_file[MAX_PATH] = {0};
2178
2179void os::set_error_file(const char *logfile) {
2180  if (strlen(logfile) <= MAX_PATH) {
2181    strncpy(saved_error_file, logfile, MAX_PATH);
2182  }
2183}
2184
2185static inline void report_error(Thread* t, DWORD exception_code,
2186                                address addr, void* siginfo, void* context) {
2187  VMError err(t, exception_code, addr, siginfo, context);
2188  err.report_and_die();
2189
2190  // If UseOsErrorReporting, this will return here and save the error file
2191  // somewhere where we can find it in the minidump.
2192}
2193
2194//-----------------------------------------------------------------------------
2195LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
2196  if (InterceptOSException) return EXCEPTION_CONTINUE_SEARCH;
2197  DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
2198#ifdef _M_IA64
2199  address pc = (address) exceptionInfo->ContextRecord->StIIP;
2200#elif _M_AMD64
2201  address pc = (address) exceptionInfo->ContextRecord->Rip;
2202#else
2203  address pc = (address) exceptionInfo->ContextRecord->Eip;
2204#endif
2205  Thread* t = ThreadLocalStorage::get_thread_slow();          // slow & steady
2206
2207#ifndef _WIN64
2208  // Execution protection violation - win32 running on AMD64 only
2209  // Handled first to avoid misdiagnosis as a "normal" access violation;
2210  // This is safe to do because we have a new/unique ExceptionInformation
2211  // code for this condition.
2212  if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2213    PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2214    int exception_subcode = (int) exceptionRecord->ExceptionInformation[0];
2215    address addr = (address) exceptionRecord->ExceptionInformation[1];
2216
2217    if (exception_subcode == EXCEPTION_INFO_EXEC_VIOLATION) {
2218      int page_size = os::vm_page_size();
2219
2220      // Make sure the pc and the faulting address are sane.
2221      //
2222      // If an instruction spans a page boundary, and the page containing
2223      // the beginning of the instruction is executable but the following
2224      // page is not, the pc and the faulting address might be slightly
2225      // different - we still want to unguard the 2nd page in this case.
2226      //
2227      // 15 bytes seems to be a (very) safe value for max instruction size.
2228      bool pc_is_near_addr =
2229        (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15);
2230      bool instr_spans_page_boundary =
2231        (align_size_down((intptr_t) pc ^ (intptr_t) addr,
2232                         (intptr_t) page_size) > 0);
2233
2234      if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) {
2235        static volatile address last_addr =
2236          (address) os::non_memory_address_word();
2237
2238        // In conservative mode, don't unguard unless the address is in the VM
2239        if (UnguardOnExecutionViolation > 0 && addr != last_addr &&
2240            (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) {
2241
2242          // Set memory to RWX and retry
2243          address page_start =
2244            (address) align_size_down((intptr_t) addr, (intptr_t) page_size);
2245          bool res = os::protect_memory((char*) page_start, page_size,
2246                                        os::MEM_PROT_RWX);
2247
2248          if (PrintMiscellaneous && Verbose) {
2249            char buf[256];
2250            jio_snprintf(buf, sizeof(buf), "Execution protection violation "
2251                         "at " INTPTR_FORMAT
2252                         ", unguarding " INTPTR_FORMAT ": %s", addr,
2253                         page_start, (res ? "success" : strerror(errno)));
2254            tty->print_raw_cr(buf);
2255          }
2256
2257          // Set last_addr so if we fault again at the same address, we don't
2258          // end up in an endless loop.
2259          //
2260          // There are two potential complications here.  Two threads trapping
2261          // at the same address at the same time could cause one of the
2262          // threads to think it already unguarded, and abort the VM.  Likely
2263          // very rare.
2264          //
2265          // The other race involves two threads alternately trapping at
2266          // different addresses and failing to unguard the page, resulting in
2267          // an endless loop.  This condition is probably even more unlikely
2268          // than the first.
2269          //
2270          // Although both cases could be avoided by using locks or thread
2271          // local last_addr, these solutions are unnecessary complication:
2272          // this handler is a best-effort safety net, not a complete solution.
2273          // It is disabled by default and should only be used as a workaround
2274          // in case we missed any no-execute-unsafe VM code.
2275
2276          last_addr = addr;
2277
2278          return EXCEPTION_CONTINUE_EXECUTION;
2279        }
2280      }
2281
2282      // Last unguard failed or not unguarding
2283      tty->print_raw_cr("Execution protection violation");
2284      report_error(t, exception_code, addr, exceptionInfo->ExceptionRecord,
2285                   exceptionInfo->ContextRecord);
2286      return EXCEPTION_CONTINUE_SEARCH;
2287    }
2288  }
2289#endif // _WIN64
2290
2291  // Check to see if we caught the safepoint code in the
2292  // process of write protecting the memory serialization page.
2293  // It write enables the page immediately after protecting it
2294  // so just return.
2295  if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
2296    JavaThread* thread = (JavaThread*) t;
2297    PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2298    address addr = (address) exceptionRecord->ExceptionInformation[1];
2299    if ( os::is_memory_serialize_page(thread, addr) ) {
2300      // Block current thread until the memory serialize page permission restored.
2301      os::block_on_serialize_page_trap();
2302      return EXCEPTION_CONTINUE_EXECUTION;
2303    }
2304  }
2305
2306  if (t != NULL && t->is_Java_thread()) {
2307    JavaThread* thread = (JavaThread*) t;
2308    bool in_java = thread->thread_state() == _thread_in_Java;
2309
2310    // Handle potential stack overflows up front.
2311    if (exception_code == EXCEPTION_STACK_OVERFLOW) {
2312      if (os::uses_stack_guard_pages()) {
2313#ifdef _M_IA64
2314        //
2315        // If it's a legal stack address continue, Windows will map it in.
2316        //
2317        PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2318        address addr = (address) exceptionRecord->ExceptionInformation[1];
2319        if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() )
2320          return EXCEPTION_CONTINUE_EXECUTION;
2321
2322        // The register save area is the same size as the memory stack
2323        // and starts at the page just above the start of the memory stack.
2324        // If we get a fault in this area, we've run out of register
2325        // stack.  If we are in java, try throwing a stack overflow exception.
2326        if (addr > thread->stack_base() &&
2327                      addr <= (thread->stack_base()+thread->stack_size()) ) {
2328          char buf[256];
2329          jio_snprintf(buf, sizeof(buf),
2330                       "Register stack overflow, addr:%p, stack_base:%p\n",
2331                       addr, thread->stack_base() );
2332          tty->print_raw_cr(buf);
2333          // If not in java code, return and hope for the best.
2334          return in_java ? Handle_Exception(exceptionInfo,
2335            SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW))
2336            :  EXCEPTION_CONTINUE_EXECUTION;
2337        }
2338#endif
2339        if (thread->stack_yellow_zone_enabled()) {
2340          // Yellow zone violation.  The o/s has unprotected the first yellow
2341          // zone page for us.  Note:  must call disable_stack_yellow_zone to
2342          // update the enabled status, even if the zone contains only one page.
2343          thread->disable_stack_yellow_zone();
2344          // If not in java code, return and hope for the best.
2345          return in_java ? Handle_Exception(exceptionInfo,
2346            SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW))
2347            :  EXCEPTION_CONTINUE_EXECUTION;
2348        } else {
2349          // Fatal red zone violation.
2350          thread->disable_stack_red_zone();
2351          tty->print_raw_cr("An unrecoverable stack overflow has occurred.");
2352          report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2353                       exceptionInfo->ContextRecord);
2354          return EXCEPTION_CONTINUE_SEARCH;
2355        }
2356      } else if (in_java) {
2357        // JVM-managed guard pages cannot be used on win95/98.  The o/s provides
2358        // a one-time-only guard page, which it has released to us.  The next
2359        // stack overflow on this thread will result in an ACCESS_VIOLATION.
2360        return Handle_Exception(exceptionInfo,
2361          SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2362      } else {
2363        // Can only return and hope for the best.  Further stack growth will
2364        // result in an ACCESS_VIOLATION.
2365        return EXCEPTION_CONTINUE_EXECUTION;
2366      }
2367    } else if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2368      // Either stack overflow or null pointer exception.
2369      if (in_java) {
2370        PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2371        address addr = (address) exceptionRecord->ExceptionInformation[1];
2372        address stack_end = thread->stack_base() - thread->stack_size();
2373        if (addr < stack_end && addr >= stack_end - os::vm_page_size()) {
2374          // Stack overflow.
2375          assert(!os::uses_stack_guard_pages(),
2376            "should be caught by red zone code above.");
2377          return Handle_Exception(exceptionInfo,
2378            SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2379        }
2380        //
2381        // Check for safepoint polling and implicit null
2382        // We only expect null pointers in the stubs (vtable)
2383        // the rest are checked explicitly now.
2384        //
2385        CodeBlob* cb = CodeCache::find_blob(pc);
2386        if (cb != NULL) {
2387          if (os::is_poll_address(addr)) {
2388            address stub = SharedRuntime::get_poll_stub(pc);
2389            return Handle_Exception(exceptionInfo, stub);
2390          }
2391        }
2392        {
2393#ifdef _WIN64
2394          //
2395          // If it's a legal stack address map the entire region in
2396          //
2397          PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2398          address addr = (address) exceptionRecord->ExceptionInformation[1];
2399          if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() ) {
2400                  addr = (address)((uintptr_t)addr &
2401                         (~((uintptr_t)os::vm_page_size() - (uintptr_t)1)));
2402                  os::commit_memory((char *)addr, thread->stack_base() - addr,
2403                                    false );
2404                  return EXCEPTION_CONTINUE_EXECUTION;
2405          }
2406          else
2407#endif
2408          {
2409            // Null pointer exception.
2410#ifdef _M_IA64
2411            // We catch register stack overflows in compiled code by doing
2412            // an explicit compare and executing a st8(G0, G0) if the
2413            // BSP enters into our guard area.  We test for the overflow
2414            // condition and fall into the normal null pointer exception
2415            // code if BSP hasn't overflowed.
2416            if ( in_java ) {
2417              if(thread->register_stack_overflow()) {
2418                assert((address)exceptionInfo->ContextRecord->IntS3 ==
2419                                thread->register_stack_limit(),
2420                               "GR7 doesn't contain register_stack_limit");
2421                // Disable the yellow zone which sets the state that
2422                // we've got a stack overflow problem.
2423                if (thread->stack_yellow_zone_enabled()) {
2424                  thread->disable_stack_yellow_zone();
2425                }
2426                // Give us some room to process the exception
2427                thread->disable_register_stack_guard();
2428                // Update GR7 with the new limit so we can continue running
2429                // compiled code.
2430                exceptionInfo->ContextRecord->IntS3 =
2431                               (ULONGLONG)thread->register_stack_limit();
2432                return Handle_Exception(exceptionInfo,
2433                       SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2434              } else {
2435                //
2436                // Check for implicit null
2437                // We only expect null pointers in the stubs (vtable)
2438                // the rest are checked explicitly now.
2439                //
2440                if (((uintptr_t)addr) < os::vm_page_size() ) {
2441                  // an access to the first page of VM--assume it is a null pointer
2442                  address stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
2443                  if (stub != NULL) return Handle_Exception(exceptionInfo, stub);
2444                }
2445              }
2446            } // in_java
2447
2448            // IA64 doesn't use implicit null checking yet. So we shouldn't
2449            // get here.
2450            tty->print_raw_cr("Access violation, possible null pointer exception");
2451            report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2452                         exceptionInfo->ContextRecord);
2453            return EXCEPTION_CONTINUE_SEARCH;
2454#else /* !IA64 */
2455
2456            // Windows 98 reports faulting addresses incorrectly
2457            if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr) ||
2458                !os::win32::is_nt()) {
2459              address stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
2460              if (stub != NULL) return Handle_Exception(exceptionInfo, stub);
2461            }
2462            report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2463                         exceptionInfo->ContextRecord);
2464            return EXCEPTION_CONTINUE_SEARCH;
2465#endif
2466          }
2467        }
2468      }
2469
2470#ifdef _WIN64
2471      // Special care for fast JNI field accessors.
2472      // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks
2473      // in and the heap gets shrunk before the field access.
2474      if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2475        address addr = JNI_FastGetField::find_slowcase_pc(pc);
2476        if (addr != (address)-1) {
2477          return Handle_Exception(exceptionInfo, addr);
2478        }
2479      }
2480#endif
2481
2482#ifdef _WIN64
2483      // Windows will sometimes generate an access violation
2484      // when we call malloc.  Since we use VectoredExceptions
2485      // on 64 bit platforms, we see this exception.  We must
2486      // pass this exception on so Windows can recover.
2487      // We check to see if the pc of the fault is in NTDLL.DLL
2488      // if so, we pass control on to Windows for handling.
2489      if (UseVectoredExceptions && _addr_in_ntdll(pc)) return EXCEPTION_CONTINUE_SEARCH;
2490#endif
2491
2492      // Stack overflow or null pointer exception in native code.
2493      report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2494                   exceptionInfo->ContextRecord);
2495      return EXCEPTION_CONTINUE_SEARCH;
2496    }
2497
2498    if (in_java) {
2499      switch (exception_code) {
2500      case EXCEPTION_INT_DIVIDE_BY_ZERO:
2501        return Handle_Exception(exceptionInfo, SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO));
2502
2503      case EXCEPTION_INT_OVERFLOW:
2504        return Handle_IDiv_Exception(exceptionInfo);
2505
2506      } // switch
2507    }
2508#ifndef _WIN64
2509    if (((thread->thread_state() == _thread_in_Java) ||
2510        (thread->thread_state() == _thread_in_native)) &&
2511        exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION)
2512    {
2513      LONG result=Handle_FLT_Exception(exceptionInfo);
2514      if (result==EXCEPTION_CONTINUE_EXECUTION) return result;
2515    }
2516#endif //_WIN64
2517  }
2518
2519  if (exception_code != EXCEPTION_BREAKPOINT) {
2520#ifndef _WIN64
2521    report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2522                 exceptionInfo->ContextRecord);
2523#else
2524    // Itanium Windows uses a VectoredExceptionHandler
2525    // Which means that C++ programatic exception handlers (try/except)
2526    // will get here.  Continue the search for the right except block if
2527    // the exception code is not a fatal code.
2528    switch ( exception_code ) {
2529      case EXCEPTION_ACCESS_VIOLATION:
2530      case EXCEPTION_STACK_OVERFLOW:
2531      case EXCEPTION_ILLEGAL_INSTRUCTION:
2532      case EXCEPTION_ILLEGAL_INSTRUCTION_2:
2533      case EXCEPTION_INT_OVERFLOW:
2534      case EXCEPTION_INT_DIVIDE_BY_ZERO:
2535      case EXCEPTION_UNCAUGHT_CXX_EXCEPTION:
2536      {  report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2537                       exceptionInfo->ContextRecord);
2538      }
2539        break;
2540      default:
2541        break;
2542    }
2543#endif
2544  }
2545  return EXCEPTION_CONTINUE_SEARCH;
2546}
2547
2548#ifndef _WIN64
2549// Special care for fast JNI accessors.
2550// jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in and
2551// the heap gets shrunk before the field access.
2552// Need to install our own structured exception handler since native code may
2553// install its own.
2554LONG WINAPI fastJNIAccessorExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
2555  DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
2556  if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2557    address pc = (address) exceptionInfo->ContextRecord->Eip;
2558    address addr = JNI_FastGetField::find_slowcase_pc(pc);
2559    if (addr != (address)-1) {
2560      return Handle_Exception(exceptionInfo, addr);
2561    }
2562  }
2563  return EXCEPTION_CONTINUE_SEARCH;
2564}
2565
2566#define DEFINE_FAST_GETFIELD(Return,Fieldname,Result) \
2567Return JNICALL jni_fast_Get##Result##Field_wrapper(JNIEnv *env, jobject obj, jfieldID fieldID) { \
2568  __try { \
2569    return (*JNI_FastGetField::jni_fast_Get##Result##Field_fp)(env, obj, fieldID); \
2570  } __except(fastJNIAccessorExceptionFilter((_EXCEPTION_POINTERS*)_exception_info())) { \
2571  } \
2572  return 0; \
2573}
2574
2575DEFINE_FAST_GETFIELD(jboolean, bool,   Boolean)
2576DEFINE_FAST_GETFIELD(jbyte,    byte,   Byte)
2577DEFINE_FAST_GETFIELD(jchar,    char,   Char)
2578DEFINE_FAST_GETFIELD(jshort,   short,  Short)
2579DEFINE_FAST_GETFIELD(jint,     int,    Int)
2580DEFINE_FAST_GETFIELD(jlong,    long,   Long)
2581DEFINE_FAST_GETFIELD(jfloat,   float,  Float)
2582DEFINE_FAST_GETFIELD(jdouble,  double, Double)
2583
2584address os::win32::fast_jni_accessor_wrapper(BasicType type) {
2585  switch (type) {
2586    case T_BOOLEAN: return (address)jni_fast_GetBooleanField_wrapper;
2587    case T_BYTE:    return (address)jni_fast_GetByteField_wrapper;
2588    case T_CHAR:    return (address)jni_fast_GetCharField_wrapper;
2589    case T_SHORT:   return (address)jni_fast_GetShortField_wrapper;
2590    case T_INT:     return (address)jni_fast_GetIntField_wrapper;
2591    case T_LONG:    return (address)jni_fast_GetLongField_wrapper;
2592    case T_FLOAT:   return (address)jni_fast_GetFloatField_wrapper;
2593    case T_DOUBLE:  return (address)jni_fast_GetDoubleField_wrapper;
2594    default:        ShouldNotReachHere();
2595  }
2596  return (address)-1;
2597}
2598#endif
2599
2600// Virtual Memory
2601
2602int os::vm_page_size() { return os::win32::vm_page_size(); }
2603int os::vm_allocation_granularity() {
2604  return os::win32::vm_allocation_granularity();
2605}
2606
2607// Windows large page support is available on Windows 2003. In order to use
2608// large page memory, the administrator must first assign additional privilege
2609// to the user:
2610//   + select Control Panel -> Administrative Tools -> Local Security Policy
2611//   + select Local Policies -> User Rights Assignment
2612//   + double click "Lock pages in memory", add users and/or groups
2613//   + reboot
2614// Note the above steps are needed for administrator as well, as administrators
2615// by default do not have the privilege to lock pages in memory.
2616//
2617// Note about Windows 2003: although the API supports committing large page
2618// memory on a page-by-page basis and VirtualAlloc() returns success under this
2619// scenario, I found through experiment it only uses large page if the entire
2620// memory region is reserved and committed in a single VirtualAlloc() call.
2621// This makes Windows large page support more or less like Solaris ISM, in
2622// that the entire heap must be committed upfront. This probably will change
2623// in the future, if so the code below needs to be revisited.
2624
2625#ifndef MEM_LARGE_PAGES
2626#define MEM_LARGE_PAGES 0x20000000
2627#endif
2628
2629static HANDLE    _hProcess;
2630static HANDLE    _hToken;
2631
2632// Container for NUMA node list info
2633class NUMANodeListHolder {
2634private:
2635  int *_numa_used_node_list;  // allocated below
2636  int _numa_used_node_count;
2637
2638  void free_node_list() {
2639    if (_numa_used_node_list != NULL) {
2640      FREE_C_HEAP_ARRAY(int, _numa_used_node_list);
2641    }
2642  }
2643
2644public:
2645  NUMANodeListHolder() {
2646    _numa_used_node_count = 0;
2647    _numa_used_node_list = NULL;
2648    // do rest of initialization in build routine (after function pointers are set up)
2649  }
2650
2651  ~NUMANodeListHolder() {
2652    free_node_list();
2653  }
2654
2655  bool build() {
2656    DWORD_PTR proc_aff_mask;
2657    DWORD_PTR sys_aff_mask;
2658    if (!GetProcessAffinityMask(GetCurrentProcess(), &proc_aff_mask, &sys_aff_mask)) return false;
2659    ULONG highest_node_number;
2660    if (!os::Kernel32Dll::GetNumaHighestNodeNumber(&highest_node_number)) return false;
2661    free_node_list();
2662    _numa_used_node_list = NEW_C_HEAP_ARRAY(int, highest_node_number + 1);
2663    for (unsigned int i = 0; i <= highest_node_number; i++) {
2664      ULONGLONG proc_mask_numa_node;
2665      if (!os::Kernel32Dll::GetNumaNodeProcessorMask(i, &proc_mask_numa_node)) return false;
2666      if ((proc_aff_mask & proc_mask_numa_node)!=0) {
2667        _numa_used_node_list[_numa_used_node_count++] = i;
2668      }
2669    }
2670    return (_numa_used_node_count > 1);
2671  }
2672
2673  int get_count() {return _numa_used_node_count;}
2674  int get_node_list_entry(int n) {
2675    // for indexes out of range, returns -1
2676    return (n < _numa_used_node_count ? _numa_used_node_list[n] : -1);
2677  }
2678
2679} numa_node_list_holder;
2680
2681
2682
2683static size_t _large_page_size = 0;
2684
2685static bool resolve_functions_for_large_page_init() {
2686  return os::Kernel32Dll::GetLargePageMinimumAvailable() &&
2687    os::Advapi32Dll::AdvapiAvailable();
2688}
2689
2690static bool request_lock_memory_privilege() {
2691  _hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,
2692                                os::current_process_id());
2693
2694  LUID luid;
2695  if (_hProcess != NULL &&
2696      os::Advapi32Dll::OpenProcessToken(_hProcess, TOKEN_ADJUST_PRIVILEGES, &_hToken) &&
2697      os::Advapi32Dll::LookupPrivilegeValue(NULL, "SeLockMemoryPrivilege", &luid)) {
2698
2699    TOKEN_PRIVILEGES tp;
2700    tp.PrivilegeCount = 1;
2701    tp.Privileges[0].Luid = luid;
2702    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
2703
2704    // AdjustTokenPrivileges() may return TRUE even when it couldn't change the
2705    // privilege. Check GetLastError() too. See MSDN document.
2706    if (os::Advapi32Dll::AdjustTokenPrivileges(_hToken, false, &tp, sizeof(tp), NULL, NULL) &&
2707        (GetLastError() == ERROR_SUCCESS)) {
2708      return true;
2709    }
2710  }
2711
2712  return false;
2713}
2714
2715static void cleanup_after_large_page_init() {
2716  if (_hProcess) CloseHandle(_hProcess);
2717  _hProcess = NULL;
2718  if (_hToken) CloseHandle(_hToken);
2719  _hToken = NULL;
2720}
2721
2722static bool numa_interleaving_init() {
2723  bool success = false;
2724  bool use_numa_interleaving_specified = !FLAG_IS_DEFAULT(UseNUMAInterleaving);
2725
2726  // print a warning if UseNUMAInterleaving flag is specified on command line
2727  bool warn_on_failure = use_numa_interleaving_specified;
2728# define WARN(msg) if (warn_on_failure) { warning(msg); }
2729
2730  // NUMAInterleaveGranularity cannot be less than vm_allocation_granularity (or _large_page_size if using large pages)
2731  size_t min_interleave_granularity = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
2732  NUMAInterleaveGranularity = align_size_up(NUMAInterleaveGranularity, min_interleave_granularity);
2733
2734  if (os::Kernel32Dll::NumaCallsAvailable()) {
2735    if (numa_node_list_holder.build()) {
2736      if (PrintMiscellaneous && Verbose) {
2737        tty->print("NUMA UsedNodeCount=%d, namely ", numa_node_list_holder.get_count());
2738        for (int i = 0; i < numa_node_list_holder.get_count(); i++) {
2739          tty->print("%d ", numa_node_list_holder.get_node_list_entry(i));
2740        }
2741        tty->print("\n");
2742      }
2743      success = true;
2744    } else {
2745      WARN("Process does not cover multiple NUMA nodes.");
2746    }
2747  } else {
2748    WARN("NUMA Interleaving is not supported by the operating system.");
2749  }
2750  if (!success) {
2751    if (use_numa_interleaving_specified) WARN("...Ignoring UseNUMAInterleaving flag.");
2752  }
2753  return success;
2754#undef WARN
2755}
2756
2757// this routine is used whenever we need to reserve a contiguous VA range
2758// but we need to make separate VirtualAlloc calls for each piece of the range
2759// Reasons for doing this:
2760//  * UseLargePagesIndividualAllocation was set (normally only needed on WS2003 but possible to be set otherwise)
2761//  * UseNUMAInterleaving requires a separate node for each piece
2762static char* allocate_pages_individually(size_t bytes, char* addr, DWORD flags, DWORD prot,
2763                                         bool should_inject_error=false) {
2764  char * p_buf;
2765  // note: at setup time we guaranteed that NUMAInterleaveGranularity was aligned up to a page size
2766  size_t page_size = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
2767  size_t chunk_size = UseNUMAInterleaving ? NUMAInterleaveGranularity : page_size;
2768
2769  // first reserve enough address space in advance since we want to be
2770  // able to break a single contiguous virtual address range into multiple
2771  // large page commits but WS2003 does not allow reserving large page space
2772  // so we just use 4K pages for reserve, this gives us a legal contiguous
2773  // address space. then we will deallocate that reservation, and re alloc
2774  // using large pages
2775  const size_t size_of_reserve = bytes + chunk_size;
2776  if (bytes > size_of_reserve) {
2777    // Overflowed.
2778    return NULL;
2779  }
2780  p_buf = (char *) VirtualAlloc(addr,
2781                                size_of_reserve,  // size of Reserve
2782                                MEM_RESERVE,
2783                                PAGE_READWRITE);
2784  // If reservation failed, return NULL
2785  if (p_buf == NULL) return NULL;
2786
2787  os::release_memory(p_buf, bytes + chunk_size);
2788
2789  // we still need to round up to a page boundary (in case we are using large pages)
2790  // but not to a chunk boundary (in case InterleavingGranularity doesn't align with page size)
2791  // instead we handle this in the bytes_to_rq computation below
2792  p_buf = (char *) align_size_up((size_t)p_buf, page_size);
2793
2794  // now go through and allocate one chunk at a time until all bytes are
2795  // allocated
2796  size_t  bytes_remaining = bytes;
2797  // An overflow of align_size_up() would have been caught above
2798  // in the calculation of size_of_reserve.
2799  char * next_alloc_addr = p_buf;
2800  HANDLE hProc = GetCurrentProcess();
2801
2802#ifdef ASSERT
2803  // Variable for the failure injection
2804  long ran_num = os::random();
2805  size_t fail_after = ran_num % bytes;
2806#endif
2807
2808  int count=0;
2809  while (bytes_remaining) {
2810    // select bytes_to_rq to get to the next chunk_size boundary
2811
2812    size_t bytes_to_rq = MIN2(bytes_remaining, chunk_size - ((size_t)next_alloc_addr % chunk_size));
2813    // Note allocate and commit
2814    char * p_new;
2815
2816#ifdef ASSERT
2817    bool inject_error_now = should_inject_error && (bytes_remaining <= fail_after);
2818#else
2819    const bool inject_error_now = false;
2820#endif
2821
2822    if (inject_error_now) {
2823      p_new = NULL;
2824    } else {
2825      if (!UseNUMAInterleaving) {
2826        p_new = (char *) VirtualAlloc(next_alloc_addr,
2827                                      bytes_to_rq,
2828                                      flags,
2829                                      prot);
2830      } else {
2831        // get the next node to use from the used_node_list
2832        assert(numa_node_list_holder.get_count() > 0, "Multiple NUMA nodes expected");
2833        DWORD node = numa_node_list_holder.get_node_list_entry(count % numa_node_list_holder.get_count());
2834        p_new = (char *)os::Kernel32Dll::VirtualAllocExNuma(hProc,
2835                                                            next_alloc_addr,
2836                                                            bytes_to_rq,
2837                                                            flags,
2838                                                            prot,
2839                                                            node);
2840      }
2841    }
2842
2843    if (p_new == NULL) {
2844      // Free any allocated pages
2845      if (next_alloc_addr > p_buf) {
2846        // Some memory was committed so release it.
2847        size_t bytes_to_release = bytes - bytes_remaining;
2848        os::release_memory(p_buf, bytes_to_release);
2849      }
2850#ifdef ASSERT
2851      if (should_inject_error) {
2852        if (TracePageSizes && Verbose) {
2853          tty->print_cr("Reserving pages individually failed.");
2854        }
2855      }
2856#endif
2857      return NULL;
2858    }
2859    bytes_remaining -= bytes_to_rq;
2860    next_alloc_addr += bytes_to_rq;
2861    count++;
2862  }
2863  // made it this far, success
2864  return p_buf;
2865}
2866
2867
2868
2869void os::large_page_init() {
2870  if (!UseLargePages) return;
2871
2872  // print a warning if any large page related flag is specified on command line
2873  bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) ||
2874                         !FLAG_IS_DEFAULT(LargePageSizeInBytes);
2875  bool success = false;
2876
2877# define WARN(msg) if (warn_on_failure) { warning(msg); }
2878  if (resolve_functions_for_large_page_init()) {
2879    if (request_lock_memory_privilege()) {
2880      size_t s = os::Kernel32Dll::GetLargePageMinimum();
2881      if (s) {
2882#if defined(IA32) || defined(AMD64)
2883        if (s > 4*M || LargePageSizeInBytes > 4*M) {
2884          WARN("JVM cannot use large pages bigger than 4mb.");
2885        } else {
2886#endif
2887          if (LargePageSizeInBytes && LargePageSizeInBytes % s == 0) {
2888            _large_page_size = LargePageSizeInBytes;
2889          } else {
2890            _large_page_size = s;
2891          }
2892          success = true;
2893#if defined(IA32) || defined(AMD64)
2894        }
2895#endif
2896      } else {
2897        WARN("Large page is not supported by the processor.");
2898      }
2899    } else {
2900      WARN("JVM cannot use large page memory because it does not have enough privilege to lock pages in memory.");
2901    }
2902  } else {
2903    WARN("Large page is not supported by the operating system.");
2904  }
2905#undef WARN
2906
2907  const size_t default_page_size = (size_t) vm_page_size();
2908  if (success && _large_page_size > default_page_size) {
2909    _page_sizes[0] = _large_page_size;
2910    _page_sizes[1] = default_page_size;
2911    _page_sizes[2] = 0;
2912  }
2913
2914  cleanup_after_large_page_init();
2915  UseLargePages = success;
2916}
2917
2918// On win32, one cannot release just a part of reserved memory, it's an
2919// all or nothing deal.  When we split a reservation, we must break the
2920// reservation into two reservations.
2921void os::split_reserved_memory(char *base, size_t size, size_t split,
2922                              bool realloc) {
2923  if (size > 0) {
2924    release_memory(base, size);
2925    if (realloc) {
2926      reserve_memory(split, base);
2927    }
2928    if (size != split) {
2929      reserve_memory(size - split, base + split);
2930    }
2931  }
2932}
2933
2934char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
2935  assert((size_t)addr % os::vm_allocation_granularity() == 0,
2936         "reserve alignment");
2937  assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size");
2938  char* res;
2939  // note that if UseLargePages is on, all the areas that require interleaving
2940  // will go thru reserve_memory_special rather than thru here.
2941  bool use_individual = (UseNUMAInterleaving && !UseLargePages);
2942  if (!use_individual) {
2943    res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE);
2944  } else {
2945    elapsedTimer reserveTimer;
2946    if( Verbose && PrintMiscellaneous ) reserveTimer.start();
2947    // in numa interleaving, we have to allocate pages individually
2948    // (well really chunks of NUMAInterleaveGranularity size)
2949    res = allocate_pages_individually(bytes, addr, MEM_RESERVE, PAGE_READWRITE);
2950    if (res == NULL) {
2951      warning("NUMA page allocation failed");
2952    }
2953    if( Verbose && PrintMiscellaneous ) {
2954      reserveTimer.stop();
2955      tty->print_cr("reserve_memory of %Ix bytes took %ld ms (%ld ticks)", bytes,
2956                    reserveTimer.milliseconds(), reserveTimer.ticks());
2957    }
2958  }
2959  assert(res == NULL || addr == NULL || addr == res,
2960         "Unexpected address from reserve.");
2961
2962  return res;
2963}
2964
2965// Reserve memory at an arbitrary address, only if that area is
2966// available (and not reserved for something else).
2967char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
2968  // Windows os::reserve_memory() fails of the requested address range is
2969  // not avilable.
2970  return reserve_memory(bytes, requested_addr);
2971}
2972
2973size_t os::large_page_size() {
2974  return _large_page_size;
2975}
2976
2977bool os::can_commit_large_page_memory() {
2978  // Windows only uses large page memory when the entire region is reserved
2979  // and committed in a single VirtualAlloc() call. This may change in the
2980  // future, but with Windows 2003 it's not possible to commit on demand.
2981  return false;
2982}
2983
2984bool os::can_execute_large_page_memory() {
2985  return true;
2986}
2987
2988char* os::reserve_memory_special(size_t bytes, char* addr, bool exec) {
2989
2990  const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
2991  const DWORD flags = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
2992
2993  // with large pages, there are two cases where we need to use Individual Allocation
2994  // 1) the UseLargePagesIndividualAllocation flag is set (set by default on WS2003)
2995  // 2) NUMA Interleaving is enabled, in which case we use a different node for each page
2996  if (UseLargePagesIndividualAllocation || UseNUMAInterleaving) {
2997    if (TracePageSizes && Verbose) {
2998       tty->print_cr("Reserving large pages individually.");
2999    }
3000    char * p_buf = allocate_pages_individually(bytes, addr, flags, prot, LargePagesIndividualAllocationInjectError);
3001    if (p_buf == NULL) {
3002      // give an appropriate warning message
3003      if (UseNUMAInterleaving) {
3004        warning("NUMA large page allocation failed, UseLargePages flag ignored");
3005      }
3006      if (UseLargePagesIndividualAllocation) {
3007        warning("Individually allocated large pages failed, "
3008                "use -XX:-UseLargePagesIndividualAllocation to turn off");
3009      }
3010      return NULL;
3011    }
3012
3013    return p_buf;
3014
3015  } else {
3016    // normal policy just allocate it all at once
3017    DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
3018    char * res = (char *)VirtualAlloc(NULL, bytes, flag, prot);
3019    return res;
3020  }
3021}
3022
3023bool os::release_memory_special(char* base, size_t bytes) {
3024  return release_memory(base, bytes);
3025}
3026
3027void os::print_statistics() {
3028}
3029
3030bool os::commit_memory(char* addr, size_t bytes, bool exec) {
3031  if (bytes == 0) {
3032    // Don't bother the OS with noops.
3033    return true;
3034  }
3035  assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries");
3036  assert(bytes % os::vm_page_size() == 0, "commit in page-sized chunks");
3037  // Don't attempt to print anything if the OS call fails. We're
3038  // probably low on resources, so the print itself may cause crashes.
3039
3040  // unless we have NUMAInterleaving enabled, the range of a commit
3041  // is always within a reserve covered by a single VirtualAlloc
3042  // in that case we can just do a single commit for the requested size
3043  if (!UseNUMAInterleaving) {
3044    if (VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) == NULL) return false;
3045    if (exec) {
3046      DWORD oldprot;
3047      // Windows doc says to use VirtualProtect to get execute permissions
3048      if (!VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &oldprot)) return false;
3049    }
3050    return true;
3051  } else {
3052
3053    // when NUMAInterleaving is enabled, the commit might cover a range that
3054    // came from multiple VirtualAlloc reserves (using allocate_pages_individually).
3055    // VirtualQuery can help us determine that.  The RegionSize that VirtualQuery
3056    // returns represents the number of bytes that can be committed in one step.
3057    size_t bytes_remaining = bytes;
3058    char * next_alloc_addr = addr;
3059    while (bytes_remaining > 0) {
3060      MEMORY_BASIC_INFORMATION alloc_info;
3061      VirtualQuery(next_alloc_addr, &alloc_info, sizeof(alloc_info));
3062      size_t bytes_to_rq = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize);
3063      if (VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_COMMIT, PAGE_READWRITE) == NULL)
3064        return false;
3065      if (exec) {
3066        DWORD oldprot;
3067        if (!VirtualProtect(next_alloc_addr, bytes_to_rq, PAGE_EXECUTE_READWRITE, &oldprot))
3068          return false;
3069      }
3070      bytes_remaining -= bytes_to_rq;
3071      next_alloc_addr += bytes_to_rq;
3072    }
3073  }
3074  // if we made it this far, return true
3075  return true;
3076}
3077
3078bool os::commit_memory(char* addr, size_t size, size_t alignment_hint,
3079                       bool exec) {
3080  return commit_memory(addr, size, exec);
3081}
3082
3083bool os::uncommit_memory(char* addr, size_t bytes) {
3084  if (bytes == 0) {
3085    // Don't bother the OS with noops.
3086    return true;
3087  }
3088  assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries");
3089  assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks");
3090  return VirtualFree(addr, bytes, MEM_DECOMMIT) != 0;
3091}
3092
3093bool os::release_memory(char* addr, size_t bytes) {
3094  return VirtualFree(addr, 0, MEM_RELEASE) != 0;
3095}
3096
3097bool os::create_stack_guard_pages(char* addr, size_t size) {
3098  return os::commit_memory(addr, size);
3099}
3100
3101bool os::remove_stack_guard_pages(char* addr, size_t size) {
3102  return os::uncommit_memory(addr, size);
3103}
3104
3105// Set protections specified
3106bool os::protect_memory(char* addr, size_t bytes, ProtType prot,
3107                        bool is_committed) {
3108  unsigned int p = 0;
3109  switch (prot) {
3110  case MEM_PROT_NONE: p = PAGE_NOACCESS; break;
3111  case MEM_PROT_READ: p = PAGE_READONLY; break;
3112  case MEM_PROT_RW:   p = PAGE_READWRITE; break;
3113  case MEM_PROT_RWX:  p = PAGE_EXECUTE_READWRITE; break;
3114  default:
3115    ShouldNotReachHere();
3116  }
3117
3118  DWORD old_status;
3119
3120  // Strange enough, but on Win32 one can change protection only for committed
3121  // memory, not a big deal anyway, as bytes less or equal than 64K
3122  if (!is_committed && !commit_memory(addr, bytes, prot == MEM_PROT_RWX)) {
3123    fatal("cannot commit protection page");
3124  }
3125  // One cannot use os::guard_memory() here, as on Win32 guard page
3126  // have different (one-shot) semantics, from MSDN on PAGE_GUARD:
3127  //
3128  // Pages in the region become guard pages. Any attempt to access a guard page
3129  // causes the system to raise a STATUS_GUARD_PAGE exception and turn off
3130  // the guard page status. Guard pages thus act as a one-time access alarm.
3131  return VirtualProtect(addr, bytes, p, &old_status) != 0;
3132}
3133
3134bool os::guard_memory(char* addr, size_t bytes) {
3135  DWORD old_status;
3136  return VirtualProtect(addr, bytes, PAGE_READWRITE | PAGE_GUARD, &old_status) != 0;
3137}
3138
3139bool os::unguard_memory(char* addr, size_t bytes) {
3140  DWORD old_status;
3141  return VirtualProtect(addr, bytes, PAGE_READWRITE, &old_status) != 0;
3142}
3143
3144void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
3145void os::free_memory(char *addr, size_t bytes, size_t alignment_hint)    { }
3146void os::numa_make_global(char *addr, size_t bytes)    { }
3147void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint)    { }
3148bool os::numa_topology_changed()                       { return false; }
3149size_t os::numa_get_groups_num()                       { return MAX2(numa_node_list_holder.get_count(), 1); }
3150int os::numa_get_group_id()                            { return 0; }
3151size_t os::numa_get_leaf_groups(int *ids, size_t size) {
3152  if (numa_node_list_holder.get_count() == 0 && size > 0) {
3153    // Provide an answer for UMA systems
3154    ids[0] = 0;
3155    return 1;
3156  } else {
3157    // check for size bigger than actual groups_num
3158    size = MIN2(size, numa_get_groups_num());
3159    for (int i = 0; i < (int)size; i++) {
3160      ids[i] = numa_node_list_holder.get_node_list_entry(i);
3161    }
3162    return size;
3163  }
3164}
3165
3166bool os::get_page_info(char *start, page_info* info) {
3167  return false;
3168}
3169
3170char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
3171  return end;
3172}
3173
3174char* os::non_memory_address_word() {
3175  // Must never look like an address returned by reserve_memory,
3176  // even in its subfields (as defined by the CPU immediate fields,
3177  // if the CPU splits constants across multiple instructions).
3178  return (char*)-1;
3179}
3180
3181#define MAX_ERROR_COUNT 100
3182#define SYS_THREAD_ERROR 0xffffffffUL
3183
3184void os::pd_start_thread(Thread* thread) {
3185  DWORD ret = ResumeThread(thread->osthread()->thread_handle());
3186  // Returns previous suspend state:
3187  // 0:  Thread was not suspended
3188  // 1:  Thread is running now
3189  // >1: Thread is still suspended.
3190  assert(ret != SYS_THREAD_ERROR, "StartThread failed"); // should propagate back
3191}
3192
3193class HighResolutionInterval {
3194  // The default timer resolution seems to be 10 milliseconds.
3195  // (Where is this written down?)
3196  // If someone wants to sleep for only a fraction of the default,
3197  // then we set the timer resolution down to 1 millisecond for
3198  // the duration of their interval.
3199  // We carefully set the resolution back, since otherwise we
3200  // seem to incur an overhead (3%?) that we don't need.
3201  // CONSIDER: if ms is small, say 3, then we should run with a high resolution time.
3202  // Buf if ms is large, say 500, or 503, we should avoid the call to timeBeginPeriod().
3203  // Alternatively, we could compute the relative error (503/500 = .6%) and only use
3204  // timeBeginPeriod() if the relative error exceeded some threshold.
3205  // timeBeginPeriod() has been linked to problems with clock drift on win32 systems and
3206  // to decreased efficiency related to increased timer "tick" rates.  We want to minimize
3207  // (a) calls to timeBeginPeriod() and timeEndPeriod() and (b) time spent with high
3208  // resolution timers running.
3209private:
3210    jlong resolution;
3211public:
3212  HighResolutionInterval(jlong ms) {
3213    resolution = ms % 10L;
3214    if (resolution != 0) {
3215      MMRESULT result = timeBeginPeriod(1L);
3216    }
3217  }
3218  ~HighResolutionInterval() {
3219    if (resolution != 0) {
3220      MMRESULT result = timeEndPeriod(1L);
3221    }
3222    resolution = 0L;
3223  }
3224};
3225
3226int os::sleep(Thread* thread, jlong ms, bool interruptable) {
3227  jlong limit = (jlong) MAXDWORD;
3228
3229  while(ms > limit) {
3230    int res;
3231    if ((res = sleep(thread, limit, interruptable)) != OS_TIMEOUT)
3232      return res;
3233    ms -= limit;
3234  }
3235
3236  assert(thread == Thread::current(),  "thread consistency check");
3237  OSThread* osthread = thread->osthread();
3238  OSThreadWaitState osts(osthread, false /* not Object.wait() */);
3239  int result;
3240  if (interruptable) {
3241    assert(thread->is_Java_thread(), "must be java thread");
3242    JavaThread *jt = (JavaThread *) thread;
3243    ThreadBlockInVM tbivm(jt);
3244
3245    jt->set_suspend_equivalent();
3246    // cleared by handle_special_suspend_equivalent_condition() or
3247    // java_suspend_self() via check_and_wait_while_suspended()
3248
3249    HANDLE events[1];
3250    events[0] = osthread->interrupt_event();
3251    HighResolutionInterval *phri=NULL;
3252    if(!ForceTimeHighResolution)
3253      phri = new HighResolutionInterval( ms );
3254    if (WaitForMultipleObjects(1, events, FALSE, (DWORD)ms) == WAIT_TIMEOUT) {
3255      result = OS_TIMEOUT;
3256    } else {
3257      ResetEvent(osthread->interrupt_event());
3258      osthread->set_interrupted(false);
3259      result = OS_INTRPT;
3260    }
3261    delete phri; //if it is NULL, harmless
3262
3263    // were we externally suspended while we were waiting?
3264    jt->check_and_wait_while_suspended();
3265  } else {
3266    assert(!thread->is_Java_thread(), "must not be java thread");
3267    Sleep((long) ms);
3268    result = OS_TIMEOUT;
3269  }
3270  return result;
3271}
3272
3273// Sleep forever; naked call to OS-specific sleep; use with CAUTION
3274void os::infinite_sleep() {
3275  while (true) {    // sleep forever ...
3276    Sleep(100000);  // ... 100 seconds at a time
3277  }
3278}
3279
3280typedef BOOL (WINAPI * STTSignature)(void) ;
3281
3282os::YieldResult os::NakedYield() {
3283  // Use either SwitchToThread() or Sleep(0)
3284  // Consider passing back the return value from SwitchToThread().
3285  if (os::Kernel32Dll::SwitchToThreadAvailable()) {
3286    return SwitchToThread() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ;
3287  } else {
3288    Sleep(0);
3289  }
3290  return os::YIELD_UNKNOWN ;
3291}
3292
3293void os::yield() {  os::NakedYield(); }
3294
3295void os::yield_all(int attempts) {
3296  // Yields to all threads, including threads with lower priorities
3297  Sleep(1);
3298}
3299
3300// Win32 only gives you access to seven real priorities at a time,
3301// so we compress Java's ten down to seven.  It would be better
3302// if we dynamically adjusted relative priorities.
3303
3304int os::java_to_os_priority[CriticalPriority + 1] = {
3305  THREAD_PRIORITY_IDLE,                         // 0  Entry should never be used
3306  THREAD_PRIORITY_LOWEST,                       // 1  MinPriority
3307  THREAD_PRIORITY_LOWEST,                       // 2
3308  THREAD_PRIORITY_BELOW_NORMAL,                 // 3
3309  THREAD_PRIORITY_BELOW_NORMAL,                 // 4
3310  THREAD_PRIORITY_NORMAL,                       // 5  NormPriority
3311  THREAD_PRIORITY_NORMAL,                       // 6
3312  THREAD_PRIORITY_ABOVE_NORMAL,                 // 7
3313  THREAD_PRIORITY_ABOVE_NORMAL,                 // 8
3314  THREAD_PRIORITY_HIGHEST,                      // 9  NearMaxPriority
3315  THREAD_PRIORITY_HIGHEST,                      // 10 MaxPriority
3316  THREAD_PRIORITY_HIGHEST                       // 11 CriticalPriority
3317};
3318
3319int prio_policy1[CriticalPriority + 1] = {
3320  THREAD_PRIORITY_IDLE,                         // 0  Entry should never be used
3321  THREAD_PRIORITY_LOWEST,                       // 1  MinPriority
3322  THREAD_PRIORITY_LOWEST,                       // 2
3323  THREAD_PRIORITY_BELOW_NORMAL,                 // 3
3324  THREAD_PRIORITY_BELOW_NORMAL,                 // 4
3325  THREAD_PRIORITY_NORMAL,                       // 5  NormPriority
3326  THREAD_PRIORITY_ABOVE_NORMAL,                 // 6
3327  THREAD_PRIORITY_ABOVE_NORMAL,                 // 7
3328  THREAD_PRIORITY_HIGHEST,                      // 8
3329  THREAD_PRIORITY_HIGHEST,                      // 9  NearMaxPriority
3330  THREAD_PRIORITY_TIME_CRITICAL,                // 10 MaxPriority
3331  THREAD_PRIORITY_TIME_CRITICAL                 // 11 CriticalPriority
3332};
3333
3334static int prio_init() {
3335  // If ThreadPriorityPolicy is 1, switch tables
3336  if (ThreadPriorityPolicy == 1) {
3337    int i;
3338    for (i = 0; i < CriticalPriority + 1; i++) {
3339      os::java_to_os_priority[i] = prio_policy1[i];
3340    }
3341  }
3342  if (UseCriticalJavaThreadPriority) {
3343    os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority] ;
3344  }
3345  return 0;
3346}
3347
3348OSReturn os::set_native_priority(Thread* thread, int priority) {
3349  if (!UseThreadPriorities) return OS_OK;
3350  bool ret = SetThreadPriority(thread->osthread()->thread_handle(), priority) != 0;
3351  return ret ? OS_OK : OS_ERR;
3352}
3353
3354OSReturn os::get_native_priority(const Thread* const thread, int* priority_ptr) {
3355  if ( !UseThreadPriorities ) {
3356    *priority_ptr = java_to_os_priority[NormPriority];
3357    return OS_OK;
3358  }
3359  int os_prio = GetThreadPriority(thread->osthread()->thread_handle());
3360  if (os_prio == THREAD_PRIORITY_ERROR_RETURN) {
3361    assert(false, "GetThreadPriority failed");
3362    return OS_ERR;
3363  }
3364  *priority_ptr = os_prio;
3365  return OS_OK;
3366}
3367
3368
3369// Hint to the underlying OS that a task switch would not be good.
3370// Void return because it's a hint and can fail.
3371void os::hint_no_preempt() {}
3372
3373void os::interrupt(Thread* thread) {
3374  assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
3375         "possibility of dangling Thread pointer");
3376
3377  OSThread* osthread = thread->osthread();
3378  osthread->set_interrupted(true);
3379  // More than one thread can get here with the same value of osthread,
3380  // resulting in multiple notifications.  We do, however, want the store
3381  // to interrupted() to be visible to other threads before we post
3382  // the interrupt event.
3383  OrderAccess::release();
3384  SetEvent(osthread->interrupt_event());
3385  // For JSR166:  unpark after setting status
3386  if (thread->is_Java_thread())
3387    ((JavaThread*)thread)->parker()->unpark();
3388
3389  ParkEvent * ev = thread->_ParkEvent ;
3390  if (ev != NULL) ev->unpark() ;
3391
3392}
3393
3394
3395bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
3396  assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
3397         "possibility of dangling Thread pointer");
3398
3399  OSThread* osthread = thread->osthread();
3400  bool interrupted = osthread->interrupted();
3401  // There is no synchronization between the setting of the interrupt
3402  // and it being cleared here. It is critical - see 6535709 - that
3403  // we only clear the interrupt state, and reset the interrupt event,
3404  // if we are going to report that we were indeed interrupted - else
3405  // an interrupt can be "lost", leading to spurious wakeups or lost wakeups
3406  // depending on the timing
3407  if (interrupted && clear_interrupted) {
3408    osthread->set_interrupted(false);
3409    ResetEvent(osthread->interrupt_event());
3410  } // Otherwise leave the interrupted state alone
3411
3412  return interrupted;
3413}
3414
3415// Get's a pc (hint) for a running thread. Currently used only for profiling.
3416ExtendedPC os::get_thread_pc(Thread* thread) {
3417  CONTEXT context;
3418  context.ContextFlags = CONTEXT_CONTROL;
3419  HANDLE handle = thread->osthread()->thread_handle();
3420#ifdef _M_IA64
3421  assert(0, "Fix get_thread_pc");
3422  return ExtendedPC(NULL);
3423#else
3424  if (GetThreadContext(handle, &context)) {
3425#ifdef _M_AMD64
3426    return ExtendedPC((address) context.Rip);
3427#else
3428    return ExtendedPC((address) context.Eip);
3429#endif
3430  } else {
3431    return ExtendedPC(NULL);
3432  }
3433#endif
3434}
3435
3436// GetCurrentThreadId() returns DWORD
3437intx os::current_thread_id()          { return GetCurrentThreadId(); }
3438
3439static int _initial_pid = 0;
3440
3441int os::current_process_id()
3442{
3443  return (_initial_pid ? _initial_pid : _getpid());
3444}
3445
3446int    os::win32::_vm_page_size       = 0;
3447int    os::win32::_vm_allocation_granularity = 0;
3448int    os::win32::_processor_type     = 0;
3449// Processor level is not available on non-NT systems, use vm_version instead
3450int    os::win32::_processor_level    = 0;
3451julong os::win32::_physical_memory    = 0;
3452size_t os::win32::_default_stack_size = 0;
3453
3454         intx os::win32::_os_thread_limit    = 0;
3455volatile intx os::win32::_os_thread_count    = 0;
3456
3457bool   os::win32::_is_nt              = false;
3458bool   os::win32::_is_windows_2003    = false;
3459bool   os::win32::_is_windows_server  = false;
3460
3461void os::win32::initialize_system_info() {
3462  SYSTEM_INFO si;
3463  GetSystemInfo(&si);
3464  _vm_page_size    = si.dwPageSize;
3465  _vm_allocation_granularity = si.dwAllocationGranularity;
3466  _processor_type  = si.dwProcessorType;
3467  _processor_level = si.wProcessorLevel;
3468  set_processor_count(si.dwNumberOfProcessors);
3469
3470  MEMORYSTATUSEX ms;
3471  ms.dwLength = sizeof(ms);
3472
3473  // also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual,
3474  // dwMemoryLoad (% of memory in use)
3475  GlobalMemoryStatusEx(&ms);
3476  _physical_memory = ms.ullTotalPhys;
3477
3478  OSVERSIONINFOEX oi;
3479  oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
3480  GetVersionEx((OSVERSIONINFO*)&oi);
3481  switch(oi.dwPlatformId) {
3482    case VER_PLATFORM_WIN32_WINDOWS: _is_nt = false; break;
3483    case VER_PLATFORM_WIN32_NT:
3484      _is_nt = true;
3485      {
3486        int os_vers = oi.dwMajorVersion * 1000 + oi.dwMinorVersion;
3487        if (os_vers == 5002) {
3488          _is_windows_2003 = true;
3489        }
3490        if (oi.wProductType == VER_NT_DOMAIN_CONTROLLER ||
3491          oi.wProductType == VER_NT_SERVER) {
3492            _is_windows_server = true;
3493        }
3494      }
3495      break;
3496    default: fatal("Unknown platform");
3497  }
3498
3499  _default_stack_size = os::current_stack_size();
3500  assert(_default_stack_size > (size_t) _vm_page_size, "invalid stack size");
3501  assert((_default_stack_size & (_vm_page_size - 1)) == 0,
3502    "stack size not a multiple of page size");
3503
3504  initialize_performance_counter();
3505
3506  // Win95/Win98 scheduler bug work-around. The Win95/98 scheduler is
3507  // known to deadlock the system, if the VM issues to thread operations with
3508  // a too high frequency, e.g., such as changing the priorities.
3509  // The 6000 seems to work well - no deadlocks has been notices on the test
3510  // programs that we have seen experience this problem.
3511  if (!os::win32::is_nt()) {
3512    StarvationMonitorInterval = 6000;
3513  }
3514}
3515
3516
3517HINSTANCE os::win32::load_Windows_dll(const char* name, char *ebuf, int ebuflen) {
3518  char path[MAX_PATH];
3519  DWORD size;
3520  DWORD pathLen = (DWORD)sizeof(path);
3521  HINSTANCE result = NULL;
3522
3523  // only allow library name without path component
3524  assert(strchr(name, '\\') == NULL, "path not allowed");
3525  assert(strchr(name, ':') == NULL, "path not allowed");
3526  if (strchr(name, '\\') != NULL || strchr(name, ':') != NULL) {
3527    jio_snprintf(ebuf, ebuflen,
3528      "Invalid parameter while calling os::win32::load_windows_dll(): cannot take path: %s", name);
3529    return NULL;
3530  }
3531
3532  // search system directory
3533  if ((size = GetSystemDirectory(path, pathLen)) > 0) {
3534    strcat(path, "\\");
3535    strcat(path, name);
3536    if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
3537      return result;
3538    }
3539  }
3540
3541  // try Windows directory
3542  if ((size = GetWindowsDirectory(path, pathLen)) > 0) {
3543    strcat(path, "\\");
3544    strcat(path, name);
3545    if ((result = (HINSTANCE)os::dll_load(path, ebuf, ebuflen)) != NULL) {
3546      return result;
3547    }
3548  }
3549
3550  jio_snprintf(ebuf, ebuflen,
3551    "os::win32::load_windows_dll() cannot load %s from system directories.", name);
3552  return NULL;
3553}
3554
3555void os::win32::setmode_streams() {
3556  _setmode(_fileno(stdin), _O_BINARY);
3557  _setmode(_fileno(stdout), _O_BINARY);
3558  _setmode(_fileno(stderr), _O_BINARY);
3559}
3560
3561
3562bool os::is_debugger_attached() {
3563  return IsDebuggerPresent() ? true : false;
3564}
3565
3566
3567void os::wait_for_keypress_at_exit(void) {
3568  if (PauseAtExit) {
3569    fprintf(stderr, "Press any key to continue...\n");
3570    fgetc(stdin);
3571  }
3572}
3573
3574
3575int os::message_box(const char* title, const char* message) {
3576  int result = MessageBox(NULL, message, title,
3577                          MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY);
3578  return result == IDYES;
3579}
3580
3581int os::allocate_thread_local_storage() {
3582  return TlsAlloc();
3583}
3584
3585
3586void os::free_thread_local_storage(int index) {
3587  TlsFree(index);
3588}
3589
3590
3591void os::thread_local_storage_at_put(int index, void* value) {
3592  TlsSetValue(index, value);
3593  assert(thread_local_storage_at(index) == value, "Just checking");
3594}
3595
3596
3597void* os::thread_local_storage_at(int index) {
3598  return TlsGetValue(index);
3599}
3600
3601
3602#ifndef PRODUCT
3603#ifndef _WIN64
3604// Helpers to check whether NX protection is enabled
3605int nx_exception_filter(_EXCEPTION_POINTERS *pex) {
3606  if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
3607      pex->ExceptionRecord->NumberParameters > 0 &&
3608      pex->ExceptionRecord->ExceptionInformation[0] ==
3609      EXCEPTION_INFO_EXEC_VIOLATION) {
3610    return EXCEPTION_EXECUTE_HANDLER;
3611  }
3612  return EXCEPTION_CONTINUE_SEARCH;
3613}
3614
3615void nx_check_protection() {
3616  // If NX is enabled we'll get an exception calling into code on the stack
3617  char code[] = { (char)0xC3 }; // ret
3618  void *code_ptr = (void *)code;
3619  __try {
3620    __asm call code_ptr
3621  } __except(nx_exception_filter((_EXCEPTION_POINTERS*)_exception_info())) {
3622    tty->print_raw_cr("NX protection detected.");
3623  }
3624}
3625#endif // _WIN64
3626#endif // PRODUCT
3627
3628// this is called _before_ the global arguments have been parsed
3629void os::init(void) {
3630  _initial_pid = _getpid();
3631
3632  init_random(1234567);
3633
3634  win32::initialize_system_info();
3635  win32::setmode_streams();
3636  init_page_sizes((size_t) win32::vm_page_size());
3637
3638  // For better scalability on MP systems (must be called after initialize_system_info)
3639#ifndef PRODUCT
3640  if (is_MP()) {
3641    NoYieldsInMicrolock = true;
3642  }
3643#endif
3644  // This may be overridden later when argument processing is done.
3645  FLAG_SET_ERGO(bool, UseLargePagesIndividualAllocation,
3646    os::win32::is_windows_2003());
3647
3648  // Initialize main_process and main_thread
3649  main_process = GetCurrentProcess();  // Remember main_process is a pseudo handle
3650 if (!DuplicateHandle(main_process, GetCurrentThread(), main_process,
3651                       &main_thread, THREAD_ALL_ACCESS, false, 0)) {
3652    fatal("DuplicateHandle failed\n");
3653  }
3654  main_thread_id = (int) GetCurrentThreadId();
3655}
3656
3657// To install functions for atexit processing
3658extern "C" {
3659  static void perfMemory_exit_helper() {
3660    perfMemory_exit();
3661  }
3662}
3663
3664// this is called _after_ the global arguments have been parsed
3665jint os::init_2(void) {
3666  // Allocate a single page and mark it as readable for safepoint polling
3667  address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY);
3668  guarantee( polling_page != NULL, "Reserve Failed for polling page");
3669
3670  address return_page  = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY);
3671  guarantee( return_page != NULL, "Commit Failed for polling page");
3672
3673  os::set_polling_page( polling_page );
3674
3675#ifndef PRODUCT
3676  if( Verbose && PrintMiscellaneous )
3677    tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
3678#endif
3679
3680  if (!UseMembar) {
3681    address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE);
3682    guarantee( mem_serialize_page != NULL, "Reserve Failed for memory serialize page");
3683
3684    return_page  = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE);
3685    guarantee( return_page != NULL, "Commit Failed for memory serialize page");
3686
3687    os::set_memory_serialize_page( mem_serialize_page );
3688
3689#ifndef PRODUCT
3690    if(Verbose && PrintMiscellaneous)
3691      tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
3692#endif
3693  }
3694
3695  os::large_page_init();
3696
3697  // Setup Windows Exceptions
3698
3699  // On Itanium systems, Structured Exception Handling does not
3700  // work since stack frames must be walkable by the OS.  Since
3701  // much of our code is dynamically generated, and we do not have
3702  // proper unwind .xdata sections, the system simply exits
3703  // rather than delivering the exception.  To work around
3704  // this we use VectorExceptions instead.
3705#ifdef _WIN64
3706  if (UseVectoredExceptions) {
3707    topLevelVectoredExceptionHandler = AddVectoredExceptionHandler( 1, topLevelExceptionFilter);
3708  }
3709#endif
3710
3711  // for debugging float code generation bugs
3712  if (ForceFloatExceptions) {
3713#ifndef  _WIN64
3714    static long fp_control_word = 0;
3715    __asm { fstcw fp_control_word }
3716    // see Intel PPro Manual, Vol. 2, p 7-16
3717    const long precision = 0x20;
3718    const long underflow = 0x10;
3719    const long overflow  = 0x08;
3720    const long zero_div  = 0x04;
3721    const long denorm    = 0x02;
3722    const long invalid   = 0x01;
3723    fp_control_word |= invalid;
3724    __asm { fldcw fp_control_word }
3725#endif
3726  }
3727
3728  // If stack_commit_size is 0, windows will reserve the default size,
3729  // but only commit a small portion of it.
3730  size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size());
3731  size_t default_reserve_size = os::win32::default_stack_size();
3732  size_t actual_reserve_size = stack_commit_size;
3733  if (stack_commit_size < default_reserve_size) {
3734    // If stack_commit_size == 0, we want this too
3735    actual_reserve_size = default_reserve_size;
3736  }
3737
3738  // Check minimum allowable stack size for thread creation and to initialize
3739  // the java system classes, including StackOverflowError - depends on page
3740  // size.  Add a page for compiler2 recursion in main thread.
3741  // Add in 2*BytesPerWord times page size to account for VM stack during
3742  // class initialization depending on 32 or 64 bit VM.
3743  size_t min_stack_allowed =
3744            (size_t)(StackYellowPages+StackRedPages+StackShadowPages+
3745            2*BytesPerWord COMPILER2_PRESENT(+1)) * os::vm_page_size();
3746  if (actual_reserve_size < min_stack_allowed) {
3747    tty->print_cr("\nThe stack size specified is too small, "
3748                  "Specify at least %dk",
3749                  min_stack_allowed / K);
3750    return JNI_ERR;
3751  }
3752
3753  JavaThread::set_stack_size_at_create(stack_commit_size);
3754
3755  // Calculate theoretical max. size of Threads to guard gainst artifical
3756  // out-of-memory situations, where all available address-space has been
3757  // reserved by thread stacks.
3758  assert(actual_reserve_size != 0, "Must have a stack");
3759
3760  // Calculate the thread limit when we should start doing Virtual Memory
3761  // banging. Currently when the threads will have used all but 200Mb of space.
3762  //
3763  // TODO: consider performing a similar calculation for commit size instead
3764  // as reserve size, since on a 64-bit platform we'll run into that more
3765  // often than running out of virtual memory space.  We can use the
3766  // lower value of the two calculations as the os_thread_limit.
3767  size_t max_address_space = ((size_t)1 << (BitsPerWord - 1)) - (200 * K * K);
3768  win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size);
3769
3770  // at exit methods are called in the reverse order of their registration.
3771  // there is no limit to the number of functions registered. atexit does
3772  // not set errno.
3773
3774  if (PerfAllowAtExitRegistration) {
3775    // only register atexit functions if PerfAllowAtExitRegistration is set.
3776    // atexit functions can be delayed until process exit time, which
3777    // can be problematic for embedded VM situations. Embedded VMs should
3778    // call DestroyJavaVM() to assure that VM resources are released.
3779
3780    // note: perfMemory_exit_helper atexit function may be removed in
3781    // the future if the appropriate cleanup code can be added to the
3782    // VM_Exit VMOperation's doit method.
3783    if (atexit(perfMemory_exit_helper) != 0) {
3784      warning("os::init_2 atexit(perfMemory_exit_helper) failed");
3785    }
3786  }
3787
3788#ifndef _WIN64
3789  // Print something if NX is enabled (win32 on AMD64)
3790  NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection());
3791#endif
3792
3793  // initialize thread priority policy
3794  prio_init();
3795
3796  if (UseNUMA && !ForceNUMA) {
3797    UseNUMA = false; // We don't fully support this yet
3798  }
3799
3800  if (UseNUMAInterleaving) {
3801    // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag
3802    bool success = numa_interleaving_init();
3803    if (!success) UseNUMAInterleaving = false;
3804  }
3805
3806  return JNI_OK;
3807}
3808
3809void os::init_3(void) {
3810  return;
3811}
3812
3813// Mark the polling page as unreadable
3814void os::make_polling_page_unreadable(void) {
3815  DWORD old_status;
3816  if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_NOACCESS, &old_status) )
3817    fatal("Could not disable polling page");
3818};
3819
3820// Mark the polling page as readable
3821void os::make_polling_page_readable(void) {
3822  DWORD old_status;
3823  if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_READONLY, &old_status) )
3824    fatal("Could not enable polling page");
3825};
3826
3827
3828int os::stat(const char *path, struct stat *sbuf) {
3829  char pathbuf[MAX_PATH];
3830  if (strlen(path) > MAX_PATH - 1) {
3831    errno = ENAMETOOLONG;
3832    return -1;
3833  }
3834  os::native_path(strcpy(pathbuf, path));
3835  int ret = ::stat(pathbuf, sbuf);
3836  if (sbuf != NULL && UseUTCFileTimestamp) {
3837    // Fix for 6539723.  st_mtime returned from stat() is dependent on
3838    // the system timezone and so can return different values for the
3839    // same file if/when daylight savings time changes.  This adjustment
3840    // makes sure the same timestamp is returned regardless of the TZ.
3841    //
3842    // See:
3843    // http://msdn.microsoft.com/library/
3844    //   default.asp?url=/library/en-us/sysinfo/base/
3845    //   time_zone_information_str.asp
3846    // and
3847    // http://msdn.microsoft.com/library/default.asp?url=
3848    //   /library/en-us/sysinfo/base/settimezoneinformation.asp
3849    //
3850    // NOTE: there is a insidious bug here:  If the timezone is changed
3851    // after the call to stat() but before 'GetTimeZoneInformation()', then
3852    // the adjustment we do here will be wrong and we'll return the wrong
3853    // value (which will likely end up creating an invalid class data
3854    // archive).  Absent a better API for this, or some time zone locking
3855    // mechanism, we'll have to live with this risk.
3856    TIME_ZONE_INFORMATION tz;
3857    DWORD tzid = GetTimeZoneInformation(&tz);
3858    int daylightBias =
3859      (tzid == TIME_ZONE_ID_DAYLIGHT) ?  tz.DaylightBias : tz.StandardBias;
3860    sbuf->st_mtime += (tz.Bias + daylightBias) * 60;
3861  }
3862  return ret;
3863}
3864
3865
3866#define FT2INT64(ft) \
3867  ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime))
3868
3869
3870// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
3871// are used by JVM M&M and JVMTI to get user+sys or user CPU time
3872// of a thread.
3873//
3874// current_thread_cpu_time() and thread_cpu_time(Thread*) returns
3875// the fast estimate available on the platform.
3876
3877// current_thread_cpu_time() is not optimized for Windows yet
3878jlong os::current_thread_cpu_time() {
3879  // return user + sys since the cost is the same
3880  return os::thread_cpu_time(Thread::current(), true /* user+sys */);
3881}
3882
3883jlong os::thread_cpu_time(Thread* thread) {
3884  // consistent with what current_thread_cpu_time() returns.
3885  return os::thread_cpu_time(thread, true /* user+sys */);
3886}
3887
3888jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
3889  return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
3890}
3891
3892jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) {
3893  // This code is copy from clasic VM -> hpi::sysThreadCPUTime
3894  // If this function changes, os::is_thread_cpu_time_supported() should too
3895  if (os::win32::is_nt()) {
3896    FILETIME CreationTime;
3897    FILETIME ExitTime;
3898    FILETIME KernelTime;
3899    FILETIME UserTime;
3900
3901    if ( GetThreadTimes(thread->osthread()->thread_handle(),
3902                    &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
3903      return -1;
3904    else
3905      if (user_sys_cpu_time) {
3906        return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100;
3907      } else {
3908        return FT2INT64(UserTime) * 100;
3909      }
3910  } else {
3911    return (jlong) timeGetTime() * 1000000;
3912  }
3913}
3914
3915void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
3916  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
3917  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
3918  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
3919  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
3920}
3921
3922void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
3923  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
3924  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
3925  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
3926  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
3927}
3928
3929bool os::is_thread_cpu_time_supported() {
3930  // see os::thread_cpu_time
3931  if (os::win32::is_nt()) {
3932    FILETIME CreationTime;
3933    FILETIME ExitTime;
3934    FILETIME KernelTime;
3935    FILETIME UserTime;
3936
3937    if ( GetThreadTimes(GetCurrentThread(),
3938                    &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
3939      return false;
3940    else
3941      return true;
3942  } else {
3943    return false;
3944  }
3945}
3946
3947// Windows does't provide a loadavg primitive so this is stubbed out for now.
3948// It does have primitives (PDH API) to get CPU usage and run queue length.
3949// "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length"
3950// If we wanted to implement loadavg on Windows, we have a few options:
3951//
3952// a) Query CPU usage and run queue length and "fake" an answer by
3953//    returning the CPU usage if it's under 100%, and the run queue
3954//    length otherwise.  It turns out that querying is pretty slow
3955//    on Windows, on the order of 200 microseconds on a fast machine.
3956//    Note that on the Windows the CPU usage value is the % usage
3957//    since the last time the API was called (and the first call
3958//    returns 100%), so we'd have to deal with that as well.
3959//
3960// b) Sample the "fake" answer using a sampling thread and store
3961//    the answer in a global variable.  The call to loadavg would
3962//    just return the value of the global, avoiding the slow query.
3963//
3964// c) Sample a better answer using exponential decay to smooth the
3965//    value.  This is basically the algorithm used by UNIX kernels.
3966//
3967// Note that sampling thread starvation could affect both (b) and (c).
3968int os::loadavg(double loadavg[], int nelem) {
3969  return -1;
3970}
3971
3972
3973// DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield()
3974bool os::dont_yield() {
3975  return DontYieldALot;
3976}
3977
3978// This method is a slightly reworked copy of JDK's sysOpen
3979// from src/windows/hpi/src/sys_api_md.c
3980
3981int os::open(const char *path, int oflag, int mode) {
3982  char pathbuf[MAX_PATH];
3983
3984  if (strlen(path) > MAX_PATH - 1) {
3985    errno = ENAMETOOLONG;
3986          return -1;
3987  }
3988  os::native_path(strcpy(pathbuf, path));
3989  return ::open(pathbuf, oflag | O_BINARY | O_NOINHERIT, mode);
3990}
3991
3992// Is a (classpath) directory empty?
3993bool os::dir_is_empty(const char* path) {
3994  WIN32_FIND_DATA fd;
3995  HANDLE f = FindFirstFile(path, &fd);
3996  if (f == INVALID_HANDLE_VALUE) {
3997    return true;
3998  }
3999  FindClose(f);
4000  return false;
4001}
4002
4003// create binary file, rewriting existing file if required
4004int os::create_binary_file(const char* path, bool rewrite_existing) {
4005  int oflags = _O_CREAT | _O_WRONLY | _O_BINARY;
4006  if (!rewrite_existing) {
4007    oflags |= _O_EXCL;
4008  }
4009  return ::open(path, oflags, _S_IREAD | _S_IWRITE);
4010}
4011
4012// return current position of file pointer
4013jlong os::current_file_offset(int fd) {
4014  return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR);
4015}
4016
4017// move file pointer to the specified offset
4018jlong os::seek_to_file_offset(int fd, jlong offset) {
4019  return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET);
4020}
4021
4022
4023jlong os::lseek(int fd, jlong offset, int whence) {
4024  return (jlong) ::_lseeki64(fd, offset, whence);
4025}
4026
4027// This method is a slightly reworked copy of JDK's sysNativePath
4028// from src/windows/hpi/src/path_md.c
4029
4030/* Convert a pathname to native format.  On win32, this involves forcing all
4031   separators to be '\\' rather than '/' (both are legal inputs, but Win95
4032   sometimes rejects '/') and removing redundant separators.  The input path is
4033   assumed to have been converted into the character encoding used by the local
4034   system.  Because this might be a double-byte encoding, care is taken to
4035   treat double-byte lead characters correctly.
4036
4037   This procedure modifies the given path in place, as the result is never
4038   longer than the original.  There is no error return; this operation always
4039   succeeds. */
4040char * os::native_path(char *path) {
4041  char *src = path, *dst = path, *end = path;
4042  char *colon = NULL;           /* If a drive specifier is found, this will
4043                                        point to the colon following the drive
4044                                        letter */
4045
4046  /* Assumption: '/', '\\', ':', and drive letters are never lead bytes */
4047  assert(((!::IsDBCSLeadByte('/'))
4048    && (!::IsDBCSLeadByte('\\'))
4049    && (!::IsDBCSLeadByte(':'))),
4050    "Illegal lead byte");
4051
4052  /* Check for leading separators */
4053#define isfilesep(c) ((c) == '/' || (c) == '\\')
4054  while (isfilesep(*src)) {
4055    src++;
4056  }
4057
4058  if (::isalpha(*src) && !::IsDBCSLeadByte(*src) && src[1] == ':') {
4059    /* Remove leading separators if followed by drive specifier.  This
4060      hack is necessary to support file URLs containing drive
4061      specifiers (e.g., "file://c:/path").  As a side effect,
4062      "/c:/path" can be used as an alternative to "c:/path". */
4063    *dst++ = *src++;
4064    colon = dst;
4065    *dst++ = ':';
4066    src++;
4067  } else {
4068    src = path;
4069    if (isfilesep(src[0]) && isfilesep(src[1])) {
4070      /* UNC pathname: Retain first separator; leave src pointed at
4071         second separator so that further separators will be collapsed
4072         into the second separator.  The result will be a pathname
4073         beginning with "\\\\" followed (most likely) by a host name. */
4074      src = dst = path + 1;
4075      path[0] = '\\';     /* Force first separator to '\\' */
4076    }
4077  }
4078
4079  end = dst;
4080
4081  /* Remove redundant separators from remainder of path, forcing all
4082      separators to be '\\' rather than '/'. Also, single byte space
4083      characters are removed from the end of the path because those
4084      are not legal ending characters on this operating system.
4085  */
4086  while (*src != '\0') {
4087    if (isfilesep(*src)) {
4088      *dst++ = '\\'; src++;
4089      while (isfilesep(*src)) src++;
4090      if (*src == '\0') {
4091        /* Check for trailing separator */
4092        end = dst;
4093        if (colon == dst - 2) break;                      /* "z:\\" */
4094        if (dst == path + 1) break;                       /* "\\" */
4095        if (dst == path + 2 && isfilesep(path[0])) {
4096          /* "\\\\" is not collapsed to "\\" because "\\\\" marks the
4097            beginning of a UNC pathname.  Even though it is not, by
4098            itself, a valid UNC pathname, we leave it as is in order
4099            to be consistent with the path canonicalizer as well
4100            as the win32 APIs, which treat this case as an invalid
4101            UNC pathname rather than as an alias for the root
4102            directory of the current drive. */
4103          break;
4104        }
4105        end = --dst;  /* Path does not denote a root directory, so
4106                                    remove trailing separator */
4107        break;
4108      }
4109      end = dst;
4110    } else {
4111      if (::IsDBCSLeadByte(*src)) { /* Copy a double-byte character */
4112        *dst++ = *src++;
4113        if (*src) *dst++ = *src++;
4114        end = dst;
4115      } else {         /* Copy a single-byte character */
4116        char c = *src++;
4117        *dst++ = c;
4118        /* Space is not a legal ending character */
4119        if (c != ' ') end = dst;
4120      }
4121    }
4122  }
4123
4124  *end = '\0';
4125
4126  /* For "z:", add "." to work around a bug in the C runtime library */
4127  if (colon == dst - 1) {
4128          path[2] = '.';
4129          path[3] = '\0';
4130  }
4131
4132  #ifdef DEBUG
4133    jio_fprintf(stderr, "sysNativePath: %s\n", path);
4134  #endif DEBUG
4135  return path;
4136}
4137
4138// This code is a copy of JDK's sysSetLength
4139// from src/windows/hpi/src/sys_api_md.c
4140
4141int os::ftruncate(int fd, jlong length) {
4142  HANDLE h = (HANDLE)::_get_osfhandle(fd);
4143  long high = (long)(length >> 32);
4144  DWORD ret;
4145
4146  if (h == (HANDLE)(-1)) {
4147    return -1;
4148  }
4149
4150  ret = ::SetFilePointer(h, (long)(length), &high, FILE_BEGIN);
4151  if ((ret == 0xFFFFFFFF) && (::GetLastError() != NO_ERROR)) {
4152      return -1;
4153  }
4154
4155  if (::SetEndOfFile(h) == FALSE) {
4156    return -1;
4157  }
4158
4159  return 0;
4160}
4161
4162
4163// This code is a copy of JDK's sysSync
4164// from src/windows/hpi/src/sys_api_md.c
4165// except for the legacy workaround for a bug in Win 98
4166
4167int os::fsync(int fd) {
4168  HANDLE handle = (HANDLE)::_get_osfhandle(fd);
4169
4170  if ( (!::FlushFileBuffers(handle)) &&
4171         (GetLastError() != ERROR_ACCESS_DENIED) ) {
4172    /* from winerror.h */
4173    return -1;
4174  }
4175  return 0;
4176}
4177
4178static int nonSeekAvailable(int, long *);
4179static int stdinAvailable(int, long *);
4180
4181#define S_ISCHR(mode)   (((mode) & _S_IFCHR) == _S_IFCHR)
4182#define S_ISFIFO(mode)  (((mode) & _S_IFIFO) == _S_IFIFO)
4183
4184// This code is a copy of JDK's sysAvailable
4185// from src/windows/hpi/src/sys_api_md.c
4186
4187int os::available(int fd, jlong *bytes) {
4188  jlong cur, end;
4189  struct _stati64 stbuf64;
4190
4191  if (::_fstati64(fd, &stbuf64) >= 0) {
4192    int mode = stbuf64.st_mode;
4193    if (S_ISCHR(mode) || S_ISFIFO(mode)) {
4194      int ret;
4195      long lpbytes;
4196      if (fd == 0) {
4197        ret = stdinAvailable(fd, &lpbytes);
4198      } else {
4199        ret = nonSeekAvailable(fd, &lpbytes);
4200      }
4201      (*bytes) = (jlong)(lpbytes);
4202      return ret;
4203    }
4204    if ((cur = ::_lseeki64(fd, 0L, SEEK_CUR)) == -1) {
4205      return FALSE;
4206    } else if ((end = ::_lseeki64(fd, 0L, SEEK_END)) == -1) {
4207      return FALSE;
4208    } else if (::_lseeki64(fd, cur, SEEK_SET) == -1) {
4209      return FALSE;
4210    }
4211    *bytes = end - cur;
4212    return TRUE;
4213  } else {
4214    return FALSE;
4215  }
4216}
4217
4218// This code is a copy of JDK's nonSeekAvailable
4219// from src/windows/hpi/src/sys_api_md.c
4220
4221static int nonSeekAvailable(int fd, long *pbytes) {
4222  /* This is used for available on non-seekable devices
4223    * (like both named and anonymous pipes, such as pipes
4224    *  connected to an exec'd process).
4225    * Standard Input is a special case.
4226    *
4227    */
4228  HANDLE han;
4229
4230  if ((han = (HANDLE) ::_get_osfhandle(fd)) == (HANDLE)(-1)) {
4231    return FALSE;
4232  }
4233
4234  if (! ::PeekNamedPipe(han, NULL, 0, NULL, (LPDWORD)pbytes, NULL)) {
4235        /* PeekNamedPipe fails when at EOF.  In that case we
4236         * simply make *pbytes = 0 which is consistent with the
4237         * behavior we get on Solaris when an fd is at EOF.
4238         * The only alternative is to raise an Exception,
4239         * which isn't really warranted.
4240         */
4241    if (::GetLastError() != ERROR_BROKEN_PIPE) {
4242      return FALSE;
4243    }
4244    *pbytes = 0;
4245  }
4246  return TRUE;
4247}
4248
4249#define MAX_INPUT_EVENTS 2000
4250
4251// This code is a copy of JDK's stdinAvailable
4252// from src/windows/hpi/src/sys_api_md.c
4253
4254static int stdinAvailable(int fd, long *pbytes) {
4255  HANDLE han;
4256  DWORD numEventsRead = 0;      /* Number of events read from buffer */
4257  DWORD numEvents = 0;  /* Number of events in buffer */
4258  DWORD i = 0;          /* Loop index */
4259  DWORD curLength = 0;  /* Position marker */
4260  DWORD actualLength = 0;       /* Number of bytes readable */
4261  BOOL error = FALSE;         /* Error holder */
4262  INPUT_RECORD *lpBuffer;     /* Pointer to records of input events */
4263
4264  if ((han = ::GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) {
4265        return FALSE;
4266  }
4267
4268  /* Construct an array of input records in the console buffer */
4269  error = ::GetNumberOfConsoleInputEvents(han, &numEvents);
4270  if (error == 0) {
4271    return nonSeekAvailable(fd, pbytes);
4272  }
4273
4274  /* lpBuffer must fit into 64K or else PeekConsoleInput fails */
4275  if (numEvents > MAX_INPUT_EVENTS) {
4276    numEvents = MAX_INPUT_EVENTS;
4277  }
4278
4279  lpBuffer = (INPUT_RECORD *)os::malloc(numEvents * sizeof(INPUT_RECORD));
4280  if (lpBuffer == NULL) {
4281    return FALSE;
4282  }
4283
4284  error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
4285  if (error == 0) {
4286    os::free(lpBuffer);
4287    return FALSE;
4288  }
4289
4290  /* Examine input records for the number of bytes available */
4291  for(i=0; i<numEvents; i++) {
4292    if (lpBuffer[i].EventType == KEY_EVENT) {
4293
4294      KEY_EVENT_RECORD *keyRecord = (KEY_EVENT_RECORD *)
4295                                      &(lpBuffer[i].Event);
4296      if (keyRecord->bKeyDown == TRUE) {
4297        CHAR *keyPressed = (CHAR *) &(keyRecord->uChar);
4298        curLength++;
4299        if (*keyPressed == '\r') {
4300          actualLength = curLength;
4301        }
4302      }
4303    }
4304  }
4305
4306  if(lpBuffer != NULL) {
4307    os::free(lpBuffer);
4308  }
4309
4310  *pbytes = (long) actualLength;
4311  return TRUE;
4312}
4313
4314// Map a block of memory.
4315char* os::map_memory(int fd, const char* file_name, size_t file_offset,
4316                     char *addr, size_t bytes, bool read_only,
4317                     bool allow_exec) {
4318  HANDLE hFile;
4319  char* base;
4320
4321  hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
4322                     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
4323  if (hFile == NULL) {
4324    if (PrintMiscellaneous && Verbose) {
4325      DWORD err = GetLastError();
4326      tty->print_cr("CreateFile() failed: GetLastError->%ld.");
4327    }
4328    return NULL;
4329  }
4330
4331  if (allow_exec) {
4332    // CreateFileMapping/MapViewOfFileEx can't map executable memory
4333    // unless it comes from a PE image (which the shared archive is not.)
4334    // Even VirtualProtect refuses to give execute access to mapped memory
4335    // that was not previously executable.
4336    //
4337    // Instead, stick the executable region in anonymous memory.  Yuck.
4338    // Penalty is that ~4 pages will not be shareable - in the future
4339    // we might consider DLLizing the shared archive with a proper PE
4340    // header so that mapping executable + sharing is possible.
4341
4342    base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE,
4343                                PAGE_READWRITE);
4344    if (base == NULL) {
4345      if (PrintMiscellaneous && Verbose) {
4346        DWORD err = GetLastError();
4347        tty->print_cr("VirtualAlloc() failed: GetLastError->%ld.", err);
4348      }
4349      CloseHandle(hFile);
4350      return NULL;
4351    }
4352
4353    DWORD bytes_read;
4354    OVERLAPPED overlapped;
4355    overlapped.Offset = (DWORD)file_offset;
4356    overlapped.OffsetHigh = 0;
4357    overlapped.hEvent = NULL;
4358    // ReadFile guarantees that if the return value is true, the requested
4359    // number of bytes were read before returning.
4360    bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0;
4361    if (!res) {
4362      if (PrintMiscellaneous && Verbose) {
4363        DWORD err = GetLastError();
4364        tty->print_cr("ReadFile() failed: GetLastError->%ld.", err);
4365      }
4366      release_memory(base, bytes);
4367      CloseHandle(hFile);
4368      return NULL;
4369    }
4370  } else {
4371    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0,
4372                                    NULL /*file_name*/);
4373    if (hMap == NULL) {
4374      if (PrintMiscellaneous && Verbose) {
4375        DWORD err = GetLastError();
4376        tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.");
4377      }
4378      CloseHandle(hFile);
4379      return NULL;
4380    }
4381
4382    DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY;
4383    base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset,
4384                                  (DWORD)bytes, addr);
4385    if (base == NULL) {
4386      if (PrintMiscellaneous && Verbose) {
4387        DWORD err = GetLastError();
4388        tty->print_cr("MapViewOfFileEx() failed: GetLastError->%ld.", err);
4389      }
4390      CloseHandle(hMap);
4391      CloseHandle(hFile);
4392      return NULL;
4393    }
4394
4395    if (CloseHandle(hMap) == 0) {
4396      if (PrintMiscellaneous && Verbose) {
4397        DWORD err = GetLastError();
4398        tty->print_cr("CloseHandle(hMap) failed: GetLastError->%ld.", err);
4399      }
4400      CloseHandle(hFile);
4401      return base;
4402    }
4403  }
4404
4405  if (allow_exec) {
4406    DWORD old_protect;
4407    DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE;
4408    bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0;
4409
4410    if (!res) {
4411      if (PrintMiscellaneous && Verbose) {
4412        DWORD err = GetLastError();
4413        tty->print_cr("VirtualProtect() failed: GetLastError->%ld.", err);
4414      }
4415      // Don't consider this a hard error, on IA32 even if the
4416      // VirtualProtect fails, we should still be able to execute
4417      CloseHandle(hFile);
4418      return base;
4419    }
4420  }
4421
4422  if (CloseHandle(hFile) == 0) {
4423    if (PrintMiscellaneous && Verbose) {
4424      DWORD err = GetLastError();
4425      tty->print_cr("CloseHandle(hFile) failed: GetLastError->%ld.", err);
4426    }
4427    return base;
4428  }
4429
4430  return base;
4431}
4432
4433
4434// Remap a block of memory.
4435char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
4436                       char *addr, size_t bytes, bool read_only,
4437                       bool allow_exec) {
4438  // This OS does not allow existing memory maps to be remapped so we
4439  // have to unmap the memory before we remap it.
4440  if (!os::unmap_memory(addr, bytes)) {
4441    return NULL;
4442  }
4443
4444  // There is a very small theoretical window between the unmap_memory()
4445  // call above and the map_memory() call below where a thread in native
4446  // code may be able to access an address that is no longer mapped.
4447
4448  return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
4449                        allow_exec);
4450}
4451
4452
4453// Unmap a block of memory.
4454// Returns true=success, otherwise false.
4455
4456bool os::unmap_memory(char* addr, size_t bytes) {
4457  BOOL result = UnmapViewOfFile(addr);
4458  if (result == 0) {
4459    if (PrintMiscellaneous && Verbose) {
4460      DWORD err = GetLastError();
4461      tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err);
4462    }
4463    return false;
4464  }
4465  return true;
4466}
4467
4468void os::pause() {
4469  char filename[MAX_PATH];
4470  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
4471    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
4472  } else {
4473    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
4474  }
4475
4476  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
4477  if (fd != -1) {
4478    struct stat buf;
4479    ::close(fd);
4480    while (::stat(filename, &buf) == 0) {
4481      Sleep(100);
4482    }
4483  } else {
4484    jio_fprintf(stderr,
4485      "Could not open pause file '%s', continuing immediately.\n", filename);
4486  }
4487}
4488
4489// An Event wraps a win32 "CreateEvent" kernel handle.
4490//
4491// We have a number of choices regarding "CreateEvent" win32 handle leakage:
4492//
4493// 1:  When a thread dies return the Event to the EventFreeList, clear the ParkHandle
4494//     field, and call CloseHandle() on the win32 event handle.  Unpark() would
4495//     need to be modified to tolerate finding a NULL (invalid) win32 event handle.
4496//     In addition, an unpark() operation might fetch the handle field, but the
4497//     event could recycle between the fetch and the SetEvent() operation.
4498//     SetEvent() would either fail because the handle was invalid, or inadvertently work,
4499//     as the win32 handle value had been recycled.  In an ideal world calling SetEvent()
4500//     on an stale but recycled handle would be harmless, but in practice this might
4501//     confuse other non-Sun code, so it's not a viable approach.
4502//
4503// 2:  Once a win32 event handle is associated with an Event, it remains associated
4504//     with the Event.  The event handle is never closed.  This could be construed
4505//     as handle leakage, but only up to the maximum # of threads that have been extant
4506//     at any one time.  This shouldn't be an issue, as windows platforms typically
4507//     permit a process to have hundreds of thousands of open handles.
4508//
4509// 3:  Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList
4510//     and release unused handles.
4511//
4512// 4:  Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle.
4513//     It's not clear, however, that we wouldn't be trading one type of leak for another.
4514//
4515// 5.  Use an RCU-like mechanism (Read-Copy Update).
4516//     Or perhaps something similar to Maged Michael's "Hazard pointers".
4517//
4518// We use (2).
4519//
4520// TODO-FIXME:
4521// 1.  Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation.
4522// 2.  Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks
4523//     to recover from (or at least detect) the dreaded Windows 841176 bug.
4524// 3.  Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent
4525//     into a single win32 CreateEvent() handle.
4526//
4527// _Event transitions in park()
4528//   -1 => -1 : illegal
4529//    1 =>  0 : pass - return immediately
4530//    0 => -1 : block
4531//
4532// _Event serves as a restricted-range semaphore :
4533//    -1 : thread is blocked
4534//     0 : neutral  - thread is running or ready
4535//     1 : signaled - thread is running or ready
4536//
4537// Another possible encoding of _Event would be
4538// with explicit "PARKED" and "SIGNALED" bits.
4539
4540int os::PlatformEvent::park (jlong Millis) {
4541    guarantee (_ParkHandle != NULL , "Invariant") ;
4542    guarantee (Millis > 0          , "Invariant") ;
4543    int v ;
4544
4545    // CONSIDER: defer assigning a CreateEvent() handle to the Event until
4546    // the initial park() operation.
4547
4548    for (;;) {
4549        v = _Event ;
4550        if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
4551    }
4552    guarantee ((v == 0) || (v == 1), "invariant") ;
4553    if (v != 0) return OS_OK ;
4554
4555    // Do this the hard way by blocking ...
4556    // TODO: consider a brief spin here, gated on the success of recent
4557    // spin attempts by this thread.
4558    //
4559    // We decompose long timeouts into series of shorter timed waits.
4560    // Evidently large timo values passed in WaitForSingleObject() are problematic on some
4561    // versions of Windows.  See EventWait() for details.  This may be superstition.  Or not.
4562    // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time
4563    // with os::javaTimeNanos().  Furthermore, we assume that spurious returns from
4564    // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend
4565    // to happen early in the wait interval.  Specifically, after a spurious wakeup (rv ==
4566    // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate
4567    // for the already waited time.  This policy does not admit any new outcomes.
4568    // In the future, however, we might want to track the accumulated wait time and
4569    // adjust Millis accordingly if we encounter a spurious wakeup.
4570
4571    const int MAXTIMEOUT = 0x10000000 ;
4572    DWORD rv = WAIT_TIMEOUT ;
4573    while (_Event < 0 && Millis > 0) {
4574       DWORD prd = Millis ;     // set prd = MAX (Millis, MAXTIMEOUT)
4575       if (Millis > MAXTIMEOUT) {
4576          prd = MAXTIMEOUT ;
4577       }
4578       rv = ::WaitForSingleObject (_ParkHandle, prd) ;
4579       assert (rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed") ;
4580       if (rv == WAIT_TIMEOUT) {
4581           Millis -= prd ;
4582       }
4583    }
4584    v = _Event ;
4585    _Event = 0 ;
4586    OrderAccess::fence() ;
4587    // If we encounter a nearly simultanous timeout expiry and unpark()
4588    // we return OS_OK indicating we awoke via unpark().
4589    // Implementor's license -- returning OS_TIMEOUT would be equally valid, however.
4590    return (v >= 0) ? OS_OK : OS_TIMEOUT ;
4591}
4592
4593void os::PlatformEvent::park () {
4594    guarantee (_ParkHandle != NULL, "Invariant") ;
4595    // Invariant: Only the thread associated with the Event/PlatformEvent
4596    // may call park().
4597    int v ;
4598    for (;;) {
4599        v = _Event ;
4600        if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
4601    }
4602    guarantee ((v == 0) || (v == 1), "invariant") ;
4603    if (v != 0) return ;
4604
4605    // Do this the hard way by blocking ...
4606    // TODO: consider a brief spin here, gated on the success of recent
4607    // spin attempts by this thread.
4608    while (_Event < 0) {
4609       DWORD rv = ::WaitForSingleObject (_ParkHandle, INFINITE) ;
4610       assert (rv == WAIT_OBJECT_0, "WaitForSingleObject failed") ;
4611    }
4612
4613    // Usually we'll find _Event == 0 at this point, but as
4614    // an optional optimization we clear it, just in case can
4615    // multiple unpark() operations drove _Event up to 1.
4616    _Event = 0 ;
4617    OrderAccess::fence() ;
4618    guarantee (_Event >= 0, "invariant") ;
4619}
4620
4621void os::PlatformEvent::unpark() {
4622  guarantee (_ParkHandle != NULL, "Invariant") ;
4623  int v ;
4624  for (;;) {
4625      v = _Event ;      // Increment _Event if it's < 1.
4626      if (v > 0) {
4627         // If it's already signaled just return.
4628         // The LD of _Event could have reordered or be satisfied
4629         // by a read-aside from this processor's write buffer.
4630         // To avoid problems execute a barrier and then
4631         // ratify the value.  A degenerate CAS() would also work.
4632         // Viz., CAS (v+0, &_Event, v) == v).
4633         OrderAccess::fence() ;
4634         if (_Event == v) return ;
4635         continue ;
4636      }
4637      if (Atomic::cmpxchg (v+1, &_Event, v) == v) break ;
4638  }
4639  if (v < 0) {
4640     ::SetEvent (_ParkHandle) ;
4641  }
4642}
4643
4644
4645// JSR166
4646// -------------------------------------------------------
4647
4648/*
4649 * The Windows implementation of Park is very straightforward: Basic
4650 * operations on Win32 Events turn out to have the right semantics to
4651 * use them directly. We opportunistically resuse the event inherited
4652 * from Monitor.
4653 */
4654
4655
4656void Parker::park(bool isAbsolute, jlong time) {
4657  guarantee (_ParkEvent != NULL, "invariant") ;
4658  // First, demultiplex/decode time arguments
4659  if (time < 0) { // don't wait
4660    return;
4661  }
4662  else if (time == 0 && !isAbsolute) {
4663    time = INFINITE;
4664  }
4665  else if  (isAbsolute) {
4666    time -= os::javaTimeMillis(); // convert to relative time
4667    if (time <= 0) // already elapsed
4668      return;
4669  }
4670  else { // relative
4671    time /= 1000000; // Must coarsen from nanos to millis
4672    if (time == 0)   // Wait for the minimal time unit if zero
4673      time = 1;
4674  }
4675
4676  JavaThread* thread = (JavaThread*)(Thread::current());
4677  assert(thread->is_Java_thread(), "Must be JavaThread");
4678  JavaThread *jt = (JavaThread *)thread;
4679
4680  // Don't wait if interrupted or already triggered
4681  if (Thread::is_interrupted(thread, false) ||
4682    WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) {
4683    ResetEvent(_ParkEvent);
4684    return;
4685  }
4686  else {
4687    ThreadBlockInVM tbivm(jt);
4688    OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
4689    jt->set_suspend_equivalent();
4690
4691    WaitForSingleObject(_ParkEvent,  time);
4692    ResetEvent(_ParkEvent);
4693
4694    // If externally suspended while waiting, re-suspend
4695    if (jt->handle_special_suspend_equivalent_condition()) {
4696      jt->java_suspend_self();
4697    }
4698  }
4699}
4700
4701void Parker::unpark() {
4702  guarantee (_ParkEvent != NULL, "invariant") ;
4703  SetEvent(_ParkEvent);
4704}
4705
4706// Run the specified command in a separate process. Return its exit value,
4707// or -1 on failure (e.g. can't create a new process).
4708int os::fork_and_exec(char* cmd) {
4709  STARTUPINFO si;
4710  PROCESS_INFORMATION pi;
4711
4712  memset(&si, 0, sizeof(si));
4713  si.cb = sizeof(si);
4714  memset(&pi, 0, sizeof(pi));
4715  BOOL rslt = CreateProcess(NULL,   // executable name - use command line
4716                            cmd,    // command line
4717                            NULL,   // process security attribute
4718                            NULL,   // thread security attribute
4719                            TRUE,   // inherits system handles
4720                            0,      // no creation flags
4721                            NULL,   // use parent's environment block
4722                            NULL,   // use parent's starting directory
4723                            &si,    // (in) startup information
4724                            &pi);   // (out) process information
4725
4726  if (rslt) {
4727    // Wait until child process exits.
4728    WaitForSingleObject(pi.hProcess, INFINITE);
4729
4730    DWORD exit_code;
4731    GetExitCodeProcess(pi.hProcess, &exit_code);
4732
4733    // Close process and thread handles.
4734    CloseHandle(pi.hProcess);
4735    CloseHandle(pi.hThread);
4736
4737    return (int)exit_code;
4738  } else {
4739    return -1;
4740  }
4741}
4742
4743//--------------------------------------------------------------------------------------------------
4744// Non-product code
4745
4746static int mallocDebugIntervalCounter = 0;
4747static int mallocDebugCounter = 0;
4748bool os::check_heap(bool force) {
4749  if (++mallocDebugCounter < MallocVerifyStart && !force) return true;
4750  if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) {
4751    // Note: HeapValidate executes two hardware breakpoints when it finds something
4752    // wrong; at these points, eax contains the address of the offending block (I think).
4753    // To get to the exlicit error message(s) below, just continue twice.
4754    HANDLE heap = GetProcessHeap();
4755    { HeapLock(heap);
4756      PROCESS_HEAP_ENTRY phe;
4757      phe.lpData = NULL;
4758      while (HeapWalk(heap, &phe) != 0) {
4759        if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) &&
4760            !HeapValidate(heap, 0, phe.lpData)) {
4761          tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter);
4762          tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData);
4763          fatal("corrupted C heap");
4764        }
4765      }
4766      DWORD err = GetLastError();
4767      if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) {
4768        fatal(err_msg("heap walk aborted with error %d", err));
4769      }
4770      HeapUnlock(heap);
4771    }
4772    mallocDebugIntervalCounter = 0;
4773  }
4774  return true;
4775}
4776
4777
4778bool os::find(address addr, outputStream* st) {
4779  // Nothing yet
4780  return false;
4781}
4782
4783LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) {
4784  DWORD exception_code = e->ExceptionRecord->ExceptionCode;
4785
4786  if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
4787    JavaThread* thread = (JavaThread*)ThreadLocalStorage::get_thread_slow();
4788    PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord;
4789    address addr = (address) exceptionRecord->ExceptionInformation[1];
4790
4791    if (os::is_memory_serialize_page(thread, addr))
4792      return EXCEPTION_CONTINUE_EXECUTION;
4793  }
4794
4795  return EXCEPTION_CONTINUE_SEARCH;
4796}
4797
4798// We don't build a headless jre for Windows
4799bool os::is_headless_jre() { return false; }
4800
4801
4802typedef CRITICAL_SECTION mutex_t;
4803#define mutexInit(m)    InitializeCriticalSection(m)
4804#define mutexDestroy(m) DeleteCriticalSection(m)
4805#define mutexLock(m)    EnterCriticalSection(m)
4806#define mutexUnlock(m)  LeaveCriticalSection(m)
4807
4808static bool sock_initialized = FALSE;
4809static mutex_t sockFnTableMutex;
4810
4811static void initSock() {
4812  WSADATA wsadata;
4813
4814  if (!os::WinSock2Dll::WinSock2Available()) {
4815    jio_fprintf(stderr, "Could not load Winsock 2 (error: %d)\n",
4816      ::GetLastError());
4817    return;
4818  }
4819  if (sock_initialized == TRUE) return;
4820
4821  ::mutexInit(&sockFnTableMutex);
4822  ::mutexLock(&sockFnTableMutex);
4823  if (os::WinSock2Dll::WSAStartup(MAKEWORD(1,1), &wsadata) != 0) {
4824      jio_fprintf(stderr, "Could not initialize Winsock\n");
4825  }
4826  sock_initialized = TRUE;
4827  ::mutexUnlock(&sockFnTableMutex);
4828}
4829
4830struct hostent* os::get_host_by_name(char* name) {
4831  if (!sock_initialized) {
4832    initSock();
4833  }
4834  if (!os::WinSock2Dll::WinSock2Available()) {
4835    return NULL;
4836  }
4837  return (struct hostent*)os::WinSock2Dll::gethostbyname(name);
4838}
4839
4840int os::socket_close(int fd) {
4841  return ::closesocket(fd);
4842}
4843
4844int os::socket_available(int fd, jint *pbytes) {
4845  int ret = ::ioctlsocket(fd, FIONREAD, (u_long*)pbytes);
4846  return (ret < 0) ? 0 : 1;
4847}
4848
4849int os::socket(int domain, int type, int protocol) {
4850  return ::socket(domain, type, protocol);
4851}
4852
4853int os::listen(int fd, int count) {
4854  return ::listen(fd, count);
4855}
4856
4857int os::connect(int fd, struct sockaddr* him, socklen_t len) {
4858  return ::connect(fd, him, len);
4859}
4860
4861int os::accept(int fd, struct sockaddr* him, socklen_t* len) {
4862  return ::accept(fd, him, len);
4863}
4864
4865int os::sendto(int fd, char* buf, size_t len, uint flags,
4866               struct sockaddr* to, socklen_t tolen) {
4867
4868  return ::sendto(fd, buf, (int)len, flags, to, tolen);
4869}
4870
4871int os::recvfrom(int fd, char *buf, size_t nBytes, uint flags,
4872                 sockaddr* from, socklen_t* fromlen) {
4873
4874  return ::recvfrom(fd, buf, (int)nBytes, flags, from, fromlen);
4875}
4876
4877int os::recv(int fd, char* buf, size_t nBytes, uint flags) {
4878  return ::recv(fd, buf, (int)nBytes, flags);
4879}
4880
4881int os::send(int fd, char* buf, size_t nBytes, uint flags) {
4882  return ::send(fd, buf, (int)nBytes, flags);
4883}
4884
4885int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) {
4886  return ::send(fd, buf, (int)nBytes, flags);
4887}
4888
4889int os::timeout(int fd, long timeout) {
4890  fd_set tbl;
4891  struct timeval t;
4892
4893  t.tv_sec  = timeout / 1000;
4894  t.tv_usec = (timeout % 1000) * 1000;
4895
4896  tbl.fd_count    = 1;
4897  tbl.fd_array[0] = fd;
4898
4899  return ::select(1, &tbl, 0, 0, &t);
4900}
4901
4902int os::get_host_name(char* name, int namelen) {
4903  return ::gethostname(name, namelen);
4904}
4905
4906int os::socket_shutdown(int fd, int howto) {
4907  return ::shutdown(fd, howto);
4908}
4909
4910int os::bind(int fd, struct sockaddr* him, socklen_t len) {
4911  return ::bind(fd, him, len);
4912}
4913
4914int os::get_sock_name(int fd, struct sockaddr* him, socklen_t* len) {
4915  return ::getsockname(fd, him, len);
4916}
4917
4918int os::get_sock_opt(int fd, int level, int optname,
4919                     char* optval, socklen_t* optlen) {
4920  return ::getsockopt(fd, level, optname, optval, optlen);
4921}
4922
4923int os::set_sock_opt(int fd, int level, int optname,
4924                     const char* optval, socklen_t optlen) {
4925  return ::setsockopt(fd, level, optname, optval, optlen);
4926}
4927
4928
4929// Kernel32 API
4930typedef SIZE_T (WINAPI* GetLargePageMinimum_Fn)(void);
4931typedef LPVOID (WINAPI *VirtualAllocExNuma_Fn) (HANDLE, LPVOID, SIZE_T, DWORD, DWORD, DWORD);
4932typedef BOOL (WINAPI *GetNumaHighestNodeNumber_Fn) (PULONG);
4933typedef BOOL (WINAPI *GetNumaNodeProcessorMask_Fn) (UCHAR, PULONGLONG);
4934
4935GetLargePageMinimum_Fn      os::Kernel32Dll::_GetLargePageMinimum = NULL;
4936VirtualAllocExNuma_Fn       os::Kernel32Dll::_VirtualAllocExNuma = NULL;
4937GetNumaHighestNodeNumber_Fn os::Kernel32Dll::_GetNumaHighestNodeNumber = NULL;
4938GetNumaNodeProcessorMask_Fn os::Kernel32Dll::_GetNumaNodeProcessorMask = NULL;
4939BOOL                        os::Kernel32Dll::initialized = FALSE;
4940SIZE_T os::Kernel32Dll::GetLargePageMinimum() {
4941  assert(initialized && _GetLargePageMinimum != NULL,
4942    "GetLargePageMinimumAvailable() not yet called");
4943  return _GetLargePageMinimum();
4944}
4945
4946BOOL os::Kernel32Dll::GetLargePageMinimumAvailable() {
4947  if (!initialized) {
4948    initialize();
4949  }
4950  return _GetLargePageMinimum != NULL;
4951}
4952
4953BOOL os::Kernel32Dll::NumaCallsAvailable() {
4954  if (!initialized) {
4955    initialize();
4956  }
4957  return _VirtualAllocExNuma != NULL;
4958}
4959
4960LPVOID os::Kernel32Dll::VirtualAllocExNuma(HANDLE hProc, LPVOID addr, SIZE_T bytes, DWORD flags, DWORD prot, DWORD node) {
4961  assert(initialized && _VirtualAllocExNuma != NULL,
4962    "NUMACallsAvailable() not yet called");
4963
4964  return _VirtualAllocExNuma(hProc, addr, bytes, flags, prot, node);
4965}
4966
4967BOOL os::Kernel32Dll::GetNumaHighestNodeNumber(PULONG ptr_highest_node_number) {
4968  assert(initialized && _GetNumaHighestNodeNumber != NULL,
4969    "NUMACallsAvailable() not yet called");
4970
4971  return _GetNumaHighestNodeNumber(ptr_highest_node_number);
4972}
4973
4974BOOL os::Kernel32Dll::GetNumaNodeProcessorMask(UCHAR node, PULONGLONG proc_mask) {
4975  assert(initialized && _GetNumaNodeProcessorMask != NULL,
4976    "NUMACallsAvailable() not yet called");
4977
4978  return _GetNumaNodeProcessorMask(node, proc_mask);
4979}
4980
4981
4982void os::Kernel32Dll::initializeCommon() {
4983  if (!initialized) {
4984    HMODULE handle = ::GetModuleHandle("Kernel32.dll");
4985    assert(handle != NULL, "Just check");
4986    _GetLargePageMinimum = (GetLargePageMinimum_Fn)::GetProcAddress(handle, "GetLargePageMinimum");
4987    _VirtualAllocExNuma = (VirtualAllocExNuma_Fn)::GetProcAddress(handle, "VirtualAllocExNuma");
4988    _GetNumaHighestNodeNumber = (GetNumaHighestNodeNumber_Fn)::GetProcAddress(handle, "GetNumaHighestNodeNumber");
4989    _GetNumaNodeProcessorMask = (GetNumaNodeProcessorMask_Fn)::GetProcAddress(handle, "GetNumaNodeProcessorMask");
4990    initialized = TRUE;
4991  }
4992}
4993
4994
4995
4996#ifndef JDK6_OR_EARLIER
4997
4998void os::Kernel32Dll::initialize() {
4999  initializeCommon();
5000}
5001
5002
5003// Kernel32 API
5004inline BOOL os::Kernel32Dll::SwitchToThread() {
5005  return ::SwitchToThread();
5006}
5007
5008inline BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
5009  return true;
5010}
5011
5012  // Help tools
5013inline BOOL os::Kernel32Dll::HelpToolsAvailable() {
5014  return true;
5015}
5016
5017inline HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
5018  return ::CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
5019}
5020
5021inline BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5022  return ::Module32First(hSnapshot, lpme);
5023}
5024
5025inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5026  return ::Module32Next(hSnapshot, lpme);
5027}
5028
5029
5030inline BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
5031  return true;
5032}
5033
5034inline void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
5035  ::GetNativeSystemInfo(lpSystemInfo);
5036}
5037
5038// PSAPI API
5039inline BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
5040  return ::EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
5041}
5042
5043inline DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
5044  return ::GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
5045}
5046
5047inline BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
5048  return ::GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
5049}
5050
5051inline BOOL os::PSApiDll::PSApiAvailable() {
5052  return true;
5053}
5054
5055
5056// WinSock2 API
5057inline BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
5058  return ::WSAStartup(wVersionRequested, lpWSAData);
5059}
5060
5061inline struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
5062  return ::gethostbyname(name);
5063}
5064
5065inline BOOL os::WinSock2Dll::WinSock2Available() {
5066  return true;
5067}
5068
5069// Advapi API
5070inline BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
5071   BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
5072   PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
5073     return ::AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
5074       BufferLength, PreviousState, ReturnLength);
5075}
5076
5077inline BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
5078  PHANDLE TokenHandle) {
5079    return ::OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
5080}
5081
5082inline BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
5083  return ::LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
5084}
5085
5086inline BOOL os::Advapi32Dll::AdvapiAvailable() {
5087  return true;
5088}
5089
5090#else
5091// Kernel32 API
5092typedef BOOL (WINAPI* SwitchToThread_Fn)(void);
5093typedef HANDLE (WINAPI* CreateToolhelp32Snapshot_Fn)(DWORD,DWORD);
5094typedef BOOL (WINAPI* Module32First_Fn)(HANDLE,LPMODULEENTRY32);
5095typedef BOOL (WINAPI* Module32Next_Fn)(HANDLE,LPMODULEENTRY32);
5096typedef void (WINAPI* GetNativeSystemInfo_Fn)(LPSYSTEM_INFO);
5097
5098SwitchToThread_Fn           os::Kernel32Dll::_SwitchToThread = NULL;
5099CreateToolhelp32Snapshot_Fn os::Kernel32Dll::_CreateToolhelp32Snapshot = NULL;
5100Module32First_Fn            os::Kernel32Dll::_Module32First = NULL;
5101Module32Next_Fn             os::Kernel32Dll::_Module32Next = NULL;
5102GetNativeSystemInfo_Fn      os::Kernel32Dll::_GetNativeSystemInfo = NULL;
5103
5104
5105void os::Kernel32Dll::initialize() {
5106  if (!initialized) {
5107    HMODULE handle = ::GetModuleHandle("Kernel32.dll");
5108    assert(handle != NULL, "Just check");
5109
5110    _SwitchToThread = (SwitchToThread_Fn)::GetProcAddress(handle, "SwitchToThread");
5111    _CreateToolhelp32Snapshot = (CreateToolhelp32Snapshot_Fn)
5112      ::GetProcAddress(handle, "CreateToolhelp32Snapshot");
5113    _Module32First = (Module32First_Fn)::GetProcAddress(handle, "Module32First");
5114    _Module32Next = (Module32Next_Fn)::GetProcAddress(handle, "Module32Next");
5115    _GetNativeSystemInfo = (GetNativeSystemInfo_Fn)::GetProcAddress(handle, "GetNativeSystemInfo");
5116    initializeCommon();  // resolve the functions that always need resolving
5117
5118    initialized = TRUE;
5119  }
5120}
5121
5122BOOL os::Kernel32Dll::SwitchToThread() {
5123  assert(initialized && _SwitchToThread != NULL,
5124    "SwitchToThreadAvailable() not yet called");
5125  return _SwitchToThread();
5126}
5127
5128
5129BOOL os::Kernel32Dll::SwitchToThreadAvailable() {
5130  if (!initialized) {
5131    initialize();
5132  }
5133  return _SwitchToThread != NULL;
5134}
5135
5136// Help tools
5137BOOL os::Kernel32Dll::HelpToolsAvailable() {
5138  if (!initialized) {
5139    initialize();
5140  }
5141  return _CreateToolhelp32Snapshot != NULL &&
5142         _Module32First != NULL &&
5143         _Module32Next != NULL;
5144}
5145
5146HANDLE os::Kernel32Dll::CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessId) {
5147  assert(initialized && _CreateToolhelp32Snapshot != NULL,
5148    "HelpToolsAvailable() not yet called");
5149
5150  return _CreateToolhelp32Snapshot(dwFlags, th32ProcessId);
5151}
5152
5153BOOL os::Kernel32Dll::Module32First(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5154  assert(initialized && _Module32First != NULL,
5155    "HelpToolsAvailable() not yet called");
5156
5157  return _Module32First(hSnapshot, lpme);
5158}
5159
5160inline BOOL os::Kernel32Dll::Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme) {
5161  assert(initialized && _Module32Next != NULL,
5162    "HelpToolsAvailable() not yet called");
5163
5164  return _Module32Next(hSnapshot, lpme);
5165}
5166
5167
5168BOOL os::Kernel32Dll::GetNativeSystemInfoAvailable() {
5169  if (!initialized) {
5170    initialize();
5171  }
5172  return _GetNativeSystemInfo != NULL;
5173}
5174
5175void os::Kernel32Dll::GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
5176  assert(initialized && _GetNativeSystemInfo != NULL,
5177    "GetNativeSystemInfoAvailable() not yet called");
5178
5179  _GetNativeSystemInfo(lpSystemInfo);
5180}
5181
5182
5183
5184// PSAPI API
5185
5186
5187typedef BOOL (WINAPI *EnumProcessModules_Fn)(HANDLE, HMODULE *, DWORD, LPDWORD);
5188typedef BOOL (WINAPI *GetModuleFileNameEx_Fn)(HANDLE, HMODULE, LPTSTR, DWORD);;
5189typedef BOOL (WINAPI *GetModuleInformation_Fn)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
5190
5191EnumProcessModules_Fn   os::PSApiDll::_EnumProcessModules = NULL;
5192GetModuleFileNameEx_Fn  os::PSApiDll::_GetModuleFileNameEx = NULL;
5193GetModuleInformation_Fn os::PSApiDll::_GetModuleInformation = NULL;
5194BOOL                    os::PSApiDll::initialized = FALSE;
5195
5196void os::PSApiDll::initialize() {
5197  if (!initialized) {
5198    HMODULE handle = os::win32::load_Windows_dll("PSAPI.DLL", NULL, 0);
5199    if (handle != NULL) {
5200      _EnumProcessModules = (EnumProcessModules_Fn)::GetProcAddress(handle,
5201        "EnumProcessModules");
5202      _GetModuleFileNameEx = (GetModuleFileNameEx_Fn)::GetProcAddress(handle,
5203        "GetModuleFileNameExA");
5204      _GetModuleInformation = (GetModuleInformation_Fn)::GetProcAddress(handle,
5205        "GetModuleInformation");
5206    }
5207    initialized = TRUE;
5208  }
5209}
5210
5211
5212
5213BOOL os::PSApiDll::EnumProcessModules(HANDLE hProcess, HMODULE *lpModule, DWORD cb, LPDWORD lpcbNeeded) {
5214  assert(initialized && _EnumProcessModules != NULL,
5215    "PSApiAvailable() not yet called");
5216  return _EnumProcessModules(hProcess, lpModule, cb, lpcbNeeded);
5217}
5218
5219DWORD os::PSApiDll::GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR lpFilename, DWORD nSize) {
5220  assert(initialized && _GetModuleFileNameEx != NULL,
5221    "PSApiAvailable() not yet called");
5222  return _GetModuleFileNameEx(hProcess, hModule, lpFilename, nSize);
5223}
5224
5225BOOL os::PSApiDll::GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, DWORD cb) {
5226  assert(initialized && _GetModuleInformation != NULL,
5227    "PSApiAvailable() not yet called");
5228  return _GetModuleInformation(hProcess, hModule, lpmodinfo, cb);
5229}
5230
5231BOOL os::PSApiDll::PSApiAvailable() {
5232  if (!initialized) {
5233    initialize();
5234  }
5235  return _EnumProcessModules != NULL &&
5236    _GetModuleFileNameEx != NULL &&
5237    _GetModuleInformation != NULL;
5238}
5239
5240
5241// WinSock2 API
5242typedef int (PASCAL FAR* WSAStartup_Fn)(WORD, LPWSADATA);
5243typedef struct hostent *(PASCAL FAR *gethostbyname_Fn)(...);
5244
5245WSAStartup_Fn    os::WinSock2Dll::_WSAStartup = NULL;
5246gethostbyname_Fn os::WinSock2Dll::_gethostbyname = NULL;
5247BOOL             os::WinSock2Dll::initialized = FALSE;
5248
5249void os::WinSock2Dll::initialize() {
5250  if (!initialized) {
5251    HMODULE handle = os::win32::load_Windows_dll("ws2_32.dll", NULL, 0);
5252    if (handle != NULL) {
5253      _WSAStartup = (WSAStartup_Fn)::GetProcAddress(handle, "WSAStartup");
5254      _gethostbyname = (gethostbyname_Fn)::GetProcAddress(handle, "gethostbyname");
5255    }
5256    initialized = TRUE;
5257  }
5258}
5259
5260
5261BOOL os::WinSock2Dll::WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
5262  assert(initialized && _WSAStartup != NULL,
5263    "WinSock2Available() not yet called");
5264  return _WSAStartup(wVersionRequested, lpWSAData);
5265}
5266
5267struct hostent* os::WinSock2Dll::gethostbyname(const char *name) {
5268  assert(initialized && _gethostbyname != NULL,
5269    "WinSock2Available() not yet called");
5270  return _gethostbyname(name);
5271}
5272
5273BOOL os::WinSock2Dll::WinSock2Available() {
5274  if (!initialized) {
5275    initialize();
5276  }
5277  return _WSAStartup != NULL &&
5278    _gethostbyname != NULL;
5279}
5280
5281typedef BOOL (WINAPI *AdjustTokenPrivileges_Fn)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
5282typedef BOOL (WINAPI *OpenProcessToken_Fn)(HANDLE, DWORD, PHANDLE);
5283typedef BOOL (WINAPI *LookupPrivilegeValue_Fn)(LPCTSTR, LPCTSTR, PLUID);
5284
5285AdjustTokenPrivileges_Fn os::Advapi32Dll::_AdjustTokenPrivileges = NULL;
5286OpenProcessToken_Fn      os::Advapi32Dll::_OpenProcessToken = NULL;
5287LookupPrivilegeValue_Fn  os::Advapi32Dll::_LookupPrivilegeValue = NULL;
5288BOOL                     os::Advapi32Dll::initialized = FALSE;
5289
5290void os::Advapi32Dll::initialize() {
5291  if (!initialized) {
5292    HMODULE handle = os::win32::load_Windows_dll("advapi32.dll", NULL, 0);
5293    if (handle != NULL) {
5294      _AdjustTokenPrivileges = (AdjustTokenPrivileges_Fn)::GetProcAddress(handle,
5295        "AdjustTokenPrivileges");
5296      _OpenProcessToken = (OpenProcessToken_Fn)::GetProcAddress(handle,
5297        "OpenProcessToken");
5298      _LookupPrivilegeValue = (LookupPrivilegeValue_Fn)::GetProcAddress(handle,
5299        "LookupPrivilegeValueA");
5300    }
5301    initialized = TRUE;
5302  }
5303}
5304
5305BOOL os::Advapi32Dll::AdjustTokenPrivileges(HANDLE TokenHandle,
5306   BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
5307   PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength) {
5308   assert(initialized && _AdjustTokenPrivileges != NULL,
5309     "AdvapiAvailable() not yet called");
5310   return _AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges, NewState,
5311       BufferLength, PreviousState, ReturnLength);
5312}
5313
5314BOOL os::Advapi32Dll::OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess,
5315  PHANDLE TokenHandle) {
5316   assert(initialized && _OpenProcessToken != NULL,
5317     "AdvapiAvailable() not yet called");
5318    return _OpenProcessToken(ProcessHandle, DesiredAccess, TokenHandle);
5319}
5320
5321BOOL os::Advapi32Dll::LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid) {
5322   assert(initialized && _LookupPrivilegeValue != NULL,
5323     "AdvapiAvailable() not yet called");
5324  return _LookupPrivilegeValue(lpSystemName, lpName, lpLuid);
5325}
5326
5327BOOL os::Advapi32Dll::AdvapiAvailable() {
5328  if (!initialized) {
5329    initialize();
5330  }
5331  return _AdjustTokenPrivileges != NULL &&
5332    _OpenProcessToken != NULL &&
5333    _LookupPrivilegeValue != NULL;
5334}
5335
5336#endif
5337