Index: vm/port/src/lil/em64t/pim/m2n_em64t.cpp =================================================================== --- vm/port/src/lil/em64t/pim/m2n_em64t.cpp (revision 589494) +++ vm/port/src/lil/em64t/pim/m2n_em64t.cpp (working copy) @@ -423,12 +423,11 @@ // returns pointer to the registers used for jvmti PopFrame Registers* get_pop_frame_registers(M2nFrame* m2nf) { - // Empty implementation - return NULL; + return m2nf->pop_regs; } // sets pointer to the registers used for jvmti PopFrame void set_pop_frame_registers(M2nFrame* m2nf, Registers* regs) { - // Empty implementation + m2nf->pop_regs = regs; } Index: vm/port/src/lil/em64t/pim/m2n_em64t_internal.h =================================================================== --- vm/port/src/lil/em64t/pim/m2n_em64t_internal.h (revision 589494) +++ vm/port/src/lil/em64t/pim/m2n_em64t_internal.h (working copy) @@ -59,6 +59,7 @@ ObjectHandles * local_object_handles; Method_Handle method; frame_type current_frame_type; + Registers* pop_regs; // This is only for M2nFrames for suspended managed code (as against ones that call stubs and prepare jvmtiPopFrame) uint64 rbx; uint64 rbp; #ifdef _WIN64 Index: vm/vmcore/src/jvmti/jvmti_pop_frame.cpp =================================================================== --- vm/vmcore/src/jvmti/jvmti_pop_frame.cpp (revision 589494) +++ vm/vmcore/src/jvmti/jvmti_pop_frame.cpp (working copy) @@ -138,22 +138,8 @@ assert(0); } -#elif defined _EM64T_ +#else // _IA32_ & _EM64T_ -void jvmti_jit_prepare_pop_frame(){ - assert(0); -} - -void jvmti_jit_complete_pop_frame(){ - assert(0); -} - -void jvmti_jit_do_pop_frame(){ - assert(0); -} - -#else // _IA32_ - // requires stack iterator and buffer to save intermediate information static void jvmti_jit_prepare_pop_frame(StackIterator* si, uint32* buf) { TRACE(("Prepare PopFrame for JIT")); @@ -191,11 +177,25 @@ // find correct ip and restore required registers context NativeCodePtr current_method_addr = NULL; + //CodeChunkInfo *cci = si_get_code_chunk_info(si); + //Method *method = cci->get_method(); NativeCodePtr ip = si_get_ip(si); + JIT *jit = cci->get_jit(); + TRACE(("PopFrame method %s.%s%s, set IP begin: %p", class_get_name(method_get_class(si_get_code_chunk_info(si)->get_method())), method_get_name(si_get_code_chunk_info(si)->get_method()), method_get_descriptor(si_get_code_chunk_info(si)->get_method()), ip )); + + uint16 bcOffset; + NativeCodePtr bcip; + jit->get_bc_location_for_native(method, (NativeCodePtr)((POINTER_SIZE_INT)ip - 1), &bcOffset); + jit->get_native_location_for_bc(method, bcOffset, &bcip); + si_set_ip(si, bcip, false); + jit->fix_handler_context(method, si_get_jit_context(si)); + + +/* size_t ip_reduce; // invoke static @@ -237,11 +237,13 @@ // set correct ip ip = (NativeCodePtr)(((char*)ip) - ip_reduce); + si_set_ip(si, ip, false); +*/ + TRACE(("PopFrame method %s.%s%s, set IP end: %p", class_get_name(method_get_class(si_get_code_chunk_info(si)->get_method())), method_get_name(si_get_code_chunk_info(si)->get_method()), method_get_descriptor(si_get_code_chunk_info(si)->get_method()), ip )); - si_set_ip(si, ip, false); } void jvmti_jit_prepare_pop_frame() { @@ -263,39 +265,9 @@ jvmti_jit_prepare_pop_frame(si, &buf); // save regs value from jit context to m2n - JitFrameContext* jitContext = si_get_jit_context(si); Registers* regs = get_pop_frame_registers(top_frame); + si_copy_to_registers(si, regs); - regs->esp = jitContext->esp; - regs->eip = *(jitContext->p_eip); - regs->esi = *(jitContext->p_esi); - regs->edi = *(jitContext->p_edi); - regs->ebp = *(jitContext->p_ebp); - - if (0 == jitContext->p_eax) { - regs->eax = 0; - } else { - regs->eax = *(jitContext->p_eax); - } - - if (0 == jitContext->p_ebx) { - regs->ebx = 0; - } else { - regs->ebx = *(jitContext->p_ebx); - } - - if (0 == jitContext->p_ecx) { - regs->ecx = 0; - } else { - regs->ecx = *(jitContext->p_ecx); - } - - if (0 == jitContext->p_edx) { - regs->edx = 0; - } else { - regs->edx = *(jitContext->p_edx); - } - // set pop done frame state m2n_set_frame_type(top_frame, frame_type(FRAME_POP_DONE | FRAME_MODIFIED_STACK)); return; Index: vm/vmcore/src/jvmti/jvmti_capability.cpp =================================================================== --- vm/vmcore/src/jvmti/jvmti_capability.cpp (revision 589494) +++ vm/vmcore/src/jvmti/jvmti_capability.cpp (working copy) @@ -79,7 +79,7 @@ 1, // can_get_owned_monitor_info 1, // can_get_current_contended_monitor 1, // can_get_monitor_info - 0, // can_pop_frame + 1, // can_pop_frame 0, // can_redefine_classes 1, // can_signal_thread 1, // can_get_source_file_name