/* -----------------------------------------------------------------------------
- * $Id: StgCRun.c,v 1.16 2000/04/11 16:36:54 sewardj Exp $
+ * $Id: StgCRun.c,v 1.23 2000/12/04 12:31:21 simonmar Exp $
*
* (c) The GHC Team, 1998-2000
*
extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg)
{
- jmp_buf save_buf;
- /* Save jmp_environment for previous call to miniInterpret */
- memcpy((void *) jmp_environment, (void *) save_buf, sizeof(jmp_buf));
- if (setjmp(jmp_environment) == 0) {
- while ( 1 ) {
-StgFunPtr f_old;
- IF_DEBUG(evaluator,
- fprintf(stderr,"Jumping to ");
- printPtr((P_)f);
- fprintf(stderr,"\n");
- );
-f_old = f;
- f = (StgFunPtr) (f)();
- if (!IS_CODE_PTR(f)) {
-fprintf ( stderr,"bad ptr given by %p %s\n", f_old, nameFromOPtr(f_old) );
-assert(IS_CODE_PTR(f));
- }
-
- }
- }
- /* Restore jmp_environment for previous call */
- memcpy((void*) save_buf, (void*) jmp_environment, sizeof(jmp_buf));
-
- return (StgThreadReturnCode)R1.i;
+ while (f) {
+ IF_DEBUG(evaluator,
+ fprintf(stderr,"Jumping to ");
+ printPtr((P_)f);
+ fprintf(stderr,"\n");
+ );
+ f = (StgFunPtr) (f)();
+ }
+ return (StgThreadReturnCode)R1.i;
}
EXTFUN(StgReturn)
{
- longjmp(jmp_environment, 1);
+ return 0;
}
#else
#if STACK_DETAILS
fprintf(stderr,
"== SB = %p SP = %p(%p) SU = %p SpLim = %p(%p)\n",
- sb, sp, tso->sp, su, basereg->rSpLim, tso->splim);
+ sb, sp, tso->sp, su, basereg->rSpLim, tso->stack + RESERVED_STACK_WORDS);
#endif
if (su >= sb) goto postloop;
StgThreadReturnCode
StgRun(StgFunPtr f, StgRegTable *basereg) {
- StgChar space[ RESERVED_C_STACK_BYTES + 4*sizeof(void *) ];
+ unsigned char space[ RESERVED_C_STACK_BYTES + 4*sizeof(void *) ];
StgThreadReturnCode r;
__asm__ volatile (
does the last paragraph above mean when it says "the top of the
stack is used for globals"? What globals? --SDM
+ Updated info (GHC 4.08.2): not saving %i7 any more (see below).
-------------------------------------------------------------------------- */
#ifdef sparc_TARGET_ARCH
StgThreadReturnCode
StgRun(StgFunPtr f, StgRegTable *basereg) {
- StgChar space[RESERVED_C_STACK_BYTES+sizeof(void *)];
+ unsigned char space[RESERVED_C_STACK_BYTES];
+#if 0
register void *i7 __asm__("%i7");
((void **)(space))[100] = i7;
+#endif
f();
__asm__ volatile (
".align 4\n"
* terrible. We could do much better by coding it directly in
* assembler.
*/
+#if 0
+ /* updated 4.08.2: we don't save %i7 in the middle of the reserved
+ * space any more, since gcc tries to save its address across the
+ * call to f(), this gets clobbered in STG land and we end up
+ * dereferencing a bogus pointer in StgReturn.
+ */
__asm__ volatile ("ld %1,%0"
: "=r" (i7) : "m" (((void **)(space))[100]));
+#endif
return (StgThreadReturnCode)R1.i;
}