Consolidate curFrame fields in thread storage

We ended up with two locations in the Thread structure for saved
Dalvik frame pointer.  This change consolidates them.

Change-Id: I78f288e4e57e232f29663be930101e775bfe370f
diff --git a/vm/mterp/Mterp.cpp b/vm/mterp/Mterp.cpp
index 7172434..d8ba97d 100644
--- a/vm/mterp/Mterp.cpp
+++ b/vm/mterp/Mterp.cpp
@@ -86,7 +86,7 @@
         free(desc);
     }
     //LOGI("self is %p, pc=%p, fp=%p\n", self, self->interpSave.pc,
-    //      self->interpSave.fp);
+    //      self->interpSave.curFrame);
     //LOGI("first instruction is 0x%04x\n", self->interpSave.pc[0]);
 
     /*
diff --git a/vm/mterp/armv5te/footer.S b/vm/mterp/armv5te/footer.S
index b262b1e..7a8ed04 100644
--- a/vm/mterp/armv5te/footer.S
+++ b/vm/mterp/armv5te/footer.S
@@ -641,7 +641,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     cmp     r0,#0
     bne     common_updateProfile
     GOTO_OPCODE(ip)                         @ jump to next instruction
@@ -649,7 +649,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     GOTO_OPCODE(ip)                         @ jump to next instruction
 #endif
 
@@ -657,7 +657,6 @@
     @ Profiling - record method entry.  r0: methodToCall
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r1, r0
     mov     r0, rSELF
     bl      dvmReportInvoke             @ (self, method)
@@ -669,7 +668,7 @@
     @ r0=methodToCall, r1=newFp, r10=newSaveArea
     ldrb    lr, [rSELF, #offThread_subMode]
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
     mov     r2, r0                      @ r2<- methodToCall
     mov     r0, r1                      @ r0<- newFp (points to args)
@@ -697,7 +696,7 @@
     @ equivalent to dvmPopJniLocals
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     bne     common_exceptionThrown      @ no, handle exception
@@ -709,11 +708,10 @@
 11:
     @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
     stmfd   sp!, {r0-r3}                @ save all but subModes
-    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPreNativeInvoke    @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
     ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
 
     @ Call the native method
@@ -724,10 +722,10 @@
     ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
 
     @ Finish up any post-invoke subMode requirements
-    @ interpSave already up-to-date
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPostNativeInvoke   @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
     b       7b                          @ resume
 
 .LstackOverflow:    @ r0=methodToCall
@@ -800,7 +798,7 @@
     PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
 #if defined(WITH_JIT)
     ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
     mov     rPC, r9                     @ publish new rPC
@@ -822,7 +820,7 @@
     @ On entry, r0: StackSaveArea
     ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     r1, [rSELF, #offThread_fp]   @ update interpSave.fp
+    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
     mov     r0, rSELF
     bl      dvmReportReturn             @ (self)
     SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
@@ -905,7 +903,7 @@
     add     sp, sp, #8                  @ restore stack
     bmi     .LnotCaughtLocally
 
-    /* adjust locals to match self->curFrame and updated PC */
+    /* adjust locals to match self->interpSave.curFrame and updated PC */
     SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
     ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
     str     r1, [rSELF, #offThread_method]  @ self->method = new method
@@ -931,7 +929,7 @@
     @ Manage debugger bookkeeping
 7:
     str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp]     @ update interpSave.fp
+    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
     mov     r0, rSELF                       @ arg0<- self
     mov     r1, r9                          @ arg1<- exception
     bl      dvmReportExceptionThrow         @ (self, exception)
diff --git a/vm/mterp/armv5te/header.S b/vm/mterp/armv5te/header.S
index ad45eb7..b3c8f0a 100644
--- a/vm/mterp/armv5te/header.S
+++ b/vm/mterp/armv5te/header.S
@@ -75,8 +75,8 @@
 /* save/restore the PC and/or FP from the thread struct */
 #define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
 #define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
-#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_fp]
-#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_fp]
+#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
+#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
 #define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
 #define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
 
diff --git a/vm/mterp/c/gotoTargets.cpp b/vm/mterp/c/gotoTargets.cpp
index cd12229..c615cba 100644
--- a/vm/mterp/c/gotoTargets.cpp
+++ b/vm/mterp/c/gotoTargets.cpp
@@ -629,7 +629,7 @@
         }
 
         /* update thread FP, and reset local variables */
-        self->curFrame = fp;
+        self->interpSave.curFrame = fp;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -766,10 +766,10 @@
 #endif
 
         /*
-         * Adjust local variables to match self->curFrame and the
+         * Adjust local variables to match self->interpSave.curFrame and the
          * updated PC.
          */
-        //fp = (u4*) self->curFrame;
+        //fp = (u4*) self->interpSave.curFrame;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -948,7 +948,7 @@
              * calls.  For native calls, we'll mark EXIT on return.
              * For non-native calls, EXIT is marked in the RETURN op.
              */
-            PC_FP_TO_SELF();
+            PC_TO_SELF();
             dvmReportInvoke(self, methodToCall);
         }
 
@@ -961,7 +961,7 @@
             self->interpSave.method = curMethod;
             methodClassDex = curMethod->clazz->pDvmDex;
             pc = methodToCall->insns;
-            self->curFrame = fp = newFp;
+            self->interpSave.curFrame = fp = newFp;
 #ifdef EASY_GDB
             debugSaveArea = SAVEAREA_FROM_FP(newFp);
 #endif
@@ -974,13 +974,12 @@
             /* set this up for JNI locals, even if not a JNI native */
             newSaveArea->xtra.localRefCookie = self->jniLocalRefTable.segmentState.all;
 
-            self->curFrame = newFp;
+            self->interpSave.curFrame = newFp;
 
             DUMP_REGS(methodToCall, newFp, true);   // show input args
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPreNativeInvoke(methodToCall, self);
+                dvmReportPreNativeInvoke(methodToCall, self, fp);
             }
 
             ILOGD("> native <-- %s.%s %s", methodToCall->clazz->descriptor,
@@ -994,13 +993,12 @@
             (*methodToCall->nativeFunc)(newFp, &retval, methodToCall, self);
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPostNativeInvoke(methodToCall, self);
+                dvmReportPostNativeInvoke(methodToCall, self, fp);
             }
 
             /* pop frame off */
             dvmPopJniLocals(self, newSaveArea);
-            self->curFrame = fp;
+            self->interpSave.curFrame = fp;
 
             /*
              * If the native code threw an exception, or interpreted code
diff --git a/vm/mterp/common/asm-constants.h b/vm/mterp/common/asm-constants.h
index 048dcbe..5b9b006 100644
--- a/vm/mterp/common/asm-constants.h
+++ b/vm/mterp/common/asm-constants.h
@@ -155,7 +155,7 @@
 
 /* Thread fields */
 MTERP_OFFSET(offThread_pc,                Thread, interpSave.pc, 0)
-MTERP_OFFSET(offThread_fp,                Thread, interpSave.fp, 4)
+MTERP_OFFSET(offThread_curFrame,          Thread, interpSave.curFrame, 4)
 MTERP_OFFSET(offThread_method,            Thread, interpSave.method, 8)
 MTERP_OFFSET(offThread_methodClassDex,    Thread, interpSave.methodClassDex, 12)
 MTERP_OFFSET(offThread_bailPtr,           Thread, interpSave.bailPtr, 16)
@@ -168,25 +168,23 @@
 MTERP_OFFSET(offThread_retval_j,          Thread, retval.j, 32)
 MTERP_OFFSET(offThread_retval_l,          Thread, retval.l, 32)
 //40
-MTERP_OFFSET(offThread_cardTable,         Thread, cardTable, 40)
-MTERP_OFFSET(offThread_interpStackEnd,    Thread, interpStackEnd, 44)
-MTERP_OFFSET(offThread_curFrame,          Thread, curFrame, 48)
-MTERP_OFFSET(offThread_exception,         Thread, exception, 52)
-MTERP_OFFSET(offThread_debugIsMethodEntry, Thread, debugIsMethodEntry, 56)
-MTERP_OFFSET(offThread_interpStackSize,   Thread, interpStackSize, 60)
-MTERP_OFFSET(offThread_stackOverflowed,   Thread, stackOverflowed, 64)
 MTERP_OFFSET(offThread_breakFlags, \
-                               Thread, interpBreak.ctl.breakFlags, 72)
+                               Thread, interpBreak.ctl.breakFlags, 40)
 MTERP_OFFSET(offThread_subMode, \
-                               Thread, interpBreak.ctl.subMode, 73)
+                               Thread, interpBreak.ctl.subMode, 41)
 MTERP_OFFSET(offThread_suspendCount, \
-                               Thread, interpBreak.ctl.suspendCount, 74)
+                               Thread, interpBreak.ctl.suspendCount, 42)
 MTERP_OFFSET(offThread_dbgSuspendCount, \
-                               Thread, interpBreak.ctl.dbgSuspendCount, 75)
+                               Thread, interpBreak.ctl.dbgSuspendCount, 43)
 MTERP_OFFSET(offThread_curHandlerTable, \
-                               Thread, interpBreak.ctl.curHandlerTable, 76)
+                               Thread, interpBreak.ctl.curHandlerTable, 44)
+MTERP_OFFSET(offThread_cardTable,         Thread, cardTable, 48)
+MTERP_OFFSET(offThread_interpStackEnd,    Thread, interpStackEnd, 52)
+MTERP_OFFSET(offThread_exception,         Thread, exception, 60)
+MTERP_OFFSET(offThread_debugIsMethodEntry, Thread, debugIsMethodEntry, 64)
+MTERP_OFFSET(offThread_interpStackSize,   Thread, interpStackSize, 68)
+MTERP_OFFSET(offThread_stackOverflowed,   Thread, stackOverflowed, 72)
 MTERP_OFFSET(offThread_mainHandlerTable,  Thread, mainHandlerTable, 80)
-
 MTERP_OFFSET(offThread_singleStepCount,   Thread, singleStepCount, 88)
 
 #ifdef WITH_JIT
diff --git a/vm/mterp/cstubs/stubdefs.cpp b/vm/mterp/cstubs/stubdefs.cpp
index e81acdc..ba2fe81 100644
--- a/vm/mterp/cstubs/stubdefs.cpp
+++ b/vm/mterp/cstubs/stubdefs.cpp
@@ -24,7 +24,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -44,6 +44,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
diff --git a/vm/mterp/out/InterpAsm-armv5te-vfp.S b/vm/mterp/out/InterpAsm-armv5te-vfp.S
index 77be638..115a7d2 100644
--- a/vm/mterp/out/InterpAsm-armv5te-vfp.S
+++ b/vm/mterp/out/InterpAsm-armv5te-vfp.S
@@ -82,8 +82,8 @@
 /* save/restore the PC and/or FP from the thread struct */
 #define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
 #define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
-#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_fp]
-#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_fp]
+#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
+#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
 #define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
 #define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
 
@@ -26845,7 +26845,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     cmp     r0,#0
     bne     common_updateProfile
     GOTO_OPCODE(ip)                         @ jump to next instruction
@@ -26853,7 +26853,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     GOTO_OPCODE(ip)                         @ jump to next instruction
 #endif
 
@@ -26861,7 +26861,6 @@
     @ Profiling - record method entry.  r0: methodToCall
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r1, r0
     mov     r0, rSELF
     bl      dvmReportInvoke             @ (self, method)
@@ -26873,7 +26872,7 @@
     @ r0=methodToCall, r1=newFp, r10=newSaveArea
     ldrb    lr, [rSELF, #offThread_subMode]
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
     mov     r2, r0                      @ r2<- methodToCall
     mov     r0, r1                      @ r0<- newFp (points to args)
@@ -26901,7 +26900,7 @@
     @ equivalent to dvmPopJniLocals
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     bne     common_exceptionThrown      @ no, handle exception
@@ -26913,11 +26912,10 @@
 11:
     @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
     stmfd   sp!, {r0-r3}                @ save all but subModes
-    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPreNativeInvoke    @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
     ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
 
     @ Call the native method
@@ -26928,10 +26926,10 @@
     ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
 
     @ Finish up any post-invoke subMode requirements
-    @ interpSave already up-to-date
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPostNativeInvoke   @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
     b       7b                          @ resume
 
 .LstackOverflow:    @ r0=methodToCall
@@ -27004,7 +27002,7 @@
     PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
 #if defined(WITH_JIT)
     ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
     mov     rPC, r9                     @ publish new rPC
@@ -27026,7 +27024,7 @@
     @ On entry, r0: StackSaveArea
     ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     r1, [rSELF, #offThread_fp]   @ update interpSave.fp
+    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
     mov     r0, rSELF
     bl      dvmReportReturn             @ (self)
     SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
@@ -27109,7 +27107,7 @@
     add     sp, sp, #8                  @ restore stack
     bmi     .LnotCaughtLocally
 
-    /* adjust locals to match self->curFrame and updated PC */
+    /* adjust locals to match self->interpSave.curFrame and updated PC */
     SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
     ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
     str     r1, [rSELF, #offThread_method]  @ self->method = new method
@@ -27135,7 +27133,7 @@
     @ Manage debugger bookkeeping
 7:
     str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp]     @ update interpSave.fp
+    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
     mov     r0, rSELF                       @ arg0<- self
     mov     r1, r9                          @ arg1<- exception
     bl      dvmReportExceptionThrow         @ (self, exception)
diff --git a/vm/mterp/out/InterpAsm-armv5te.S b/vm/mterp/out/InterpAsm-armv5te.S
index b46c3ee..665178b 100644
--- a/vm/mterp/out/InterpAsm-armv5te.S
+++ b/vm/mterp/out/InterpAsm-armv5te.S
@@ -82,8 +82,8 @@
 /* save/restore the PC and/or FP from the thread struct */
 #define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
 #define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
-#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_fp]
-#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_fp]
+#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
+#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
 #define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
 #define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
 
@@ -27303,7 +27303,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     cmp     r0,#0
     bne     common_updateProfile
     GOTO_OPCODE(ip)                         @ jump to next instruction
@@ -27311,7 +27311,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     GOTO_OPCODE(ip)                         @ jump to next instruction
 #endif
 
@@ -27319,7 +27319,6 @@
     @ Profiling - record method entry.  r0: methodToCall
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r1, r0
     mov     r0, rSELF
     bl      dvmReportInvoke             @ (self, method)
@@ -27331,7 +27330,7 @@
     @ r0=methodToCall, r1=newFp, r10=newSaveArea
     ldrb    lr, [rSELF, #offThread_subMode]
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
     mov     r2, r0                      @ r2<- methodToCall
     mov     r0, r1                      @ r0<- newFp (points to args)
@@ -27359,7 +27358,7 @@
     @ equivalent to dvmPopJniLocals
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     bne     common_exceptionThrown      @ no, handle exception
@@ -27371,11 +27370,10 @@
 11:
     @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
     stmfd   sp!, {r0-r3}                @ save all but subModes
-    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPreNativeInvoke    @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
     ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
 
     @ Call the native method
@@ -27386,10 +27384,10 @@
     ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
 
     @ Finish up any post-invoke subMode requirements
-    @ interpSave already up-to-date
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPostNativeInvoke   @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
     b       7b                          @ resume
 
 .LstackOverflow:    @ r0=methodToCall
@@ -27462,7 +27460,7 @@
     PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
 #if defined(WITH_JIT)
     ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
     mov     rPC, r9                     @ publish new rPC
@@ -27484,7 +27482,7 @@
     @ On entry, r0: StackSaveArea
     ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     r1, [rSELF, #offThread_fp]   @ update interpSave.fp
+    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
     mov     r0, rSELF
     bl      dvmReportReturn             @ (self)
     SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
@@ -27567,7 +27565,7 @@
     add     sp, sp, #8                  @ restore stack
     bmi     .LnotCaughtLocally
 
-    /* adjust locals to match self->curFrame and updated PC */
+    /* adjust locals to match self->interpSave.curFrame and updated PC */
     SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
     ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
     str     r1, [rSELF, #offThread_method]  @ self->method = new method
@@ -27593,7 +27591,7 @@
     @ Manage debugger bookkeeping
 7:
     str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp]     @ update interpSave.fp
+    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
     mov     r0, rSELF                       @ arg0<- self
     mov     r1, r9                          @ arg1<- exception
     bl      dvmReportExceptionThrow         @ (self, exception)
diff --git a/vm/mterp/out/InterpAsm-armv7-a-neon.S b/vm/mterp/out/InterpAsm-armv7-a-neon.S
index 4694cf7..e1f54fb 100644
--- a/vm/mterp/out/InterpAsm-armv7-a-neon.S
+++ b/vm/mterp/out/InterpAsm-armv7-a-neon.S
@@ -82,8 +82,8 @@
 /* save/restore the PC and/or FP from the thread struct */
 #define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
 #define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
-#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_fp]
-#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_fp]
+#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
+#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
 #define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
 #define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
 
@@ -26783,7 +26783,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     cmp     r0,#0
     bne     common_updateProfile
     GOTO_OPCODE(ip)                         @ jump to next instruction
@@ -26791,7 +26791,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     GOTO_OPCODE(ip)                         @ jump to next instruction
 #endif
 
@@ -26799,7 +26799,6 @@
     @ Profiling - record method entry.  r0: methodToCall
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r1, r0
     mov     r0, rSELF
     bl      dvmReportInvoke             @ (self, method)
@@ -26811,7 +26810,7 @@
     @ r0=methodToCall, r1=newFp, r10=newSaveArea
     ldrb    lr, [rSELF, #offThread_subMode]
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
     mov     r2, r0                      @ r2<- methodToCall
     mov     r0, r1                      @ r0<- newFp (points to args)
@@ -26839,7 +26838,7 @@
     @ equivalent to dvmPopJniLocals
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     bne     common_exceptionThrown      @ no, handle exception
@@ -26851,11 +26850,10 @@
 11:
     @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
     stmfd   sp!, {r0-r3}                @ save all but subModes
-    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPreNativeInvoke    @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
     ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
 
     @ Call the native method
@@ -26866,10 +26864,10 @@
     ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
 
     @ Finish up any post-invoke subMode requirements
-    @ interpSave already up-to-date
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPostNativeInvoke   @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
     b       7b                          @ resume
 
 .LstackOverflow:    @ r0=methodToCall
@@ -26942,7 +26940,7 @@
     PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
 #if defined(WITH_JIT)
     ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
     mov     rPC, r9                     @ publish new rPC
@@ -26964,7 +26962,7 @@
     @ On entry, r0: StackSaveArea
     ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     r1, [rSELF, #offThread_fp]   @ update interpSave.fp
+    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
     mov     r0, rSELF
     bl      dvmReportReturn             @ (self)
     SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
@@ -27047,7 +27045,7 @@
     add     sp, sp, #8                  @ restore stack
     bmi     .LnotCaughtLocally
 
-    /* adjust locals to match self->curFrame and updated PC */
+    /* adjust locals to match self->interpSave.curFrame and updated PC */
     SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
     ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
     str     r1, [rSELF, #offThread_method]  @ self->method = new method
@@ -27073,7 +27071,7 @@
     @ Manage debugger bookkeeping
 7:
     str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp]     @ update interpSave.fp
+    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
     mov     r0, rSELF                       @ arg0<- self
     mov     r1, r9                          @ arg1<- exception
     bl      dvmReportExceptionThrow         @ (self, exception)
diff --git a/vm/mterp/out/InterpAsm-armv7-a.S b/vm/mterp/out/InterpAsm-armv7-a.S
index 5a291f0..6a36b6d 100644
--- a/vm/mterp/out/InterpAsm-armv7-a.S
+++ b/vm/mterp/out/InterpAsm-armv7-a.S
@@ -82,8 +82,8 @@
 /* save/restore the PC and/or FP from the thread struct */
 #define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
 #define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
-#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_fp]
-#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_fp]
+#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
+#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
 #define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
 #define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
 
@@ -26783,7 +26783,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     cmp     r0,#0
     bne     common_updateProfile
     GOTO_OPCODE(ip)                         @ jump to next instruction
@@ -26791,7 +26791,7 @@
     mov     rFP, r1                         @ fp = newFp
     GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
     mov     rINST, r9                       @ publish new rINST
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     GOTO_OPCODE(ip)                         @ jump to next instruction
 #endif
 
@@ -26799,7 +26799,6 @@
     @ Profiling - record method entry.  r0: methodToCall
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r1, r0
     mov     r0, rSELF
     bl      dvmReportInvoke             @ (self, method)
@@ -26811,7 +26810,7 @@
     @ r0=methodToCall, r1=newFp, r10=newSaveArea
     ldrb    lr, [rSELF, #offThread_subMode]
     ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
-    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
+    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
     str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
     mov     r2, r0                      @ r2<- methodToCall
     mov     r0, r1                      @ r0<- newFp (points to args)
@@ -26839,7 +26838,7 @@
     @ equivalent to dvmPopJniLocals
     ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
     ldr     r1, [rSELF, #offThread_exception] @ check for exception
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
     cmp     r1, #0                      @ null?
     str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
     bne     common_exceptionThrown      @ no, handle exception
@@ -26851,11 +26850,10 @@
 11:
     @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
     stmfd   sp!, {r0-r3}                @ save all but subModes
-    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp] @ update interpSave.fp
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPreNativeInvoke    @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
     ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
 
     @ Call the native method
@@ -26866,10 +26864,10 @@
     ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
 
     @ Finish up any post-invoke subMode requirements
-    @ interpSave already up-to-date
     mov     r0, r2                      @ r0<- methodToCall
     mov     r1, rSELF
-    bl      dvmReportPostNativeInvoke   @ (methodToCall, self)
+    mov     r2, rFP
+    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
     b       7b                          @ resume
 
 .LstackOverflow:    @ r0=methodToCall
@@ -26942,7 +26940,7 @@
     PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
     str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
     ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
-    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
+    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
 #if defined(WITH_JIT)
     ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
     mov     rPC, r9                     @ publish new rPC
@@ -26964,7 +26962,7 @@
     @ On entry, r0: StackSaveArea
     ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
     str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
-    str     r1, [rSELF, #offThread_fp]   @ update interpSave.fp
+    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
     mov     r0, rSELF
     bl      dvmReportReturn             @ (self)
     SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
@@ -27047,7 +27045,7 @@
     add     sp, sp, #8                  @ restore stack
     bmi     .LnotCaughtLocally
 
-    /* adjust locals to match self->curFrame and updated PC */
+    /* adjust locals to match self->interpSave.curFrame and updated PC */
     SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
     ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
     str     r1, [rSELF, #offThread_method]  @ self->method = new method
@@ -27073,7 +27071,7 @@
     @ Manage debugger bookkeeping
 7:
     str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
-    str     rFP, [rSELF, #offThread_fp]     @ update interpSave.fp
+    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
     mov     r0, rSELF                       @ arg0<- self
     mov     r1, r9                          @ arg1<- exception
     bl      dvmReportExceptionThrow         @ (self, exception)
diff --git a/vm/mterp/out/InterpAsm-x86.S b/vm/mterp/out/InterpAsm-x86.S
index 68fccd1..5ae3fc3 100644
--- a/vm/mterp/out/InterpAsm-x86.S
+++ b/vm/mterp/out/InterpAsm-x86.S
@@ -130,13 +130,13 @@
 .macro SAVE_PC_FP_TO_SELF _reg
     movl     rSELF,\_reg
     movl     rPC,offThread_pc(\_reg)
-    movl     rFP,offThread_fp(\_reg)
+    movl     rFP,offThread_curFrame(\_reg)
 .endm
 
 .macro LOAD_PC_FP_FROM_SELF
     movl    rSELF,rFP
     movl    offThread_pc(rFP),rPC
-    movl    offThread_fp(rFP),rFP
+    movl    offThread_curFrame(rFP),rFP
 .endm
 
 /* The interpreter assumes a properly aligned stack on entry, and
@@ -25880,7 +25880,7 @@
 
 /* Set up "named" registers */
     movl    offThread_pc(%ecx),rPC
-    movl    offThread_fp(%ecx),rFP
+    movl    offThread_curFrame(%ecx),rFP
     movl    offThread_curHandlerTable(%ecx),rIBASE
 
 /* Remember %esp for future "longjmp" */
@@ -26324,7 +26324,7 @@
     movl        offMethod_insns(%eax), rPC # rPC<- methodToCall->insns
     movl        $1, offThread_debugIsMethodEntry(%ecx)
     movl        LOCAL1_OFFSET(%ebp), rFP # rFP<- newFP
-    movl        rFP, offThread_curFrame(%ecx) # self->curFrame<- newFP
+    movl        rFP, offThread_curFrame(%ecx) # curFrame<-newFP
     movl        offThread_curHandlerTable(%ecx),rIBASE
     FETCH_INST
     GOTO_NEXT                           # jump to methodToCall->insns
@@ -26339,7 +26339,6 @@
     SPILL_TMP1(%eax)                   # preserve methodToCall
     SPILL_TMP2(%edx)                   # preserve newSaveArea
     movl        rPC, offThread_pc(%ecx) # update interpSave.pc
-    movl        rFP, offThread_fp(%ecx) # update interpSave.fp
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
     call        dvmReportInvoke        # (self, method)
@@ -26358,7 +26357,7 @@
     movl        rINST, offStackSaveArea_localRefCookie(%edx) # newSaveArea->localRefCookie<- top
     movl        %edx, LOCAL2_OFFSET(%ebp)  # save newSaveArea
     movl        LOCAL1_OFFSET(%ebp), rINST # rINST<- newFP
-    movl        rINST, offThread_curFrame(%ecx)  # self->curFrame<- newFP
+    movl        rINST, offThread_curFrame(%ecx)  # curFrame<- newFP
     cmpb        $0, offThread_subMode(%ecx)  # Anything special going on?
     jne         11f                     # yes - handle it
     movl        %ecx, OUT_ARG3(%esp)    # push parameter self
@@ -26372,7 +26371,7 @@
     movl        rSELF, %eax             # %eax<- self
     movl        offStackSaveArea_localRefCookie(%ecx), %edx # %edx<- old top
     cmp         $0, offThread_exception(%eax) # check for exception
-    movl        rFP, offThread_curFrame(%eax) # self->curFrame<- rFP
+    movl        rFP, offThread_curFrame(%eax) # curFrame<- rFP
     movl        %edx, offThread_jniLocal_topCookie(%eax) # new top <- old top
     jne         common_exceptionThrown  # handle exception
     movl        offThread_curHandlerTable(%eax),rIBASE
@@ -26387,10 +26386,10 @@
      */
     SPILL_TMP1(%eax)                    # save methodTocall
     movl        rPC, offThread_pc(%ecx)
-    movl        rFP, offThread_fp(%ecx)
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
-    call        dvmReportPreNativeInvoke # (self, methodToCall)
+    movl        rFP, OUT_ARG2(%esp)
+    call        dvmReportPreNativeInvoke # (self, methodToCall, fp)
     UNSPILL_TMP1(%eax)                  # restore methodToCall
     movl        rSELF,%ecx              # restore self
 
@@ -26406,7 +26405,8 @@
     movl        rSELF, %ecx
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
-    call        dvmReportPostNativeInvoke # (self, methodToCall)
+    movl        rFP, OUT_ARG2(%esp)
+    call        dvmReportPostNativeInvoke # (self, methodToCall, fp)
     jmp         7b                      # rejoin
 
 .LstackOverflow:    # eax=methodToCall
@@ -26433,7 +26433,7 @@
 
     movl    offStackSaveArea_savedPc(%eax),rPC # pc<- saveArea->savedPC
     movl    rINST,offThread_method(%ecx)       # self->method = newSave->meethod
-    movl    rFP,offThread_curFrame(%ecx)       # self->curFrame = fp
+    movl    rFP,offThread_curFrame(%ecx)       # curFrame = fp
     movl    offMethod_clazz(rINST),%eax        # eax<- method->clazz
     movl    offThread_curHandlerTable(%ecx),rIBASE
     movl    offClassObject_pDvmDex(%eax),rINST # rINST<- method->clazz->pDvmDex
@@ -26447,7 +26447,7 @@
      * Handle special subMode actions
      * On entry, rFP: prevFP, %ecx: self, %eax: saveArea
      */
-    movl     rFP, offThread_fp(%ecx)          # update interpSave.fp
+    movl     rFP, offThread_curFrame(%ecx)    # update interpSave.curFrame
     movl     rPC, offThread_pc(%ecx)          # update interpSave.pc
     movl     %ecx, OUT_ARG0(%esp)             # parameter self
     call     dvmReportReturn                  # (self)
@@ -26468,7 +26468,7 @@
  */
 common_gotoBail:
     movl   rPC,offThread_pc(%ecx)     # export state to self
-    movl   rFP,offThread_fp(%ecx)
+    movl   rFP,offThread_curFrame(%ecx)
     movl   %ecx,OUT_ARG0(%esp)      # self in arg0
     movl   rINST,OUT_ARG1(%esp)     # changeInterp in arg1
     call   dvmMterpStdBail          # bail out....
@@ -26481,7 +26481,7 @@
  common_resumeAfterGlueCall:
      movl  rSELF, %eax
      movl  offThread_pc(%eax),rPC
-     movl  offThread_fp(%eax),rFP
+     movl  offThread_curFrame(%eax),rFP
      movl  offThread_curHandlerTable(%eax),rIBASE
      FETCH_INST
      GOTO_NEXT
@@ -26556,7 +26556,7 @@
 common_exceptionThrown:
     movl    rSELF,%ecx
     movl    rPC,offThread_pc(%ecx)
-    movl    rFP,offThread_fp(%ecx)
+    movl    rFP,offThread_curFrame(%ecx)
     movl    %ecx,OUT_ARG0(%esp)
     call    dvmMterp_exceptionThrown
     jmp     common_resumeAfterGlueCall
diff --git a/vm/mterp/out/InterpC-allstubs.cpp b/vm/mterp/out/InterpC-allstubs.cpp
index 7859c2d..1356597 100644
--- a/vm/mterp/out/InterpC-allstubs.cpp
+++ b/vm/mterp/out/InterpC-allstubs.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
@@ -5053,7 +5054,7 @@
         }
 
         /* update thread FP, and reset local variables */
-        self->curFrame = fp;
+        self->interpSave.curFrame = fp;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -5190,10 +5191,10 @@
 #endif
 
         /*
-         * Adjust local variables to match self->curFrame and the
+         * Adjust local variables to match self->interpSave.curFrame and the
          * updated PC.
          */
-        //fp = (u4*) self->curFrame;
+        //fp = (u4*) self->interpSave.curFrame;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -5372,7 +5373,7 @@
              * calls.  For native calls, we'll mark EXIT on return.
              * For non-native calls, EXIT is marked in the RETURN op.
              */
-            PC_FP_TO_SELF();
+            PC_TO_SELF();
             dvmReportInvoke(self, methodToCall);
         }
 
@@ -5385,7 +5386,7 @@
             self->interpSave.method = curMethod;
             methodClassDex = curMethod->clazz->pDvmDex;
             pc = methodToCall->insns;
-            self->curFrame = fp = newFp;
+            self->interpSave.curFrame = fp = newFp;
 #ifdef EASY_GDB
             debugSaveArea = SAVEAREA_FROM_FP(newFp);
 #endif
@@ -5398,13 +5399,12 @@
             /* set this up for JNI locals, even if not a JNI native */
             newSaveArea->xtra.localRefCookie = self->jniLocalRefTable.segmentState.all;
 
-            self->curFrame = newFp;
+            self->interpSave.curFrame = newFp;
 
             DUMP_REGS(methodToCall, newFp, true);   // show input args
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPreNativeInvoke(methodToCall, self);
+                dvmReportPreNativeInvoke(methodToCall, self, fp);
             }
 
             ILOGD("> native <-- %s.%s %s", methodToCall->clazz->descriptor,
@@ -5418,13 +5418,12 @@
             (*methodToCall->nativeFunc)(newFp, &retval, methodToCall, self);
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPostNativeInvoke(methodToCall, self);
+                dvmReportPostNativeInvoke(methodToCall, self, fp);
             }
 
             /* pop frame off */
             dvmPopJniLocals(self, newSaveArea);
-            self->curFrame = fp;
+            self->interpSave.curFrame = fp;
 
             /*
              * If the native code threw an exception, or interpreted code
diff --git a/vm/mterp/out/InterpC-armv5te-vfp.cpp b/vm/mterp/out/InterpC-armv5te-vfp.cpp
index 8c3a4c0..4f69687 100644
--- a/vm/mterp/out/InterpC-armv5te-vfp.cpp
+++ b/vm/mterp/out/InterpC-armv5te-vfp.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
diff --git a/vm/mterp/out/InterpC-armv5te.cpp b/vm/mterp/out/InterpC-armv5te.cpp
index 7503ddc..c55f481 100644
--- a/vm/mterp/out/InterpC-armv5te.cpp
+++ b/vm/mterp/out/InterpC-armv5te.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
diff --git a/vm/mterp/out/InterpC-armv7-a-neon.cpp b/vm/mterp/out/InterpC-armv7-a-neon.cpp
index ba9f8a2..18ebfd3 100644
--- a/vm/mterp/out/InterpC-armv7-a-neon.cpp
+++ b/vm/mterp/out/InterpC-armv7-a-neon.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
diff --git a/vm/mterp/out/InterpC-armv7-a.cpp b/vm/mterp/out/InterpC-armv7-a.cpp
index 3c24b7b..e423623 100644
--- a/vm/mterp/out/InterpC-armv7-a.cpp
+++ b/vm/mterp/out/InterpC-armv7-a.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
diff --git a/vm/mterp/out/InterpC-portable.cpp b/vm/mterp/out/InterpC-portable.cpp
index 593a7f7..5bc368f 100644
--- a/vm/mterp/out/InterpC-portable.cpp
+++ b/vm/mterp/out/InterpC-portable.cpp
@@ -403,7 +403,8 @@
  */
 #define PC_FP_TO_SELF()                                                    \
     self->interpSave.pc = pc;                                              \
-    self->interpSave.fp = fp;
+    self->interpSave.curFrame = fp;
+#define PC_TO_SELF() self->interpSave.pc = pc;
 
 /*
  * Instruction framing.  For a switch-oriented implementation this is
@@ -1232,7 +1233,7 @@
 void dvmInterpretPortable(Thread* self)
 {
 #if defined(EASY_GDB)
-    StackSaveArea* debugSaveArea = SAVEAREA_FROM_FP(self->curFrame);
+    StackSaveArea* debugSaveArea = SAVEAREA_FROM_FP(self->interpSave.curFrame);
 #endif
 #if defined(WITH_TRACKREF_CHECKS)
     int debugTrackedRefStart = self->interpSave.debugTrackedRefStart;
@@ -1260,7 +1261,7 @@
     /* copy state in */
     curMethod = self->interpSave.method;
     pc = self->interpSave.pc;
-    fp = self->interpSave.fp;
+    fp = self->interpSave.curFrame;
     retval = self->retval;   /* only need for kInterpEntryReturn? */
 
     methodClassDex = curMethod->clazz->pDvmDex;
@@ -1285,7 +1286,7 @@
     if (self->debugIsMethodEntry) {
         ILOGD("|-- Now interpreting %s.%s", curMethod->clazz->descriptor,
                 curMethod->name);
-        DUMP_REGS(curMethod, self->interpSave.fp, false);
+        DUMP_REGS(curMethod, self->interpSave.curFrame, false);
     }
 #endif
 
@@ -5012,7 +5013,7 @@
         }
 
         /* update thread FP, and reset local variables */
-        self->curFrame = fp;
+        self->interpSave.curFrame = fp;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -5149,10 +5150,10 @@
 #endif
 
         /*
-         * Adjust local variables to match self->curFrame and the
+         * Adjust local variables to match self->interpSave.curFrame and the
          * updated PC.
          */
-        //fp = (u4*) self->curFrame;
+        //fp = (u4*) self->interpSave.curFrame;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -5331,7 +5332,7 @@
              * calls.  For native calls, we'll mark EXIT on return.
              * For non-native calls, EXIT is marked in the RETURN op.
              */
-            PC_FP_TO_SELF();
+            PC_TO_SELF();
             dvmReportInvoke(self, methodToCall);
         }
 
@@ -5344,7 +5345,7 @@
             self->interpSave.method = curMethod;
             methodClassDex = curMethod->clazz->pDvmDex;
             pc = methodToCall->insns;
-            self->curFrame = fp = newFp;
+            self->interpSave.curFrame = fp = newFp;
 #ifdef EASY_GDB
             debugSaveArea = SAVEAREA_FROM_FP(newFp);
 #endif
@@ -5357,13 +5358,12 @@
             /* set this up for JNI locals, even if not a JNI native */
             newSaveArea->xtra.localRefCookie = self->jniLocalRefTable.segmentState.all;
 
-            self->curFrame = newFp;
+            self->interpSave.curFrame = newFp;
 
             DUMP_REGS(methodToCall, newFp, true);   // show input args
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPreNativeInvoke(methodToCall, self);
+                dvmReportPreNativeInvoke(methodToCall, self, fp);
             }
 
             ILOGD("> native <-- %s.%s %s", methodToCall->clazz->descriptor,
@@ -5377,13 +5377,12 @@
             (*methodToCall->nativeFunc)(newFp, &retval, methodToCall, self);
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPostNativeInvoke(methodToCall, self);
+                dvmReportPostNativeInvoke(methodToCall, self, fp);
             }
 
             /* pop frame off */
             dvmPopJniLocals(self, newSaveArea);
-            self->curFrame = fp;
+            self->interpSave.curFrame = fp;
 
             /*
              * If the native code threw an exception, or interpreted code
diff --git a/vm/mterp/out/InterpC-x86-atom.cpp b/vm/mterp/out/InterpC-x86-atom.cpp
index 5483b84..f91c1f8 100644
--- a/vm/mterp/out/InterpC-x86-atom.cpp
+++ b/vm/mterp/out/InterpC-x86-atom.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
@@ -2142,7 +2143,7 @@
         }
 
         /* update thread FP, and reset local variables */
-        self->curFrame = fp;
+        self->interpSave.curFrame = fp;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -2279,10 +2280,10 @@
 #endif
 
         /*
-         * Adjust local variables to match self->curFrame and the
+         * Adjust local variables to match self->interpSave.curFrame and the
          * updated PC.
          */
-        //fp = (u4*) self->curFrame;
+        //fp = (u4*) self->interpSave.curFrame;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -2461,7 +2462,7 @@
              * calls.  For native calls, we'll mark EXIT on return.
              * For non-native calls, EXIT is marked in the RETURN op.
              */
-            PC_FP_TO_SELF();
+            PC_TO_SELF();
             dvmReportInvoke(self, methodToCall);
         }
 
@@ -2474,7 +2475,7 @@
             self->interpSave.method = curMethod;
             methodClassDex = curMethod->clazz->pDvmDex;
             pc = methodToCall->insns;
-            self->curFrame = fp = newFp;
+            self->interpSave.curFrame = fp = newFp;
 #ifdef EASY_GDB
             debugSaveArea = SAVEAREA_FROM_FP(newFp);
 #endif
@@ -2487,13 +2488,12 @@
             /* set this up for JNI locals, even if not a JNI native */
             newSaveArea->xtra.localRefCookie = self->jniLocalRefTable.segmentState.all;
 
-            self->curFrame = newFp;
+            self->interpSave.curFrame = newFp;
 
             DUMP_REGS(methodToCall, newFp, true);   // show input args
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPreNativeInvoke(methodToCall, self);
+                dvmReportPreNativeInvoke(methodToCall, self, fp);
             }
 
             ILOGD("> native <-- %s.%s %s", methodToCall->clazz->descriptor,
@@ -2507,13 +2507,12 @@
             (*methodToCall->nativeFunc)(newFp, &retval, methodToCall, self);
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPostNativeInvoke(methodToCall, self);
+                dvmReportPostNativeInvoke(methodToCall, self, fp);
             }
 
             /* pop frame off */
             dvmPopJniLocals(self, newSaveArea);
-            self->curFrame = fp;
+            self->interpSave.curFrame = fp;
 
             /*
              * If the native code threw an exception, or interpreted code
diff --git a/vm/mterp/out/InterpC-x86.cpp b/vm/mterp/out/InterpC-x86.cpp
index ce4435b..1f8d9f2 100644
--- a/vm/mterp/out/InterpC-x86.cpp
+++ b/vm/mterp/out/InterpC-x86.cpp
@@ -406,7 +406,7 @@
  */
 #define retval                  self->retval
 #define pc                      self->interpSave.pc
-#define fp                      self->interpSave.fp
+#define fp                      self->interpSave.curFrame
 #define curMethod               self->interpSave.method
 #define methodClassDex          self->interpSave.methodClassDex
 #define debugTrackedRefStart    self->interpSave.debugTrackedRefStart
@@ -426,6 +426,7 @@
  * the interpSave vars directly, so this is a nop for stubs.
  */
 #define PC_FP_TO_SELF()
+#define PC_TO_SELF()
 
 /*
  * Opcode handler framing macros.  Here, each opcode is a separate function
@@ -2084,7 +2085,7 @@
         }
 
         /* update thread FP, and reset local variables */
-        self->curFrame = fp;
+        self->interpSave.curFrame = fp;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -2221,10 +2222,10 @@
 #endif
 
         /*
-         * Adjust local variables to match self->curFrame and the
+         * Adjust local variables to match self->interpSave.curFrame and the
          * updated PC.
          */
-        //fp = (u4*) self->curFrame;
+        //fp = (u4*) self->interpSave.curFrame;
         curMethod = SAVEAREA_FROM_FP(fp)->method;
         self->interpSave.method = curMethod;
         //methodClass = curMethod->clazz;
@@ -2403,7 +2404,7 @@
              * calls.  For native calls, we'll mark EXIT on return.
              * For non-native calls, EXIT is marked in the RETURN op.
              */
-            PC_FP_TO_SELF();
+            PC_TO_SELF();
             dvmReportInvoke(self, methodToCall);
         }
 
@@ -2416,7 +2417,7 @@
             self->interpSave.method = curMethod;
             methodClassDex = curMethod->clazz->pDvmDex;
             pc = methodToCall->insns;
-            self->curFrame = fp = newFp;
+            self->interpSave.curFrame = fp = newFp;
 #ifdef EASY_GDB
             debugSaveArea = SAVEAREA_FROM_FP(newFp);
 #endif
@@ -2429,13 +2430,12 @@
             /* set this up for JNI locals, even if not a JNI native */
             newSaveArea->xtra.localRefCookie = self->jniLocalRefTable.segmentState.all;
 
-            self->curFrame = newFp;
+            self->interpSave.curFrame = newFp;
 
             DUMP_REGS(methodToCall, newFp, true);   // show input args
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPreNativeInvoke(methodToCall, self);
+                dvmReportPreNativeInvoke(methodToCall, self, fp);
             }
 
             ILOGD("> native <-- %s.%s %s", methodToCall->clazz->descriptor,
@@ -2449,13 +2449,12 @@
             (*methodToCall->nativeFunc)(newFp, &retval, methodToCall, self);
 
             if (self->interpBreak.ctl.subMode != 0) {
-                PC_FP_TO_SELF();
-                dvmReportPostNativeInvoke(methodToCall, self);
+                dvmReportPostNativeInvoke(methodToCall, self, fp);
             }
 
             /* pop frame off */
             dvmPopJniLocals(self, newSaveArea);
-            self->curFrame = fp;
+            self->interpSave.curFrame = fp;
 
             /*
              * If the native code threw an exception, or interpreted code
diff --git a/vm/mterp/portable/entry.cpp b/vm/mterp/portable/entry.cpp
index 485fa82..dddf136 100644
--- a/vm/mterp/portable/entry.cpp
+++ b/vm/mterp/portable/entry.cpp
@@ -6,7 +6,7 @@
 void dvmInterpretPortable(Thread* self)
 {
 #if defined(EASY_GDB)
-    StackSaveArea* debugSaveArea = SAVEAREA_FROM_FP(self->curFrame);
+    StackSaveArea* debugSaveArea = SAVEAREA_FROM_FP(self->interpSave.curFrame);
 #endif
 #if defined(WITH_TRACKREF_CHECKS)
     int debugTrackedRefStart = self->interpSave.debugTrackedRefStart;
@@ -34,7 +34,7 @@
     /* copy state in */
     curMethod = self->interpSave.method;
     pc = self->interpSave.pc;
-    fp = self->interpSave.fp;
+    fp = self->interpSave.curFrame;
     retval = self->retval;   /* only need for kInterpEntryReturn? */
 
     methodClassDex = curMethod->clazz->pDvmDex;
@@ -59,7 +59,7 @@
     if (self->debugIsMethodEntry) {
         ILOGD("|-- Now interpreting %s.%s", curMethod->clazz->descriptor,
                 curMethod->name);
-        DUMP_REGS(curMethod, self->interpSave.fp, false);
+        DUMP_REGS(curMethod, self->interpSave.curFrame, false);
     }
 #endif
 
diff --git a/vm/mterp/portable/stubdefs.cpp b/vm/mterp/portable/stubdefs.cpp
index de9a8e7..57ff35c 100644
--- a/vm/mterp/portable/stubdefs.cpp
+++ b/vm/mterp/portable/stubdefs.cpp
@@ -21,7 +21,8 @@
  */
 #define PC_FP_TO_SELF()                                                    \
     self->interpSave.pc = pc;                                              \
-    self->interpSave.fp = fp;
+    self->interpSave.curFrame = fp;
+#define PC_TO_SELF() self->interpSave.pc = pc;
 
 /*
  * Instruction framing.  For a switch-oriented implementation this is
diff --git a/vm/mterp/x86/entry.S b/vm/mterp/x86/entry.S
index b6f944a..3e2a708 100644
--- a/vm/mterp/x86/entry.S
+++ b/vm/mterp/x86/entry.S
@@ -43,7 +43,7 @@
 
 /* Set up "named" registers */
     movl    offThread_pc(%ecx),rPC
-    movl    offThread_fp(%ecx),rFP
+    movl    offThread_curFrame(%ecx),rFP
     movl    offThread_curHandlerTable(%ecx),rIBASE
 
 /* Remember %esp for future "longjmp" */
diff --git a/vm/mterp/x86/footer.S b/vm/mterp/x86/footer.S
index b79d8cf..c9a88c1 100644
--- a/vm/mterp/x86/footer.S
+++ b/vm/mterp/x86/footer.S
@@ -393,7 +393,7 @@
     movl        offMethod_insns(%eax), rPC # rPC<- methodToCall->insns
     movl        $$1, offThread_debugIsMethodEntry(%ecx)
     movl        LOCAL1_OFFSET(%ebp), rFP # rFP<- newFP
-    movl        rFP, offThread_curFrame(%ecx) # self->curFrame<- newFP
+    movl        rFP, offThread_curFrame(%ecx) # curFrame<-newFP
     movl        offThread_curHandlerTable(%ecx),rIBASE
     FETCH_INST
     GOTO_NEXT                           # jump to methodToCall->insns
@@ -408,7 +408,6 @@
     SPILL_TMP1(%eax)                   # preserve methodToCall
     SPILL_TMP2(%edx)                   # preserve newSaveArea
     movl        rPC, offThread_pc(%ecx) # update interpSave.pc
-    movl        rFP, offThread_fp(%ecx) # update interpSave.fp
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
     call        dvmReportInvoke        # (self, method)
@@ -427,7 +426,7 @@
     movl        rINST, offStackSaveArea_localRefCookie(%edx) # newSaveArea->localRefCookie<- top
     movl        %edx, LOCAL2_OFFSET(%ebp)  # save newSaveArea
     movl        LOCAL1_OFFSET(%ebp), rINST # rINST<- newFP
-    movl        rINST, offThread_curFrame(%ecx)  # self->curFrame<- newFP
+    movl        rINST, offThread_curFrame(%ecx)  # curFrame<- newFP
     cmpb        $$0, offThread_subMode(%ecx)  # Anything special going on?
     jne         11f                     # yes - handle it
     movl        %ecx, OUT_ARG3(%esp)    # push parameter self
@@ -441,7 +440,7 @@
     movl        rSELF, %eax             # %eax<- self
     movl        offStackSaveArea_localRefCookie(%ecx), %edx # %edx<- old top
     cmp         $$0, offThread_exception(%eax) # check for exception
-    movl        rFP, offThread_curFrame(%eax) # self->curFrame<- rFP
+    movl        rFP, offThread_curFrame(%eax) # curFrame<- rFP
     movl        %edx, offThread_jniLocal_topCookie(%eax) # new top <- old top
     jne         common_exceptionThrown  # handle exception
     movl        offThread_curHandlerTable(%eax),rIBASE
@@ -456,10 +455,10 @@
      */
     SPILL_TMP1(%eax)                    # save methodTocall
     movl        rPC, offThread_pc(%ecx)
-    movl        rFP, offThread_fp(%ecx)
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
-    call        dvmReportPreNativeInvoke # (self, methodToCall)
+    movl        rFP, OUT_ARG2(%esp)
+    call        dvmReportPreNativeInvoke # (self, methodToCall, fp)
     UNSPILL_TMP1(%eax)                  # restore methodToCall
     movl        rSELF,%ecx              # restore self
 
@@ -475,7 +474,8 @@
     movl        rSELF, %ecx
     movl        %ecx, OUT_ARG0(%esp)
     movl        %eax, OUT_ARG1(%esp)
-    call        dvmReportPostNativeInvoke # (self, methodToCall)
+    movl        rFP, OUT_ARG2(%esp)
+    call        dvmReportPostNativeInvoke # (self, methodToCall, fp)
     jmp         7b                      # rejoin
 
 .LstackOverflow:    # eax=methodToCall
@@ -502,7 +502,7 @@
 
     movl    offStackSaveArea_savedPc(%eax),rPC # pc<- saveArea->savedPC
     movl    rINST,offThread_method(%ecx)       # self->method = newSave->meethod
-    movl    rFP,offThread_curFrame(%ecx)       # self->curFrame = fp
+    movl    rFP,offThread_curFrame(%ecx)       # curFrame = fp
     movl    offMethod_clazz(rINST),%eax        # eax<- method->clazz
     movl    offThread_curHandlerTable(%ecx),rIBASE
     movl    offClassObject_pDvmDex(%eax),rINST # rINST<- method->clazz->pDvmDex
@@ -516,7 +516,7 @@
      * Handle special subMode actions
      * On entry, rFP: prevFP, %ecx: self, %eax: saveArea
      */
-    movl     rFP, offThread_fp(%ecx)          # update interpSave.fp
+    movl     rFP, offThread_curFrame(%ecx)    # update interpSave.curFrame
     movl     rPC, offThread_pc(%ecx)          # update interpSave.pc
     movl     %ecx, OUT_ARG0(%esp)             # parameter self
     call     dvmReportReturn                  # (self)
@@ -537,7 +537,7 @@
  */
 common_gotoBail:
     movl   rPC,offThread_pc(%ecx)     # export state to self
-    movl   rFP,offThread_fp(%ecx)
+    movl   rFP,offThread_curFrame(%ecx)
     movl   %ecx,OUT_ARG0(%esp)      # self in arg0
     movl   rINST,OUT_ARG1(%esp)     # changeInterp in arg1
     call   dvmMterpStdBail          # bail out....
@@ -550,7 +550,7 @@
  common_resumeAfterGlueCall:
      movl  rSELF, %eax
      movl  offThread_pc(%eax),rPC
-     movl  offThread_fp(%eax),rFP
+     movl  offThread_curFrame(%eax),rFP
      movl  offThread_curHandlerTable(%eax),rIBASE
      FETCH_INST
      GOTO_NEXT
@@ -625,7 +625,7 @@
 common_exceptionThrown:
     movl    rSELF,%ecx
     movl    rPC,offThread_pc(%ecx)
-    movl    rFP,offThread_fp(%ecx)
+    movl    rFP,offThread_curFrame(%ecx)
     movl    %ecx,OUT_ARG0(%esp)
     call    dvmMterp_exceptionThrown
     jmp     common_resumeAfterGlueCall
diff --git a/vm/mterp/x86/header.S b/vm/mterp/x86/header.S
index 0a34a6f..6f3be0c 100644
--- a/vm/mterp/x86/header.S
+++ b/vm/mterp/x86/header.S
@@ -123,13 +123,13 @@
 .macro SAVE_PC_FP_TO_SELF _reg
     movl     rSELF,\_reg
     movl     rPC,offThread_pc(\_reg)
-    movl     rFP,offThread_fp(\_reg)
+    movl     rFP,offThread_curFrame(\_reg)
 .endm
 
 .macro LOAD_PC_FP_FROM_SELF
     movl    rSELF,rFP
     movl    offThread_pc(rFP),rPC
-    movl    offThread_fp(rFP),rFP
+    movl    offThread_curFrame(rFP),rFP
 .endm
 
 /* The interpreter assumes a properly aligned stack on entry, and