@@ -155,10 +155,16 @@ inline void FreezeBase::relativize_interpreted_frame_metadata(const frame& f, co
155
155
// extended_sp is already relativized by TemplateInterpreterGenerator::generate_normal_entry or
156
156
// AbstractInterpreter::layout_activation
157
157
158
+ // The interpreter native wrapper code adds space in the stack equal to size_of_parameters()
159
+ // after the fixed part of the frame. For wait0 this is equal to 3 words (this + long parameter).
160
+ // We adjust by this size since otherwise the saved last sp will be less than the extended_sp.
161
+ DEBUG_ONLY (Method* m = hf.interpreter_frame_method ();)
162
+ DEBUG_ONLY (int extra_space = m->is_object_wait0 () ? m->size_of_parameters () : 0 ;)
163
+
158
164
assert ((hf.fp () - hf.unextended_sp ()) == (f.fp () - f.unextended_sp ()), " " );
159
165
assert (hf.unextended_sp () == (intptr_t *)hf.at (frame::interpreter_frame_last_sp_offset), " " );
160
166
assert (hf.unextended_sp () <= (intptr_t *)hf.at (frame::interpreter_frame_initial_sp_offset), " " );
161
- assert (hf.unextended_sp () > (intptr_t *)hf.at (frame::interpreter_frame_extended_sp_offset), " " );
167
+ assert (hf.unextended_sp () + extra_space > (intptr_t *)hf.at (frame::interpreter_frame_extended_sp_offset), " " );
162
168
assert (hf.fp () > (intptr_t *)hf.at (frame::interpreter_frame_initial_sp_offset), " " );
163
169
assert (hf.fp () <= (intptr_t *)hf.at (frame::interpreter_frame_locals_offset), " " );
164
170
}
@@ -219,7 +225,6 @@ template<typename FKind> frame ThawBase::new_stack_frame(const frame& hf, frame&
219
225
// If caller is interpreted it already made room for the callee arguments
220
226
int overlap = caller.is_interpreted_frame () ? ContinuationHelper::InterpretedFrame::stack_argsize (hf) : 0 ;
221
227
const int fsize = (int )(ContinuationHelper::InterpretedFrame::frame_bottom (hf) - hf.unextended_sp () - overlap);
222
- const int locals = hf.interpreter_frame_method ()->max_locals ();
223
228
intptr_t * frame_sp = caller.unextended_sp () - fsize;
224
229
intptr_t * fp = frame_sp + (hf.fp () - heap_sp);
225
230
if ((intptr_t )fp % frame::frame_alignment != 0 ) {
@@ -258,7 +263,7 @@ template<typename FKind> frame ThawBase::new_stack_frame(const frame& hf, frame&
258
263
// we need to recreate a "real" frame pointer, pointing into the stack
259
264
fp = frame_sp + FKind::size (hf) - frame::sender_sp_offset;
260
265
} else {
261
- fp = FKind::stub
266
+ fp = FKind::stub || FKind::native
262
267
? frame_sp + fsize - frame::sender_sp_offset // fp always points to the address below the pushed return pc. We need correct address.
263
268
: *(intptr_t **)(hf.sp () - frame::sender_sp_offset); // we need to re-read fp because it may be an oop and we might have fixed the frame.
264
269
}
@@ -287,10 +292,32 @@ inline void ThawBase::patch_pd(frame& f, intptr_t* caller_sp) {
287
292
Unimplemented ();
288
293
}
289
294
290
- inline intptr_t * ThawBase::push_preempt_rerun_adapter (frame top, bool is_interpreted_frame) {
295
+ inline void ThawBase::fix_native_return_pc_pd (frame& top) {
296
+ // Nothing to do since the last pc saved before making the call to
297
+ // JVM_MonitorWait() was already set to the correct resume pc. Just
298
+ // do some sanity check.
299
+ #ifdef ASSERT
300
+ Method* method = top.is_interpreted_frame () ? top.interpreter_frame_method () : CodeCache::find_blob (top.pc ())->as_nmethod ()->method ();
301
+ assert (method->is_object_wait0 (), " " );
302
+ #endif
303
+ }
304
+
305
+ inline intptr_t * ThawBase::push_resume_adapter (frame& top) {
291
306
intptr_t * sp = top.sp ();
292
307
CodeBlob* cb = top.cb ();
293
- if (!is_interpreted_frame && cb->frame_size () == 2 ) {
308
+
309
+ #ifdef ASSERT
310
+ RegisterMap map (JavaThread::current (),
311
+ RegisterMap::UpdateMap::skip,
312
+ RegisterMap::ProcessFrames::skip,
313
+ RegisterMap::WalkContinuation::skip);
314
+ frame caller = top.sender (&map);
315
+ intptr_t link_addr = (intptr_t )ContinuationHelper::Frame::callee_link_address (caller);
316
+ assert (sp[-2 ] == link_addr, " wrong link address: " INTPTR_FORMAT " != " INTPTR_FORMAT, sp[-2 ], link_addr);
317
+ #endif
318
+
319
+ bool interpreted = top.is_interpreted_frame ();
320
+ if (!interpreted && cb->frame_size () == 2 ) {
294
321
// C2 runtime stub case. For aarch64 the real size of the c2 runtime stub is 2 words bigger
295
322
// than what we think, i.e. size is 4. This is because the _last_Java_sp is not set to the
296
323
// sp right before making the call to the VM, but rather it is artificially set 2 words above
@@ -306,21 +333,19 @@ inline intptr_t* ThawBase::push_preempt_rerun_adapter(frame top, bool is_interpr
306
333
}
307
334
308
335
intptr_t * fp = sp - frame::sender_sp_offset;
309
- address pc = is_interpreted_frame ? Interpreter::cont_preempt_rerun_interpreter_adapter ()
310
- : StubRoutines::cont_preempt_rerun_compiler_adapter ();
336
+ address pc = interpreted ? Interpreter::cont_resume_interpreter_adapter ()
337
+ : StubRoutines::cont_resume_compiler_adapter ();
311
338
312
339
sp -= frame::metadata_words;
313
340
*(address*)(sp - frame::sender_sp_ret_address_offset ()) = pc;
314
341
*(intptr_t **)(sp - frame::sender_sp_offset) = fp;
315
342
316
- log_develop_trace (continuations, preempt)(" push_preempt_rerun_ %s_adapter() initial sp: " INTPTR_FORMAT " final sp: " INTPTR_FORMAT " fp: " INTPTR_FORMAT,
317
- is_interpreted_frame ? " interpreter" : " safepointblob " , p2i (sp + frame::metadata_words), p2i (sp), p2i (fp));
343
+ log_develop_trace (continuations, preempt)(" push_resume_ %s_adapter() initial sp: " INTPTR_FORMAT " final sp: " INTPTR_FORMAT " fp: " INTPTR_FORMAT,
344
+ interpreted ? " interpreter" : " compiler " , p2i (sp + frame::metadata_words), p2i (sp), p2i (fp));
318
345
return sp;
319
346
}
320
347
321
- inline intptr_t * ThawBase::push_preempt_monitorenter_redo (stackChunkOop chunk) {
322
-
323
- // fprintf(stderr, "push_preempt_monitorenter_redo\n");
348
+ inline intptr_t * ThawBase::push_resume_monitor_operation (stackChunkOop chunk) {
324
349
frame enterSpecial = new_entry_frame ();
325
350
intptr_t * sp = enterSpecial.sp ();
326
351
@@ -329,15 +354,15 @@ inline intptr_t* ThawBase::push_preempt_monitorenter_redo(stackChunkOop chunk) {
329
354
sp[1 ] = (intptr_t )StubRoutines::cont_returnBarrier ();
330
355
sp[0 ] = (intptr_t )enterSpecial.fp ();
331
356
332
- // Now push the ObjectMonitor *
357
+ // Now push the ObjectWaiter *
333
358
sp -= frame::metadata_words;
334
- sp[1 ] = (intptr_t )chunk->objectMonitor (); // alignment
335
- sp[0 ] = (intptr_t )chunk->objectMonitor ();
359
+ sp[1 ] = (intptr_t )chunk->object_waiter (); // alignment
360
+ sp[0 ] = (intptr_t )chunk->object_waiter ();
336
361
337
- // Finally arrange to return to the monitorenter_redo stub
338
- sp[-1 ] = (intptr_t )StubRoutines::cont_preempt_monitorenter_redo ();
362
+ // Finally arrange to return to the resume_monitor_operation stub
363
+ sp[-1 ] = (intptr_t )StubRoutines::cont_resume_monitor_operation ();
339
364
sp[-2 ] = (intptr_t )enterSpecial.fp ();
340
- log_develop_trace (continuations, preempt)(" push_preempt_monitorenter_redo initial sp: " INTPTR_FORMAT " final sp: " INTPTR_FORMAT, p2i (sp + 2 * frame::metadata_words), p2i (sp));
365
+ log_develop_trace (continuations, preempt)(" push_resume_monitor_operation initial sp: " INTPTR_FORMAT " final sp: " INTPTR_FORMAT, p2i (sp + 2 * frame::metadata_words), p2i (sp));
341
366
return sp;
342
367
}
343
368
@@ -349,7 +374,9 @@ inline void ThawBase::derelativize_interpreted_frame_metadata(const frame& hf, c
349
374
assert (f.at_absolute (frame::interpreter_frame_monitor_block_top_offset) <= frame::interpreter_frame_initial_sp_offset, " " );
350
375
351
376
// Make sure that extended_sp is kept relativized.
352
- assert ((intptr_t *)f.at_relative (frame::interpreter_frame_extended_sp_offset) < f.unextended_sp (), " " );
377
+ DEBUG_ONLY (Method* m = hf.interpreter_frame_method ();)
378
+ DEBUG_ONLY (int extra_space = m->is_object_wait0 () ? m->size_of_parameters () : 0 ;) // see comment in relativize_interpreted_frame_metadata()
379
+ assert ((intptr_t *)f.at_relative (frame::interpreter_frame_extended_sp_offset) < f.unextended_sp () + extra_space, " " );
353
380
}
354
381
355
382
#endif // CPU_AARCH64_CONTINUATIONFREEZETHAW_AARCH64_INLINE_HPP
0 commit comments