push the new system_events file that i was prevented from pushing way back when cable...
authorLisa Hsu <hsul@eecs.umich.edu>
Mon, 17 May 2004 17:22:19 +0000 (13:22 -0400)
committerLisa Hsu <hsul@eecs.umich.edu>
Mon, 17 May 2004 17:22:19 +0000 (13:22 -0400)
base/stats/text.cc:
    fix the printing of binned stats.

--HG--
extra : convert_revision : 3a04d004f5ea1d90536f7102fce946fd6dd34613

base/stats/text.cc
kern/system_events.cc [new file with mode: 0644]
kern/system_events.hh [new file with mode: 0644]

index 0f43a1772d3ebe5858061dd6e7a9023f223e8625..79a91e66112db07b76d703ec2c8d52fe7fb21138 100644 (file)
@@ -132,7 +132,7 @@ Text::output()
         for (i = bins().begin(); i != end; ++i) {
             MainBin *bin = *i;
             bin->activate();
-            ccprintf(*stream,"---%s Bin------------\n", bin);
+            ccprintf(*stream,"---%s Bin------------\n", bin->name());
             stat_list_t::const_iterator i, end = stats().end();
             for (i = stats().begin(); i != end; ++i)
                 (*i)->visit(*this);
diff --git a/kern/system_events.cc b/kern/system_events.cc
new file mode 100644 (file)
index 0000000..011dbce
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2003 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "cpu/exec_context.hh"
+#include "cpu/base_cpu.hh"
+#include "cpu/full_cpu/bpred.hh"
+#include "cpu/full_cpu/full_cpu.hh"
+#include "kern/system_events.hh"
+#include "sim/system.hh"
+#include "sim/sw_context.hh"
+
+void
+SkipFuncEvent::process(ExecContext *xc)
+{
+    Addr newpc = xc->regs.intRegFile[ReturnAddressReg];
+
+    DPRINTF(PCEvent, "skipping %s: pc=%x, newpc=%x\n", description,
+            xc->regs.pc, newpc);
+
+    xc->regs.pc = newpc;
+    xc->regs.npc = xc->regs.pc + sizeof(MachInst);
+
+    BranchPred *bp = xc->cpu->getBranchPred();
+    if (bp != NULL) {
+        bp->popRAS(xc->thread_num);
+    }
+}
+
+
+FnEvent::FnEvent(PCEventQueue *q, const std::string & desc, System *system)
+    : PCEvent(q, desc), _name(desc)
+{
+    myBin = system->getBin(desc);
+    assert(myBin);
+}
+
+void
+FnEvent::process(ExecContext *xc)
+{
+    if (xc->misspeculating())
+        return;
+    assert(xc->system->bin && "FnEvent must be in a binned system");
+    SWContext *ctx = xc->swCtx;
+    DPRINTF(TCPIP, "%s: %s Event!!!\n", xc->system->name(), description);
+
+    if (ctx && !ctx->callStack.empty()) {
+        DPRINTF(TCPIP, "already a callstack!\n");
+        fnCall *last = ctx->callStack.top();
+
+        if (last->name == "idle_thread")
+            ctx->calls++;
+
+        if (!xc->system->findCaller(myname(), "" ) &&
+            !xc->system->findCaller(myname(), last->name)) {
+
+            DPRINTF(TCPIP, "but can't find parent %s\n", last->name);
+            return;
+        }
+        ctx->calls--;
+
+        //assert(!ctx->calls && "on a binned fn, calls should == 0 (but can happen in boot)");
+    } else {
+        DPRINTF(TCPIP, "no callstack yet\n");
+        if (!xc->system->findCaller(myname(), "")) {
+            DPRINTF(TCPIP, "not the right function, returning\n");
+            return;
+        }
+        if (!ctx)  {
+            DPRINTF(TCPIP, "creating new context for %s\n", myname());
+            ctx = new SWContext;
+            xc->swCtx = ctx;
+        }
+    }
+    DPRINTF(TCPIP, "adding fn %s to context\n", myname());
+    fnCall *call = new fnCall;
+    call->myBin = myBin;
+    call->name = myname();
+    ctx->callStack.push(call);
+    myBin->activate();
+    xc->system->fnCalls++;
+    DPRINTF(TCPIP, "fnCalls for %s is %d\n", description,
+            xc->system->fnCalls.value());
+    xc->system->dumpState(xc);
+}
diff --git a/kern/system_events.hh b/kern/system_events.hh
new file mode 100644 (file)
index 0000000..fdf2a06
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2003 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __SYSTEM_EVENTS_HH__
+#define __SYSTEM_EVENTS_HH__
+
+#include "cpu/pc_event.hh"
+
+class System;
+
+class SkipFuncEvent : public PCEvent
+{
+  public:
+    SkipFuncEvent(PCEventQueue *q, const std::string &desc)
+        : PCEvent(q, desc) {}
+    virtual void process(ExecContext *xc);
+};
+
+class FnEvent : public PCEvent
+{
+  public:
+    FnEvent(PCEventQueue *q, const std::string &desc, System *system);
+    virtual void process(ExecContext *xc);
+    std::string myname() const { return _name; }
+
+  private:
+    std::string _name;
+    Statistics::MainBin *myBin;
+};
+
+#endif // __SYSTEM_EVENTS_HH__