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