os_windows.cpp revision 61:5a76ab815e34
1/*
2 * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
24
25#ifdef _WIN64
26// Must be at least Windows 2000 or XP to use VectoredExceptions
27#define _WIN32_WINNT 0x500
28#endif
29
30// do not include precompiled header file
31# include "incls/_os_windows.cpp.incl"
32
33#ifdef _DEBUG
34#include <crtdbg.h>
35#endif
36
37
38#include <windows.h>
39#include <sys/types.h>
40#include <sys/stat.h>
41#include <sys/timeb.h>
42#include <objidl.h>
43#include <shlobj.h>
44
45#include <malloc.h>
46#include <signal.h>
47#include <direct.h>
48#include <errno.h>
49#include <fcntl.h>
50#include <io.h>
51#include <process.h>              // For _beginthreadex(), _endthreadex()
52#include <imagehlp.h>             // For os::dll_address_to_function_name
53
54/* for enumerating dll libraries */
55#include <tlhelp32.h>
56#include <vdmdbg.h>
57
58// for timer info max values which include all bits
59#define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
60
61// For DLL loading/load error detection
62// Values of PE COFF
63#define IMAGE_FILE_PTR_TO_SIGNATURE 0x3c
64#define IMAGE_FILE_SIGNATURE_LENGTH 4
65
66static HANDLE main_process;
67static HANDLE main_thread;
68static int    main_thread_id;
69
70static FILETIME process_creation_time;
71static FILETIME process_exit_time;
72static FILETIME process_user_time;
73static FILETIME process_kernel_time;
74
75#ifdef _WIN64
76PVOID  topLevelVectoredExceptionHandler = NULL;
77#endif
78
79#ifdef _M_IA64
80#define __CPU__ ia64
81#elif _M_AMD64
82#define __CPU__ amd64
83#else
84#define __CPU__ i486
85#endif
86
87// save DLL module handle, used by GetModuleFileName
88
89HINSTANCE vm_lib_handle;
90static int getLastErrorString(char *buf, size_t len);
91
92BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) {
93  switch (reason) {
94    case DLL_PROCESS_ATTACH:
95      vm_lib_handle = hinst;
96      if(ForceTimeHighResolution)
97        timeBeginPeriod(1L);
98      break;
99    case DLL_PROCESS_DETACH:
100      if(ForceTimeHighResolution)
101        timeEndPeriod(1L);
102#ifdef _WIN64
103      if (topLevelVectoredExceptionHandler != NULL) {
104        RemoveVectoredExceptionHandler(topLevelVectoredExceptionHandler);
105        topLevelVectoredExceptionHandler = NULL;
106      }
107#endif
108      break;
109    default:
110      break;
111  }
112  return true;
113}
114
115static inline double fileTimeAsDouble(FILETIME* time) {
116  const double high  = (double) ((unsigned int) ~0);
117  const double split = 10000000.0;
118  double result = (time->dwLowDateTime / split) +
119                   time->dwHighDateTime * (high/split);
120  return result;
121}
122
123// Implementation of os
124
125bool os::getenv(const char* name, char* buffer, int len) {
126 int result = GetEnvironmentVariable(name, buffer, len);
127 return result > 0 && result < len;
128}
129
130
131// No setuid programs under Windows.
132bool os::have_special_privileges() {
133  return false;
134}
135
136
137// This method is  a periodic task to check for misbehaving JNI applications
138// under CheckJNI, we can add any periodic checks here.
139// For Windows at the moment does nothing
140void os::run_periodic_checks() {
141  return;
142}
143
144#ifndef _WIN64
145LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo);
146#endif
147void os::init_system_properties_values() {
148  /* sysclasspath, java_home, dll_dir */
149  {
150      char *home_path;
151      char *dll_path;
152      char *pslash;
153      char *bin = "\\bin";
154      char home_dir[MAX_PATH];
155
156      if (!getenv("_ALT_JAVA_HOME_DIR", home_dir, MAX_PATH)) {
157          os::jvm_path(home_dir, sizeof(home_dir));
158          // Found the full path to jvm[_g].dll.
159          // Now cut the path to <java_home>/jre if we can.
160          *(strrchr(home_dir, '\\')) = '\0';  /* get rid of \jvm.dll */
161          pslash = strrchr(home_dir, '\\');
162          if (pslash != NULL) {
163              *pslash = '\0';                 /* get rid of \{client|server} */
164              pslash = strrchr(home_dir, '\\');
165              if (pslash != NULL)
166                  *pslash = '\0';             /* get rid of \bin */
167          }
168      }
169
170      home_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + 1);
171      if (home_path == NULL)
172          return;
173      strcpy(home_path, home_dir);
174      Arguments::set_java_home(home_path);
175
176      dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1);
177      if (dll_path == NULL)
178          return;
179      strcpy(dll_path, home_dir);
180      strcat(dll_path, bin);
181      Arguments::set_dll_dir(dll_path);
182
183      if (!set_boot_path('\\', ';'))
184          return;
185  }
186
187  /* library_path */
188  #define EXT_DIR "\\lib\\ext"
189  #define BIN_DIR "\\bin"
190  #define PACKAGE_DIR "\\Sun\\Java"
191  {
192    /* Win32 library search order (See the documentation for LoadLibrary):
193     *
194     * 1. The directory from which application is loaded.
195     * 2. The current directory
196     * 3. The system wide Java Extensions directory (Java only)
197     * 4. System directory (GetSystemDirectory)
198     * 5. Windows directory (GetWindowsDirectory)
199     * 6. The PATH environment variable
200     */
201
202    char *library_path;
203    char tmp[MAX_PATH];
204    char *path_str = ::getenv("PATH");
205
206    library_path = NEW_C_HEAP_ARRAY(char, MAX_PATH * 5 + sizeof(PACKAGE_DIR) +
207        sizeof(BIN_DIR) + (path_str ? strlen(path_str) : 0) + 10);
208
209    library_path[0] = '\0';
210
211    GetModuleFileName(NULL, tmp, sizeof(tmp));
212    *(strrchr(tmp, '\\')) = '\0';
213    strcat(library_path, tmp);
214
215    strcat(library_path, ";.");
216
217    GetWindowsDirectory(tmp, sizeof(tmp));
218    strcat(library_path, ";");
219    strcat(library_path, tmp);
220    strcat(library_path, PACKAGE_DIR BIN_DIR);
221
222    GetSystemDirectory(tmp, sizeof(tmp));
223    strcat(library_path, ";");
224    strcat(library_path, tmp);
225
226    GetWindowsDirectory(tmp, sizeof(tmp));
227    strcat(library_path, ";");
228    strcat(library_path, tmp);
229
230    if (path_str) {
231        strcat(library_path, ";");
232        strcat(library_path, path_str);
233    }
234
235    Arguments::set_library_path(library_path);
236    FREE_C_HEAP_ARRAY(char, library_path);
237  }
238
239  /* Default extensions directory */
240  {
241    char path[MAX_PATH];
242    char buf[2 * MAX_PATH + 2 * sizeof(EXT_DIR) + sizeof(PACKAGE_DIR) + 1];
243    GetWindowsDirectory(path, MAX_PATH);
244    sprintf(buf, "%s%s;%s%s%s", Arguments::get_java_home(), EXT_DIR,
245        path, PACKAGE_DIR, EXT_DIR);
246    Arguments::set_ext_dirs(buf);
247  }
248  #undef EXT_DIR
249  #undef BIN_DIR
250  #undef PACKAGE_DIR
251
252  /* Default endorsed standards directory. */
253  {
254    #define ENDORSED_DIR "\\lib\\endorsed"
255    size_t len = strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR);
256    char * buf = NEW_C_HEAP_ARRAY(char, len);
257    sprintf(buf, "%s%s", Arguments::get_java_home(), ENDORSED_DIR);
258    Arguments::set_endorsed_dirs(buf);
259    #undef ENDORSED_DIR
260  }
261
262#ifndef _WIN64
263  SetUnhandledExceptionFilter(Handle_FLT_Exception);
264#endif
265
266  // Done
267  return;
268}
269
270void os::breakpoint() {
271  DebugBreak();
272}
273
274// Invoked from the BREAKPOINT Macro
275extern "C" void breakpoint() {
276  os::breakpoint();
277}
278
279// Returns an estimate of the current stack pointer. Result must be guaranteed
280// to point into the calling threads stack, and be no lower than the current
281// stack pointer.
282
283address os::current_stack_pointer() {
284  int dummy;
285  address sp = (address)&dummy;
286  return sp;
287}
288
289// os::current_stack_base()
290//
291//   Returns the base of the stack, which is the stack's
292//   starting address.  This function must be called
293//   while running on the stack of the thread being queried.
294
295address os::current_stack_base() {
296  MEMORY_BASIC_INFORMATION minfo;
297  address stack_bottom;
298  size_t stack_size;
299
300  VirtualQuery(&minfo, &minfo, sizeof(minfo));
301  stack_bottom =  (address)minfo.AllocationBase;
302  stack_size = minfo.RegionSize;
303
304  // Add up the sizes of all the regions with the same
305  // AllocationBase.
306  while( 1 )
307  {
308    VirtualQuery(stack_bottom+stack_size, &minfo, sizeof(minfo));
309    if ( stack_bottom == (address)minfo.AllocationBase )
310      stack_size += minfo.RegionSize;
311    else
312      break;
313  }
314
315#ifdef _M_IA64
316  // IA64 has memory and register stacks
317  stack_size = stack_size / 2;
318#endif
319  return stack_bottom + stack_size;
320}
321
322size_t os::current_stack_size() {
323  size_t sz;
324  MEMORY_BASIC_INFORMATION minfo;
325  VirtualQuery(&minfo, &minfo, sizeof(minfo));
326  sz = (size_t)os::current_stack_base() - (size_t)minfo.AllocationBase;
327  return sz;
328}
329
330
331LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo);
332
333// Thread start routine for all new Java threads
334static unsigned __stdcall java_start(Thread* thread) {
335  // Try to randomize the cache line index of hot stack frames.
336  // This helps when threads of the same stack traces evict each other's
337  // cache lines. The threads can be either from the same JVM instance, or
338  // from different JVM instances. The benefit is especially true for
339  // processors with hyperthreading technology.
340  static int counter = 0;
341  int pid = os::current_process_id();
342  _alloca(((pid ^ counter++) & 7) * 128);
343
344  OSThread* osthr = thread->osthread();
345  assert(osthr->get_state() == RUNNABLE, "invalid os thread state");
346
347  if (UseNUMA) {
348    int lgrp_id = os::numa_get_group_id();
349    if (lgrp_id != -1) {
350      thread->set_lgrp_id(lgrp_id);
351    }
352  }
353
354
355  if (UseVectoredExceptions) {
356    // If we are using vectored exception we don't need to set a SEH
357    thread->run();
358  }
359  else {
360    // Install a win32 structured exception handler around every thread created
361    // by VM, so VM can genrate error dump when an exception occurred in non-
362    // Java thread (e.g. VM thread).
363    __try {
364       thread->run();
365    } __except(topLevelExceptionFilter(
366               (_EXCEPTION_POINTERS*)_exception_info())) {
367        // Nothing to do.
368    }
369  }
370
371  // One less thread is executing
372  // When the VMThread gets here, the main thread may have already exited
373  // which frees the CodeHeap containing the Atomic::add code
374  if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) {
375    Atomic::dec_ptr((intptr_t*)&os::win32::_os_thread_count);
376  }
377
378  return 0;
379}
380
381static OSThread* create_os_thread(Thread* thread, HANDLE thread_handle, int thread_id) {
382  // Allocate the OSThread object
383  OSThread* osthread = new OSThread(NULL, NULL);
384  if (osthread == NULL) return NULL;
385
386  // Initialize support for Java interrupts
387  HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL);
388  if (interrupt_event == NULL) {
389    delete osthread;
390    return NULL;
391  }
392  osthread->set_interrupt_event(interrupt_event);
393
394  // Store info on the Win32 thread into the OSThread
395  osthread->set_thread_handle(thread_handle);
396  osthread->set_thread_id(thread_id);
397
398  if (UseNUMA) {
399    int lgrp_id = os::numa_get_group_id();
400    if (lgrp_id != -1) {
401      thread->set_lgrp_id(lgrp_id);
402    }
403  }
404
405  // Initial thread state is INITIALIZED, not SUSPENDED
406  osthread->set_state(INITIALIZED);
407
408  return osthread;
409}
410
411
412bool os::create_attached_thread(JavaThread* thread) {
413#ifdef ASSERT
414  thread->verify_not_published();
415#endif
416  HANDLE thread_h;
417  if (!DuplicateHandle(main_process, GetCurrentThread(), GetCurrentProcess(),
418                       &thread_h, THREAD_ALL_ACCESS, false, 0)) {
419    fatal("DuplicateHandle failed\n");
420  }
421  OSThread* osthread = create_os_thread(thread, thread_h,
422                                        (int)current_thread_id());
423  if (osthread == NULL) {
424     return false;
425  }
426
427  // Initial thread state is RUNNABLE
428  osthread->set_state(RUNNABLE);
429
430  thread->set_osthread(osthread);
431  return true;
432}
433
434bool os::create_main_thread(JavaThread* thread) {
435#ifdef ASSERT
436  thread->verify_not_published();
437#endif
438  if (_starting_thread == NULL) {
439    _starting_thread = create_os_thread(thread, main_thread, main_thread_id);
440     if (_starting_thread == NULL) {
441        return false;
442     }
443  }
444
445  // The primordial thread is runnable from the start)
446  _starting_thread->set_state(RUNNABLE);
447
448  thread->set_osthread(_starting_thread);
449  return true;
450}
451
452// Allocate and initialize a new OSThread
453bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
454  unsigned thread_id;
455
456  // Allocate the OSThread object
457  OSThread* osthread = new OSThread(NULL, NULL);
458  if (osthread == NULL) {
459    return false;
460  }
461
462  // Initialize support for Java interrupts
463  HANDLE interrupt_event = CreateEvent(NULL, true, false, NULL);
464  if (interrupt_event == NULL) {
465    delete osthread;
466    return NULL;
467  }
468  osthread->set_interrupt_event(interrupt_event);
469  osthread->set_interrupted(false);
470
471  thread->set_osthread(osthread);
472
473  if (stack_size == 0) {
474    switch (thr_type) {
475    case os::java_thread:
476      // Java threads use ThreadStackSize which default value can be changed with the flag -Xss
477      if (JavaThread::stack_size_at_create() > 0)
478        stack_size = JavaThread::stack_size_at_create();
479      break;
480    case os::compiler_thread:
481      if (CompilerThreadStackSize > 0) {
482        stack_size = (size_t)(CompilerThreadStackSize * K);
483        break;
484      } // else fall through:
485        // use VMThreadStackSize if CompilerThreadStackSize is not defined
486    case os::vm_thread:
487    case os::pgc_thread:
488    case os::cgc_thread:
489    case os::watcher_thread:
490      if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K);
491      break;
492    }
493  }
494
495  // Create the Win32 thread
496  //
497  // Contrary to what MSDN document says, "stack_size" in _beginthreadex()
498  // does not specify stack size. Instead, it specifies the size of
499  // initially committed space. The stack size is determined by
500  // PE header in the executable. If the committed "stack_size" is larger
501  // than default value in the PE header, the stack is rounded up to the
502  // nearest multiple of 1MB. For example if the launcher has default
503  // stack size of 320k, specifying any size less than 320k does not
504  // affect the actual stack size at all, it only affects the initial
505  // commitment. On the other hand, specifying 'stack_size' larger than
506  // default value may cause significant increase in memory usage, because
507  // not only the stack space will be rounded up to MB, but also the
508  // entire space is committed upfront.
509  //
510  // Finally Windows XP added a new flag 'STACK_SIZE_PARAM_IS_A_RESERVATION'
511  // for CreateThread() that can treat 'stack_size' as stack size. However we
512  // are not supposed to call CreateThread() directly according to MSDN
513  // document because JVM uses C runtime library. The good news is that the
514  // flag appears to work with _beginthredex() as well.
515
516#ifndef STACK_SIZE_PARAM_IS_A_RESERVATION
517#define STACK_SIZE_PARAM_IS_A_RESERVATION  (0x10000)
518#endif
519
520  HANDLE thread_handle =
521    (HANDLE)_beginthreadex(NULL,
522                           (unsigned)stack_size,
523                           (unsigned (__stdcall *)(void*)) java_start,
524                           thread,
525                           CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION,
526                           &thread_id);
527  if (thread_handle == NULL) {
528    // perhaps STACK_SIZE_PARAM_IS_A_RESERVATION is not supported, try again
529    // without the flag.
530    thread_handle =
531    (HANDLE)_beginthreadex(NULL,
532                           (unsigned)stack_size,
533                           (unsigned (__stdcall *)(void*)) java_start,
534                           thread,
535                           CREATE_SUSPENDED,
536                           &thread_id);
537  }
538  if (thread_handle == NULL) {
539    // Need to clean up stuff we've allocated so far
540    CloseHandle(osthread->interrupt_event());
541    thread->set_osthread(NULL);
542    delete osthread;
543    return NULL;
544  }
545
546  Atomic::inc_ptr((intptr_t*)&os::win32::_os_thread_count);
547
548  // Store info on the Win32 thread into the OSThread
549  osthread->set_thread_handle(thread_handle);
550  osthread->set_thread_id(thread_id);
551
552  // Initial thread state is INITIALIZED, not SUSPENDED
553  osthread->set_state(INITIALIZED);
554
555  // The thread is returned suspended (in state INITIALIZED), and is started higher up in the call chain
556  return true;
557}
558
559
560// Free Win32 resources related to the OSThread
561void os::free_thread(OSThread* osthread) {
562  assert(osthread != NULL, "osthread not set");
563  CloseHandle(osthread->thread_handle());
564  CloseHandle(osthread->interrupt_event());
565  delete osthread;
566}
567
568
569static int    has_performance_count = 0;
570static jlong first_filetime;
571static jlong initial_performance_count;
572static jlong performance_frequency;
573
574
575jlong as_long(LARGE_INTEGER x) {
576  jlong result = 0; // initialization to avoid warning
577  set_high(&result, x.HighPart);
578  set_low(&result,  x.LowPart);
579  return result;
580}
581
582
583jlong os::elapsed_counter() {
584  LARGE_INTEGER count;
585  if (has_performance_count) {
586    QueryPerformanceCounter(&count);
587    return as_long(count) - initial_performance_count;
588  } else {
589    FILETIME wt;
590    GetSystemTimeAsFileTime(&wt);
591    return (jlong_from(wt.dwHighDateTime, wt.dwLowDateTime) - first_filetime);
592  }
593}
594
595
596jlong os::elapsed_frequency() {
597  if (has_performance_count) {
598    return performance_frequency;
599  } else {
600   // the FILETIME time is the number of 100-nanosecond intervals since January 1,1601.
601   return 10000000;
602  }
603}
604
605
606julong os::available_memory() {
607  return win32::available_memory();
608}
609
610julong os::win32::available_memory() {
611  // FIXME: GlobalMemoryStatus() may return incorrect value if total memory
612  // is larger than 4GB
613  MEMORYSTATUS ms;
614  GlobalMemoryStatus(&ms);
615
616  return (julong)ms.dwAvailPhys;
617}
618
619julong os::physical_memory() {
620  return win32::physical_memory();
621}
622
623julong os::allocatable_physical_memory(julong size) {
624  return MIN2(size, (julong)1400*M);
625}
626
627// VC6 lacks DWORD_PTR
628#if _MSC_VER < 1300
629typedef UINT_PTR DWORD_PTR;
630#endif
631
632int os::active_processor_count() {
633  DWORD_PTR lpProcessAffinityMask = 0;
634  DWORD_PTR lpSystemAffinityMask = 0;
635  int proc_count = processor_count();
636  if (proc_count <= sizeof(UINT_PTR) * BitsPerByte &&
637      GetProcessAffinityMask(GetCurrentProcess(), &lpProcessAffinityMask, &lpSystemAffinityMask)) {
638    // Nof active processors is number of bits in process affinity mask
639    int bitcount = 0;
640    while (lpProcessAffinityMask != 0) {
641      lpProcessAffinityMask = lpProcessAffinityMask & (lpProcessAffinityMask-1);
642      bitcount++;
643    }
644    return bitcount;
645  } else {
646    return proc_count;
647  }
648}
649
650bool os::distribute_processes(uint length, uint* distribution) {
651  // Not yet implemented.
652  return false;
653}
654
655bool os::bind_to_processor(uint processor_id) {
656  // Not yet implemented.
657  return false;
658}
659
660static void initialize_performance_counter() {
661  LARGE_INTEGER count;
662  if (QueryPerformanceFrequency(&count)) {
663    has_performance_count = 1;
664    performance_frequency = as_long(count);
665    QueryPerformanceCounter(&count);
666    initial_performance_count = as_long(count);
667  } else {
668    has_performance_count = 0;
669    FILETIME wt;
670    GetSystemTimeAsFileTime(&wt);
671    first_filetime = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
672  }
673}
674
675
676double os::elapsedTime() {
677  return (double) elapsed_counter() / (double) elapsed_frequency();
678}
679
680
681// Windows format:
682//   The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601.
683// Java format:
684//   Java standards require the number of milliseconds since 1/1/1970
685
686// Constant offset - calculated using offset()
687static jlong  _offset   = 116444736000000000;
688// Fake time counter for reproducible results when debugging
689static jlong  fake_time = 0;
690
691#ifdef ASSERT
692// Just to be safe, recalculate the offset in debug mode
693static jlong _calculated_offset = 0;
694static int   _has_calculated_offset = 0;
695
696jlong offset() {
697  if (_has_calculated_offset) return _calculated_offset;
698  SYSTEMTIME java_origin;
699  java_origin.wYear          = 1970;
700  java_origin.wMonth         = 1;
701  java_origin.wDayOfWeek     = 0; // ignored
702  java_origin.wDay           = 1;
703  java_origin.wHour          = 0;
704  java_origin.wMinute        = 0;
705  java_origin.wSecond        = 0;
706  java_origin.wMilliseconds  = 0;
707  FILETIME jot;
708  if (!SystemTimeToFileTime(&java_origin, &jot)) {
709    fatal1("Error = %d\nWindows error", GetLastError());
710  }
711  _calculated_offset = jlong_from(jot.dwHighDateTime, jot.dwLowDateTime);
712  _has_calculated_offset = 1;
713  assert(_calculated_offset == _offset, "Calculated and constant time offsets must be equal");
714  return _calculated_offset;
715}
716#else
717jlong offset() {
718  return _offset;
719}
720#endif
721
722jlong windows_to_java_time(FILETIME wt) {
723  jlong a = jlong_from(wt.dwHighDateTime, wt.dwLowDateTime);
724  return (a - offset()) / 10000;
725}
726
727FILETIME java_to_windows_time(jlong l) {
728  jlong a = (l * 10000) + offset();
729  FILETIME result;
730  result.dwHighDateTime = high(a);
731  result.dwLowDateTime  = low(a);
732  return result;
733}
734
735jlong os::javaTimeMillis() {
736  if (UseFakeTimers) {
737    return fake_time++;
738  } else {
739    FILETIME wt;
740    GetSystemTimeAsFileTime(&wt);
741    return windows_to_java_time(wt);
742  }
743}
744
745#define NANOS_PER_SEC         CONST64(1000000000)
746#define NANOS_PER_MILLISEC    1000000
747jlong os::javaTimeNanos() {
748  if (!has_performance_count) {
749    return javaTimeMillis() * NANOS_PER_MILLISEC; // the best we can do.
750  } else {
751    LARGE_INTEGER current_count;
752    QueryPerformanceCounter(&current_count);
753    double current = as_long(current_count);
754    double freq = performance_frequency;
755    jlong time = (jlong)((current/freq) * NANOS_PER_SEC);
756    return time;
757  }
758}
759
760void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) {
761  if (!has_performance_count) {
762    // javaTimeMillis() doesn't have much percision,
763    // but it is not going to wrap -- so all 64 bits
764    info_ptr->max_value = ALL_64_BITS;
765
766    // this is a wall clock timer, so may skip
767    info_ptr->may_skip_backward = true;
768    info_ptr->may_skip_forward = true;
769  } else {
770    jlong freq = performance_frequency;
771    if (freq < NANOS_PER_SEC) {
772      // the performance counter is 64 bits and we will
773      // be multiplying it -- so no wrap in 64 bits
774      info_ptr->max_value = ALL_64_BITS;
775    } else if (freq > NANOS_PER_SEC) {
776      // use the max value the counter can reach to
777      // determine the max value which could be returned
778      julong max_counter = (julong)ALL_64_BITS;
779      info_ptr->max_value = (jlong)(max_counter / (freq / NANOS_PER_SEC));
780    } else {
781      // the performance counter is 64 bits and we will
782      // be using it directly -- so no wrap in 64 bits
783      info_ptr->max_value = ALL_64_BITS;
784    }
785
786    // using a counter, so no skipping
787    info_ptr->may_skip_backward = false;
788    info_ptr->may_skip_forward = false;
789  }
790  info_ptr->kind = JVMTI_TIMER_ELAPSED;                // elapsed not CPU time
791}
792
793char* os::local_time_string(char *buf, size_t buflen) {
794  SYSTEMTIME st;
795  GetLocalTime(&st);
796  jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d",
797               st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
798  return buf;
799}
800
801bool os::getTimesSecs(double* process_real_time,
802                     double* process_user_time,
803                     double* process_system_time) {
804  HANDLE h_process = GetCurrentProcess();
805  FILETIME create_time, exit_time, kernel_time, user_time;
806  BOOL result = GetProcessTimes(h_process,
807                               &create_time,
808                               &exit_time,
809                               &kernel_time,
810                               &user_time);
811  if (result != 0) {
812    FILETIME wt;
813    GetSystemTimeAsFileTime(&wt);
814    jlong rtc_millis = windows_to_java_time(wt);
815    jlong user_millis = windows_to_java_time(user_time);
816    jlong system_millis = windows_to_java_time(kernel_time);
817    *process_real_time = ((double) rtc_millis) / ((double) MILLIUNITS);
818    *process_user_time = ((double) user_millis) / ((double) MILLIUNITS);
819    *process_system_time = ((double) system_millis) / ((double) MILLIUNITS);
820    return true;
821  } else {
822    return false;
823  }
824}
825
826void os::shutdown() {
827
828  // allow PerfMemory to attempt cleanup of any persistent resources
829  perfMemory_exit();
830
831  // flush buffered output, finish log files
832  ostream_abort();
833
834  // Check for abort hook
835  abort_hook_t abort_hook = Arguments::abort_hook();
836  if (abort_hook != NULL) {
837    abort_hook();
838  }
839}
840
841void os::abort(bool dump_core)
842{
843  os::shutdown();
844  // no core dump on Windows
845  ::exit(1);
846}
847
848// Die immediately, no exit hook, no abort hook, no cleanup.
849void os::die() {
850  _exit(-1);
851}
852
853// Directory routines copied from src/win32/native/java/io/dirent_md.c
854//  * dirent_md.c       1.15 00/02/02
855//
856// The declarations for DIR and struct dirent are in jvm_win32.h.
857
858/* Caller must have already run dirname through JVM_NativePath, which removes
859   duplicate slashes and converts all instances of '/' into '\\'. */
860
861DIR *
862os::opendir(const char *dirname)
863{
864    assert(dirname != NULL, "just checking");   // hotspot change
865    DIR *dirp = (DIR *)malloc(sizeof(DIR));
866    DWORD fattr;                                // hotspot change
867    char alt_dirname[4] = { 0, 0, 0, 0 };
868
869    if (dirp == 0) {
870        errno = ENOMEM;
871        return 0;
872    }
873
874    /*
875     * Win32 accepts "\" in its POSIX stat(), but refuses to treat it
876     * as a directory in FindFirstFile().  We detect this case here and
877     * prepend the current drive name.
878     */
879    if (dirname[1] == '\0' && dirname[0] == '\\') {
880        alt_dirname[0] = _getdrive() + 'A' - 1;
881        alt_dirname[1] = ':';
882        alt_dirname[2] = '\\';
883        alt_dirname[3] = '\0';
884        dirname = alt_dirname;
885    }
886
887    dirp->path = (char *)malloc(strlen(dirname) + 5);
888    if (dirp->path == 0) {
889        free(dirp);
890        errno = ENOMEM;
891        return 0;
892    }
893    strcpy(dirp->path, dirname);
894
895    fattr = GetFileAttributes(dirp->path);
896    if (fattr == 0xffffffff) {
897        free(dirp->path);
898        free(dirp);
899        errno = ENOENT;
900        return 0;
901    } else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
902        free(dirp->path);
903        free(dirp);
904        errno = ENOTDIR;
905        return 0;
906    }
907
908    /* Append "*.*", or possibly "\\*.*", to path */
909    if (dirp->path[1] == ':'
910        && (dirp->path[2] == '\0'
911            || (dirp->path[2] == '\\' && dirp->path[3] == '\0'))) {
912        /* No '\\' needed for cases like "Z:" or "Z:\" */
913        strcat(dirp->path, "*.*");
914    } else {
915        strcat(dirp->path, "\\*.*");
916    }
917
918    dirp->handle = FindFirstFile(dirp->path, &dirp->find_data);
919    if (dirp->handle == INVALID_HANDLE_VALUE) {
920        if (GetLastError() != ERROR_FILE_NOT_FOUND) {
921            free(dirp->path);
922            free(dirp);
923            errno = EACCES;
924            return 0;
925        }
926    }
927    return dirp;
928}
929
930/* parameter dbuf unused on Windows */
931
932struct dirent *
933os::readdir(DIR *dirp, dirent *dbuf)
934{
935    assert(dirp != NULL, "just checking");      // hotspot change
936    if (dirp->handle == INVALID_HANDLE_VALUE) {
937        return 0;
938    }
939
940    strcpy(dirp->dirent.d_name, dirp->find_data.cFileName);
941
942    if (!FindNextFile(dirp->handle, &dirp->find_data)) {
943        if (GetLastError() == ERROR_INVALID_HANDLE) {
944            errno = EBADF;
945            return 0;
946        }
947        FindClose(dirp->handle);
948        dirp->handle = INVALID_HANDLE_VALUE;
949    }
950
951    return &dirp->dirent;
952}
953
954int
955os::closedir(DIR *dirp)
956{
957    assert(dirp != NULL, "just checking");      // hotspot change
958    if (dirp->handle != INVALID_HANDLE_VALUE) {
959        if (!FindClose(dirp->handle)) {
960            errno = EBADF;
961            return -1;
962        }
963        dirp->handle = INVALID_HANDLE_VALUE;
964    }
965    free(dirp->path);
966    free(dirp);
967    return 0;
968}
969
970const char* os::dll_file_extension() { return ".dll"; }
971
972const char * os::get_temp_directory()
973{
974    static char path_buf[MAX_PATH];
975    if (GetTempPath(MAX_PATH, path_buf)>0)
976      return path_buf;
977    else{
978      path_buf[0]='\0';
979      return path_buf;
980    }
981}
982
983// Needs to be in os specific directory because windows requires another
984// header file <direct.h>
985const char* os::get_current_directory(char *buf, int buflen) {
986  return _getcwd(buf, buflen);
987}
988
989//-----------------------------------------------------------
990// Helper functions for fatal error handler
991
992// The following library functions are resolved dynamically at runtime:
993
994// PSAPI functions, for Windows NT, 2000, XP
995
996// psapi.h doesn't come with Visual Studio 6; it can be downloaded as Platform
997// SDK from Microsoft.  Here are the definitions copied from psapi.h
998typedef struct _MODULEINFO {
999    LPVOID lpBaseOfDll;
1000    DWORD SizeOfImage;
1001    LPVOID EntryPoint;
1002} MODULEINFO, *LPMODULEINFO;
1003
1004static BOOL  (WINAPI *_EnumProcessModules)  ( HANDLE, HMODULE *, DWORD, LPDWORD );
1005static DWORD (WINAPI *_GetModuleFileNameEx) ( HANDLE, HMODULE, LPTSTR, DWORD );
1006static BOOL  (WINAPI *_GetModuleInformation)( HANDLE, HMODULE, LPMODULEINFO, DWORD );
1007
1008// ToolHelp Functions, for Windows 95, 98 and ME
1009
1010static HANDLE(WINAPI *_CreateToolhelp32Snapshot)(DWORD,DWORD) ;
1011static BOOL  (WINAPI *_Module32First)           (HANDLE,LPMODULEENTRY32) ;
1012static BOOL  (WINAPI *_Module32Next)            (HANDLE,LPMODULEENTRY32) ;
1013
1014bool _has_psapi;
1015bool _psapi_init = false;
1016bool _has_toolhelp;
1017
1018static bool _init_psapi() {
1019  HINSTANCE psapi = LoadLibrary( "PSAPI.DLL" ) ;
1020  if( psapi == NULL ) return false ;
1021
1022  _EnumProcessModules = CAST_TO_FN_PTR(
1023      BOOL(WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD),
1024      GetProcAddress(psapi, "EnumProcessModules")) ;
1025  _GetModuleFileNameEx = CAST_TO_FN_PTR(
1026      DWORD (WINAPI *)(HANDLE, HMODULE, LPTSTR, DWORD),
1027      GetProcAddress(psapi, "GetModuleFileNameExA"));
1028  _GetModuleInformation = CAST_TO_FN_PTR(
1029      BOOL (WINAPI *)(HANDLE, HMODULE, LPMODULEINFO, DWORD),
1030      GetProcAddress(psapi, "GetModuleInformation"));
1031
1032  _has_psapi = (_EnumProcessModules && _GetModuleFileNameEx && _GetModuleInformation);
1033  _psapi_init = true;
1034  return _has_psapi;
1035}
1036
1037static bool _init_toolhelp() {
1038  HINSTANCE kernel32 = LoadLibrary("Kernel32.DLL") ;
1039  if (kernel32 == NULL) return false ;
1040
1041  _CreateToolhelp32Snapshot = CAST_TO_FN_PTR(
1042      HANDLE(WINAPI *)(DWORD,DWORD),
1043      GetProcAddress(kernel32, "CreateToolhelp32Snapshot"));
1044  _Module32First = CAST_TO_FN_PTR(
1045      BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32),
1046      GetProcAddress(kernel32, "Module32First" ));
1047  _Module32Next = CAST_TO_FN_PTR(
1048      BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32),
1049      GetProcAddress(kernel32, "Module32Next" ));
1050
1051  _has_toolhelp = (_CreateToolhelp32Snapshot && _Module32First && _Module32Next);
1052  return _has_toolhelp;
1053}
1054
1055#ifdef _WIN64
1056// Helper routine which returns true if address in
1057// within the NTDLL address space.
1058//
1059static bool _addr_in_ntdll( address addr )
1060{
1061  HMODULE hmod;
1062  MODULEINFO minfo;
1063
1064  hmod = GetModuleHandle("NTDLL.DLL");
1065  if ( hmod == NULL ) return false;
1066  if ( !_GetModuleInformation( GetCurrentProcess(), hmod,
1067                               &minfo, sizeof(MODULEINFO)) )
1068    return false;
1069
1070  if ( (addr >= minfo.lpBaseOfDll) &&
1071       (addr < (address)((uintptr_t)minfo.lpBaseOfDll + (uintptr_t)minfo.SizeOfImage)))
1072    return true;
1073  else
1074    return false;
1075}
1076#endif
1077
1078
1079// Enumerate all modules for a given process ID
1080//
1081// Notice that Windows 95/98/Me and Windows NT/2000/XP have
1082// different API for doing this. We use PSAPI.DLL on NT based
1083// Windows and ToolHelp on 95/98/Me.
1084
1085// Callback function that is called by enumerate_modules() on
1086// every DLL module.
1087// Input parameters:
1088//    int       pid,
1089//    char*     module_file_name,
1090//    address   module_base_addr,
1091//    unsigned  module_size,
1092//    void*     param
1093typedef int (*EnumModulesCallbackFunc)(int, char *, address, unsigned, void *);
1094
1095// enumerate_modules for Windows NT, using PSAPI
1096static int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void * param)
1097{
1098  HANDLE   hProcess ;
1099
1100# define MAX_NUM_MODULES 128
1101  HMODULE     modules[MAX_NUM_MODULES];
1102  static char filename[ MAX_PATH ];
1103  int         result = 0;
1104
1105  if (!_has_psapi && (_psapi_init || !_init_psapi())) return 0;
1106
1107  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
1108                         FALSE, pid ) ;
1109  if (hProcess == NULL) return 0;
1110
1111  DWORD size_needed;
1112  if (!_EnumProcessModules(hProcess, modules,
1113                           sizeof(modules), &size_needed)) {
1114      CloseHandle( hProcess );
1115      return 0;
1116  }
1117
1118  // number of modules that are currently loaded
1119  int num_modules = size_needed / sizeof(HMODULE);
1120
1121  for (int i = 0; i < MIN2(num_modules, MAX_NUM_MODULES); i++) {
1122    // Get Full pathname:
1123    if(!_GetModuleFileNameEx(hProcess, modules[i],
1124                             filename, sizeof(filename))) {
1125        filename[0] = '\0';
1126    }
1127
1128    MODULEINFO modinfo;
1129    if (!_GetModuleInformation(hProcess, modules[i],
1130                               &modinfo, sizeof(modinfo))) {
1131        modinfo.lpBaseOfDll = NULL;
1132        modinfo.SizeOfImage = 0;
1133    }
1134
1135    // Invoke callback function
1136    result = func(pid, filename, (address)modinfo.lpBaseOfDll,
1137                  modinfo.SizeOfImage, param);
1138    if (result) break;
1139  }
1140
1141  CloseHandle( hProcess ) ;
1142  return result;
1143}
1144
1145
1146// enumerate_modules for Windows 95/98/ME, using TOOLHELP
1147static int _enumerate_modules_windows( int pid, EnumModulesCallbackFunc func, void *param)
1148{
1149  HANDLE                hSnapShot ;
1150  static MODULEENTRY32  modentry ;
1151  int                   result = 0;
1152
1153  if (!_has_toolhelp) return 0;
1154
1155  // Get a handle to a Toolhelp snapshot of the system
1156  hSnapShot = _CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid ) ;
1157  if( hSnapShot == INVALID_HANDLE_VALUE ) {
1158      return FALSE ;
1159  }
1160
1161  // iterate through all modules
1162  modentry.dwSize = sizeof(MODULEENTRY32) ;
1163  bool not_done = _Module32First( hSnapShot, &modentry ) != 0;
1164
1165  while( not_done ) {
1166    // invoke the callback
1167    result=func(pid, modentry.szExePath, (address)modentry.modBaseAddr,
1168                modentry.modBaseSize, param);
1169    if (result) break;
1170
1171    modentry.dwSize = sizeof(MODULEENTRY32) ;
1172    not_done = _Module32Next( hSnapShot, &modentry ) != 0;
1173  }
1174
1175  CloseHandle(hSnapShot);
1176  return result;
1177}
1178
1179int enumerate_modules( int pid, EnumModulesCallbackFunc func, void * param )
1180{
1181  // Get current process ID if caller doesn't provide it.
1182  if (!pid) pid = os::current_process_id();
1183
1184  if (os::win32::is_nt()) return _enumerate_modules_winnt  (pid, func, param);
1185  else                    return _enumerate_modules_windows(pid, func, param);
1186}
1187
1188struct _modinfo {
1189   address addr;
1190   char*   full_path;   // point to a char buffer
1191   int     buflen;      // size of the buffer
1192   address base_addr;
1193};
1194
1195static int _locate_module_by_addr(int pid, char * mod_fname, address base_addr,
1196                                  unsigned size, void * param) {
1197   struct _modinfo *pmod = (struct _modinfo *)param;
1198   if (!pmod) return -1;
1199
1200   if (base_addr     <= pmod->addr &&
1201       base_addr+size > pmod->addr) {
1202     // if a buffer is provided, copy path name to the buffer
1203     if (pmod->full_path) {
1204       jio_snprintf(pmod->full_path, pmod->buflen, "%s", mod_fname);
1205     }
1206     pmod->base_addr = base_addr;
1207     return 1;
1208   }
1209   return 0;
1210}
1211
1212bool os::dll_address_to_library_name(address addr, char* buf,
1213                                     int buflen, int* offset) {
1214// NOTE: the reason we don't use SymGetModuleInfo() is it doesn't always
1215//       return the full path to the DLL file, sometimes it returns path
1216//       to the corresponding PDB file (debug info); sometimes it only
1217//       returns partial path, which makes life painful.
1218
1219   struct _modinfo mi;
1220   mi.addr      = addr;
1221   mi.full_path = buf;
1222   mi.buflen    = buflen;
1223   int pid = os::current_process_id();
1224   if (enumerate_modules(pid, _locate_module_by_addr, (void *)&mi)) {
1225      // buf already contains path name
1226      if (offset) *offset = addr - mi.base_addr;
1227      return true;
1228   } else {
1229      if (buf) buf[0] = '\0';
1230      if (offset) *offset = -1;
1231      return false;
1232   }
1233}
1234
1235bool os::dll_address_to_function_name(address addr, char *buf,
1236                                      int buflen, int *offset) {
1237  // Unimplemented on Windows - in order to use SymGetSymFromAddr(),
1238  // we need to initialize imagehlp/dbghelp, then load symbol table
1239  // for every module. That's too much work to do after a fatal error.
1240  // For an example on how to implement this function, see 1.4.2.
1241  if (offset)  *offset  = -1;
1242  if (buf) buf[0] = '\0';
1243  return false;
1244}
1245
1246// save the start and end address of jvm.dll into param[0] and param[1]
1247static int _locate_jvm_dll(int pid, char* mod_fname, address base_addr,
1248                    unsigned size, void * param) {
1249   if (!param) return -1;
1250
1251   if (base_addr     <= (address)_locate_jvm_dll &&
1252       base_addr+size > (address)_locate_jvm_dll) {
1253         ((address*)param)[0] = base_addr;
1254         ((address*)param)[1] = base_addr + size;
1255         return 1;
1256   }
1257   return 0;
1258}
1259
1260address vm_lib_location[2];    // start and end address of jvm.dll
1261
1262// check if addr is inside jvm.dll
1263bool os::address_is_in_vm(address addr) {
1264  if (!vm_lib_location[0] || !vm_lib_location[1]) {
1265    int pid = os::current_process_id();
1266    if (!enumerate_modules(pid, _locate_jvm_dll, (void *)vm_lib_location)) {
1267      assert(false, "Can't find jvm module.");
1268      return false;
1269    }
1270  }
1271
1272  return (vm_lib_location[0] <= addr) && (addr < vm_lib_location[1]);
1273}
1274
1275// print module info; param is outputStream*
1276static int _print_module(int pid, char* fname, address base,
1277                         unsigned size, void* param) {
1278   if (!param) return -1;
1279
1280   outputStream* st = (outputStream*)param;
1281
1282   address end_addr = base + size;
1283   st->print(PTR_FORMAT " - " PTR_FORMAT " \t%s\n", base, end_addr, fname);
1284   return 0;
1285}
1286
1287// Loads .dll/.so and
1288// in case of error it checks if .dll/.so was built for the
1289// same architecture as Hotspot is running on
1290void * os::dll_load(const char *name, char *ebuf, int ebuflen)
1291{
1292  void * result = LoadLibrary(name);
1293  if (result != NULL)
1294  {
1295    return result;
1296  }
1297
1298  long errcode = GetLastError();
1299  if (errcode == ERROR_MOD_NOT_FOUND) {
1300    strncpy(ebuf, "Can't find dependent libraries", ebuflen-1);
1301    ebuf[ebuflen-1]='\0';
1302    return NULL;
1303  }
1304
1305  // Parsing dll below
1306  // If we can read dll-info and find that dll was built
1307  // for an architecture other than Hotspot is running in
1308  // - then print to buffer "DLL was built for a different architecture"
1309  // else call getLastErrorString to obtain system error message
1310
1311  // Read system error message into ebuf
1312  // It may or may not be overwritten below (in the for loop and just above)
1313  getLastErrorString(ebuf, (size_t) ebuflen);
1314  ebuf[ebuflen-1]='\0';
1315  int file_descriptor=::open(name, O_RDONLY | O_BINARY, 0);
1316  if (file_descriptor<0)
1317  {
1318    return NULL;
1319  }
1320
1321  uint32_t signature_offset;
1322  uint16_t lib_arch=0;
1323  bool failed_to_get_lib_arch=
1324  (
1325    //Go to position 3c in the dll
1326    (os::seek_to_file_offset(file_descriptor,IMAGE_FILE_PTR_TO_SIGNATURE)<0)
1327    ||
1328    // Read loacation of signature
1329    (sizeof(signature_offset)!=
1330      (os::read(file_descriptor, (void*)&signature_offset,sizeof(signature_offset))))
1331    ||
1332    //Go to COFF File Header in dll
1333    //that is located after"signature" (4 bytes long)
1334    (os::seek_to_file_offset(file_descriptor,
1335      signature_offset+IMAGE_FILE_SIGNATURE_LENGTH)<0)
1336    ||
1337    //Read field that contains code of architecture
1338    // that dll was build for
1339    (sizeof(lib_arch)!=
1340      (os::read(file_descriptor, (void*)&lib_arch,sizeof(lib_arch))))
1341  );
1342
1343  ::close(file_descriptor);
1344  if (failed_to_get_lib_arch)
1345  {
1346    // file i/o error - report getLastErrorString(...) msg
1347    return NULL;
1348  }
1349
1350  typedef struct
1351  {
1352    uint16_t arch_code;
1353    char* arch_name;
1354  } arch_t;
1355
1356  static const arch_t arch_array[]={
1357    {IMAGE_FILE_MACHINE_I386,      (char*)"IA 32"},
1358    {IMAGE_FILE_MACHINE_AMD64,     (char*)"AMD 64"},
1359    {IMAGE_FILE_MACHINE_IA64,      (char*)"IA 64"}
1360  };
1361  #if   (defined _M_IA64)
1362    static const uint16_t running_arch=IMAGE_FILE_MACHINE_IA64;
1363  #elif (defined _M_AMD64)
1364    static const uint16_t running_arch=IMAGE_FILE_MACHINE_AMD64;
1365  #elif (defined _M_IX86)
1366    static const uint16_t running_arch=IMAGE_FILE_MACHINE_I386;
1367  #else
1368    #error Method os::dll_load requires that one of following \
1369           is defined :_M_IA64,_M_AMD64 or _M_IX86
1370  #endif
1371
1372
1373  // Obtain a string for printf operation
1374  // lib_arch_str shall contain string what platform this .dll was built for
1375  // running_arch_str shall string contain what platform Hotspot was built for
1376  char *running_arch_str=NULL,*lib_arch_str=NULL;
1377  for (unsigned int i=0;i<ARRAY_SIZE(arch_array);i++)
1378  {
1379    if (lib_arch==arch_array[i].arch_code)
1380      lib_arch_str=arch_array[i].arch_name;
1381    if (running_arch==arch_array[i].arch_code)
1382      running_arch_str=arch_array[i].arch_name;
1383  }
1384
1385  assert(running_arch_str,
1386    "Didn't find runing architecture code in arch_array");
1387
1388  // If the architure is right
1389  // but some other error took place - report getLastErrorString(...) msg
1390  if (lib_arch == running_arch)
1391  {
1392    return NULL;
1393  }
1394
1395  if (lib_arch_str!=NULL)
1396  {
1397    ::_snprintf(ebuf, ebuflen-1,
1398      "Can't load %s-bit .dll on a %s-bit platform",
1399      lib_arch_str,running_arch_str);
1400  }
1401  else
1402  {
1403    // don't know what architecture this dll was build for
1404    ::_snprintf(ebuf, ebuflen-1,
1405      "Can't load this .dll (machine code=0x%x) on a %s-bit platform",
1406      lib_arch,running_arch_str);
1407  }
1408
1409  return NULL;
1410}
1411
1412
1413void os::print_dll_info(outputStream *st) {
1414   int pid = os::current_process_id();
1415   st->print_cr("Dynamic libraries:");
1416   enumerate_modules(pid, _print_module, (void *)st);
1417}
1418
1419void os::print_os_info(outputStream* st) {
1420   st->print("OS:");
1421
1422   OSVERSIONINFOEX osvi;
1423   ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
1424   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
1425
1426   if (!GetVersionEx((OSVERSIONINFO *)&osvi)) {
1427      st->print_cr("N/A");
1428      return;
1429   }
1430
1431   int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion;
1432
1433   if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
1434     switch (os_vers) {
1435       case 3051: st->print(" Windows NT 3.51"); break;
1436       case 4000: st->print(" Windows NT 4.0"); break;
1437       case 5000: st->print(" Windows 2000"); break;
1438       case 5001: st->print(" Windows XP"); break;
1439       case 5002: st->print(" Windows Server 2003 family"); break;
1440       case 6000: st->print(" Windows Vista"); break;
1441       default: // future windows, print out its major and minor versions
1442                st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1443     }
1444   } else {
1445     switch (os_vers) {
1446       case 4000: st->print(" Windows 95"); break;
1447       case 4010: st->print(" Windows 98"); break;
1448       case 4090: st->print(" Windows Me"); break;
1449       default: // future windows, print out its major and minor versions
1450                st->print(" Windows %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
1451     }
1452   }
1453
1454   st->print(" Build %d", osvi.dwBuildNumber);
1455   st->print(" %s", osvi.szCSDVersion);           // service pack
1456   st->cr();
1457}
1458
1459void os::print_memory_info(outputStream* st) {
1460  st->print("Memory:");
1461  st->print(" %dk page", os::vm_page_size()>>10);
1462
1463  // FIXME: GlobalMemoryStatus() may return incorrect value if total memory
1464  // is larger than 4GB
1465  MEMORYSTATUS ms;
1466  GlobalMemoryStatus(&ms);
1467
1468  st->print(", physical %uk", os::physical_memory() >> 10);
1469  st->print("(%uk free)", os::available_memory() >> 10);
1470
1471  st->print(", swap %uk", ms.dwTotalPageFile >> 10);
1472  st->print("(%uk free)", ms.dwAvailPageFile >> 10);
1473  st->cr();
1474}
1475
1476void os::print_siginfo(outputStream *st, void *siginfo) {
1477  EXCEPTION_RECORD* er = (EXCEPTION_RECORD*)siginfo;
1478  st->print("siginfo:");
1479  st->print(" ExceptionCode=0x%x", er->ExceptionCode);
1480
1481  if (er->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
1482      er->NumberParameters >= 2) {
1483      switch (er->ExceptionInformation[0]) {
1484      case 0: st->print(", reading address"); break;
1485      case 1: st->print(", writing address"); break;
1486      default: st->print(", ExceptionInformation=" INTPTR_FORMAT,
1487                            er->ExceptionInformation[0]);
1488      }
1489      st->print(" " INTPTR_FORMAT, er->ExceptionInformation[1]);
1490  } else if (er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR &&
1491             er->NumberParameters >= 2 && UseSharedSpaces) {
1492    FileMapInfo* mapinfo = FileMapInfo::current_info();
1493    if (mapinfo->is_in_shared_space((void*)er->ExceptionInformation[1])) {
1494      st->print("\n\nError accessing class data sharing archive."       \
1495                " Mapped file inaccessible during execution, "          \
1496                " possible disk/network problem.");
1497    }
1498  } else {
1499    int num = er->NumberParameters;
1500    if (num > 0) {
1501      st->print(", ExceptionInformation=");
1502      for (int i = 0; i < num; i++) {
1503        st->print(INTPTR_FORMAT " ", er->ExceptionInformation[i]);
1504      }
1505    }
1506  }
1507  st->cr();
1508}
1509
1510void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
1511  // do nothing
1512}
1513
1514static char saved_jvm_path[MAX_PATH] = {0};
1515
1516// Find the full path to the current module, jvm.dll or jvm_g.dll
1517void os::jvm_path(char *buf, jint buflen) {
1518  // Error checking.
1519  if (buflen < MAX_PATH) {
1520    assert(false, "must use a large-enough buffer");
1521    buf[0] = '\0';
1522    return;
1523  }
1524  // Lazy resolve the path to current module.
1525  if (saved_jvm_path[0] != 0) {
1526    strcpy(buf, saved_jvm_path);
1527    return;
1528  }
1529
1530  GetModuleFileName(vm_lib_handle, buf, buflen);
1531  strcpy(saved_jvm_path, buf);
1532}
1533
1534
1535void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
1536#ifndef _WIN64
1537  st->print("_");
1538#endif
1539}
1540
1541
1542void os::print_jni_name_suffix_on(outputStream* st, int args_size) {
1543#ifndef _WIN64
1544  st->print("@%d", args_size  * sizeof(int));
1545#endif
1546}
1547
1548// sun.misc.Signal
1549// NOTE that this is a workaround for an apparent kernel bug where if
1550// a signal handler for SIGBREAK is installed then that signal handler
1551// takes priority over the console control handler for CTRL_CLOSE_EVENT.
1552// See bug 4416763.
1553static void (*sigbreakHandler)(int) = NULL;
1554
1555static void UserHandler(int sig, void *siginfo, void *context) {
1556  os::signal_notify(sig);
1557  // We need to reinstate the signal handler each time...
1558  os::signal(sig, (void*)UserHandler);
1559}
1560
1561void* os::user_handler() {
1562  return (void*) UserHandler;
1563}
1564
1565void* os::signal(int signal_number, void* handler) {
1566  if ((signal_number == SIGBREAK) && (!ReduceSignalUsage)) {
1567    void (*oldHandler)(int) = sigbreakHandler;
1568    sigbreakHandler = (void (*)(int)) handler;
1569    return (void*) oldHandler;
1570  } else {
1571    return (void*)::signal(signal_number, (void (*)(int))handler);
1572  }
1573}
1574
1575void os::signal_raise(int signal_number) {
1576  raise(signal_number);
1577}
1578
1579// The Win32 C runtime library maps all console control events other than ^C
1580// into SIGBREAK, which makes it impossible to distinguish ^BREAK from close,
1581// logoff, and shutdown events.  We therefore install our own console handler
1582// that raises SIGTERM for the latter cases.
1583//
1584static BOOL WINAPI consoleHandler(DWORD event) {
1585  switch(event) {
1586    case CTRL_C_EVENT:
1587      if (is_error_reported()) {
1588        // Ctrl-C is pressed during error reporting, likely because the error
1589        // handler fails to abort. Let VM die immediately.
1590        os::die();
1591      }
1592
1593      os::signal_raise(SIGINT);
1594      return TRUE;
1595      break;
1596    case CTRL_BREAK_EVENT:
1597      if (sigbreakHandler != NULL) {
1598        (*sigbreakHandler)(SIGBREAK);
1599      }
1600      return TRUE;
1601      break;
1602    case CTRL_CLOSE_EVENT:
1603    case CTRL_LOGOFF_EVENT:
1604    case CTRL_SHUTDOWN_EVENT:
1605      os::signal_raise(SIGTERM);
1606      return TRUE;
1607      break;
1608    default:
1609      break;
1610  }
1611  return FALSE;
1612}
1613
1614/*
1615 * The following code is moved from os.cpp for making this
1616 * code platform specific, which it is by its very nature.
1617 */
1618
1619// Return maximum OS signal used + 1 for internal use only
1620// Used as exit signal for signal_thread
1621int os::sigexitnum_pd(){
1622  return NSIG;
1623}
1624
1625// a counter for each possible signal value, including signal_thread exit signal
1626static volatile jint pending_signals[NSIG+1] = { 0 };
1627static HANDLE sig_sem;
1628
1629void os::signal_init_pd() {
1630  // Initialize signal structures
1631  memset((void*)pending_signals, 0, sizeof(pending_signals));
1632
1633  sig_sem = ::CreateSemaphore(NULL, 0, NSIG+1, NULL);
1634
1635  // Programs embedding the VM do not want it to attempt to receive
1636  // events like CTRL_LOGOFF_EVENT, which are used to implement the
1637  // shutdown hooks mechanism introduced in 1.3.  For example, when
1638  // the VM is run as part of a Windows NT service (i.e., a servlet
1639  // engine in a web server), the correct behavior is for any console
1640  // control handler to return FALSE, not TRUE, because the OS's
1641  // "final" handler for such events allows the process to continue if
1642  // it is a service (while terminating it if it is not a service).
1643  // To make this behavior uniform and the mechanism simpler, we
1644  // completely disable the VM's usage of these console events if -Xrs
1645  // (=ReduceSignalUsage) is specified.  This means, for example, that
1646  // the CTRL-BREAK thread dump mechanism is also disabled in this
1647  // case.  See bugs 4323062, 4345157, and related bugs.
1648
1649  if (!ReduceSignalUsage) {
1650    // Add a CTRL-C handler
1651    SetConsoleCtrlHandler(consoleHandler, TRUE);
1652  }
1653}
1654
1655void os::signal_notify(int signal_number) {
1656  BOOL ret;
1657
1658  Atomic::inc(&pending_signals[signal_number]);
1659  ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
1660  assert(ret != 0, "ReleaseSemaphore() failed");
1661}
1662
1663static int check_pending_signals(bool wait_for_signal) {
1664  DWORD ret;
1665  while (true) {
1666    for (int i = 0; i < NSIG + 1; i++) {
1667      jint n = pending_signals[i];
1668      if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) {
1669        return i;
1670      }
1671    }
1672    if (!wait_for_signal) {
1673      return -1;
1674    }
1675
1676    JavaThread *thread = JavaThread::current();
1677
1678    ThreadBlockInVM tbivm(thread);
1679
1680    bool threadIsSuspended;
1681    do {
1682      thread->set_suspend_equivalent();
1683      // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
1684      ret = ::WaitForSingleObject(sig_sem, INFINITE);
1685      assert(ret == WAIT_OBJECT_0, "WaitForSingleObject() failed");
1686
1687      // were we externally suspended while we were waiting?
1688      threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
1689      if (threadIsSuspended) {
1690        //
1691        // The semaphore has been incremented, but while we were waiting
1692        // another thread suspended us. We don't want to continue running
1693        // while suspended because that would surprise the thread that
1694        // suspended us.
1695        //
1696        ret = ::ReleaseSemaphore(sig_sem, 1, NULL);
1697        assert(ret != 0, "ReleaseSemaphore() failed");
1698
1699        thread->java_suspend_self();
1700      }
1701    } while (threadIsSuspended);
1702  }
1703}
1704
1705int os::signal_lookup() {
1706  return check_pending_signals(false);
1707}
1708
1709int os::signal_wait() {
1710  return check_pending_signals(true);
1711}
1712
1713// Implicit OS exception handling
1714
1715LONG Handle_Exception(struct _EXCEPTION_POINTERS* exceptionInfo, address handler) {
1716  JavaThread* thread = JavaThread::current();
1717  // Save pc in thread
1718#ifdef _M_IA64
1719  thread->set_saved_exception_pc((address)exceptionInfo->ContextRecord->StIIP);
1720  // Set pc to handler
1721  exceptionInfo->ContextRecord->StIIP = (DWORD64)handler;
1722#elif _M_AMD64
1723  thread->set_saved_exception_pc((address)exceptionInfo->ContextRecord->Rip);
1724  // Set pc to handler
1725  exceptionInfo->ContextRecord->Rip = (DWORD64)handler;
1726#else
1727  thread->set_saved_exception_pc((address)exceptionInfo->ContextRecord->Eip);
1728  // Set pc to handler
1729  exceptionInfo->ContextRecord->Eip = (LONG)handler;
1730#endif
1731
1732  // Continue the execution
1733  return EXCEPTION_CONTINUE_EXECUTION;
1734}
1735
1736
1737// Used for PostMortemDump
1738extern "C" void safepoints();
1739extern "C" void find(int x);
1740extern "C" void events();
1741
1742// According to Windows API documentation, an illegal instruction sequence should generate
1743// the 0xC000001C exception code. However, real world experience shows that occasionnaly
1744// the execution of an illegal instruction can generate the exception code 0xC000001E. This
1745// seems to be an undocumented feature of Win NT 4.0 (and probably other Windows systems).
1746
1747#define EXCEPTION_ILLEGAL_INSTRUCTION_2 0xC000001E
1748
1749// From "Execution Protection in the Windows Operating System" draft 0.35
1750// Once a system header becomes available, the "real" define should be
1751// included or copied here.
1752#define EXCEPTION_INFO_EXEC_VIOLATION 0x08
1753
1754#define def_excpt(val) #val, val
1755
1756struct siglabel {
1757  char *name;
1758  int   number;
1759};
1760
1761struct siglabel exceptlabels[] = {
1762    def_excpt(EXCEPTION_ACCESS_VIOLATION),
1763    def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT),
1764    def_excpt(EXCEPTION_BREAKPOINT),
1765    def_excpt(EXCEPTION_SINGLE_STEP),
1766    def_excpt(EXCEPTION_ARRAY_BOUNDS_EXCEEDED),
1767    def_excpt(EXCEPTION_FLT_DENORMAL_OPERAND),
1768    def_excpt(EXCEPTION_FLT_DIVIDE_BY_ZERO),
1769    def_excpt(EXCEPTION_FLT_INEXACT_RESULT),
1770    def_excpt(EXCEPTION_FLT_INVALID_OPERATION),
1771    def_excpt(EXCEPTION_FLT_OVERFLOW),
1772    def_excpt(EXCEPTION_FLT_STACK_CHECK),
1773    def_excpt(EXCEPTION_FLT_UNDERFLOW),
1774    def_excpt(EXCEPTION_INT_DIVIDE_BY_ZERO),
1775    def_excpt(EXCEPTION_INT_OVERFLOW),
1776    def_excpt(EXCEPTION_PRIV_INSTRUCTION),
1777    def_excpt(EXCEPTION_IN_PAGE_ERROR),
1778    def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION),
1779    def_excpt(EXCEPTION_ILLEGAL_INSTRUCTION_2),
1780    def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION),
1781    def_excpt(EXCEPTION_STACK_OVERFLOW),
1782    def_excpt(EXCEPTION_INVALID_DISPOSITION),
1783    def_excpt(EXCEPTION_GUARD_PAGE),
1784    def_excpt(EXCEPTION_INVALID_HANDLE),
1785    NULL, 0
1786};
1787
1788const char* os::exception_name(int exception_code, char *buf, size_t size) {
1789  for (int i = 0; exceptlabels[i].name != NULL; i++) {
1790    if (exceptlabels[i].number == exception_code) {
1791       jio_snprintf(buf, size, "%s", exceptlabels[i].name);
1792       return buf;
1793    }
1794  }
1795
1796  return NULL;
1797}
1798
1799//-----------------------------------------------------------------------------
1800LONG Handle_IDiv_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
1801  // handle exception caused by idiv; should only happen for -MinInt/-1
1802  // (division by zero is handled explicitly)
1803#ifdef _M_IA64
1804  assert(0, "Fix Handle_IDiv_Exception");
1805#elif _M_AMD64
1806  PCONTEXT ctx = exceptionInfo->ContextRecord;
1807  address pc = (address)ctx->Rip;
1808  NOT_PRODUCT(Events::log("idiv overflow exception at " INTPTR_FORMAT , pc));
1809  assert(pc[0] == 0xF7, "not an idiv opcode");
1810  assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
1811  assert(ctx->Rax == min_jint, "unexpected idiv exception");
1812  // set correct result values and continue after idiv instruction
1813  ctx->Rip = (DWORD)pc + 2;        // idiv reg, reg  is 2 bytes
1814  ctx->Rax = (DWORD)min_jint;      // result
1815  ctx->Rdx = (DWORD)0;             // remainder
1816  // Continue the execution
1817#else
1818  PCONTEXT ctx = exceptionInfo->ContextRecord;
1819  address pc = (address)ctx->Eip;
1820  NOT_PRODUCT(Events::log("idiv overflow exception at " INTPTR_FORMAT , pc));
1821  assert(pc[0] == 0xF7, "not an idiv opcode");
1822  assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands");
1823  assert(ctx->Eax == min_jint, "unexpected idiv exception");
1824  // set correct result values and continue after idiv instruction
1825  ctx->Eip = (DWORD)pc + 2;        // idiv reg, reg  is 2 bytes
1826  ctx->Eax = (DWORD)min_jint;      // result
1827  ctx->Edx = (DWORD)0;             // remainder
1828  // Continue the execution
1829#endif
1830  return EXCEPTION_CONTINUE_EXECUTION;
1831}
1832
1833#ifndef  _WIN64
1834//-----------------------------------------------------------------------------
1835LONG WINAPI Handle_FLT_Exception(struct _EXCEPTION_POINTERS* exceptionInfo) {
1836  // handle exception caused by native mothod modifying control word
1837  PCONTEXT ctx = exceptionInfo->ContextRecord;
1838  DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
1839
1840  switch (exception_code) {
1841    case EXCEPTION_FLT_DENORMAL_OPERAND:
1842    case EXCEPTION_FLT_DIVIDE_BY_ZERO:
1843    case EXCEPTION_FLT_INEXACT_RESULT:
1844    case EXCEPTION_FLT_INVALID_OPERATION:
1845    case EXCEPTION_FLT_OVERFLOW:
1846    case EXCEPTION_FLT_STACK_CHECK:
1847    case EXCEPTION_FLT_UNDERFLOW:
1848      jint fp_control_word = (* (jint*) StubRoutines::addr_fpu_cntrl_wrd_std());
1849      if (fp_control_word != ctx->FloatSave.ControlWord) {
1850        // Restore FPCW and mask out FLT exceptions
1851        ctx->FloatSave.ControlWord = fp_control_word | 0xffffffc0;
1852        // Mask out pending FLT exceptions
1853        ctx->FloatSave.StatusWord &=  0xffffff00;
1854        return EXCEPTION_CONTINUE_EXECUTION;
1855      }
1856  }
1857  return EXCEPTION_CONTINUE_SEARCH;
1858}
1859#else //_WIN64
1860/*
1861  On Windows, the mxcsr control bits are non-volatile across calls
1862  See also CR 6192333
1863  If EXCEPTION_FLT_* happened after some native method modified
1864  mxcsr - it is not a jvm fault.
1865  However should we decide to restore of mxcsr after a faulty
1866  native method we can uncomment following code
1867      jint MxCsr = INITIAL_MXCSR;
1868        // we can't use StubRoutines::addr_mxcsr_std()
1869        // because in Win64 mxcsr is not saved there
1870      if (MxCsr != ctx->MxCsr) {
1871        ctx->MxCsr = MxCsr;
1872        return EXCEPTION_CONTINUE_EXECUTION;
1873      }
1874
1875*/
1876#endif //_WIN64
1877
1878
1879// Fatal error reporting is single threaded so we can make this a
1880// static and preallocated.  If it's more than MAX_PATH silently ignore
1881// it.
1882static char saved_error_file[MAX_PATH] = {0};
1883
1884void os::set_error_file(const char *logfile) {
1885  if (strlen(logfile) <= MAX_PATH) {
1886    strncpy(saved_error_file, logfile, MAX_PATH);
1887  }
1888}
1889
1890static inline void report_error(Thread* t, DWORD exception_code,
1891                                address addr, void* siginfo, void* context) {
1892  VMError err(t, exception_code, addr, siginfo, context);
1893  err.report_and_die();
1894
1895  // If UseOsErrorReporting, this will return here and save the error file
1896  // somewhere where we can find it in the minidump.
1897}
1898
1899//-----------------------------------------------------------------------------
1900LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
1901  if (InterceptOSException) return EXCEPTION_CONTINUE_SEARCH;
1902  DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
1903#ifdef _M_IA64
1904  address pc = (address) exceptionInfo->ContextRecord->StIIP;
1905#elif _M_AMD64
1906  address pc = (address) exceptionInfo->ContextRecord->Rip;
1907#else
1908  address pc = (address) exceptionInfo->ContextRecord->Eip;
1909#endif
1910  Thread* t = ThreadLocalStorage::get_thread_slow();          // slow & steady
1911
1912#ifndef _WIN64
1913  // Execution protection violation - win32 running on AMD64 only
1914  // Handled first to avoid misdiagnosis as a "normal" access violation;
1915  // This is safe to do because we have a new/unique ExceptionInformation
1916  // code for this condition.
1917  if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
1918    PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
1919    int exception_subcode = (int) exceptionRecord->ExceptionInformation[0];
1920    address addr = (address) exceptionRecord->ExceptionInformation[1];
1921
1922    if (exception_subcode == EXCEPTION_INFO_EXEC_VIOLATION) {
1923      int page_size = os::vm_page_size();
1924
1925      // Make sure the pc and the faulting address are sane.
1926      //
1927      // If an instruction spans a page boundary, and the page containing
1928      // the beginning of the instruction is executable but the following
1929      // page is not, the pc and the faulting address might be slightly
1930      // different - we still want to unguard the 2nd page in this case.
1931      //
1932      // 15 bytes seems to be a (very) safe value for max instruction size.
1933      bool pc_is_near_addr =
1934        (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15);
1935      bool instr_spans_page_boundary =
1936        (align_size_down((intptr_t) pc ^ (intptr_t) addr,
1937                         (intptr_t) page_size) > 0);
1938
1939      if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) {
1940        static volatile address last_addr =
1941          (address) os::non_memory_address_word();
1942
1943        // In conservative mode, don't unguard unless the address is in the VM
1944        if (UnguardOnExecutionViolation > 0 && addr != last_addr &&
1945            (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) {
1946
1947          // Unguard and retry
1948          address page_start =
1949            (address) align_size_down((intptr_t) addr, (intptr_t) page_size);
1950          bool res = os::unguard_memory((char*) page_start, page_size);
1951
1952          if (PrintMiscellaneous && Verbose) {
1953            char buf[256];
1954            jio_snprintf(buf, sizeof(buf), "Execution protection violation "
1955                         "at " INTPTR_FORMAT
1956                         ", unguarding " INTPTR_FORMAT ": %s", addr,
1957                         page_start, (res ? "success" : strerror(errno)));
1958            tty->print_raw_cr(buf);
1959          }
1960
1961          // Set last_addr so if we fault again at the same address, we don't
1962          // end up in an endless loop.
1963          //
1964          // There are two potential complications here.  Two threads trapping
1965          // at the same address at the same time could cause one of the
1966          // threads to think it already unguarded, and abort the VM.  Likely
1967          // very rare.
1968          //
1969          // The other race involves two threads alternately trapping at
1970          // different addresses and failing to unguard the page, resulting in
1971          // an endless loop.  This condition is probably even more unlikely
1972          // than the first.
1973          //
1974          // Although both cases could be avoided by using locks or thread
1975          // local last_addr, these solutions are unnecessary complication:
1976          // this handler is a best-effort safety net, not a complete solution.
1977          // It is disabled by default and should only be used as a workaround
1978          // in case we missed any no-execute-unsafe VM code.
1979
1980          last_addr = addr;
1981
1982          return EXCEPTION_CONTINUE_EXECUTION;
1983        }
1984      }
1985
1986      // Last unguard failed or not unguarding
1987      tty->print_raw_cr("Execution protection violation");
1988      report_error(t, exception_code, addr, exceptionInfo->ExceptionRecord,
1989                   exceptionInfo->ContextRecord);
1990      return EXCEPTION_CONTINUE_SEARCH;
1991    }
1992  }
1993#endif // _WIN64
1994
1995  // Check to see if we caught the safepoint code in the
1996  // process of write protecting the memory serialization page.
1997  // It write enables the page immediately after protecting it
1998  // so just return.
1999  if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
2000    JavaThread* thread = (JavaThread*) t;
2001    PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2002    address addr = (address) exceptionRecord->ExceptionInformation[1];
2003    if ( os::is_memory_serialize_page(thread, addr) ) {
2004      // Block current thread until the memory serialize page permission restored.
2005      os::block_on_serialize_page_trap();
2006      return EXCEPTION_CONTINUE_EXECUTION;
2007    }
2008  }
2009
2010
2011  if (t != NULL && t->is_Java_thread()) {
2012    JavaThread* thread = (JavaThread*) t;
2013    bool in_java = thread->thread_state() == _thread_in_Java;
2014
2015    // Handle potential stack overflows up front.
2016    if (exception_code == EXCEPTION_STACK_OVERFLOW) {
2017      if (os::uses_stack_guard_pages()) {
2018#ifdef _M_IA64
2019        //
2020        // If it's a legal stack address continue, Windows will map it in.
2021        //
2022        PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2023        address addr = (address) exceptionRecord->ExceptionInformation[1];
2024        if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() )
2025          return EXCEPTION_CONTINUE_EXECUTION;
2026
2027        // The register save area is the same size as the memory stack
2028        // and starts at the page just above the start of the memory stack.
2029        // If we get a fault in this area, we've run out of register
2030        // stack.  If we are in java, try throwing a stack overflow exception.
2031        if (addr > thread->stack_base() &&
2032                      addr <= (thread->stack_base()+thread->stack_size()) ) {
2033          char buf[256];
2034          jio_snprintf(buf, sizeof(buf),
2035                       "Register stack overflow, addr:%p, stack_base:%p\n",
2036                       addr, thread->stack_base() );
2037          tty->print_raw_cr(buf);
2038          // If not in java code, return and hope for the best.
2039          return in_java ? Handle_Exception(exceptionInfo,
2040            SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW))
2041            :  EXCEPTION_CONTINUE_EXECUTION;
2042        }
2043#endif
2044        if (thread->stack_yellow_zone_enabled()) {
2045          // Yellow zone violation.  The o/s has unprotected the first yellow
2046          // zone page for us.  Note:  must call disable_stack_yellow_zone to
2047          // update the enabled status, even if the zone contains only one page.
2048          thread->disable_stack_yellow_zone();
2049          // If not in java code, return and hope for the best.
2050          return in_java ? Handle_Exception(exceptionInfo,
2051            SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW))
2052            :  EXCEPTION_CONTINUE_EXECUTION;
2053        } else {
2054          // Fatal red zone violation.
2055          thread->disable_stack_red_zone();
2056          tty->print_raw_cr("An unrecoverable stack overflow has occurred.");
2057          report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2058                       exceptionInfo->ContextRecord);
2059          return EXCEPTION_CONTINUE_SEARCH;
2060        }
2061      } else if (in_java) {
2062        // JVM-managed guard pages cannot be used on win95/98.  The o/s provides
2063        // a one-time-only guard page, which it has released to us.  The next
2064        // stack overflow on this thread will result in an ACCESS_VIOLATION.
2065        return Handle_Exception(exceptionInfo,
2066          SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2067      } else {
2068        // Can only return and hope for the best.  Further stack growth will
2069        // result in an ACCESS_VIOLATION.
2070        return EXCEPTION_CONTINUE_EXECUTION;
2071      }
2072    } else if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2073      // Either stack overflow or null pointer exception.
2074      if (in_java) {
2075        PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2076        address addr = (address) exceptionRecord->ExceptionInformation[1];
2077        address stack_end = thread->stack_base() - thread->stack_size();
2078        if (addr < stack_end && addr >= stack_end - os::vm_page_size()) {
2079          // Stack overflow.
2080          assert(!os::uses_stack_guard_pages(),
2081            "should be caught by red zone code above.");
2082          return Handle_Exception(exceptionInfo,
2083            SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2084        }
2085        //
2086        // Check for safepoint polling and implicit null
2087        // We only expect null pointers in the stubs (vtable)
2088        // the rest are checked explicitly now.
2089        //
2090        CodeBlob* cb = CodeCache::find_blob(pc);
2091        if (cb != NULL) {
2092          if (os::is_poll_address(addr)) {
2093            address stub = SharedRuntime::get_poll_stub(pc);
2094            return Handle_Exception(exceptionInfo, stub);
2095          }
2096        }
2097        {
2098#ifdef _WIN64
2099          //
2100          // If it's a legal stack address map the entire region in
2101          //
2102          PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2103          address addr = (address) exceptionRecord->ExceptionInformation[1];
2104          if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() ) {
2105                  addr = (address)((uintptr_t)addr &
2106                         (~((uintptr_t)os::vm_page_size() - (uintptr_t)1)));
2107                  os::commit_memory( (char *)addr, thread->stack_base() - addr );
2108                  return EXCEPTION_CONTINUE_EXECUTION;
2109          }
2110          else
2111#endif
2112          {
2113            // Null pointer exception.
2114#ifdef _M_IA64
2115            // We catch register stack overflows in compiled code by doing
2116            // an explicit compare and executing a st8(G0, G0) if the
2117            // BSP enters into our guard area.  We test for the overflow
2118            // condition and fall into the normal null pointer exception
2119            // code if BSP hasn't overflowed.
2120            if ( in_java ) {
2121              if(thread->register_stack_overflow()) {
2122                assert((address)exceptionInfo->ContextRecord->IntS3 ==
2123                                thread->register_stack_limit(),
2124                               "GR7 doesn't contain register_stack_limit");
2125                // Disable the yellow zone which sets the state that
2126                // we've got a stack overflow problem.
2127                if (thread->stack_yellow_zone_enabled()) {
2128                  thread->disable_stack_yellow_zone();
2129                }
2130                // Give us some room to process the exception
2131                thread->disable_register_stack_guard();
2132                // Update GR7 with the new limit so we can continue running
2133                // compiled code.
2134                exceptionInfo->ContextRecord->IntS3 =
2135                               (ULONGLONG)thread->register_stack_limit();
2136                return Handle_Exception(exceptionInfo,
2137                       SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW));
2138              } else {
2139                //
2140                // Check for implicit null
2141                // We only expect null pointers in the stubs (vtable)
2142                // the rest are checked explicitly now.
2143                //
2144                CodeBlob* cb = CodeCache::find_blob(pc);
2145                if (cb != NULL) {
2146                  if (VtableStubs::stub_containing(pc) != NULL) {
2147                    if (((uintptr_t)addr) < os::vm_page_size() ) {
2148                      // an access to the first page of VM--assume it is a null pointer
2149                      return Handle_Exception(exceptionInfo,
2150                        SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL));
2151                    }
2152                  }
2153                }
2154              }
2155            } // in_java
2156
2157            // IA64 doesn't use implicit null checking yet. So we shouldn't
2158            // get here.
2159            tty->print_raw_cr("Access violation, possible null pointer exception");
2160            report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2161                         exceptionInfo->ContextRecord);
2162            return EXCEPTION_CONTINUE_SEARCH;
2163#else /* !IA64 */
2164
2165            // Windows 98 reports faulting addresses incorrectly
2166            if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr) ||
2167                !os::win32::is_nt()) {
2168              return Handle_Exception(exceptionInfo,
2169                  SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL));
2170            }
2171            report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2172                         exceptionInfo->ContextRecord);
2173            return EXCEPTION_CONTINUE_SEARCH;
2174#endif
2175          }
2176        }
2177      }
2178
2179#ifdef _WIN64
2180      // Special care for fast JNI field accessors.
2181      // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks
2182      // in and the heap gets shrunk before the field access.
2183      if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2184        address addr = JNI_FastGetField::find_slowcase_pc(pc);
2185        if (addr != (address)-1) {
2186          return Handle_Exception(exceptionInfo, addr);
2187        }
2188      }
2189#endif
2190
2191#ifdef _WIN64
2192      // Windows will sometimes generate an access violation
2193      // when we call malloc.  Since we use VectoredExceptions
2194      // on 64 bit platforms, we see this exception.  We must
2195      // pass this exception on so Windows can recover.
2196      // We check to see if the pc of the fault is in NTDLL.DLL
2197      // if so, we pass control on to Windows for handling.
2198      if (UseVectoredExceptions && _addr_in_ntdll(pc)) return EXCEPTION_CONTINUE_SEARCH;
2199#endif
2200
2201      // Stack overflow or null pointer exception in native code.
2202      report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2203                   exceptionInfo->ContextRecord);
2204      return EXCEPTION_CONTINUE_SEARCH;
2205    }
2206
2207    if (in_java) {
2208      switch (exception_code) {
2209      case EXCEPTION_INT_DIVIDE_BY_ZERO:
2210        return Handle_Exception(exceptionInfo, SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO));
2211
2212      case EXCEPTION_INT_OVERFLOW:
2213        return Handle_IDiv_Exception(exceptionInfo);
2214
2215      } // switch
2216    }
2217#ifndef _WIN64
2218    if ((thread->thread_state() == _thread_in_Java) ||
2219        (thread->thread_state() == _thread_in_native) )
2220    {
2221      LONG result=Handle_FLT_Exception(exceptionInfo);
2222      if (result==EXCEPTION_CONTINUE_EXECUTION) return result;
2223    }
2224#endif //_WIN64
2225  }
2226
2227  if (exception_code != EXCEPTION_BREAKPOINT) {
2228#ifndef _WIN64
2229    report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2230                 exceptionInfo->ContextRecord);
2231#else
2232    // Itanium Windows uses a VectoredExceptionHandler
2233    // Which means that C++ programatic exception handlers (try/except)
2234    // will get here.  Continue the search for the right except block if
2235    // the exception code is not a fatal code.
2236    switch ( exception_code ) {
2237      case EXCEPTION_ACCESS_VIOLATION:
2238      case EXCEPTION_STACK_OVERFLOW:
2239      case EXCEPTION_ILLEGAL_INSTRUCTION:
2240      case EXCEPTION_ILLEGAL_INSTRUCTION_2:
2241      case EXCEPTION_INT_OVERFLOW:
2242      case EXCEPTION_INT_DIVIDE_BY_ZERO:
2243      {  report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2244                       exceptionInfo->ContextRecord);
2245      }
2246        break;
2247      default:
2248        break;
2249    }
2250#endif
2251  }
2252  return EXCEPTION_CONTINUE_SEARCH;
2253}
2254
2255#ifndef _WIN64
2256// Special care for fast JNI accessors.
2257// jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in and
2258// the heap gets shrunk before the field access.
2259// Need to install our own structured exception handler since native code may
2260// install its own.
2261LONG WINAPI fastJNIAccessorExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
2262  DWORD exception_code = exceptionInfo->ExceptionRecord->ExceptionCode;
2263  if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2264    address pc = (address) exceptionInfo->ContextRecord->Eip;
2265    address addr = JNI_FastGetField::find_slowcase_pc(pc);
2266    if (addr != (address)-1) {
2267      return Handle_Exception(exceptionInfo, addr);
2268    }
2269  }
2270  return EXCEPTION_CONTINUE_SEARCH;
2271}
2272
2273#define DEFINE_FAST_GETFIELD(Return,Fieldname,Result) \
2274Return JNICALL jni_fast_Get##Result##Field_wrapper(JNIEnv *env, jobject obj, jfieldID fieldID) { \
2275  __try { \
2276    return (*JNI_FastGetField::jni_fast_Get##Result##Field_fp)(env, obj, fieldID); \
2277  } __except(fastJNIAccessorExceptionFilter((_EXCEPTION_POINTERS*)_exception_info())) { \
2278  } \
2279  return 0; \
2280}
2281
2282DEFINE_FAST_GETFIELD(jboolean, bool,   Boolean)
2283DEFINE_FAST_GETFIELD(jbyte,    byte,   Byte)
2284DEFINE_FAST_GETFIELD(jchar,    char,   Char)
2285DEFINE_FAST_GETFIELD(jshort,   short,  Short)
2286DEFINE_FAST_GETFIELD(jint,     int,    Int)
2287DEFINE_FAST_GETFIELD(jlong,    long,   Long)
2288DEFINE_FAST_GETFIELD(jfloat,   float,  Float)
2289DEFINE_FAST_GETFIELD(jdouble,  double, Double)
2290
2291address os::win32::fast_jni_accessor_wrapper(BasicType type) {
2292  switch (type) {
2293    case T_BOOLEAN: return (address)jni_fast_GetBooleanField_wrapper;
2294    case T_BYTE:    return (address)jni_fast_GetByteField_wrapper;
2295    case T_CHAR:    return (address)jni_fast_GetCharField_wrapper;
2296    case T_SHORT:   return (address)jni_fast_GetShortField_wrapper;
2297    case T_INT:     return (address)jni_fast_GetIntField_wrapper;
2298    case T_LONG:    return (address)jni_fast_GetLongField_wrapper;
2299    case T_FLOAT:   return (address)jni_fast_GetFloatField_wrapper;
2300    case T_DOUBLE:  return (address)jni_fast_GetDoubleField_wrapper;
2301    default:        ShouldNotReachHere();
2302  }
2303  return (address)-1;
2304}
2305#endif
2306
2307// Virtual Memory
2308
2309int os::vm_page_size() { return os::win32::vm_page_size(); }
2310int os::vm_allocation_granularity() {
2311  return os::win32::vm_allocation_granularity();
2312}
2313
2314// Windows large page support is available on Windows 2003. In order to use
2315// large page memory, the administrator must first assign additional privilege
2316// to the user:
2317//   + select Control Panel -> Administrative Tools -> Local Security Policy
2318//   + select Local Policies -> User Rights Assignment
2319//   + double click "Lock pages in memory", add users and/or groups
2320//   + reboot
2321// Note the above steps are needed for administrator as well, as administrators
2322// by default do not have the privilege to lock pages in memory.
2323//
2324// Note about Windows 2003: although the API supports committing large page
2325// memory on a page-by-page basis and VirtualAlloc() returns success under this
2326// scenario, I found through experiment it only uses large page if the entire
2327// memory region is reserved and committed in a single VirtualAlloc() call.
2328// This makes Windows large page support more or less like Solaris ISM, in
2329// that the entire heap must be committed upfront. This probably will change
2330// in the future, if so the code below needs to be revisited.
2331
2332#ifndef MEM_LARGE_PAGES
2333#define MEM_LARGE_PAGES 0x20000000
2334#endif
2335
2336// GetLargePageMinimum is only available on Windows 2003. The other functions
2337// are available on NT but not on Windows 98/Me. We have to resolve them at
2338// runtime.
2339typedef SIZE_T (WINAPI *GetLargePageMinimum_func_type) (void);
2340typedef BOOL (WINAPI *AdjustTokenPrivileges_func_type)
2341             (HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
2342typedef BOOL (WINAPI *OpenProcessToken_func_type) (HANDLE, DWORD, PHANDLE);
2343typedef BOOL (WINAPI *LookupPrivilegeValue_func_type) (LPCTSTR, LPCTSTR, PLUID);
2344
2345static GetLargePageMinimum_func_type   _GetLargePageMinimum;
2346static AdjustTokenPrivileges_func_type _AdjustTokenPrivileges;
2347static OpenProcessToken_func_type      _OpenProcessToken;
2348static LookupPrivilegeValue_func_type  _LookupPrivilegeValue;
2349
2350static HINSTANCE _kernel32;
2351static HINSTANCE _advapi32;
2352static HANDLE    _hProcess;
2353static HANDLE    _hToken;
2354
2355static size_t _large_page_size = 0;
2356
2357static bool resolve_functions_for_large_page_init() {
2358  _kernel32 = LoadLibrary("kernel32.dll");
2359  if (_kernel32 == NULL) return false;
2360
2361  _GetLargePageMinimum   = CAST_TO_FN_PTR(GetLargePageMinimum_func_type,
2362                            GetProcAddress(_kernel32, "GetLargePageMinimum"));
2363  if (_GetLargePageMinimum == NULL) return false;
2364
2365  _advapi32 = LoadLibrary("advapi32.dll");
2366  if (_advapi32 == NULL) return false;
2367
2368  _AdjustTokenPrivileges = CAST_TO_FN_PTR(AdjustTokenPrivileges_func_type,
2369                            GetProcAddress(_advapi32, "AdjustTokenPrivileges"));
2370  _OpenProcessToken      = CAST_TO_FN_PTR(OpenProcessToken_func_type,
2371                            GetProcAddress(_advapi32, "OpenProcessToken"));
2372  _LookupPrivilegeValue  = CAST_TO_FN_PTR(LookupPrivilegeValue_func_type,
2373                            GetProcAddress(_advapi32, "LookupPrivilegeValueA"));
2374  return _AdjustTokenPrivileges != NULL &&
2375         _OpenProcessToken      != NULL &&
2376         _LookupPrivilegeValue  != NULL;
2377}
2378
2379static bool request_lock_memory_privilege() {
2380  _hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,
2381                                os::current_process_id());
2382
2383  LUID luid;
2384  if (_hProcess != NULL &&
2385      _OpenProcessToken(_hProcess, TOKEN_ADJUST_PRIVILEGES, &_hToken) &&
2386      _LookupPrivilegeValue(NULL, "SeLockMemoryPrivilege", &luid)) {
2387
2388    TOKEN_PRIVILEGES tp;
2389    tp.PrivilegeCount = 1;
2390    tp.Privileges[0].Luid = luid;
2391    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
2392
2393    // AdjustTokenPrivileges() may return TRUE even when it couldn't change the
2394    // privilege. Check GetLastError() too. See MSDN document.
2395    if (_AdjustTokenPrivileges(_hToken, false, &tp, sizeof(tp), NULL, NULL) &&
2396        (GetLastError() == ERROR_SUCCESS)) {
2397      return true;
2398    }
2399  }
2400
2401  return false;
2402}
2403
2404static void cleanup_after_large_page_init() {
2405  _GetLargePageMinimum = NULL;
2406  _AdjustTokenPrivileges = NULL;
2407  _OpenProcessToken = NULL;
2408  _LookupPrivilegeValue = NULL;
2409  if (_kernel32) FreeLibrary(_kernel32);
2410  _kernel32 = NULL;
2411  if (_advapi32) FreeLibrary(_advapi32);
2412  _advapi32 = NULL;
2413  if (_hProcess) CloseHandle(_hProcess);
2414  _hProcess = NULL;
2415  if (_hToken) CloseHandle(_hToken);
2416  _hToken = NULL;
2417}
2418
2419bool os::large_page_init() {
2420  if (!UseLargePages) return false;
2421
2422  // print a warning if any large page related flag is specified on command line
2423  bool warn_on_failure = !FLAG_IS_DEFAULT(UseLargePages) ||
2424                         !FLAG_IS_DEFAULT(LargePageSizeInBytes);
2425  bool success = false;
2426
2427# define WARN(msg) if (warn_on_failure) { warning(msg); }
2428  if (resolve_functions_for_large_page_init()) {
2429    if (request_lock_memory_privilege()) {
2430      size_t s = _GetLargePageMinimum();
2431      if (s) {
2432#if defined(IA32) || defined(AMD64)
2433        if (s > 4*M || LargePageSizeInBytes > 4*M) {
2434          WARN("JVM cannot use large pages bigger than 4mb.");
2435        } else {
2436#endif
2437          if (LargePageSizeInBytes && LargePageSizeInBytes % s == 0) {
2438            _large_page_size = LargePageSizeInBytes;
2439          } else {
2440            _large_page_size = s;
2441          }
2442          success = true;
2443#if defined(IA32) || defined(AMD64)
2444        }
2445#endif
2446      } else {
2447        WARN("Large page is not supported by the processor.");
2448      }
2449    } else {
2450      WARN("JVM cannot use large page memory because it does not have enough privilege to lock pages in memory.");
2451    }
2452  } else {
2453    WARN("Large page is not supported by the operating system.");
2454  }
2455#undef WARN
2456
2457  const size_t default_page_size = (size_t) vm_page_size();
2458  if (success && _large_page_size > default_page_size) {
2459    _page_sizes[0] = _large_page_size;
2460    _page_sizes[1] = default_page_size;
2461    _page_sizes[2] = 0;
2462  }
2463
2464  cleanup_after_large_page_init();
2465  return success;
2466}
2467
2468// On win32, one cannot release just a part of reserved memory, it's an
2469// all or nothing deal.  When we split a reservation, we must break the
2470// reservation into two reservations.
2471void os::split_reserved_memory(char *base, size_t size, size_t split,
2472                              bool realloc) {
2473  if (size > 0) {
2474    release_memory(base, size);
2475    if (realloc) {
2476      reserve_memory(split, base);
2477    }
2478    if (size != split) {
2479      reserve_memory(size - split, base + split);
2480    }
2481  }
2482}
2483
2484char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
2485  assert((size_t)addr % os::vm_allocation_granularity() == 0,
2486         "reserve alignment");
2487  assert(bytes % os::vm_allocation_granularity() == 0, "reserve block size");
2488  char* res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE,
2489                                  PAGE_EXECUTE_READWRITE);
2490  assert(res == NULL || addr == NULL || addr == res,
2491         "Unexpected address from reserve.");
2492  return res;
2493}
2494
2495// Reserve memory at an arbitrary address, only if that area is
2496// available (and not reserved for something else).
2497char* os::attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
2498  // Windows os::reserve_memory() fails of the requested address range is
2499  // not avilable.
2500  return reserve_memory(bytes, requested_addr);
2501}
2502
2503size_t os::large_page_size() {
2504  return _large_page_size;
2505}
2506
2507bool os::can_commit_large_page_memory() {
2508  // Windows only uses large page memory when the entire region is reserved
2509  // and committed in a single VirtualAlloc() call. This may change in the
2510  // future, but with Windows 2003 it's not possible to commit on demand.
2511  return false;
2512}
2513
2514char* os::reserve_memory_special(size_t bytes) {
2515  DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
2516  char * res = (char *)VirtualAlloc(NULL, bytes, flag, PAGE_READWRITE);
2517  return res;
2518}
2519
2520bool os::release_memory_special(char* base, size_t bytes) {
2521  return release_memory(base, bytes);
2522}
2523
2524void os::print_statistics() {
2525}
2526
2527bool os::commit_memory(char* addr, size_t bytes) {
2528  if (bytes == 0) {
2529    // Don't bother the OS with noops.
2530    return true;
2531  }
2532  assert((size_t) addr % os::vm_page_size() == 0, "commit on page boundaries");
2533  assert(bytes % os::vm_page_size() == 0, "commit in page-sized chunks");
2534  // Don't attempt to print anything if the OS call fails. We're
2535  // probably low on resources, so the print itself may cause crashes.
2536  return VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_EXECUTE_READWRITE) != NULL;
2537}
2538
2539bool os::commit_memory(char* addr, size_t size, size_t alignment_hint) {
2540  return commit_memory(addr, size);
2541}
2542
2543bool os::uncommit_memory(char* addr, size_t bytes) {
2544  if (bytes == 0) {
2545    // Don't bother the OS with noops.
2546    return true;
2547  }
2548  assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries");
2549  assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks");
2550  return VirtualFree(addr, bytes, MEM_DECOMMIT) != 0;
2551}
2552
2553bool os::release_memory(char* addr, size_t bytes) {
2554  return VirtualFree(addr, 0, MEM_RELEASE) != 0;
2555}
2556
2557bool os::protect_memory(char* addr, size_t bytes) {
2558  DWORD old_status;
2559  return VirtualProtect(addr, bytes, PAGE_READONLY, &old_status) != 0;
2560}
2561
2562bool os::guard_memory(char* addr, size_t bytes) {
2563  DWORD old_status;
2564  return VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE | PAGE_GUARD, &old_status) != 0;
2565}
2566
2567bool os::unguard_memory(char* addr, size_t bytes) {
2568  DWORD old_status;
2569  return VirtualProtect(addr, bytes, PAGE_EXECUTE_READWRITE, &old_status) != 0;
2570}
2571
2572void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
2573void os::free_memory(char *addr, size_t bytes)         { }
2574void os::numa_make_global(char *addr, size_t bytes)    { }
2575void os::numa_make_local(char *addr, size_t bytes)     { }
2576bool os::numa_topology_changed()                       { return false; }
2577size_t os::numa_get_groups_num()                       { return 1; }
2578int os::numa_get_group_id()                            { return 0; }
2579size_t os::numa_get_leaf_groups(int *ids, size_t size) {
2580  if (size > 0) {
2581    ids[0] = 0;
2582    return 1;
2583  }
2584  return 0;
2585}
2586
2587bool os::get_page_info(char *start, page_info* info) {
2588  return false;
2589}
2590
2591char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
2592  return end;
2593}
2594
2595char* os::non_memory_address_word() {
2596  // Must never look like an address returned by reserve_memory,
2597  // even in its subfields (as defined by the CPU immediate fields,
2598  // if the CPU splits constants across multiple instructions).
2599  return (char*)-1;
2600}
2601
2602#define MAX_ERROR_COUNT 100
2603#define SYS_THREAD_ERROR 0xffffffffUL
2604
2605void os::pd_start_thread(Thread* thread) {
2606  DWORD ret = ResumeThread(thread->osthread()->thread_handle());
2607  // Returns previous suspend state:
2608  // 0:  Thread was not suspended
2609  // 1:  Thread is running now
2610  // >1: Thread is still suspended.
2611  assert(ret != SYS_THREAD_ERROR, "StartThread failed"); // should propagate back
2612}
2613
2614size_t os::read(int fd, void *buf, unsigned int nBytes) {
2615  return ::read(fd, buf, nBytes);
2616}
2617
2618class HighResolutionInterval {
2619  // The default timer resolution seems to be 10 milliseconds.
2620  // (Where is this written down?)
2621  // If someone wants to sleep for only a fraction of the default,
2622  // then we set the timer resolution down to 1 millisecond for
2623  // the duration of their interval.
2624  // We carefully set the resolution back, since otherwise we
2625  // seem to incur an overhead (3%?) that we don't need.
2626  // CONSIDER: if ms is small, say 3, then we should run with a high resolution time.
2627  // Buf if ms is large, say 500, or 503, we should avoid the call to timeBeginPeriod().
2628  // Alternatively, we could compute the relative error (503/500 = .6%) and only use
2629  // timeBeginPeriod() if the relative error exceeded some threshold.
2630  // timeBeginPeriod() has been linked to problems with clock drift on win32 systems and
2631  // to decreased efficiency related to increased timer "tick" rates.  We want to minimize
2632  // (a) calls to timeBeginPeriod() and timeEndPeriod() and (b) time spent with high
2633  // resolution timers running.
2634private:
2635    jlong resolution;
2636public:
2637  HighResolutionInterval(jlong ms) {
2638    resolution = ms % 10L;
2639    if (resolution != 0) {
2640      MMRESULT result = timeBeginPeriod(1L);
2641    }
2642  }
2643  ~HighResolutionInterval() {
2644    if (resolution != 0) {
2645      MMRESULT result = timeEndPeriod(1L);
2646    }
2647    resolution = 0L;
2648  }
2649};
2650
2651int os::sleep(Thread* thread, jlong ms, bool interruptable) {
2652  jlong limit = (jlong) MAXDWORD;
2653
2654  while(ms > limit) {
2655    int res;
2656    if ((res = sleep(thread, limit, interruptable)) != OS_TIMEOUT)
2657      return res;
2658    ms -= limit;
2659  }
2660
2661  assert(thread == Thread::current(),  "thread consistency check");
2662  OSThread* osthread = thread->osthread();
2663  OSThreadWaitState osts(osthread, false /* not Object.wait() */);
2664  int result;
2665  if (interruptable) {
2666    assert(thread->is_Java_thread(), "must be java thread");
2667    JavaThread *jt = (JavaThread *) thread;
2668    ThreadBlockInVM tbivm(jt);
2669
2670    jt->set_suspend_equivalent();
2671    // cleared by handle_special_suspend_equivalent_condition() or
2672    // java_suspend_self() via check_and_wait_while_suspended()
2673
2674    HANDLE events[1];
2675    events[0] = osthread->interrupt_event();
2676    HighResolutionInterval *phri=NULL;
2677    if(!ForceTimeHighResolution)
2678      phri = new HighResolutionInterval( ms );
2679    if (WaitForMultipleObjects(1, events, FALSE, (DWORD)ms) == WAIT_TIMEOUT) {
2680      result = OS_TIMEOUT;
2681    } else {
2682      ResetEvent(osthread->interrupt_event());
2683      osthread->set_interrupted(false);
2684      result = OS_INTRPT;
2685    }
2686    delete phri; //if it is NULL, harmless
2687
2688    // were we externally suspended while we were waiting?
2689    jt->check_and_wait_while_suspended();
2690  } else {
2691    assert(!thread->is_Java_thread(), "must not be java thread");
2692    Sleep((long) ms);
2693    result = OS_TIMEOUT;
2694  }
2695  return result;
2696}
2697
2698// Sleep forever; naked call to OS-specific sleep; use with CAUTION
2699void os::infinite_sleep() {
2700  while (true) {    // sleep forever ...
2701    Sleep(100000);  // ... 100 seconds at a time
2702  }
2703}
2704
2705typedef BOOL (WINAPI * STTSignature)(void) ;
2706
2707os::YieldResult os::NakedYield() {
2708  // Use either SwitchToThread() or Sleep(0)
2709  // Consider passing back the return value from SwitchToThread().
2710  // We use GetProcAddress() as ancient Win9X versions of windows doen't support SwitchToThread.
2711  // In that case we revert to Sleep(0).
2712  static volatile STTSignature stt = (STTSignature) 1 ;
2713
2714  if (stt == ((STTSignature) 1)) {
2715    stt = (STTSignature) ::GetProcAddress (LoadLibrary ("Kernel32.dll"), "SwitchToThread") ;
2716    // It's OK if threads race during initialization as the operation above is idempotent.
2717  }
2718  if (stt != NULL) {
2719    return (*stt)() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ;
2720  } else {
2721    Sleep (0) ;
2722  }
2723  return os::YIELD_UNKNOWN ;
2724}
2725
2726void os::yield() {  os::NakedYield(); }
2727
2728void os::yield_all(int attempts) {
2729  // Yields to all threads, including threads with lower priorities
2730  Sleep(1);
2731}
2732
2733// Win32 only gives you access to seven real priorities at a time,
2734// so we compress Java's ten down to seven.  It would be better
2735// if we dynamically adjusted relative priorities.
2736
2737int os::java_to_os_priority[MaxPriority + 1] = {
2738  THREAD_PRIORITY_IDLE,                         // 0  Entry should never be used
2739  THREAD_PRIORITY_LOWEST,                       // 1  MinPriority
2740  THREAD_PRIORITY_LOWEST,                       // 2
2741  THREAD_PRIORITY_BELOW_NORMAL,                 // 3
2742  THREAD_PRIORITY_BELOW_NORMAL,                 // 4
2743  THREAD_PRIORITY_NORMAL,                       // 5  NormPriority
2744  THREAD_PRIORITY_NORMAL,                       // 6
2745  THREAD_PRIORITY_ABOVE_NORMAL,                 // 7
2746  THREAD_PRIORITY_ABOVE_NORMAL,                 // 8
2747  THREAD_PRIORITY_HIGHEST,                      // 9  NearMaxPriority
2748  THREAD_PRIORITY_HIGHEST                       // 10 MaxPriority
2749};
2750
2751int prio_policy1[MaxPriority + 1] = {
2752  THREAD_PRIORITY_IDLE,                         // 0  Entry should never be used
2753  THREAD_PRIORITY_LOWEST,                       // 1  MinPriority
2754  THREAD_PRIORITY_LOWEST,                       // 2
2755  THREAD_PRIORITY_BELOW_NORMAL,                 // 3
2756  THREAD_PRIORITY_BELOW_NORMAL,                 // 4
2757  THREAD_PRIORITY_NORMAL,                       // 5  NormPriority
2758  THREAD_PRIORITY_ABOVE_NORMAL,                 // 6
2759  THREAD_PRIORITY_ABOVE_NORMAL,                 // 7
2760  THREAD_PRIORITY_HIGHEST,                      // 8
2761  THREAD_PRIORITY_HIGHEST,                      // 9  NearMaxPriority
2762  THREAD_PRIORITY_TIME_CRITICAL                 // 10 MaxPriority
2763};
2764
2765static int prio_init() {
2766  // If ThreadPriorityPolicy is 1, switch tables
2767  if (ThreadPriorityPolicy == 1) {
2768    int i;
2769    for (i = 0; i < MaxPriority + 1; i++) {
2770      os::java_to_os_priority[i] = prio_policy1[i];
2771    }
2772  }
2773  return 0;
2774}
2775
2776OSReturn os::set_native_priority(Thread* thread, int priority) {
2777  if (!UseThreadPriorities) return OS_OK;
2778  bool ret = SetThreadPriority(thread->osthread()->thread_handle(), priority) != 0;
2779  return ret ? OS_OK : OS_ERR;
2780}
2781
2782OSReturn os::get_native_priority(const Thread* const thread, int* priority_ptr) {
2783  if ( !UseThreadPriorities ) {
2784    *priority_ptr = java_to_os_priority[NormPriority];
2785    return OS_OK;
2786  }
2787  int os_prio = GetThreadPriority(thread->osthread()->thread_handle());
2788  if (os_prio == THREAD_PRIORITY_ERROR_RETURN) {
2789    assert(false, "GetThreadPriority failed");
2790    return OS_ERR;
2791  }
2792  *priority_ptr = os_prio;
2793  return OS_OK;
2794}
2795
2796
2797// Hint to the underlying OS that a task switch would not be good.
2798// Void return because it's a hint and can fail.
2799void os::hint_no_preempt() {}
2800
2801void os::interrupt(Thread* thread) {
2802  assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
2803         "possibility of dangling Thread pointer");
2804
2805  OSThread* osthread = thread->osthread();
2806  osthread->set_interrupted(true);
2807  // More than one thread can get here with the same value of osthread,
2808  // resulting in multiple notifications.  We do, however, want the store
2809  // to interrupted() to be visible to other threads before we post
2810  // the interrupt event.
2811  OrderAccess::release();
2812  SetEvent(osthread->interrupt_event());
2813  // For JSR166:  unpark after setting status
2814  if (thread->is_Java_thread())
2815    ((JavaThread*)thread)->parker()->unpark();
2816
2817  ParkEvent * ev = thread->_ParkEvent ;
2818  if (ev != NULL) ev->unpark() ;
2819
2820}
2821
2822
2823bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
2824  assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
2825         "possibility of dangling Thread pointer");
2826
2827  OSThread* osthread = thread->osthread();
2828  bool interrupted;
2829  interrupted = osthread->interrupted();
2830  if (clear_interrupted == true) {
2831    osthread->set_interrupted(false);
2832    ResetEvent(osthread->interrupt_event());
2833  } // Otherwise leave the interrupted state alone
2834
2835  return interrupted;
2836}
2837
2838// Get's a pc (hint) for a running thread. Currently used only for profiling.
2839ExtendedPC os::get_thread_pc(Thread* thread) {
2840  CONTEXT context;
2841  context.ContextFlags = CONTEXT_CONTROL;
2842  HANDLE handle = thread->osthread()->thread_handle();
2843#ifdef _M_IA64
2844  assert(0, "Fix get_thread_pc");
2845  return ExtendedPC(NULL);
2846#else
2847  if (GetThreadContext(handle, &context)) {
2848#ifdef _M_AMD64
2849    return ExtendedPC((address) context.Rip);
2850#else
2851    return ExtendedPC((address) context.Eip);
2852#endif
2853  } else {
2854    return ExtendedPC(NULL);
2855  }
2856#endif
2857}
2858
2859// GetCurrentThreadId() returns DWORD
2860intx os::current_thread_id()          { return GetCurrentThreadId(); }
2861
2862static int _initial_pid = 0;
2863
2864int os::current_process_id()
2865{
2866  return (_initial_pid ? _initial_pid : _getpid());
2867}
2868
2869int    os::win32::_vm_page_size       = 0;
2870int    os::win32::_vm_allocation_granularity = 0;
2871int    os::win32::_processor_type     = 0;
2872// Processor level is not available on non-NT systems, use vm_version instead
2873int    os::win32::_processor_level    = 0;
2874julong os::win32::_physical_memory    = 0;
2875size_t os::win32::_default_stack_size = 0;
2876
2877         intx os::win32::_os_thread_limit    = 0;
2878volatile intx os::win32::_os_thread_count    = 0;
2879
2880bool   os::win32::_is_nt              = false;
2881
2882
2883void os::win32::initialize_system_info() {
2884  SYSTEM_INFO si;
2885  GetSystemInfo(&si);
2886  _vm_page_size    = si.dwPageSize;
2887  _vm_allocation_granularity = si.dwAllocationGranularity;
2888  _processor_type  = si.dwProcessorType;
2889  _processor_level = si.wProcessorLevel;
2890  _processor_count = si.dwNumberOfProcessors;
2891
2892  MEMORYSTATUS ms;
2893  // also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual,
2894  // dwMemoryLoad (% of memory in use)
2895  GlobalMemoryStatus(&ms);
2896  _physical_memory = ms.dwTotalPhys;
2897
2898  OSVERSIONINFO oi;
2899  oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
2900  GetVersionEx(&oi);
2901  switch(oi.dwPlatformId) {
2902    case VER_PLATFORM_WIN32_WINDOWS: _is_nt = false; break;
2903    case VER_PLATFORM_WIN32_NT:      _is_nt = true;  break;
2904    default: fatal("Unknown platform");
2905  }
2906
2907  _default_stack_size = os::current_stack_size();
2908  assert(_default_stack_size > (size_t) _vm_page_size, "invalid stack size");
2909  assert((_default_stack_size & (_vm_page_size - 1)) == 0,
2910    "stack size not a multiple of page size");
2911
2912  initialize_performance_counter();
2913
2914  // Win95/Win98 scheduler bug work-around. The Win95/98 scheduler is
2915  // known to deadlock the system, if the VM issues to thread operations with
2916  // a too high frequency, e.g., such as changing the priorities.
2917  // The 6000 seems to work well - no deadlocks has been notices on the test
2918  // programs that we have seen experience this problem.
2919  if (!os::win32::is_nt()) {
2920    StarvationMonitorInterval = 6000;
2921  }
2922}
2923
2924
2925void os::win32::setmode_streams() {
2926  _setmode(_fileno(stdin), _O_BINARY);
2927  _setmode(_fileno(stdout), _O_BINARY);
2928  _setmode(_fileno(stderr), _O_BINARY);
2929}
2930
2931
2932int os::message_box(const char* title, const char* message) {
2933  int result = MessageBox(NULL, message, title,
2934                          MB_YESNO | MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFAULT_DESKTOP_ONLY);
2935  return result == IDYES;
2936}
2937
2938int os::allocate_thread_local_storage() {
2939  return TlsAlloc();
2940}
2941
2942
2943void os::free_thread_local_storage(int index) {
2944  TlsFree(index);
2945}
2946
2947
2948void os::thread_local_storage_at_put(int index, void* value) {
2949  TlsSetValue(index, value);
2950  assert(thread_local_storage_at(index) == value, "Just checking");
2951}
2952
2953
2954void* os::thread_local_storage_at(int index) {
2955  return TlsGetValue(index);
2956}
2957
2958
2959#ifndef PRODUCT
2960#ifndef _WIN64
2961// Helpers to check whether NX protection is enabled
2962int nx_exception_filter(_EXCEPTION_POINTERS *pex) {
2963  if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION &&
2964      pex->ExceptionRecord->NumberParameters > 0 &&
2965      pex->ExceptionRecord->ExceptionInformation[0] ==
2966      EXCEPTION_INFO_EXEC_VIOLATION) {
2967    return EXCEPTION_EXECUTE_HANDLER;
2968  }
2969  return EXCEPTION_CONTINUE_SEARCH;
2970}
2971
2972void nx_check_protection() {
2973  // If NX is enabled we'll get an exception calling into code on the stack
2974  char code[] = { (char)0xC3 }; // ret
2975  void *code_ptr = (void *)code;
2976  __try {
2977    __asm call code_ptr
2978  } __except(nx_exception_filter((_EXCEPTION_POINTERS*)_exception_info())) {
2979    tty->print_raw_cr("NX protection detected.");
2980  }
2981}
2982#endif // _WIN64
2983#endif // PRODUCT
2984
2985// this is called _before_ the global arguments have been parsed
2986void os::init(void) {
2987  _initial_pid = _getpid();
2988
2989  init_random(1234567);
2990
2991  win32::initialize_system_info();
2992  win32::setmode_streams();
2993  init_page_sizes((size_t) win32::vm_page_size());
2994
2995  // For better scalability on MP systems (must be called after initialize_system_info)
2996#ifndef PRODUCT
2997  if (is_MP()) {
2998    NoYieldsInMicrolock = true;
2999  }
3000#endif
3001  // Initialize main_process and main_thread
3002  main_process = GetCurrentProcess();  // Remember main_process is a pseudo handle
3003  if (!DuplicateHandle(main_process, GetCurrentThread(), main_process,
3004                       &main_thread, THREAD_ALL_ACCESS, false, 0)) {
3005    fatal("DuplicateHandle failed\n");
3006  }
3007  main_thread_id = (int) GetCurrentThreadId();
3008}
3009
3010// To install functions for atexit processing
3011extern "C" {
3012  static void perfMemory_exit_helper() {
3013    perfMemory_exit();
3014  }
3015}
3016
3017
3018// this is called _after_ the global arguments have been parsed
3019jint os::init_2(void) {
3020  // Allocate a single page and mark it as readable for safepoint polling
3021  address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY);
3022  guarantee( polling_page != NULL, "Reserve Failed for polling page");
3023
3024  address return_page  = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY);
3025  guarantee( return_page != NULL, "Commit Failed for polling page");
3026
3027  os::set_polling_page( polling_page );
3028
3029#ifndef PRODUCT
3030  if( Verbose && PrintMiscellaneous )
3031    tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
3032#endif
3033
3034  if (!UseMembar) {
3035    address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_EXECUTE_READWRITE);
3036    guarantee( mem_serialize_page != NULL, "Reserve Failed for memory serialize page");
3037
3038    return_page  = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
3039    guarantee( return_page != NULL, "Commit Failed for memory serialize page");
3040
3041    os::set_memory_serialize_page( mem_serialize_page );
3042
3043#ifndef PRODUCT
3044    if(Verbose && PrintMiscellaneous)
3045      tty->print("[Memory Serialize  Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
3046#endif
3047}
3048
3049  FLAG_SET_DEFAULT(UseLargePages, os::large_page_init());
3050
3051  // Setup Windows Exceptions
3052
3053  // On Itanium systems, Structured Exception Handling does not
3054  // work since stack frames must be walkable by the OS.  Since
3055  // much of our code is dynamically generated, and we do not have
3056  // proper unwind .xdata sections, the system simply exits
3057  // rather than delivering the exception.  To work around
3058  // this we use VectorExceptions instead.
3059#ifdef _WIN64
3060  if (UseVectoredExceptions) {
3061    topLevelVectoredExceptionHandler = AddVectoredExceptionHandler( 1, topLevelExceptionFilter);
3062  }
3063#endif
3064
3065  // for debugging float code generation bugs
3066  if (ForceFloatExceptions) {
3067#ifndef  _WIN64
3068    static long fp_control_word = 0;
3069    __asm { fstcw fp_control_word }
3070    // see Intel PPro Manual, Vol. 2, p 7-16
3071    const long precision = 0x20;
3072    const long underflow = 0x10;
3073    const long overflow  = 0x08;
3074    const long zero_div  = 0x04;
3075    const long denorm    = 0x02;
3076    const long invalid   = 0x01;
3077    fp_control_word |= invalid;
3078    __asm { fldcw fp_control_word }
3079#endif
3080  }
3081
3082  // Initialize HPI.
3083  jint hpi_result = hpi::initialize();
3084  if (hpi_result != JNI_OK) { return hpi_result; }
3085
3086  // If stack_commit_size is 0, windows will reserve the default size,
3087  // but only commit a small portion of it.
3088  size_t stack_commit_size = round_to(ThreadStackSize*K, os::vm_page_size());
3089  size_t default_reserve_size = os::win32::default_stack_size();
3090  size_t actual_reserve_size = stack_commit_size;
3091  if (stack_commit_size < default_reserve_size) {
3092    // If stack_commit_size == 0, we want this too
3093    actual_reserve_size = default_reserve_size;
3094  }
3095
3096  JavaThread::set_stack_size_at_create(stack_commit_size);
3097
3098  // Calculate theoretical max. size of Threads to guard gainst artifical
3099  // out-of-memory situations, where all available address-space has been
3100  // reserved by thread stacks.
3101  assert(actual_reserve_size != 0, "Must have a stack");
3102
3103  // Calculate the thread limit when we should start doing Virtual Memory
3104  // banging. Currently when the threads will have used all but 200Mb of space.
3105  //
3106  // TODO: consider performing a similar calculation for commit size instead
3107  // as reserve size, since on a 64-bit platform we'll run into that more
3108  // often than running out of virtual memory space.  We can use the
3109  // lower value of the two calculations as the os_thread_limit.
3110  size_t max_address_space = ((size_t)1 << (BitsPerOop - 1)) - (200 * K * K);
3111  win32::_os_thread_limit = (intx)(max_address_space / actual_reserve_size);
3112
3113  // at exit methods are called in the reverse order of their registration.
3114  // there is no limit to the number of functions registered. atexit does
3115  // not set errno.
3116
3117  if (PerfAllowAtExitRegistration) {
3118    // only register atexit functions if PerfAllowAtExitRegistration is set.
3119    // atexit functions can be delayed until process exit time, which
3120    // can be problematic for embedded VM situations. Embedded VMs should
3121    // call DestroyJavaVM() to assure that VM resources are released.
3122
3123    // note: perfMemory_exit_helper atexit function may be removed in
3124    // the future if the appropriate cleanup code can be added to the
3125    // VM_Exit VMOperation's doit method.
3126    if (atexit(perfMemory_exit_helper) != 0) {
3127      warning("os::init_2 atexit(perfMemory_exit_helper) failed");
3128    }
3129  }
3130
3131  // initialize PSAPI or ToolHelp for fatal error handler
3132  if (win32::is_nt()) _init_psapi();
3133  else _init_toolhelp();
3134
3135#ifndef _WIN64
3136  // Print something if NX is enabled (win32 on AMD64)
3137  NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection());
3138#endif
3139
3140  // initialize thread priority policy
3141  prio_init();
3142
3143  return JNI_OK;
3144}
3145
3146
3147// Mark the polling page as unreadable
3148void os::make_polling_page_unreadable(void) {
3149  DWORD old_status;
3150  if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_NOACCESS, &old_status) )
3151    fatal("Could not disable polling page");
3152};
3153
3154// Mark the polling page as readable
3155void os::make_polling_page_readable(void) {
3156  DWORD old_status;
3157  if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_READONLY, &old_status) )
3158    fatal("Could not enable polling page");
3159};
3160
3161
3162int os::stat(const char *path, struct stat *sbuf) {
3163  char pathbuf[MAX_PATH];
3164  if (strlen(path) > MAX_PATH - 1) {
3165    errno = ENAMETOOLONG;
3166    return -1;
3167  }
3168  hpi::native_path(strcpy(pathbuf, path));
3169  int ret = ::stat(pathbuf, sbuf);
3170  if (sbuf != NULL && UseUTCFileTimestamp) {
3171    // Fix for 6539723.  st_mtime returned from stat() is dependent on
3172    // the system timezone and so can return different values for the
3173    // same file if/when daylight savings time changes.  This adjustment
3174    // makes sure the same timestamp is returned regardless of the TZ.
3175    //
3176    // See:
3177    // http://msdn.microsoft.com/library/
3178    //   default.asp?url=/library/en-us/sysinfo/base/
3179    //   time_zone_information_str.asp
3180    // and
3181    // http://msdn.microsoft.com/library/default.asp?url=
3182    //   /library/en-us/sysinfo/base/settimezoneinformation.asp
3183    //
3184    // NOTE: there is a insidious bug here:  If the timezone is changed
3185    // after the call to stat() but before 'GetTimeZoneInformation()', then
3186    // the adjustment we do here will be wrong and we'll return the wrong
3187    // value (which will likely end up creating an invalid class data
3188    // archive).  Absent a better API for this, or some time zone locking
3189    // mechanism, we'll have to live with this risk.
3190    TIME_ZONE_INFORMATION tz;
3191    DWORD tzid = GetTimeZoneInformation(&tz);
3192    int daylightBias =
3193      (tzid == TIME_ZONE_ID_DAYLIGHT) ?  tz.DaylightBias : tz.StandardBias;
3194    sbuf->st_mtime += (tz.Bias + daylightBias) * 60;
3195  }
3196  return ret;
3197}
3198
3199
3200#define FT2INT64(ft) \
3201  ((jlong)((jlong)(ft).dwHighDateTime << 32 | (julong)(ft).dwLowDateTime))
3202
3203
3204// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
3205// are used by JVM M&M and JVMTI to get user+sys or user CPU time
3206// of a thread.
3207//
3208// current_thread_cpu_time() and thread_cpu_time(Thread*) returns
3209// the fast estimate available on the platform.
3210
3211// current_thread_cpu_time() is not optimized for Windows yet
3212jlong os::current_thread_cpu_time() {
3213  // return user + sys since the cost is the same
3214  return os::thread_cpu_time(Thread::current(), true /* user+sys */);
3215}
3216
3217jlong os::thread_cpu_time(Thread* thread) {
3218  // consistent with what current_thread_cpu_time() returns.
3219  return os::thread_cpu_time(thread, true /* user+sys */);
3220}
3221
3222jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
3223  return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
3224}
3225
3226jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) {
3227  // This code is copy from clasic VM -> hpi::sysThreadCPUTime
3228  // If this function changes, os::is_thread_cpu_time_supported() should too
3229  if (os::win32::is_nt()) {
3230    FILETIME CreationTime;
3231    FILETIME ExitTime;
3232    FILETIME KernelTime;
3233    FILETIME UserTime;
3234
3235    if ( GetThreadTimes(thread->osthread()->thread_handle(),
3236                    &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
3237      return -1;
3238    else
3239      if (user_sys_cpu_time) {
3240        return (FT2INT64(UserTime) + FT2INT64(KernelTime)) * 100;
3241      } else {
3242        return FT2INT64(UserTime) * 100;
3243      }
3244  } else {
3245    return (jlong) timeGetTime() * 1000000;
3246  }
3247}
3248
3249void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
3250  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
3251  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
3252  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
3253  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
3254}
3255
3256void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
3257  info_ptr->max_value = ALL_64_BITS;        // the max value -- all 64 bits
3258  info_ptr->may_skip_backward = false;      // GetThreadTimes returns absolute time
3259  info_ptr->may_skip_forward = false;       // GetThreadTimes returns absolute time
3260  info_ptr->kind = JVMTI_TIMER_TOTAL_CPU;   // user+system time is returned
3261}
3262
3263bool os::is_thread_cpu_time_supported() {
3264  // see os::thread_cpu_time
3265  if (os::win32::is_nt()) {
3266    FILETIME CreationTime;
3267    FILETIME ExitTime;
3268    FILETIME KernelTime;
3269    FILETIME UserTime;
3270
3271    if ( GetThreadTimes(GetCurrentThread(),
3272                    &CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
3273      return false;
3274    else
3275      return true;
3276  } else {
3277    return false;
3278  }
3279}
3280
3281// Windows does't provide a loadavg primitive so this is stubbed out for now.
3282// It does have primitives (PDH API) to get CPU usage and run queue length.
3283// "\\Processor(_Total)\\% Processor Time", "\\System\\Processor Queue Length"
3284// If we wanted to implement loadavg on Windows, we have a few options:
3285//
3286// a) Query CPU usage and run queue length and "fake" an answer by
3287//    returning the CPU usage if it's under 100%, and the run queue
3288//    length otherwise.  It turns out that querying is pretty slow
3289//    on Windows, on the order of 200 microseconds on a fast machine.
3290//    Note that on the Windows the CPU usage value is the % usage
3291//    since the last time the API was called (and the first call
3292//    returns 100%), so we'd have to deal with that as well.
3293//
3294// b) Sample the "fake" answer using a sampling thread and store
3295//    the answer in a global variable.  The call to loadavg would
3296//    just return the value of the global, avoiding the slow query.
3297//
3298// c) Sample a better answer using exponential decay to smooth the
3299//    value.  This is basically the algorithm used by UNIX kernels.
3300//
3301// Note that sampling thread starvation could affect both (b) and (c).
3302int os::loadavg(double loadavg[], int nelem) {
3303  return -1;
3304}
3305
3306
3307// DontYieldALot=false by default: dutifully perform all yields as requested by JVM_Yield()
3308bool os::dont_yield() {
3309  return DontYieldALot;
3310}
3311
3312// Is a (classpath) directory empty?
3313bool os::dir_is_empty(const char* path) {
3314  WIN32_FIND_DATA fd;
3315  HANDLE f = FindFirstFile(path, &fd);
3316  if (f == INVALID_HANDLE_VALUE) {
3317    return true;
3318  }
3319  FindClose(f);
3320  return false;
3321}
3322
3323// create binary file, rewriting existing file if required
3324int os::create_binary_file(const char* path, bool rewrite_existing) {
3325  int oflags = _O_CREAT | _O_WRONLY | _O_BINARY;
3326  if (!rewrite_existing) {
3327    oflags |= _O_EXCL;
3328  }
3329  return ::open(path, oflags, _S_IREAD | _S_IWRITE);
3330}
3331
3332// return current position of file pointer
3333jlong os::current_file_offset(int fd) {
3334  return (jlong)::_lseeki64(fd, (__int64)0L, SEEK_CUR);
3335}
3336
3337// move file pointer to the specified offset
3338jlong os::seek_to_file_offset(int fd, jlong offset) {
3339  return (jlong)::_lseeki64(fd, (__int64)offset, SEEK_SET);
3340}
3341
3342
3343// Map a block of memory.
3344char* os::map_memory(int fd, const char* file_name, size_t file_offset,
3345                     char *addr, size_t bytes, bool read_only,
3346                     bool allow_exec) {
3347  HANDLE hFile;
3348  char* base;
3349
3350  hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
3351                     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
3352  if (hFile == NULL) {
3353    if (PrintMiscellaneous && Verbose) {
3354      DWORD err = GetLastError();
3355      tty->print_cr("CreateFile() failed: GetLastError->%ld.");
3356    }
3357    return NULL;
3358  }
3359
3360  if (allow_exec) {
3361    // CreateFileMapping/MapViewOfFileEx can't map executable memory
3362    // unless it comes from a PE image (which the shared archive is not.)
3363    // Even VirtualProtect refuses to give execute access to mapped memory
3364    // that was not previously executable.
3365    //
3366    // Instead, stick the executable region in anonymous memory.  Yuck.
3367    // Penalty is that ~4 pages will not be shareable - in the future
3368    // we might consider DLLizing the shared archive with a proper PE
3369    // header so that mapping executable + sharing is possible.
3370
3371    base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE,
3372                                PAGE_READWRITE);
3373    if (base == NULL) {
3374      if (PrintMiscellaneous && Verbose) {
3375        DWORD err = GetLastError();
3376        tty->print_cr("VirtualAlloc() failed: GetLastError->%ld.", err);
3377      }
3378      CloseHandle(hFile);
3379      return NULL;
3380    }
3381
3382    DWORD bytes_read;
3383    OVERLAPPED overlapped;
3384    overlapped.Offset = (DWORD)file_offset;
3385    overlapped.OffsetHigh = 0;
3386    overlapped.hEvent = NULL;
3387    // ReadFile guarantees that if the return value is true, the requested
3388    // number of bytes were read before returning.
3389    bool res = ReadFile(hFile, base, (DWORD)bytes, &bytes_read, &overlapped) != 0;
3390    if (!res) {
3391      if (PrintMiscellaneous && Verbose) {
3392        DWORD err = GetLastError();
3393        tty->print_cr("ReadFile() failed: GetLastError->%ld.", err);
3394      }
3395      release_memory(base, bytes);
3396      CloseHandle(hFile);
3397      return NULL;
3398    }
3399  } else {
3400    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0,
3401                                    NULL /*file_name*/);
3402    if (hMap == NULL) {
3403      if (PrintMiscellaneous && Verbose) {
3404        DWORD err = GetLastError();
3405        tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.");
3406      }
3407      CloseHandle(hFile);
3408      return NULL;
3409    }
3410
3411    DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY;
3412    base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset,
3413                                  (DWORD)bytes, addr);
3414    if (base == NULL) {
3415      if (PrintMiscellaneous && Verbose) {
3416        DWORD err = GetLastError();
3417        tty->print_cr("MapViewOfFileEx() failed: GetLastError->%ld.", err);
3418      }
3419      CloseHandle(hMap);
3420      CloseHandle(hFile);
3421      return NULL;
3422    }
3423
3424    if (CloseHandle(hMap) == 0) {
3425      if (PrintMiscellaneous && Verbose) {
3426        DWORD err = GetLastError();
3427        tty->print_cr("CloseHandle(hMap) failed: GetLastError->%ld.", err);
3428      }
3429      CloseHandle(hFile);
3430      return base;
3431    }
3432  }
3433
3434  if (allow_exec) {
3435    DWORD old_protect;
3436    DWORD exec_access = read_only ? PAGE_EXECUTE_READ : PAGE_EXECUTE_READWRITE;
3437    bool res = VirtualProtect(base, bytes, exec_access, &old_protect) != 0;
3438
3439    if (!res) {
3440      if (PrintMiscellaneous && Verbose) {
3441        DWORD err = GetLastError();
3442        tty->print_cr("VirtualProtect() failed: GetLastError->%ld.", err);
3443      }
3444      // Don't consider this a hard error, on IA32 even if the
3445      // VirtualProtect fails, we should still be able to execute
3446      CloseHandle(hFile);
3447      return base;
3448    }
3449  }
3450
3451  if (CloseHandle(hFile) == 0) {
3452    if (PrintMiscellaneous && Verbose) {
3453      DWORD err = GetLastError();
3454      tty->print_cr("CloseHandle(hFile) failed: GetLastError->%ld.", err);
3455    }
3456    return base;
3457  }
3458
3459  return base;
3460}
3461
3462
3463// Remap a block of memory.
3464char* os::remap_memory(int fd, const char* file_name, size_t file_offset,
3465                       char *addr, size_t bytes, bool read_only,
3466                       bool allow_exec) {
3467  // This OS does not allow existing memory maps to be remapped so we
3468  // have to unmap the memory before we remap it.
3469  if (!os::unmap_memory(addr, bytes)) {
3470    return NULL;
3471  }
3472
3473  // There is a very small theoretical window between the unmap_memory()
3474  // call above and the map_memory() call below where a thread in native
3475  // code may be able to access an address that is no longer mapped.
3476
3477  return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only,
3478                        allow_exec);
3479}
3480
3481
3482// Unmap a block of memory.
3483// Returns true=success, otherwise false.
3484
3485bool os::unmap_memory(char* addr, size_t bytes) {
3486  BOOL result = UnmapViewOfFile(addr);
3487  if (result == 0) {
3488    if (PrintMiscellaneous && Verbose) {
3489      DWORD err = GetLastError();
3490      tty->print_cr("UnmapViewOfFile() failed: GetLastError->%ld.", err);
3491    }
3492    return false;
3493  }
3494  return true;
3495}
3496
3497void os::pause() {
3498  char filename[MAX_PATH];
3499  if (PauseAtStartupFile && PauseAtStartupFile[0]) {
3500    jio_snprintf(filename, MAX_PATH, PauseAtStartupFile);
3501  } else {
3502    jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id());
3503  }
3504
3505  int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
3506  if (fd != -1) {
3507    struct stat buf;
3508    close(fd);
3509    while (::stat(filename, &buf) == 0) {
3510      Sleep(100);
3511    }
3512  } else {
3513    jio_fprintf(stderr,
3514      "Could not open pause file '%s', continuing immediately.\n", filename);
3515  }
3516}
3517
3518// An Event wraps a win32 "CreateEvent" kernel handle.
3519//
3520// We have a number of choices regarding "CreateEvent" win32 handle leakage:
3521//
3522// 1:  When a thread dies return the Event to the EventFreeList, clear the ParkHandle
3523//     field, and call CloseHandle() on the win32 event handle.  Unpark() would
3524//     need to be modified to tolerate finding a NULL (invalid) win32 event handle.
3525//     In addition, an unpark() operation might fetch the handle field, but the
3526//     event could recycle between the fetch and the SetEvent() operation.
3527//     SetEvent() would either fail because the handle was invalid, or inadvertently work,
3528//     as the win32 handle value had been recycled.  In an ideal world calling SetEvent()
3529//     on an stale but recycled handle would be harmless, but in practice this might
3530//     confuse other non-Sun code, so it's not a viable approach.
3531//
3532// 2:  Once a win32 event handle is associated with an Event, it remains associated
3533//     with the Event.  The event handle is never closed.  This could be construed
3534//     as handle leakage, but only up to the maximum # of threads that have been extant
3535//     at any one time.  This shouldn't be an issue, as windows platforms typically
3536//     permit a process to have hundreds of thousands of open handles.
3537//
3538// 3:  Same as (1), but periodically, at stop-the-world time, rundown the EventFreeList
3539//     and release unused handles.
3540//
3541// 4:  Add a CRITICAL_SECTION to the Event to protect LD+SetEvent from LD;ST(null);CloseHandle.
3542//     It's not clear, however, that we wouldn't be trading one type of leak for another.
3543//
3544// 5.  Use an RCU-like mechanism (Read-Copy Update).
3545//     Or perhaps something similar to Maged Michael's "Hazard pointers".
3546//
3547// We use (2).
3548//
3549// TODO-FIXME:
3550// 1.  Reconcile Doug's JSR166 j.u.c park-unpark with the objectmonitor implementation.
3551// 2.  Consider wrapping the WaitForSingleObject(Ex) calls in SEH try/finally blocks
3552//     to recover from (or at least detect) the dreaded Windows 841176 bug.
3553// 3.  Collapse the interrupt_event, the JSR166 parker event, and the objectmonitor ParkEvent
3554//     into a single win32 CreateEvent() handle.
3555//
3556// _Event transitions in park()
3557//   -1 => -1 : illegal
3558//    1 =>  0 : pass - return immediately
3559//    0 => -1 : block
3560//
3561// _Event serves as a restricted-range semaphore :
3562//    -1 : thread is blocked
3563//     0 : neutral  - thread is running or ready
3564//     1 : signaled - thread is running or ready
3565//
3566// Another possible encoding of _Event would be
3567// with explicit "PARKED" and "SIGNALED" bits.
3568
3569int os::PlatformEvent::park (jlong Millis) {
3570    guarantee (_ParkHandle != NULL , "Invariant") ;
3571    guarantee (Millis > 0          , "Invariant") ;
3572    int v ;
3573
3574    // CONSIDER: defer assigning a CreateEvent() handle to the Event until
3575    // the initial park() operation.
3576
3577    for (;;) {
3578        v = _Event ;
3579        if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
3580    }
3581    guarantee ((v == 0) || (v == 1), "invariant") ;
3582    if (v != 0) return OS_OK ;
3583
3584    // Do this the hard way by blocking ...
3585    // TODO: consider a brief spin here, gated on the success of recent
3586    // spin attempts by this thread.
3587    //
3588    // We decompose long timeouts into series of shorter timed waits.
3589    // Evidently large timo values passed in WaitForSingleObject() are problematic on some
3590    // versions of Windows.  See EventWait() for details.  This may be superstition.  Or not.
3591    // We trust the WAIT_TIMEOUT indication and don't track the elapsed wait time
3592    // with os::javaTimeNanos().  Furthermore, we assume that spurious returns from
3593    // ::WaitForSingleObject() caused by latent ::setEvent() operations will tend
3594    // to happen early in the wait interval.  Specifically, after a spurious wakeup (rv ==
3595    // WAIT_OBJECT_0 but _Event is still < 0) we don't bother to recompute Millis to compensate
3596    // for the already waited time.  This policy does not admit any new outcomes.
3597    // In the future, however, we might want to track the accumulated wait time and
3598    // adjust Millis accordingly if we encounter a spurious wakeup.
3599
3600    const int MAXTIMEOUT = 0x10000000 ;
3601    DWORD rv = WAIT_TIMEOUT ;
3602    while (_Event < 0 && Millis > 0) {
3603       DWORD prd = Millis ;     // set prd = MAX (Millis, MAXTIMEOUT)
3604       if (Millis > MAXTIMEOUT) {
3605          prd = MAXTIMEOUT ;
3606       }
3607       rv = ::WaitForSingleObject (_ParkHandle, prd) ;
3608       assert (rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed") ;
3609       if (rv == WAIT_TIMEOUT) {
3610           Millis -= prd ;
3611       }
3612    }
3613    v = _Event ;
3614    _Event = 0 ;
3615    OrderAccess::fence() ;
3616    // If we encounter a nearly simultanous timeout expiry and unpark()
3617    // we return OS_OK indicating we awoke via unpark().
3618    // Implementor's license -- returning OS_TIMEOUT would be equally valid, however.
3619    return (v >= 0) ? OS_OK : OS_TIMEOUT ;
3620}
3621
3622void os::PlatformEvent::park () {
3623    guarantee (_ParkHandle != NULL, "Invariant") ;
3624    // Invariant: Only the thread associated with the Event/PlatformEvent
3625    // may call park().
3626    int v ;
3627    for (;;) {
3628        v = _Event ;
3629        if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
3630    }
3631    guarantee ((v == 0) || (v == 1), "invariant") ;
3632    if (v != 0) return ;
3633
3634    // Do this the hard way by blocking ...
3635    // TODO: consider a brief spin here, gated on the success of recent
3636    // spin attempts by this thread.
3637    while (_Event < 0) {
3638       DWORD rv = ::WaitForSingleObject (_ParkHandle, INFINITE) ;
3639       assert (rv == WAIT_OBJECT_0, "WaitForSingleObject failed") ;
3640    }
3641
3642    // Usually we'll find _Event == 0 at this point, but as
3643    // an optional optimization we clear it, just in case can
3644    // multiple unpark() operations drove _Event up to 1.
3645    _Event = 0 ;
3646    OrderAccess::fence() ;
3647    guarantee (_Event >= 0, "invariant") ;
3648}
3649
3650void os::PlatformEvent::unpark() {
3651  guarantee (_ParkHandle != NULL, "Invariant") ;
3652  int v ;
3653  for (;;) {
3654      v = _Event ;      // Increment _Event if it's < 1.
3655      if (v > 0) {
3656         // If it's already signaled just return.
3657         // The LD of _Event could have reordered or be satisfied
3658         // by a read-aside from this processor's write buffer.
3659         // To avoid problems execute a barrier and then
3660         // ratify the value.  A degenerate CAS() would also work.
3661         // Viz., CAS (v+0, &_Event, v) == v).
3662         OrderAccess::fence() ;
3663         if (_Event == v) return ;
3664         continue ;
3665      }
3666      if (Atomic::cmpxchg (v+1, &_Event, v) == v) break ;
3667  }
3668  if (v < 0) {
3669     ::SetEvent (_ParkHandle) ;
3670  }
3671}
3672
3673
3674// JSR166
3675// -------------------------------------------------------
3676
3677/*
3678 * The Windows implementation of Park is very straightforward: Basic
3679 * operations on Win32 Events turn out to have the right semantics to
3680 * use them directly. We opportunistically resuse the event inherited
3681 * from Monitor.
3682 */
3683
3684
3685void Parker::park(bool isAbsolute, jlong time) {
3686  guarantee (_ParkEvent != NULL, "invariant") ;
3687  // First, demultiplex/decode time arguments
3688  if (time < 0) { // don't wait
3689    return;
3690  }
3691  else if (time == 0) {
3692    time = INFINITE;
3693  }
3694  else if  (isAbsolute) {
3695    time -= os::javaTimeMillis(); // convert to relative time
3696    if (time <= 0) // already elapsed
3697      return;
3698  }
3699  else { // relative
3700    time /= 1000000; // Must coarsen from nanos to millis
3701    if (time == 0)   // Wait for the minimal time unit if zero
3702      time = 1;
3703  }
3704
3705  JavaThread* thread = (JavaThread*)(Thread::current());
3706  assert(thread->is_Java_thread(), "Must be JavaThread");
3707  JavaThread *jt = (JavaThread *)thread;
3708
3709  // Don't wait if interrupted or already triggered
3710  if (Thread::is_interrupted(thread, false) ||
3711    WaitForSingleObject(_ParkEvent, 0) == WAIT_OBJECT_0) {
3712    ResetEvent(_ParkEvent);
3713    return;
3714  }
3715  else {
3716    ThreadBlockInVM tbivm(jt);
3717    OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
3718    jt->set_suspend_equivalent();
3719
3720    WaitForSingleObject(_ParkEvent,  time);
3721    ResetEvent(_ParkEvent);
3722
3723    // If externally suspended while waiting, re-suspend
3724    if (jt->handle_special_suspend_equivalent_condition()) {
3725      jt->java_suspend_self();
3726    }
3727  }
3728}
3729
3730void Parker::unpark() {
3731  guarantee (_ParkEvent != NULL, "invariant") ;
3732  SetEvent(_ParkEvent);
3733}
3734
3735// Run the specified command in a separate process. Return its exit value,
3736// or -1 on failure (e.g. can't create a new process).
3737int os::fork_and_exec(char* cmd) {
3738  STARTUPINFO si;
3739  PROCESS_INFORMATION pi;
3740
3741  memset(&si, 0, sizeof(si));
3742  si.cb = sizeof(si);
3743  memset(&pi, 0, sizeof(pi));
3744  BOOL rslt = CreateProcess(NULL,   // executable name - use command line
3745                            cmd,    // command line
3746                            NULL,   // process security attribute
3747                            NULL,   // thread security attribute
3748                            TRUE,   // inherits system handles
3749                            0,      // no creation flags
3750                            NULL,   // use parent's environment block
3751                            NULL,   // use parent's starting directory
3752                            &si,    // (in) startup information
3753                            &pi);   // (out) process information
3754
3755  if (rslt) {
3756    // Wait until child process exits.
3757    WaitForSingleObject(pi.hProcess, INFINITE);
3758
3759    DWORD exit_code;
3760    GetExitCodeProcess(pi.hProcess, &exit_code);
3761
3762    // Close process and thread handles.
3763    CloseHandle(pi.hProcess);
3764    CloseHandle(pi.hThread);
3765
3766    return (int)exit_code;
3767  } else {
3768    return -1;
3769  }
3770}
3771
3772//--------------------------------------------------------------------------------------------------
3773// Non-product code
3774
3775static int mallocDebugIntervalCounter = 0;
3776static int mallocDebugCounter = 0;
3777bool os::check_heap(bool force) {
3778  if (++mallocDebugCounter < MallocVerifyStart && !force) return true;
3779  if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) {
3780    // Note: HeapValidate executes two hardware breakpoints when it finds something
3781    // wrong; at these points, eax contains the address of the offending block (I think).
3782    // To get to the exlicit error message(s) below, just continue twice.
3783    HANDLE heap = GetProcessHeap();
3784    { HeapLock(heap);
3785      PROCESS_HEAP_ENTRY phe;
3786      phe.lpData = NULL;
3787      while (HeapWalk(heap, &phe) != 0) {
3788        if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) &&
3789            !HeapValidate(heap, 0, phe.lpData)) {
3790          tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter);
3791          tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData);
3792          fatal("corrupted C heap");
3793        }
3794      }
3795      int err = GetLastError();
3796      if (err != ERROR_NO_MORE_ITEMS && err != ERROR_CALL_NOT_IMPLEMENTED) {
3797        fatal1("heap walk aborted with error %d", err);
3798      }
3799      HeapUnlock(heap);
3800    }
3801    mallocDebugIntervalCounter = 0;
3802  }
3803  return true;
3804}
3805
3806
3807#ifndef PRODUCT
3808bool os::find(address addr) {
3809  // Nothing yet
3810  return false;
3811}
3812#endif
3813
3814LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) {
3815  DWORD exception_code = e->ExceptionRecord->ExceptionCode;
3816
3817  if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
3818    JavaThread* thread = (JavaThread*)ThreadLocalStorage::get_thread_slow();
3819    PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord;
3820    address addr = (address) exceptionRecord->ExceptionInformation[1];
3821
3822    if (os::is_memory_serialize_page(thread, addr))
3823      return EXCEPTION_CONTINUE_EXECUTION;
3824  }
3825
3826  return EXCEPTION_CONTINUE_SEARCH;
3827}
3828
3829static int getLastErrorString(char *buf, size_t len)
3830{
3831    long errval;
3832
3833    if ((errval = GetLastError()) != 0)
3834    {
3835      /* DOS error */
3836      size_t n = (size_t)FormatMessage(
3837            FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
3838            NULL,
3839            errval,
3840            0,
3841            buf,
3842            (DWORD)len,
3843            NULL);
3844      if (n > 3) {
3845        /* Drop final '.', CR, LF */
3846        if (buf[n - 1] == '\n') n--;
3847        if (buf[n - 1] == '\r') n--;
3848        if (buf[n - 1] == '.') n--;
3849        buf[n] = '\0';
3850      }
3851      return (int)n;
3852    }
3853
3854    if (errno != 0)
3855    {
3856      /* C runtime error that has no corresponding DOS error code */
3857      const char *s = strerror(errno);
3858      size_t n = strlen(s);
3859      if (n >= len) n = len - 1;
3860      strncpy(buf, s, n);
3861      buf[n] = '\0';
3862      return (int)n;
3863    }
3864    return 0;
3865}
3866