sim: Add a new gem5 op for workload events.
authorGabe Black <gabe.black@gmail.com>
Wed, 21 Oct 2020 00:37:17 +0000 (17:37 -0700)
committerGabe Black <gabe.black@gmail.com>
Thu, 29 Oct 2020 01:35:15 +0000 (01:35 +0000)
This is a way to send a very generic poke to the workload so it can do
something. It's up to the workload to know what information to look for
to interpret an event, such as what PC it came from, what register
values are, or the context of the workload itself (is this SE mode? which
OS is running?).

Change-Id: Ifa4bdf3b5c5a934338c50600747d0b65f4b5eb2b
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/34162
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
include/gem5/asm/generic/m5ops.h
include/gem5/m5ops.h
src/sim/pseudo_inst.cc
src/sim/pseudo_inst.hh
src/sim/se_workload.hh
src/sim/workload.hh

index 20f38d31f6388252a4d714074cec22ba69e37f18..aad927c05bc986bf69fa9574dfa5ff180089e0c7 100644 (file)
@@ -80,6 +80,8 @@
 #define M5OP_SE_PAGE_FAULT      0x61
 #define M5OP_DIST_TOGGLE_SYNC   0x62
 
+#define M5OP_WORKLOAD           0x70
+
 
 #define M5OP_FOREACH                                            \
     M5OP(m5_arm, M5OP_ARM)                                      \
     M5OP(m5_work_end, M5OP_WORK_END)                            \
     M5OP(m5_se_syscall, M5OP_SE_SYSCALL)                        \
     M5OP(m5_se_page_fault, M5OP_SE_PAGE_FAULT)                  \
-    M5OP(m5_dist_toggle_sync, M5OP_DIST_TOGGLE_SYNC)
+    M5OP(m5_dist_toggle_sync, M5OP_DIST_TOGGLE_SYNC)            \
+    M5OP(m5_workload, M5OP_WORKLOAD)                            \
 
 #define M5OP_MERGE_TOKENS_I(a, b) a##b
 #define M5OP_MERGE_TOKENS(a, b) M5OP_MERGE_TOKENS_I(a, b)
index fddbf534fa1f4f80c253c5888cd08a4be2c5738b..1caab225e049e6ed7348940b148b7d208a924cc1 100644 (file)
@@ -68,6 +68,14 @@ void m5_work_end(uint64_t workid, uint64_t threadid);
 void m5_se_syscall();
 void m5_se_page_fault();
 
+/*
+ * Send a very generic poke to the workload so it can do something. It's up to
+ * the workload to know what information to look for to interpret an event,
+ * such as what PC it came from, what register values are, or the context of
+ * the workload itself (is this SE mode? which OS is running?).
+ */
+void m5_workload();
+
 #ifdef __cplusplus
 }
 #endif
index a50937438e8c9f641607fdac333329884da97714..03014c0c6007730b9ea401f6cf9b1174ab3564a2 100644 (file)
@@ -489,6 +489,13 @@ togglesync(ThreadContext *tc)
     DistIface::toggleSync(tc);
 }
 
+void
+triggerWorkloadEvent(ThreadContext *tc)
+{
+    DPRINTF(PseudoInst, "PseudoInst::triggerWorkloadEvent()\n");
+    tc->getSystemPtr()->workload->event(tc);
+}
+
 //
 // This function is executed when annotated work items begin.  Depending on
 // what the user specified at the command line, the simulation may exit and/or
index c32243ae2f68f6cde11fc36c6d20c1dad70e0d17..e5c4fe59201497b08d89ef60127f6217c9d5ae12 100644 (file)
@@ -113,6 +113,7 @@ void workbegin(ThreadContext *tc, uint64_t workid, uint64_t threadid);
 void workend(ThreadContext *tc, uint64_t workid, uint64_t threadid);
 void m5Syscall(ThreadContext *tc);
 void togglesync(ThreadContext *tc);
+void triggerWorkloadEvent(ThreadContext *tc);
 
 /**
  * Execute a decoded M5 pseudo instruction
@@ -254,6 +255,10 @@ pseudoInstWork(ThreadContext *tc, uint8_t func, uint64_t &result)
         invokeSimcall<ABI>(tc, togglesync);
         return true;
 
+      case M5OP_WORKLOAD:
+        invokeSimcall<ABI>(tc, triggerWorkloadEvent);
+        return true;
+
       default:
         warn("Unhandled m5 op: %#x\n", func);
         return false;
index 8deb03b31deac3c0c0383e8ef2965ae47ec97661..16c3f226cb5888543bf9fc1165618cd6bffc2df7 100644 (file)
@@ -78,6 +78,9 @@ class SEWorkload : public Workload
     }
 
     void syscall(ThreadContext *tc) override;
+
+    // For now, assume the only type of events are system calls.
+    void event(ThreadContext *tc) override { syscall(tc); }
 };
 
 #endif // __SIM_SE_WORKLOAD_HH__
index 60b1cff7518452e2fc44c8c0d175d4eda99f9b6d..c789b6550eebe6e9574bf0418c7dde7d036a7849 100644 (file)
@@ -75,6 +75,12 @@ class Workload : public SimObject
         panic("syscall() not implemented.");
     }
 
+    virtual void
+    event(ThreadContext *tc)
+    {
+        warn("Unhandled workload event.");
+    }
+
     /** @{ */
     /**
      * Add a function-based event to the given function, to be looked