summaryrefslogtreecommitdiff
path: root/src/inc/regdisp.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/inc/regdisp.h')
-rw-r--r--src/inc/regdisp.h13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/inc/regdisp.h b/src/inc/regdisp.h
index eb84fdfa14..ed60f4bcfd 100644
--- a/src/inc/regdisp.h
+++ b/src/inc/regdisp.h
@@ -406,9 +406,20 @@ inline void FillRegDisplay(const PREGDISPLAY pRD, PT_CONTEXT pctx, PT_CONTEXT pC
FillContextPointers(&pRD->ctxPtrsOne, pctx);
#if defined(_TARGET_ARM_)
+ // Fill volatile context pointers. They can be used by GC in the case of the leaf frame
+ pRD->volatileCurrContextPointers.R0 = &pctx->R0;
+ pRD->volatileCurrContextPointers.R1 = &pctx->R1;
+ pRD->volatileCurrContextPointers.R2 = &pctx->R2;
+ pRD->volatileCurrContextPointers.R3 = &pctx->R3;
+ pRD->volatileCurrContextPointers.R12 = &pctx->R12;
+
pRD->ctxPtrsOne.Lr = &pctx->Lr;
pRD->pPC = &pRD->pCurrentContext->Pc;
-#endif // _TARGET_ARM_
+#elif defined(_TARGET_ARM64_) // _TARGET_ARM_
+ // Fill volatile context pointers. They can be used by GC in the case of the leaf frame
+ for (int i=0; i < 18; i++)
+ pRD->volatileCurrContextPointers.X[i] = &pctx->X[i];
+#endif // _TARGET_ARM64_
#ifdef DEBUG_REGDISPLAY
pRD->_pThread = NULL;