mem-cache: Avoid write merging if there are reads in between
[gem5.git] / src / sim / main.cc
index 5bf4add4b47fd17f74d30f76aabaea099e98de84..168e4390f9fd8aed3b18831d78d17a9fb7d2226d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2005 The Regents of The University of Michigan
+ * Copyright (c) 2008 The Hewlett-Packard Development Company
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  */
 
 #include <Python.h>
-#include <signal.h>
 
-#include <iostream>
-#include <string>
-
-#include "base/cprintf.hh"
-#include "base/misc.hh"
-#include "config/pythonhome.hh"
-#include "python/swig/init.hh"
-#include "sim/async.hh"
-#include "sim/host.hh"
-#include "sim/core.hh"
-
-using namespace std;
-
-/// Stats signal handler.
-void
-dumpStatsHandler(int sigtype)
-{
-    async_event = true;
-    async_statdump = true;
-}
-
-void
-dumprstStatsHandler(int sigtype)
-{
-    async_event = true;
-    async_statdump = true;
-    async_statreset = true;
-}
-
-/// Exit signal handler.
-void
-exitNowHandler(int sigtype)
-{
-    async_event = true;
-    async_exit = true;
-}
-
-/// Abort signal handler.
-void
-abortHandler(int sigtype)
-{
-    ccprintf(cerr, "Program aborted at cycle %d\n", curTick);
-}
+#include "sim/init.hh"
+#include "sim/init_signals.hh"
 
+// main() is now pretty stripped down and just sets up python and then
+// calls initM5Python which loads the various embedded python modules
+// into the python environment and then starts things running by
+// calling m5Main.
 int
 main(int argc, char **argv)
 {
-    signal(SIGFPE, SIG_IGN);           // may occur on misspeculated paths
-    signal(SIGTRAP, SIG_IGN);
-    signal(SIGUSR1, dumpStatsHandler);         // dump intermediate stats
-    signal(SIGUSR2, dumprstStatsHandler);      // dump and reset stats
-    signal(SIGINT, exitNowHandler);            // dump final stats and exit
-    signal(SIGABRT, abortHandler);
-
-    Py_SetProgramName(argv[0]);
+    int ret;
 
-    // default path to m5 python code is the currently executing
-    // file... Python ZipImporter will find embedded zip archive.
-    // The M5_ARCHIVE environment variable can be used to override this.
-    char *m5_archive = getenv("M5_ARCHIVE");
-    string pythonpath = m5_archive ? m5_archive : argv[0];
+    // Initialize m5 special signal handling.
+    initSignals();
 
-    char *oldpath = getenv("PYTHONPATH");
-    if (oldpath != NULL) {
-        pythonpath += ":";
-        pythonpath += oldpath;
-    }
-
-    if (setenv("PYTHONPATH", pythonpath.c_str(), true) == -1)
-        fatal("setenv: %s\n", strerror(errno));
+#if PY_MAJOR_VERSION >= 3
+    std::unique_ptr<wchar_t[], decltype(&PyMem_RawFree)> program(
+        Py_DecodeLocale(argv[0], NULL),
+        &PyMem_RawFree);
+    Py_SetProgramName(program.get());
+#else
+    Py_SetProgramName(argv[0]);
+#endif
 
-    char *python_home = getenv("PYTHONHOME");
-    if (!python_home)
-        python_home = PYTHONHOME;
-    Py_SetPythonHome(python_home);
+    // Register native modules with Python's init system before
+    // initializing the interpreter.
+    registerNativeModules();
 
     // initialize embedded Python interpreter
     Py_Initialize();
-    PySys_SetArgv(argc, argv);
 
-    // initialize SWIG modules
-    init_swig();
+    // Initialize the embedded m5 python library
+    ret = EmbeddedPython::initAll();
 
-    PyRun_SimpleString("import m5.main");
-    PyRun_SimpleString("m5.main.main()");
+    if (ret == 0) {
+        // start m5
+        ret = m5Main(argc, argv);
+    }
 
     // clean up Python intepreter.
     Py_Finalize();
+
+    return ret;
 }