/* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.79 2004/02/27 13:35:16 simonmar Exp $
*
* (c) The GHC Team, 1998-2002
*
#include "RtsUtils.h"
#include "RtsFlags.h"
#include "Storage.h" /* initStorage, exitStorage */
-#include "StablePriv.h" /* initStablePtrTable */
#include "Schedule.h" /* initScheduler */
#include "Stats.h" /* initStats */
#include "Signals.h"
#include "Weak.h"
#include "Ticky.h"
#include "StgRun.h"
-#include "StgStartup.h"
#include "Prelude.h" /* fixupRTStoPreludeRefs */
#include "HsFFI.h"
#include "Linker.h"
#include "ThreadLabels.h"
+#include "BlockAlloc.h"
#if defined(RTS_GTK_FRONTPANEL)
#include "FrontPanel.h"
#include <signal.h>
#endif
-// Flag Structure
-struct RTS_FLAGS RtsFlags;
-
// Count of how many outstanding hs_init()s there have been.
static int hs_init_count = 0;
}
/* -----------------------------------------------------------------------------
+ Initialise floating point unit on x86 (currently disabled. why?)
+ -------------------------------------------------------------------------- */
+
+#define X86_INIT_FPU 0
+
+#if X86_INIT_FPU
+static void
+x86_init_fpu ( void )
+{
+ __volatile unsigned short int fpu_cw;
+
+ // Grab the control word
+ __asm __volatile ("fnstcw %0" : "=m" (fpu_cw));
+
+#if 0
+ printf("fpu_cw: %x\n", fpu_cw);
+#endif
+
+ // Set bits 8-9 to 10 (64-bit precision).
+ fpu_cw = (fpu_cw & 0xfcff) | 0x0200;
+
+ // Store the new control word back
+ __asm __volatile ("fldcw %0" : : "m" (fpu_cw));
+}
+#endif
+
+/* -----------------------------------------------------------------------------
Starting up the RTS
-------------------------------------------------------------------------- */
#if defined(PAR)
/* NB: this really must be done after processing the RTS flags */
IF_PAR_DEBUG(verbose,
- fprintf(stderr, "==== Synchronising system (%d PEs)\n", nPEs));
+ debugBelch("==== Synchronising system (%d PEs)\n", nPEs));
synchroniseSystem(); // calls initParallelSystem etc
#endif /* PAR */
+ /* Perform initialisation of adjustor thunk layer. */
+ initAdjustor();
+
/* initialise scheduler data structures (needs to be done before
* initStorage()).
*/
/* initialise the stable pointer table */
initStablePtrTable();
+#if defined(DEBUG)
/* initialise thread label table (tso->char*) */
initThreadLabelTable();
+#endif
#if defined(PROFILING) || defined(DEBUG)
initProfiling1();
#endif
#ifdef HAVE_LOCALE_H
- setlocale(LC_ALL,"");
+ setlocale(LC_CTYPE,"");
+#endif
+
+#if X86_INIT_FPU
+ x86_init_fpu();
#endif
/* Record initialization times */
barf("hs_add_root() must be called after hs_init()");
}
- init_sp = 0;
+ /* The initialisation stack grows downward, with sp pointing
+ to the last occupied word */
+ init_sp = INIT_STACK_BLOCKS*BLOCK_SIZE_W;
bd = allocGroup(INIT_STACK_BLOCKS);
init_stack = (F_ *)bd->start;
- init_stack[init_sp++] = (F_)stg_init_ret;
+ init_stack[--init_sp] = (F_)stg_init_finish;
if (init_root != NULL) {
- init_stack[init_sp++] = (F_)init_root;
+ init_stack[--init_sp] = (F_)init_root;
}
cap.r.rSp = (P_)(init_stack + init_sp);
return;
exit_started=rtsTrue;
- IF_PAR_DEBUG(verbose, fprintf(stderr,"==-- stg_exit %d on [%x]...", n, mytid));
+ IF_PAR_DEBUG(verbose, debugBelch("==-- stg_exit %d on [%x]...", n, mytid));
shutdownParallelSystem(n);
#endif
exit(n);
}
-