From c601c41fa276761331f452ff1872d6cfca9c232f Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Tue, 28 Jul 2020 14:56:51 +1000 Subject: [PATCH 1/3] Make harness_begin()/end() work --- jikesrvm/rvm/src/org/jikesrvm/VMExt.java | 14 +++++++++++++ .../src/org/jikesrvm/runtime/Entrypoints.java | 2 ++ mmtk/src/api.rs | 20 +++++++++++++++---- mmtk/src/lib.rs | 7 +++++++ repos/jikesrvm | 2 +- 5 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 jikesrvm/rvm/src/org/jikesrvm/VMExt.java diff --git a/jikesrvm/rvm/src/org/jikesrvm/VMExt.java b/jikesrvm/rvm/src/org/jikesrvm/VMExt.java new file mode 100644 index 00000000..ca0dbaf6 --- /dev/null +++ b/jikesrvm/rvm/src/org/jikesrvm/VMExt.java @@ -0,0 +1,14 @@ +package org.jikesrvm; + +import org.jikesrvm.scheduler.RVMThread; +import org.vmmagic.pragma.Entrypoint; + +public class VMExt { + @Entrypoint + public static int currentThreadSwitchTo(int newStatus) { + RVMThread cur = RVMThread.getCurrentThread(); + int old = cur.getExecStatus(); + cur.setExecStatus(newStatus); + return old; + } +} diff --git a/jikesrvm/rvm/src/org/jikesrvm/runtime/Entrypoints.java b/jikesrvm/rvm/src/org/jikesrvm/runtime/Entrypoints.java index 0e7d4489..acce686d 100644 --- a/jikesrvm/rvm/src/org/jikesrvm/runtime/Entrypoints.java +++ b/jikesrvm/rvm/src/org/jikesrvm/runtime/Entrypoints.java @@ -32,6 +32,8 @@ public class Entrypoints { "(Lorg/jikesrvm/scheduler/RVMThread;Lorg/vmmagic/unboxed/Address;ZZ)V"); public static final NormalMethod scanBootImageMethod = getMethod(org.jikesrvm.mm.mminterface.RustScanning.class, "scanBootImage", "(Lorg/vmmagic/unboxed/Address;)V"); + public static final NormalMethod currentThreadSwitchToMethod = + getMethod(org.jikesrvm.VMExt.class, "currentThreadSwitchTo", "(I)I"); // The usual causes for getField/Method() to fail are: // 1. you misspelled the class name, member name, or member signature diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index f8ba8c5b..5cb0f504 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -159,13 +159,25 @@ pub extern "C" fn add_phantom_candidate(reff: ObjectReference, referent: ObjectR } #[no_mangle] -pub extern "C" fn harness_begin(tls: OpaquePointer) { - memory_manager::harness_begin(&SINGLETON, tls) +pub extern "C" fn harness_begin(id: usize) { + unsafe { + let thread_from_id = VMCollection::thread_from_id(id); + let tls = OpaquePointer::from_address(thread_from_id); + let st = JikesRVM::currentThreadSwitchTo(tls, 1); // 1 = IN_JAVA + memory_manager::harness_begin(&SINGLETON, tls); + JikesRVM::currentThreadSwitchTo(tls, st); + } } #[no_mangle] -pub extern "C" fn harness_end(tls: OpaquePointer) { - memory_manager::harness_end(&SINGLETON) +pub extern "C" fn harness_end(id: usize) { + unsafe { + let thread_from_id = VMCollection::thread_from_id(id); + let tls = OpaquePointer::from_address(thread_from_id); + let st = JikesRVM::currentThreadSwitchTo(tls, 1); // 1 = IN_JAVA + memory_manager::harness_end(&SINGLETON); + JikesRVM::currentThreadSwitchTo(tls, st); + } } #[no_mangle] diff --git a/mmtk/src/lib.rs b/mmtk/src/lib.rs index d205ae75..a815d05a 100644 --- a/mmtk/src/lib.rs +++ b/mmtk/src/lib.rs @@ -8,6 +8,7 @@ extern crate lazy_static; extern crate log; use mmtk::util::address::Address; +use mmtk::util::OpaquePointer; use mmtk::TraceLocal; use mmtk::vm::VMBinding; use mmtk::MMTK; @@ -77,6 +78,12 @@ impl JikesRVM { jtoc_call!(TEST3_METHOD_OFFSET, BOOT_THREAD, input1, input2, input3, input4) } } + + pub fn currentThreadSwitchTo(tls: OpaquePointer, status: i32) -> i32 { + unsafe { + jtoc_call!(CURRENT_THREAD_SWITCH_TO_METHOD_OFFSET, tls, status) as i32 + } + } } lazy_static! { diff --git a/repos/jikesrvm b/repos/jikesrvm index 67dadebb..c4b7938d 160000 --- a/repos/jikesrvm +++ b/repos/jikesrvm @@ -1 +1 @@ -Subproject commit 67dadebb060ed48687dabf7e30805ee70a810686 +Subproject commit c4b7938d0d2cddd9ea5021941fd0a7eaa49dbf76 From 5044a1ccabf3072e183854326fcec83cfcd0c4d2 Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Tue, 28 Jul 2020 15:02:23 +1000 Subject: [PATCH 2/3] Rename --- mmtk/src/api.rs | 8 ++++---- mmtk/src/lib.rs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index 5cb0f504..bc6d3a91 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -163,9 +163,9 @@ pub extern "C" fn harness_begin(id: usize) { unsafe { let thread_from_id = VMCollection::thread_from_id(id); let tls = OpaquePointer::from_address(thread_from_id); - let st = JikesRVM::currentThreadSwitchTo(tls, 1); // 1 = IN_JAVA + let st = JikesRVM::current_thread_switch_to(tls, 1); // 1 = IN_JAVA memory_manager::harness_begin(&SINGLETON, tls); - JikesRVM::currentThreadSwitchTo(tls, st); + JikesRVM::current_thread_switch_to(tls, st); } } @@ -174,9 +174,9 @@ pub extern "C" fn harness_end(id: usize) { unsafe { let thread_from_id = VMCollection::thread_from_id(id); let tls = OpaquePointer::from_address(thread_from_id); - let st = JikesRVM::currentThreadSwitchTo(tls, 1); // 1 = IN_JAVA + let st = JikesRVM::current_thread_switch_to(tls, 1); // 1 = IN_JAVA memory_manager::harness_end(&SINGLETON); - JikesRVM::currentThreadSwitchTo(tls, st); + JikesRVM::current_thread_switch_to(tls, st); } } diff --git a/mmtk/src/lib.rs b/mmtk/src/lib.rs index a815d05a..f7837ecd 100644 --- a/mmtk/src/lib.rs +++ b/mmtk/src/lib.rs @@ -79,7 +79,7 @@ impl JikesRVM { } } - pub fn currentThreadSwitchTo(tls: OpaquePointer, status: i32) -> i32 { + pub fn current_thread_switch_to(tls: OpaquePointer, status: i32) -> i32 { unsafe { jtoc_call!(CURRENT_THREAD_SWITCH_TO_METHOD_OFFSET, tls, status) as i32 } From a079de1fe7c0c24ba4ff224fee40c5a7700a866f Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Tue, 28 Jul 2020 15:36:52 +1000 Subject: [PATCH 3/3] Use enter_vm/leave_vm (to be consistent with openjdk binding) --- jikesrvm/rvm/src/org/jikesrvm/VMExt.java | 10 ++++++++-- jikesrvm/rvm/src/org/jikesrvm/runtime/Entrypoints.java | 6 ++++-- mmtk/src/api.rs | 8 ++++---- mmtk/src/lib.rs | 10 ++++++++-- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/jikesrvm/rvm/src/org/jikesrvm/VMExt.java b/jikesrvm/rvm/src/org/jikesrvm/VMExt.java index ca0dbaf6..8de7ad5b 100644 --- a/jikesrvm/rvm/src/org/jikesrvm/VMExt.java +++ b/jikesrvm/rvm/src/org/jikesrvm/VMExt.java @@ -5,10 +5,16 @@ public class VMExt { @Entrypoint - public static int currentThreadSwitchTo(int newStatus) { + public static int enterVM() { RVMThread cur = RVMThread.getCurrentThread(); int old = cur.getExecStatus(); - cur.setExecStatus(newStatus); + cur.setExecStatus(RVMThread.IN_JAVA); return old; } + + @Entrypoint + public static void leaveVM(int status) { + RVMThread cur = RVMThread.getCurrentThread(); + cur.setExecStatus(status); + } } diff --git a/jikesrvm/rvm/src/org/jikesrvm/runtime/Entrypoints.java b/jikesrvm/rvm/src/org/jikesrvm/runtime/Entrypoints.java index acce686d..78fba419 100644 --- a/jikesrvm/rvm/src/org/jikesrvm/runtime/Entrypoints.java +++ b/jikesrvm/rvm/src/org/jikesrvm/runtime/Entrypoints.java @@ -32,8 +32,10 @@ public class Entrypoints { "(Lorg/jikesrvm/scheduler/RVMThread;Lorg/vmmagic/unboxed/Address;ZZ)V"); public static final NormalMethod scanBootImageMethod = getMethod(org.jikesrvm.mm.mminterface.RustScanning.class, "scanBootImage", "(Lorg/vmmagic/unboxed/Address;)V"); - public static final NormalMethod currentThreadSwitchToMethod = - getMethod(org.jikesrvm.VMExt.class, "currentThreadSwitchTo", "(I)I"); + public static final NormalMethod enterVMMethod = + getMethod(org.jikesrvm.VMExt.class, "enterVM", "()I"); + public static final NormalMethod leaveVMMethod = + getMethod(org.jikesrvm.VMExt.class, "leaveVM", "(I)V"); // The usual causes for getField/Method() to fail are: // 1. you misspelled the class name, member name, or member signature diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index bc6d3a91..1c236efb 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -163,9 +163,9 @@ pub extern "C" fn harness_begin(id: usize) { unsafe { let thread_from_id = VMCollection::thread_from_id(id); let tls = OpaquePointer::from_address(thread_from_id); - let st = JikesRVM::current_thread_switch_to(tls, 1); // 1 = IN_JAVA + let st = JikesRVM::enter_vm(tls); memory_manager::harness_begin(&SINGLETON, tls); - JikesRVM::current_thread_switch_to(tls, st); + JikesRVM::leave_vm(tls, st); } } @@ -174,9 +174,9 @@ pub extern "C" fn harness_end(id: usize) { unsafe { let thread_from_id = VMCollection::thread_from_id(id); let tls = OpaquePointer::from_address(thread_from_id); - let st = JikesRVM::current_thread_switch_to(tls, 1); // 1 = IN_JAVA + let st = JikesRVM::enter_vm(tls); memory_manager::harness_end(&SINGLETON); - JikesRVM::current_thread_switch_to(tls, st); + JikesRVM::leave_vm(tls, st); } } diff --git a/mmtk/src/lib.rs b/mmtk/src/lib.rs index f7837ecd..1ca45eb6 100644 --- a/mmtk/src/lib.rs +++ b/mmtk/src/lib.rs @@ -79,9 +79,15 @@ impl JikesRVM { } } - pub fn current_thread_switch_to(tls: OpaquePointer, status: i32) -> i32 { + pub fn enter_vm(tls: OpaquePointer) -> i32 { unsafe { - jtoc_call!(CURRENT_THREAD_SWITCH_TO_METHOD_OFFSET, tls, status) as i32 + jtoc_call!(ENTER_VM_METHOD_OFFSET, tls) as i32 + } + } + + pub fn leave_vm(tls: OpaquePointer, status: i32) { + unsafe { + jtoc_call!(LEAVE_VM_METHOD_OFFSET, tls, status); } } }