@@ -155,10 +155,16 @@ inline void FreezeBase::relativize_interpreted_frame_metadata(const frame& f, co
155155 // extended_sp is already relativized by TemplateInterpreterGenerator::generate_normal_entry or
156156 // AbstractInterpreter::layout_activation
157157
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+
158164 assert ((hf.fp () - hf.unextended_sp ()) == (f.fp () - f.unextended_sp ()), " " );
159165 assert (hf.unextended_sp () == (intptr_t *)hf.at (frame::interpreter_frame_last_sp_offset), " " );
160166 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), " " );
162168 assert (hf.fp () > (intptr_t *)hf.at (frame::interpreter_frame_initial_sp_offset), " " );
163169 assert (hf.fp () <= (intptr_t *)hf.at (frame::interpreter_frame_locals_offset), " " );
164170}
@@ -219,7 +225,6 @@ template<typename FKind> frame ThawBase::new_stack_frame(const frame& hf, frame&
219225 // If caller is interpreted it already made room for the callee arguments
220226 int overlap = caller.is_interpreted_frame () ? ContinuationHelper::InterpretedFrame::stack_argsize (hf) : 0 ;
221227 const int fsize = (int )(ContinuationHelper::InterpretedFrame::frame_bottom (hf) - hf.unextended_sp () - overlap);
222- const int locals = hf.interpreter_frame_method ()->max_locals ();
223228 intptr_t * frame_sp = caller.unextended_sp () - fsize;
224229 intptr_t * fp = frame_sp + (hf.fp () - heap_sp);
225230 if ((intptr_t )fp % frame::frame_alignment != 0 ) {
@@ -258,7 +263,7 @@ template<typename FKind> frame ThawBase::new_stack_frame(const frame& hf, frame&
258263 // we need to recreate a "real" frame pointer, pointing into the stack
259264 fp = frame_sp + FKind::size (hf) - frame::sender_sp_offset;
260265 } else {
261- fp = FKind::stub
266+ fp = FKind::stub || FKind::native
262267 ? frame_sp + fsize - frame::sender_sp_offset // fp always points to the address below the pushed return pc. We need correct address.
263268 : *(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.
264269 }
@@ -287,10 +292,32 @@ inline void ThawBase::patch_pd(frame& f, intptr_t* caller_sp) {
287292 Unimplemented ();
288293}
289294
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) {
291306 intptr_t * sp = top.sp ();
292307 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 ) {
294321 // C2 runtime stub case. For aarch64 the real size of the c2 runtime stub is 2 words bigger
295322 // than what we think, i.e. size is 4. This is because the _last_Java_sp is not set to the
296323 // 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
306333 }
307334
308335 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 ();
311338
312339 sp -= frame::metadata_words;
313340 *(address*)(sp - frame::sender_sp_ret_address_offset ()) = pc;
314341 *(intptr_t **)(sp - frame::sender_sp_offset) = fp;
315342
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));
318345 return sp;
319346}
320347
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) {
324349 frame enterSpecial = new_entry_frame ();
325350 intptr_t * sp = enterSpecial.sp ();
326351
@@ -329,15 +354,15 @@ inline intptr_t* ThawBase::push_preempt_monitorenter_redo(stackChunkOop chunk) {
329354 sp[1 ] = (intptr_t )StubRoutines::cont_returnBarrier ();
330355 sp[0 ] = (intptr_t )enterSpecial.fp ();
331356
332- // Now push the ObjectMonitor *
357+ // Now push the ObjectWaiter *
333358 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 ();
336361
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 ();
339364 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));
341366 return sp;
342367}
343368
@@ -349,7 +374,9 @@ inline void ThawBase::derelativize_interpreted_frame_metadata(const frame& hf, c
349374 assert (f.at_absolute (frame::interpreter_frame_monitor_block_top_offset) <= frame::interpreter_frame_initial_sp_offset, " " );
350375
351376 // 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, " " );
353380}
354381
355382#endif // CPU_AARCH64_CONTINUATIONFREEZETHAW_AARCH64_INLINE_HPP
0 commit comments