@@ -1348,6 +1348,8 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
1348
1348
// result handler is in r0
1349
1349
// set result handler
1350
1350
__ mov (result_handler, r0);
1351
+ __ str (r0, Address (rfp, frame::interpreter_frame_result_handler_offset * wordSize));
1352
+
1351
1353
// pass mirror handle if static call
1352
1354
{
1353
1355
Label L;
@@ -1383,9 +1385,10 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
1383
1385
// pass JNIEnv
1384
1386
__ add (c_rarg0, rthread, in_bytes (JavaThread::jni_environment_offset ()));
1385
1387
1386
- // Set the last Java PC in the frame anchor to be the return address from
1387
- // the call to the native method: this will allow the debugger to
1388
- // generate an accurate stack trace.
1388
+ // It is enough that the pc() points into the right code
1389
+ // segment. It does not have to be the correct return pc.
1390
+ // For convenience we use the pc we want to resume to in
1391
+ // case of preemption on Object.wait.
1389
1392
Label native_return;
1390
1393
__ set_last_Java_frame (esp, rfp, native_return, rscratch1);
1391
1394
@@ -1406,9 +1409,13 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
1406
1409
__ lea (rscratch2, Address (rthread, JavaThread::thread_state_offset ()));
1407
1410
__ stlrw (rscratch1, rscratch2);
1408
1411
1412
+ __ push_cont_fastpath ();
1413
+
1409
1414
// Call the native method.
1410
1415
__ blr (r10);
1411
- __ bind (native_return);
1416
+
1417
+ __ pop_cont_fastpath ();
1418
+
1412
1419
__ get_method (rmethod);
1413
1420
// result potentially in r0 or v0
1414
1421
@@ -1466,6 +1473,21 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
1466
1473
__ lea (rscratch2, Address (rthread, JavaThread::thread_state_offset ()));
1467
1474
__ stlrw (rscratch1, rscratch2);
1468
1475
1476
+ if (LockingMode != LM_LEGACY) {
1477
+ // Check preemption for Object.wait()
1478
+ Label not_preempted;
1479
+ __ ldr (rscratch1, Address (rthread, JavaThread::preempt_alternate_return_offset ()));
1480
+ __ cbz (rscratch1, not_preempted);
1481
+ __ str (zr, Address (rthread, JavaThread::preempt_alternate_return_offset ()));
1482
+ __ br (rscratch1);
1483
+ __ bind (native_return);
1484
+ __ restore_after_resume (true /* is_native */ );
1485
+ __ bind (not_preempted);
1486
+ } else {
1487
+ // any pc will do so just use this one for LM_LEGACY to keep code together.
1488
+ __ bind (native_return);
1489
+ }
1490
+
1469
1491
// reset_last_Java_frame
1470
1492
__ reset_last_Java_frame (true );
1471
1493
@@ -1484,6 +1506,7 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
1484
1506
{
1485
1507
Label no_oop;
1486
1508
__ adr (t, ExternalAddress (AbstractInterpreter::result_handler (T_OBJECT)));
1509
+ __ ldr (result_handler, Address (rfp, frame::interpreter_frame_result_handler_offset*wordSize));
1487
1510
__ cmp (t, result_handler);
1488
1511
__ br (Assembler::NE, no_oop);
1489
1512
// Unbox oop result, e.g. JNIHandles::resolve result.
0 commit comments