@@ -3413,16 +3413,78 @@ int SpinPause() {
34133413}
34143414
34153415#if INCLUDE_JFR
3416+
3417+ // For c2: c_rarg0 is junk, call to runtime to write a checkpoint.
3418+ // It returns a jobject handle to the event writer.
3419+ // The handle is dereferenced and the return value is the event writer oop.
34163420RuntimeStub* SharedRuntime::generate_jfr_write_checkpoint () {
3417- if (!Continuations::enabled ()) return nullptr ;
3418- Unimplemented ();
3419- return nullptr ;
3421+ const char * name = SharedRuntime::stub_name (SharedStubId::jfr_write_checkpoint_id);
3422+ CodeBuffer code (name, 512 , 64 );
3423+ MacroAssembler* masm = new MacroAssembler (&code);
3424+
3425+ int framesize = frame::z_abi_160_size / VMRegImpl::stack_slot_size;
3426+ address start = __ pc ();
3427+ __ save_return_pc (); // save return_pc (Z_R14)
3428+ __ push_frame_abi160 (0 );
3429+ int frame_complete = __ pc () - start;
3430+ __ set_last_Java_frame (Z_SP, noreg);
3431+
3432+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, JfrIntrinsicSupport::write_checkpoint), Z_thread);
3433+ address calls_return_pc = __ last_calls_return_pc ();
3434+
3435+ __ reset_last_Java_frame ();
3436+
3437+ // The handle is dereferenced through a load barrier.
3438+ __ stop (" fuck it" );
3439+ __ resolve_global_jobject (Z_ARG1, Z_tmp_1, Z_tmp_2); // Z_R10 & Z_R11, are these live ?
3440+ __ pop_frame ();
3441+ __ restore_return_pc ();
3442+ __ z_br (Z_R14);
3443+
3444+ OopMapSet* oop_maps = new OopMapSet ();
3445+ OopMap* map = new OopMap (framesize, 0 );
3446+ oop_maps->add_gc_map (calls_return_pc - start, map);
3447+
3448+ RuntimeStub* stub = // codeBlob framesize is in words (not VMRegImpl::slot_size)
3449+ RuntimeStub::new_runtime_stub (name, &code, frame_complete,
3450+ (framesize >> (LogBytesPerWord - LogBytesPerInt)),
3451+ oop_maps, false );
3452+
3453+ return stub;
34203454}
34213455
3456+ // For c2: call to return a leased buffer.
34223457RuntimeStub* SharedRuntime::generate_jfr_return_lease () {
3423- if (!Continuations::enabled ()) return nullptr ;
3424- Unimplemented ();
3425- return nullptr ;
3458+ const char * name = SharedRuntime::stub_name (SharedStubId::jfr_return_lease_id);
3459+ CodeBuffer code (name, 512 , 64 );
3460+ MacroAssembler* masm = new MacroAssembler (&code);
3461+
3462+ int framesize = frame::z_abi_160_size / VMRegImpl::stack_slot_size;
3463+ address start = __ pc ();
3464+ __ save_return_pc (); // save return_pc (Z_R14)
3465+ __ push_frame_abi160 (0 );
3466+ int frame_complete = __ pc () - start;
3467+ __ set_last_Java_frame (Z_SP, noreg);
3468+ __ stop (" crahs here" );
3469+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, JfrIntrinsicSupport::return_lease), Z_thread);
3470+ address calls_return_pc = __ last_calls_return_pc ();
3471+
3472+ __ reset_last_Java_frame ();
3473+
3474+ __ pop_frame ();
3475+ __ restore_return_pc ();
3476+ __ z_br (Z_R14);
3477+
3478+ OopMapSet* oop_maps = new OopMapSet ();
3479+ OopMap* map = new OopMap (framesize, 0 );
3480+ oop_maps->add_gc_map (calls_return_pc - start, map);
3481+
3482+ RuntimeStub* stub = // codeBlob framesize is in words (not VMRegImpl::slot_size)
3483+ RuntimeStub::new_runtime_stub (name, &code, frame_complete,
3484+ (framesize >> (LogBytesPerWord - LogBytesPerInt)),
3485+ oop_maps, false );
3486+
3487+ return stub;
34263488}
34273489
34283490#endif // INCLUDE_JFR
0 commit comments