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