cpu: IntrControl, clear all and check helpers
authorAdrian Herrera <adrian.herrera@arm.com>
Mon, 9 Dec 2019 20:10:14 +0000 (20:10 +0000)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Wed, 25 Mar 2020 09:49:20 +0000 (09:49 +0000)
This patch extends the IntrControl to provided additional member
functions for (1) clearing all pending interrupts in a PE and (2)
checking for any pending interrupt in a PE. These are intended to
be used from interrupt management related peripherals.

Change-Id: I06b553872ed469e7449b872a0716865773ace154
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/26809
Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/cpu/intr_control.cc
src/cpu/intr_control.hh

index 071b9d5f50103e28edca301070a23f4af345cf0d..9274b375d2c38543df58bde2d0cc791207a51e79 100644 (file)
@@ -47,18 +47,32 @@ void
 IntrControl::post(int cpu_id, int int_num, int index)
 {
     DPRINTF(IntrControl, "post  %d:%d (cpu %d)\n", int_num, index, cpu_id);
-    std::vector<ThreadContext *> &tcvec = sys->threadContexts;
-    BaseCPU *cpu = tcvec[cpu_id]->getCpuPtr();
-    cpu->postInterrupt(tcvec[cpu_id]->threadId(), int_num, index);
+    ThreadContext *tc = sys->getThreadContext(cpu_id);
+    tc->getCpuPtr()->postInterrupt(tc->threadId(), int_num, index);
 }
 
 void
 IntrControl::clear(int cpu_id, int int_num, int index)
 {
     DPRINTF(IntrControl, "clear %d:%d (cpu %d)\n", int_num, index, cpu_id);
-    std::vector<ThreadContext *> &tcvec = sys->threadContexts;
-    BaseCPU *cpu = tcvec[cpu_id]->getCpuPtr();
-    cpu->clearInterrupt(tcvec[cpu_id]->threadId(), int_num, index);
+    ThreadContext *tc = sys->getThreadContext(cpu_id);
+    tc->getCpuPtr()->clearInterrupt(tc->threadId(), int_num, index);
+}
+
+void
+IntrControl::clearAll(int cpu_id)
+{
+    DPRINTF(IntrControl, "Clear all pending interrupts for CPU %d\n", cpu_id);
+    ThreadContext *tc = sys->getThreadContext(cpu_id);
+    tc->getCpuPtr()->clearInterrupts(tc->threadId());
+}
+
+bool
+IntrControl::havePosted(int cpu_id) const
+{
+    DPRINTF(IntrControl, "Check pending interrupts for CPU %d\n", cpu_id);
+    ThreadContext *tc = sys->getThreadContext(cpu_id);
+    return tc->getCpuPtr()->checkInterrupts(tc);
 }
 
 IntrControl *
index b7ff2a8f845cec7810ea516e260c8898de515037..a6f025ecb4e1bb825d2b49eda67d2b609a74ad8b 100644 (file)
@@ -45,6 +45,8 @@ class IntrControl : public SimObject
 
     void clear(int cpu_id, int int_num, int index);
     void post(int cpu_id, int int_num, int index);
+    void clearAll(int cpu_id);
+    bool havePosted(int cpu_id) const;
 
     void
     clear(int int_num, int index = 0)