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