fetch.cc:
[gem5.git] / arch / alpha / pseudo_inst.cc
index 50b7d1aafd5388396afd5bca937a27ede1175ab9..22d65638b970c11c29b8f2c3de09f93ef719a90a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003 The Regents of The University of Michigan
+ * Copyright (c) 2003-2004 The Regents of The University of Michigan
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <fcntl.h>
+#include <unistd.h>
+#include <cstdio>
+
 #include <string>
 
 #include "arch/alpha/pseudo_inst.hh"
+#include "arch/alpha/vtophys.hh"
+#include "cpu/base_cpu.hh"
+#include "cpu/sampling_cpu/sampling_cpu.hh"
 #include "cpu/exec_context.hh"
+#include "kern/kernel_stats.hh"
 #include "sim/param.hh"
 #include "sim/serialize.hh"
 #include "sim/sim_exit.hh"
-#include "sim/sim_stats.hh"
+#include "sim/stat_control.hh"
+#include "sim/stats.hh"
+#include "sim/system.hh"
+#include "sim/debug.hh"
 
 using namespace std;
-using namespace Statistics;
+
+extern SamplingCPU *SampCPU;
+
+using namespace Stats;
 
 namespace AlphaPseudo
 {
     bool doStatisticsInsts;
     bool doCheckpointInsts;
+    bool doQuiesce;
+
+    void
+    arm(ExecContext *xc)
+    {
+        xc->kernelStats->arm();
+    }
+
+    void
+    quiesce(ExecContext *xc)
+    {
+        if (!doQuiesce)
+            return;
+
+        xc->suspend();
+        xc->kernelStats->quiesce();
+    }
+
+    void
+    ivlb(ExecContext *xc)
+    {
+        xc->kernelStats->ivlb();
+    }
+
+    void
+    ivle(ExecContext *xc)
+    {
+    }
 
     void
     m5exit_old(ExecContext *xc)
@@ -69,6 +111,7 @@ namespace AlphaPseudo
         Tick when = curTick + NS2Ticks(delay);
         Tick repeat = NS2Ticks(period);
 
+        using namespace Stats;
         SetupEvent(Reset, when, repeat);
     }
 
@@ -84,6 +127,7 @@ namespace AlphaPseudo
         Tick when = curTick + NS2Ticks(delay);
         Tick repeat = NS2Ticks(period);
 
+        using namespace Stats;
         SetupEvent(Dump, when, repeat);
     }
 
@@ -99,6 +143,7 @@ namespace AlphaPseudo
         Tick when = curTick + NS2Ticks(delay);
         Tick repeat = NS2Ticks(period);
 
+        using namespace Stats;
         SetupEvent(Dump|Reset, when, repeat);
     }
 
@@ -114,7 +159,44 @@ namespace AlphaPseudo
         Tick when = curTick + NS2Ticks(delay);
         Tick repeat = NS2Ticks(period);
 
-        SetupCheckpoint(when, repeat);
+        Checkpoint::setup(when, repeat);
+    }
+
+    void
+    readfile(ExecContext *xc)
+    {
+        const string &file = xc->cpu->system->params->readfile;
+        if (file.empty()) {
+            xc->regs.intRegFile[0] = ULL(0);
+            return;
+        }
+
+        Addr vaddr = xc->regs.intRegFile[16];
+        uint64_t len = xc->regs.intRegFile[17];
+        uint64_t offset = xc->regs.intRegFile[18];
+        uint64_t result = 0;
+
+        int fd = ::open(file.c_str(), O_RDONLY, 0);
+        if (fd < 0)
+            panic("could not open file %s\n", file);
+
+        char *buf = new char[len];
+        char *p = buf;
+        while (len > 0) {
+            int bytes = ::pread(fd, p, len, offset);
+            if (bytes <= 0)
+                break;
+
+            p += bytes;
+            offset += bytes;
+            result += bytes;
+            len -= bytes;
+        }
+
+        close(fd);
+        CopyIn(xc, vaddr, buf, result);
+        delete [] buf;
+        xc->regs.intRegFile[0] = result;
     }
 
     class Context : public ParamContext
@@ -124,19 +206,34 @@ namespace AlphaPseudo
         void checkParams();
     };
 
-    Context context("PseudoInsts");
+    Context context("pseudo_inst");
 
+    Param<bool> __quiesce(&context, "quiesce",
+                          "enable quiesce instructions",
+                          true);
     Param<bool> __statistics(&context, "statistics",
-                             "enable the statistics pseudo instructions",
-                             yes);
+                             "enable statistics pseudo instructions",
+                             true);
     Param<bool> __checkpoint(&context, "checkpoint",
-                             "enable the checkpoint pseudo instructions",
-                             yes);
+                             "enable checkpoint pseudo instructions",
+                             true);
 
     void
     Context::checkParams()
     {
+        doQuiesce = __quiesce;
         doStatisticsInsts = __statistics;
         doCheckpointInsts = __checkpoint;
     }
+
+    void debugbreak(ExecContext *xc)
+    {
+        debug_break();
+    }
+
+    void switchcpu(ExecContext *xc)
+    {
+        if (SampCPU)
+            SampCPU->switchCPUs();
+    }
 }