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