diff a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp
--- a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp
+++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp
@@ -113,11 +113,17 @@
   inline int offset_to_method_toc(const address addr);
 
   // Global TOC.
   void calculate_address_from_global_toc(Register dst, address addr,
                                          bool hi16 = true, bool lo16 = true,
-                                         bool add_relocation = true, bool emit_dummy_addr = false);
+                                         bool add_relocation = true, bool emit_dummy_addr = false,
+                                         bool add_addr_to_reloc = true);
+  void calculate_address_from_global_toc(Register dst, Label& addr,
+                                         bool hi16 = true, bool lo16 = true,
+                                         bool add_relocation = true, bool emit_dummy_addr = false) {
+    calculate_address_from_global_toc(dst, target(addr), hi16, lo16, add_relocation, emit_dummy_addr, false);
+  }
   inline void calculate_address_from_global_toc_hi16only(Register dst, address addr) {
     calculate_address_from_global_toc(dst, addr, true, false);
   };
   inline void calculate_address_from_global_toc_lo16only(Register dst, address addr) {
     calculate_address_from_global_toc(dst, addr, false, true);
@@ -282,11 +288,14 @@
   // some ABI-related functions
 
   // Clobbers all volatile, (non-floating-point) general-purpose registers for debugging purposes.
   // This is especially useful for making calls to the JRT in places in which this hasn't been done before;
   // e.g. with the introduction of LRBs (load reference barriers) for concurrent garbage collection.
-  void clobber_volatile_gprs(Register excluded_register = noreg);
+  void clobber_volatile_gprs(Register excluded_register = noreg) NOT_DEBUG_RETURN;
+  // Load bad values into registers that are nonvolatile according to the ABI except R16_thread and R29_TOC.
+  // This is done after vthread preemption and before vthread resume.
+  void clobber_nonvolatile_registers() NOT_DEBUG_RETURN;
   void clobber_carg_stack_slots(Register tmp);
 
   void save_nonvolatile_gprs(   Register dst_base, int offset);
   void restore_nonvolatile_gprs(Register src_base, int offset);
 
@@ -396,11 +405,12 @@
     // to set up last_Java_frame in stubs; use noreg otherwise
     Register        last_java_sp,
     // the entry point
     address         entry_point,
     // flag which indicates if exception should be checked
-    bool            check_exception = true
+    bool            check_exception = true,
+    Label* last_java_pc = nullptr
   );
 
   // Support for VM calls. This is the base routine called by the
   // different versions of call_VM_leaf. The interpreter may customize
   // this version by overriding it for its purposes (e.g., to
@@ -409,11 +419,11 @@
 
  public:
   // Call into the VM.
   // Passes the thread pointer (in R3_ARG1) as a prepended argument.
   // Makes sure oop return values are visible to the GC.
-  void call_VM(Register oop_result, address entry_point, bool check_exceptions = true);
+  void call_VM(Register oop_result, address entry_point, bool check_exceptions = true, Label* last_java_pc = nullptr);
   void call_VM(Register oop_result, address entry_point, Register arg_1, bool check_exceptions = true);
   void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true);
   void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg3, bool check_exceptions = true);
   void call_VM_leaf(address entry_point);
   void call_VM_leaf(address entry_point, Register arg_1);
@@ -693,12 +703,12 @@
   // thread-local information).
 
   // Support for last Java frame (but use call_VM instead where possible):
   // access R16_thread->last_Java_sp.
   void set_last_Java_frame(Register last_java_sp, Register last_Java_pc);
-  void reset_last_Java_frame(void);
-  void set_top_ijava_frame_at_SP_as_last_Java_frame(Register sp, Register tmp1);
+  void reset_last_Java_frame(bool check_last_java_sp = true);
+  void set_top_ijava_frame_at_SP_as_last_Java_frame(Register sp, Register tmp1, Label* jpc = nullptr);
 
   // Read vm result from thread: oop_result = R16_thread->result;
   void get_vm_result  (Register oop_result);
   void get_vm_result_2(Register metadata_result);
 
@@ -907,11 +917,11 @@
   void asm_assert_eq(const char* msg) { asm_assert(true, msg); }
   void asm_assert_ne(const char* msg) { asm_assert(false, msg); }
 
  private:
   void asm_assert_mems_zero(bool check_equal, int size, int mem_offset, Register mem_base,
-                            const char* msg);
+                            const char* msg) NOT_DEBUG_RETURN;
 
  public:
 
   void asm_assert_mem8_is_zero(int mem_offset, Register mem_base, const char* msg) {
     asm_assert_mems_zero(true,  8, mem_offset, mem_base, msg);
