annotate src/os_cpu/windows_x86/vm/os_windows_x86.cpp @ 4837:eff609af17d7

7127706: G1: re-enable survivors during the initial-mark pause Summary: Re-enable survivors during the initial-mark pause. Afterwards, the concurrent marking threads have to scan them and mark everything reachable from them. The next GC will have to wait for the survivors to be scanned. Reviewed-by: brutisso, johnc
author tonyp
date Wed, 25 Jan 2012 12:58:23 -0500
parents 828eafbd85cc
children 897b7d18bebc da4be62fb889
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1681
diff changeset
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 844
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 844
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 844
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
25 // no precompiled headers
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
26 #include "assembler_x86.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
27 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
28 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
29 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
30 #include "code/icBuffer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
31 #include "code/vtableStubs.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
32 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
33 #include "jvm_windows.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
34 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
35 #include "mutex_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
36 #include "nativeInst_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
37 #include "os_share_windows.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
38 #include "prims/jniFastGetField.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
39 #include "prims/jvm.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
40 #include "prims/jvm_misc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
41 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
42 #include "runtime/extendedPC.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
43 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
44 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
45 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
46 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
47 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
48 #include "runtime/osThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
49 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
50 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
51 #include "runtime/timer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
52 #include "thread_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
53 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
54 #include "utilities/vmError.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
55 #ifdef COMPILER1
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
56 #include "c1/c1_Runtime1.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
57 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
58 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
59 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
60 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1907
diff changeset
61
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 # include "unwind_windows_x86.hpp"
a61af66fc99e Initial load
duke
parents:
diff changeset
63 #undef REG_SP
a61af66fc99e Initial load
duke
parents:
diff changeset
64 #undef REG_FP
a61af66fc99e Initial load
duke
parents:
diff changeset
65 #undef REG_PC
a61af66fc99e Initial load
duke
parents:
diff changeset
66 #ifdef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
67 #define REG_SP Rsp
a61af66fc99e Initial load
duke
parents:
diff changeset
68 #define REG_FP Rbp
a61af66fc99e Initial load
duke
parents:
diff changeset
69 #define REG_PC Rip
a61af66fc99e Initial load
duke
parents:
diff changeset
70 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
71 #define REG_SP Esp
a61af66fc99e Initial load
duke
parents:
diff changeset
72 #define REG_FP Ebp
a61af66fc99e Initial load
duke
parents:
diff changeset
73 #define REG_PC Eip
a61af66fc99e Initial load
duke
parents:
diff changeset
74 #endif // AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 extern LONG WINAPI topLevelExceptionFilter(_EXCEPTION_POINTERS* );
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // Install a win32 structured exception handler around thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
79 void os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 __try {
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 #ifndef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // We store the current thread in this wrapperthread location
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // and determine how far away this address is from the structured
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // execption pointer that FS:[0] points to. This get_thread
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // code can then get the thread pointer via FS.
a61af66fc99e Initial load
duke
parents:
diff changeset
87 //
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // Warning: This routine must NEVER be inlined since we'd end up with
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // multiple offsets.
a61af66fc99e Initial load
duke
parents:
diff changeset
90 //
a61af66fc99e Initial load
duke
parents:
diff changeset
91 volatile Thread* wrapperthread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 if ( ThreadLocalStorage::get_thread_ptr_offset() == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 int thread_ptr_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 __asm {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 lea eax, dword ptr wrapperthread;
a61af66fc99e Initial load
duke
parents:
diff changeset
97 sub eax, dword ptr FS:[0H];
a61af66fc99e Initial load
duke
parents:
diff changeset
98 mov thread_ptr_offset, eax
a61af66fc99e Initial load
duke
parents:
diff changeset
99 };
a61af66fc99e Initial load
duke
parents:
diff changeset
100 ThreadLocalStorage::set_thread_ptr_offset(thread_ptr_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // Verify that the offset hasn't changed since we initally captured
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // it. This might happen if we accidentally ended up with an
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // inlined version of this routine.
a61af66fc99e Initial load
duke
parents:
diff changeset
106 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 int test_thread_ptr_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 __asm {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 lea eax, dword ptr wrapperthread;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 sub eax, dword ptr FS:[0H];
a61af66fc99e Initial load
duke
parents:
diff changeset
111 mov test_thread_ptr_offset, eax
a61af66fc99e Initial load
duke
parents:
diff changeset
112 };
a61af66fc99e Initial load
duke
parents:
diff changeset
113 assert(test_thread_ptr_offset == ThreadLocalStorage::get_thread_ptr_offset(),
a61af66fc99e Initial load
duke
parents:
diff changeset
114 "thread pointer offset from SEH changed");
a61af66fc99e Initial load
duke
parents:
diff changeset
115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
116 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
117 #endif // !AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 f(value, method, args, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 } __except(topLevelExceptionFilter((_EXCEPTION_POINTERS*)_exception_info())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // Nothing to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 #ifdef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // This is the language specific handler for exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // originating from dynamically generated code.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // We call the standard structured exception handler
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // We only expect Continued Execution since we cannot unwind
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // from generated code.
a61af66fc99e Initial load
duke
parents:
diff changeset
132 LONG HandleExceptionFromCodeCache(
a61af66fc99e Initial load
duke
parents:
diff changeset
133 IN PEXCEPTION_RECORD ExceptionRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
134 IN ULONG64 EstablisherFrame,
a61af66fc99e Initial load
duke
parents:
diff changeset
135 IN OUT PCONTEXT ContextRecord,
a61af66fc99e Initial load
duke
parents:
diff changeset
136 IN OUT PDISPATCHER_CONTEXT DispatcherContext) {
a61af66fc99e Initial load
duke
parents:
diff changeset
137 EXCEPTION_POINTERS ep;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 LONG result;
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 ep.ExceptionRecord = ExceptionRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 ep.ContextRecord = ContextRecord;
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 result = topLevelExceptionFilter(&ep);
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // We better only get a CONTINUE_EXECUTION from our handler
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // since we don't have unwind information registered.
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 guarantee( result == EXCEPTION_CONTINUE_EXECUTION,
a61af66fc99e Initial load
duke
parents:
diff changeset
149 "Unexpected result from topLevelExceptionFilter");
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 return(ExceptionContinueExecution);
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // Structure containing the Windows Data Structures required
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // to register our Code Cache exception handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // We put these in the CodeCache since the API requires
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // all addresses in these structures are relative to the Code
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // area registered with RtlAddFunctionTable.
a61af66fc99e Initial load
duke
parents:
diff changeset
160 typedef struct {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 char ExceptionHandlerInstr[16]; // jmp HandleExceptionFromCodeCache
a61af66fc99e Initial load
duke
parents:
diff changeset
162 RUNTIME_FUNCTION rt;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 UNWIND_INFO_EH_ONLY unw;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 } DynamicCodeData, *pDynamicCodeData;
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 #endif // AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
167 //
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Register our CodeCache area with the OS so it will dispatch exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // to our topLevelExceptionFilter when we take an exception in our
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // dynamically generated code.
a61af66fc99e Initial load
duke
parents:
diff changeset
171 //
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // Arguments: low and high are the address of the full reserved
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // codeCache area
a61af66fc99e Initial load
duke
parents:
diff changeset
174 //
a61af66fc99e Initial load
duke
parents:
diff changeset
175 bool os::register_code_area(char *low, char *high) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 #ifdef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 pDynamicCodeData pDCD;
a61af66fc99e Initial load
duke
parents:
diff changeset
181 PRUNTIME_FUNCTION prt;
a61af66fc99e Initial load
duke
parents:
diff changeset
182 PUNWIND_INFO_EH_ONLY punwind;
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // If we are using Vectored Exceptions we don't need this registration
a61af66fc99e Initial load
duke
parents:
diff changeset
185 if (UseVectoredExceptions) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
186
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1681
diff changeset
187 BufferBlob* blob = BufferBlob::create("CodeCache Exception Handler", sizeof(DynamicCodeData));
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1681
diff changeset
188 CodeBuffer cb(blob);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
189 MacroAssembler* masm = new MacroAssembler(&cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
190 pDCD = (pDynamicCodeData) masm->pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 masm->jump(ExternalAddress((address)&HandleExceptionFromCodeCache));
a61af66fc99e Initial load
duke
parents:
diff changeset
193 masm->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Create an Unwind Structure specifying no unwind info
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // other than an Exception Handler
a61af66fc99e Initial load
duke
parents:
diff changeset
197 punwind = &pDCD->unw;
a61af66fc99e Initial load
duke
parents:
diff changeset
198 punwind->Version = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
199 punwind->Flags = UNW_FLAG_EHANDLER;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 punwind->SizeOfProlog = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 punwind->CountOfCodes = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 punwind->FrameRegister = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
203 punwind->FrameOffset = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 punwind->ExceptionHandler = (char *)(&(pDCD->ExceptionHandlerInstr[0])) -
a61af66fc99e Initial load
duke
parents:
diff changeset
205 (char*)low;
a61af66fc99e Initial load
duke
parents:
diff changeset
206 punwind->ExceptionData[0] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // This structure describes the covered dynamic code area.
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // Addresses are relative to the beginning on the code cache area
a61af66fc99e Initial load
duke
parents:
diff changeset
210 prt = &pDCD->rt;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 prt->BeginAddress = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 prt->EndAddress = (ULONG)(high - low);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 prt->UnwindData = ((char *)punwind - low);
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 guarantee(RtlAddFunctionTable(prt, 1, (ULONGLONG)low),
a61af66fc99e Initial load
duke
parents:
diff changeset
216 "Failed to register Dynamic Code Exception Handler with RtlAddFunctionTable");
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 #endif // AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 void os::initialize_thread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // Nothing to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // Atomics and Stub Functions
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 typedef jint xchg_func_t (jint, volatile jint*);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 typedef intptr_t xchg_ptr_func_t (intptr_t, volatile intptr_t*);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 typedef jint cmpxchg_func_t (jint, volatile jint*, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 typedef jlong cmpxchg_long_func_t (jlong, volatile jlong*, jlong);
a61af66fc99e Initial load
duke
parents:
diff changeset
232 typedef jint add_func_t (jint, volatile jint*);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 typedef intptr_t add_ptr_func_t (intptr_t, volatile intptr_t*);
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 #ifdef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 jint os::atomic_xchg_bootstrap(jint exchange_value, volatile jint* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // try to use the stub:
a61af66fc99e Initial load
duke
parents:
diff changeset
239 xchg_func_t* func = CAST_TO_FN_PTR(xchg_func_t*, StubRoutines::atomic_xchg_entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 if (func != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
242 os::atomic_xchg_func = func;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 return (*func)(exchange_value, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245 assert(Threads::number_of_threads() == 0, "for bootstrap only");
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 jint old_value = *dest;
a61af66fc99e Initial load
duke
parents:
diff changeset
248 *dest = exchange_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
249 return old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 intptr_t os::atomic_xchg_ptr_bootstrap(intptr_t exchange_value, volatile intptr_t* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // try to use the stub:
a61af66fc99e Initial load
duke
parents:
diff changeset
254 xchg_ptr_func_t* func = CAST_TO_FN_PTR(xchg_ptr_func_t*, StubRoutines::atomic_xchg_ptr_entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 if (func != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 os::atomic_xchg_ptr_func = func;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 return (*func)(exchange_value, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 assert(Threads::number_of_threads() == 0, "for bootstrap only");
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 intptr_t old_value = *dest;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 *dest = exchange_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 return old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 jint os::atomic_cmpxchg_bootstrap(jint exchange_value, volatile jint* dest, jint compare_value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // try to use the stub:
a61af66fc99e Initial load
duke
parents:
diff changeset
270 cmpxchg_func_t* func = CAST_TO_FN_PTR(cmpxchg_func_t*, StubRoutines::atomic_cmpxchg_entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 if (func != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 os::atomic_cmpxchg_func = func;
a61af66fc99e Initial load
duke
parents:
diff changeset
274 return (*func)(exchange_value, dest, compare_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
276 assert(Threads::number_of_threads() == 0, "for bootstrap only");
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 jint old_value = *dest;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 if (old_value == compare_value)
a61af66fc99e Initial load
duke
parents:
diff changeset
280 *dest = exchange_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
281 return old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 #endif // AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 jlong os::atomic_cmpxchg_long_bootstrap(jlong exchange_value, volatile jlong* dest, jlong compare_value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // try to use the stub:
a61af66fc99e Initial load
duke
parents:
diff changeset
287 cmpxchg_long_func_t* func = CAST_TO_FN_PTR(cmpxchg_long_func_t*, StubRoutines::atomic_cmpxchg_long_entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 if (func != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 os::atomic_cmpxchg_long_func = func;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 return (*func)(exchange_value, dest, compare_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293 assert(Threads::number_of_threads() == 0, "for bootstrap only");
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 jlong old_value = *dest;
a61af66fc99e Initial load
duke
parents:
diff changeset
296 if (old_value == compare_value)
a61af66fc99e Initial load
duke
parents:
diff changeset
297 *dest = exchange_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
298 return old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 #ifdef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 jint os::atomic_add_bootstrap(jint add_value, volatile jint* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // try to use the stub:
a61af66fc99e Initial load
duke
parents:
diff changeset
305 add_func_t* func = CAST_TO_FN_PTR(add_func_t*, StubRoutines::atomic_add_entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 if (func != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 os::atomic_add_func = func;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 return (*func)(add_value, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
311 assert(Threads::number_of_threads() == 0, "for bootstrap only");
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 return (*dest) += add_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 intptr_t os::atomic_add_ptr_bootstrap(intptr_t add_value, volatile intptr_t* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // try to use the stub:
a61af66fc99e Initial load
duke
parents:
diff changeset
318 add_ptr_func_t* func = CAST_TO_FN_PTR(add_ptr_func_t*, StubRoutines::atomic_add_ptr_entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 if (func != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 os::atomic_add_ptr_func = func;
a61af66fc99e Initial load
duke
parents:
diff changeset
322 return (*func)(add_value, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
324 assert(Threads::number_of_threads() == 0, "for bootstrap only");
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 return (*dest) += add_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 xchg_func_t* os::atomic_xchg_func = os::atomic_xchg_bootstrap;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 xchg_ptr_func_t* os::atomic_xchg_ptr_func = os::atomic_xchg_ptr_bootstrap;
a61af66fc99e Initial load
duke
parents:
diff changeset
331 cmpxchg_func_t* os::atomic_cmpxchg_func = os::atomic_cmpxchg_bootstrap;
a61af66fc99e Initial load
duke
parents:
diff changeset
332 add_func_t* os::atomic_add_func = os::atomic_add_bootstrap;
a61af66fc99e Initial load
duke
parents:
diff changeset
333 add_ptr_func_t* os::atomic_add_ptr_func = os::atomic_add_ptr_bootstrap;
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 #endif // AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 cmpxchg_long_func_t* os::atomic_cmpxchg_long_func = os::atomic_cmpxchg_long_bootstrap;
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 ExtendedPC os::fetch_frame_from_context(void* ucVoid,
a61af66fc99e Initial load
duke
parents:
diff changeset
340 intptr_t** ret_sp, intptr_t** ret_fp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 ExtendedPC epc;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 CONTEXT* uc = (CONTEXT*)ucVoid;
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 if (uc != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
346 epc = ExtendedPC((address)uc->REG_PC);
a61af66fc99e Initial load
duke
parents:
diff changeset
347 if (ret_sp) *ret_sp = (intptr_t*)uc->REG_SP;
a61af66fc99e Initial load
duke
parents:
diff changeset
348 if (ret_fp) *ret_fp = (intptr_t*)uc->REG_FP;
a61af66fc99e Initial load
duke
parents:
diff changeset
349 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // construct empty ExtendedPC for return value checking
a61af66fc99e Initial load
duke
parents:
diff changeset
351 epc = ExtendedPC(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 if (ret_sp) *ret_sp = (intptr_t *)NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 if (ret_fp) *ret_fp = (intptr_t *)NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 return epc;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 frame os::fetch_frame_from_context(void* ucVoid) {
a61af66fc99e Initial load
duke
parents:
diff changeset
360 intptr_t* sp;
a61af66fc99e Initial load
duke
parents:
diff changeset
361 intptr_t* fp;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
363 return frame(sp, fp, epc.pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // VC++ does not save frame pointer on stack in optimized build. It
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // can be turned off by /Oy-. If we really want to walk C frames,
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // we can use the StackWalk() API.
a61af66fc99e Initial load
duke
parents:
diff changeset
369 frame os::get_sender_for_C_frame(frame* fr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
370 return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 #ifndef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
375 intptr_t* _get_previous_fp() {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 intptr_t **frameptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
377 __asm {
a61af66fc99e Initial load
duke
parents:
diff changeset
378 mov frameptr, ebp
a61af66fc99e Initial load
duke
parents:
diff changeset
379 };
a61af66fc99e Initial load
duke
parents:
diff changeset
380 return *frameptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
381 }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 #endif // !AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 frame os::current_frame() {
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 #ifdef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // apparently _asm not supported on windows amd64
a61af66fc99e Initial load
duke
parents:
diff changeset
388 typedef intptr_t* get_fp_func ();
a61af66fc99e Initial load
duke
parents:
diff changeset
389 get_fp_func* func = CAST_TO_FN_PTR(get_fp_func*,
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
390 StubRoutines::x86::get_previous_fp_entry());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
391 if (func == NULL) return frame(NULL, NULL, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
392 intptr_t* fp = (*func)();
a61af66fc99e Initial load
duke
parents:
diff changeset
393 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
394 intptr_t* fp = _get_previous_fp();
a61af66fc99e Initial load
duke
parents:
diff changeset
395 #endif // AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 frame myframe((intptr_t*)os::current_stack_pointer(),
a61af66fc99e Initial load
duke
parents:
diff changeset
398 (intptr_t*)fp,
a61af66fc99e Initial load
duke
parents:
diff changeset
399 CAST_FROM_FN_PTR(address, os::current_frame));
a61af66fc99e Initial load
duke
parents:
diff changeset
400 if (os::is_first_C_frame(&myframe)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // stack is not walkable
a61af66fc99e Initial load
duke
parents:
diff changeset
402 return frame(NULL, NULL, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
403 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
404 return os::get_sender_for_C_frame(&myframe);
a61af66fc99e Initial load
duke
parents:
diff changeset
405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 void os::print_context(outputStream *st, void *context) {
a61af66fc99e Initial load
duke
parents:
diff changeset
409 if (context == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 CONTEXT* uc = (CONTEXT*)context;
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 st->print_cr("Registers:");
a61af66fc99e Initial load
duke
parents:
diff changeset
414 #ifdef AMD64
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
415 st->print( "RAX=" INTPTR_FORMAT, uc->Rax);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
416 st->print(", RBX=" INTPTR_FORMAT, uc->Rbx);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
417 st->print(", RCX=" INTPTR_FORMAT, uc->Rcx);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
418 st->print(", RDX=" INTPTR_FORMAT, uc->Rdx);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
419 st->cr();
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
420 st->print( "RSP=" INTPTR_FORMAT, uc->Rsp);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
421 st->print(", RBP=" INTPTR_FORMAT, uc->Rbp);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
422 st->print(", RSI=" INTPTR_FORMAT, uc->Rsi);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
423 st->print(", RDI=" INTPTR_FORMAT, uc->Rdi);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
424 st->cr();
1907
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
425 st->print( "R8 =" INTPTR_FORMAT, uc->R8);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
426 st->print(", R9 =" INTPTR_FORMAT, uc->R9);
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
427 st->print(", R10=" INTPTR_FORMAT, uc->R10);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
428 st->print(", R11=" INTPTR_FORMAT, uc->R11);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
429 st->cr();
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
430 st->print( "R12=" INTPTR_FORMAT, uc->R12);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
431 st->print(", R13=" INTPTR_FORMAT, uc->R13);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
432 st->print(", R14=" INTPTR_FORMAT, uc->R14);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
433 st->print(", R15=" INTPTR_FORMAT, uc->R15);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
434 st->cr();
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
435 st->print( "RIP=" INTPTR_FORMAT, uc->Rip);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
436 st->print(", EFLAGS=" INTPTR_FORMAT, uc->EFlags);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
437 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
438 st->print( "EAX=" INTPTR_FORMAT, uc->Eax);
a61af66fc99e Initial load
duke
parents:
diff changeset
439 st->print(", EBX=" INTPTR_FORMAT, uc->Ebx);
a61af66fc99e Initial load
duke
parents:
diff changeset
440 st->print(", ECX=" INTPTR_FORMAT, uc->Ecx);
a61af66fc99e Initial load
duke
parents:
diff changeset
441 st->print(", EDX=" INTPTR_FORMAT, uc->Edx);
a61af66fc99e Initial load
duke
parents:
diff changeset
442 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
443 st->print( "ESP=" INTPTR_FORMAT, uc->Esp);
a61af66fc99e Initial load
duke
parents:
diff changeset
444 st->print(", EBP=" INTPTR_FORMAT, uc->Ebp);
a61af66fc99e Initial load
duke
parents:
diff changeset
445 st->print(", ESI=" INTPTR_FORMAT, uc->Esi);
a61af66fc99e Initial load
duke
parents:
diff changeset
446 st->print(", EDI=" INTPTR_FORMAT, uc->Edi);
a61af66fc99e Initial load
duke
parents:
diff changeset
447 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
448 st->print( "EIP=" INTPTR_FORMAT, uc->Eip);
a61af66fc99e Initial load
duke
parents:
diff changeset
449 st->print(", EFLAGS=" INTPTR_FORMAT, uc->EFlags);
a61af66fc99e Initial load
duke
parents:
diff changeset
450 #endif // AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
451 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
452 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 intptr_t *sp = (intptr_t *)uc->REG_SP;
a61af66fc99e Initial load
duke
parents:
diff changeset
455 st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", sp);
a61af66fc99e Initial load
duke
parents:
diff changeset
456 print_hex_dump(st, (address)sp, (address)(sp + 32), sizeof(intptr_t));
a61af66fc99e Initial load
duke
parents:
diff changeset
457 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // Note: it may be unsafe to inspect memory near pc. For example, pc may
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // point to garbage if entry point in an nmethod is corrupted. Leave
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // this at the end, and hope for the best.
a61af66fc99e Initial load
duke
parents:
diff changeset
462 address pc = (address)uc->REG_PC;
a61af66fc99e Initial load
duke
parents:
diff changeset
463 st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc);
1907
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
464 print_hex_dump(st, pc - 32, pc + 32, sizeof(char));
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
465 st->cr();
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
466 }
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
467
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
468
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
469 void os::print_register_info(outputStream *st, void *context) {
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
470 if (context == NULL) return;
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
471
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
472 CONTEXT* uc = (CONTEXT*)context;
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
473
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
474 st->print_cr("Register to memory mapping:");
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
475 st->cr();
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
476
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
477 // this is only for the "general purpose" registers
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
478
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
479 #ifdef AMD64
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
480 st->print("RAX="); print_location(st, uc->Rax);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
481 st->print("RBX="); print_location(st, uc->Rbx);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
482 st->print("RCX="); print_location(st, uc->Rcx);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
483 st->print("RDX="); print_location(st, uc->Rdx);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
484 st->print("RSP="); print_location(st, uc->Rsp);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
485 st->print("RBP="); print_location(st, uc->Rbp);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
486 st->print("RSI="); print_location(st, uc->Rsi);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
487 st->print("RDI="); print_location(st, uc->Rdi);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
488 st->print("R8 ="); print_location(st, uc->R8);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
489 st->print("R9 ="); print_location(st, uc->R9);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
490 st->print("R10="); print_location(st, uc->R10);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
491 st->print("R11="); print_location(st, uc->R11);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
492 st->print("R12="); print_location(st, uc->R12);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
493 st->print("R13="); print_location(st, uc->R13);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
494 st->print("R14="); print_location(st, uc->R14);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
495 st->print("R15="); print_location(st, uc->R15);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
496 #else
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
497 st->print("EAX="); print_location(st, uc->Eax);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
498 st->print("EBX="); print_location(st, uc->Ebx);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
499 st->print("ECX="); print_location(st, uc->Ecx);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
500 st->print("EDX="); print_location(st, uc->Edx);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
501 st->print("ESP="); print_location(st, uc->Esp);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
502 st->print("EBP="); print_location(st, uc->Ebp);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
503 st->print("ESI="); print_location(st, uc->Esi);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
504 st->print("EDI="); print_location(st, uc->Edi);
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
505 #endif
1e9a9d2e6509 6970683: improvements to hs_err output
never
parents: 1748
diff changeset
506
0
a61af66fc99e Initial load
duke
parents:
diff changeset
507 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510 extern "C" int SafeFetch32 (int * adr, int Err) {
a61af66fc99e Initial load
duke
parents:
diff changeset
511 int rv = Err ;
a61af66fc99e Initial load
duke
parents:
diff changeset
512 _try {
a61af66fc99e Initial load
duke
parents:
diff changeset
513 rv = *((volatile int *) adr) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
514 } __except(EXCEPTION_EXECUTE_HANDLER) {
a61af66fc99e Initial load
duke
parents:
diff changeset
515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
516 return rv ;
a61af66fc99e Initial load
duke
parents:
diff changeset
517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 extern "C" intptr_t SafeFetchN (intptr_t * adr, intptr_t Err) {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 intptr_t rv = Err ;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 _try {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 rv = *((volatile intptr_t *) adr) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
523 } __except(EXCEPTION_EXECUTE_HANDLER) {
a61af66fc99e Initial load
duke
parents:
diff changeset
524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
525 return rv ;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 extern "C" int SpinPause () {
a61af66fc99e Initial load
duke
parents:
diff changeset
529 #ifdef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
530 return 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
531 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // pause == rep:nop
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // On systems that don't support pause a rep:nop
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // is executed as a nop. The rep: prefix is ignored.
a61af66fc99e Initial load
duke
parents:
diff changeset
535 _asm {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 pause ;
a61af66fc99e Initial load
duke
parents:
diff changeset
537 };
a61af66fc99e Initial load
duke
parents:
diff changeset
538 return 1 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
539 #endif // AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
540 }
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 void os::setup_fpu() {
a61af66fc99e Initial load
duke
parents:
diff changeset
544 #ifndef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
545 int fpu_cntrl_word = StubRoutines::fpu_cntrl_wrd_std();
a61af66fc99e Initial load
duke
parents:
diff changeset
546 __asm fldcw fpu_cntrl_word;
a61af66fc99e Initial load
duke
parents:
diff changeset
547 #endif // !AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
548 }