/* Keep -Wmissing-prototypes from complaining */
void SaveAllStgRegs(STG_NO_ARGS);
+#if i386_TARGET_ARCH
+void SaveAllStgContext(void * /*return address*/);
+#else
void SaveAllStgContext(STG_NO_ARGS);
+#endif
void SaveStgStackRegs(STG_NO_ARGS);
void RestoreAllStgRegs(STG_NO_ARGS);
void RestoreStackStgRegs(STG_NO_ARGS);
extern STG_INLINE
void SaveAllStgRegs(STG_NO_ARGS)
{
+#ifdef REG_Base
+# ifdef CONCURRENT
+ /* I do not think so: CurrentRegTable will not have changed
+ between entry to and exit from "Haskell land" (WDP 95/12)
+ */
+ /* CurrentRegTable = BaseReg; */
+# endif
+#endif
+
#ifdef REG_R1
SAVE_R1 = R1;
#endif
SAVE_Hp = Hp; /* always! */
SAVE_HpLim = HpLim; /* ditto! */
-
-#if defined(DO_INSTR_COUNTING)
-#ifdef REG_Activity
- SAVE_Activity = ActivityReg;
-#endif
-#endif
}
extern STG_INLINE
-void SaveAllStgContext(STG_NO_ARGS)
+void
+#if i386_TARGET_ARCH
+SaveAllStgContext(void * ret_addr)
+#else
+SaveAllStgContext(STG_NO_ARGS)
+#endif
{
SaveAllStgRegs();
#ifdef CONCURRENT
+# if defined(PROFILING) || defined(PAR)
TSO_CCC(CurrentTSO) = CCC;
CCC = (CostCentre)STATIC_CC_REF(CC_MAIN);
+# endif
+# if i386_TARGET_ARCH
+ SET_RETADDR(TSO_PC2(CurrentTSO), ret_addr)
+# else
SET_RETADDR(TSO_PC2(CurrentTSO))
+# endif
#endif
}
{
#ifdef REG_Base
/* Re-initialise the register table pointer */
+# ifdef CONCURRENT
+ BaseReg = CurrentRegTable;
+# else
BaseReg = &MainRegTable;
+# endif
#endif
#ifdef REG_R1
StkStubReg = STK_STUB_closure;
#endif
-#if defined(DO_INSTR_COUNTING) && defined(REG_Activity)
- ActivityReg = SAVE_Activity;
-#endif
-
-#ifdef CONCURRENT
+#if CONCURRENT
+# if defined(PROFILING) || defined(PAR)
CCC = TSO_CCC(CurrentTSO);
+# endif
#endif
}