summaryrefslogtreecommitdiff
path: root/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'cpu')
-rw-r--r--cpu/intr_control.cc38
-rw-r--r--cpu/intr_control.hh14
2 files changed, 43 insertions, 9 deletions
diff --git a/cpu/intr_control.cc b/cpu/intr_control.cc
index 037b00ef4..c71a36b6f 100644
--- a/cpu/intr_control.cc
+++ b/cpu/intr_control.cc
@@ -40,6 +40,42 @@ IntrControl::IntrControl(const string &name, BaseCPU *c)
: SimObject(name), cpu(c)
{}
+/* @todo
+ *Fix the cpu sim object parameter to be a system pointer
+ *instead, to avoid some extra dereferencing
+ */
+void
+IntrControl::post(int int_num, int index)
+{
+ std::vector<ExecContext *> &xcvec = cpu->system->execContexts;
+ BaseCPU *temp = xcvec[0]->cpu;
+ temp->post_interrupt(int_num, index);
+}
+
+void
+IntrControl::post(int cpu_id, int int_num, int index)
+{
+ std::vector<ExecContext *> &xcvec = cpu->system->execContexts;
+ BaseCPU *temp = xcvec[cpu_id]->cpu;
+ temp->post_interrupt(int_num, index);
+}
+
+void
+IntrControl::clear(int int_num, int index)
+{
+ std::vector<ExecContext *> &xcvec = cpu->system->execContexts;
+ BaseCPU *temp = xcvec[0]->cpu;
+ temp->clear_interrupt(int_num, index);
+}
+
+void
+IntrControl::clear(int cpu_id, int int_num, int index)
+{
+ std::vector<ExecContext *> &xcvec = cpu->system->execContexts;
+ BaseCPU *temp = xcvec[cpu_id]->cpu;
+ temp->clear_interrupt(int_num, index);
+}
+
BEGIN_DECLARE_SIM_OBJECT_PARAMS(IntrControl)
SimObjectParam<BaseCPU *> cpu;
@@ -48,7 +84,7 @@ END_DECLARE_SIM_OBJECT_PARAMS(IntrControl)
BEGIN_INIT_SIM_OBJECT_PARAMS(IntrControl)
- INIT_PARAM(cpu, "the processor")
+ INIT_PARAM(cpu, "the cpu")
END_INIT_SIM_OBJECT_PARAMS(IntrControl)
diff --git a/cpu/intr_control.hh b/cpu/intr_control.hh
index b8fa68f52..37e62ed00 100644
--- a/cpu/intr_control.hh
+++ b/cpu/intr_control.hh
@@ -29,9 +29,13 @@
#ifndef __INTR_CONTROL_HH__
#define __INTR_CONTROL_HH__
+#include <vector>
#include "base/misc.hh"
#include "cpu/base_cpu.hh"
#include "sim/sim_object.hh"
+#include "sim/system.hh"
+#include "cpu/exec_context.hh"
+
class IntrControl : public SimObject
{
@@ -41,16 +45,10 @@ class IntrControl : public SimObject
void clear(int int_num, int index = 0);
void post(int int_num, int index = 0);
+ void clear(int cpu_id, int int_num, int index);
+ void post(int cpu_id, int int_num, int index);
};
-inline void
-IntrControl::post(int int_num, int index)
-{ cpu->post_interrupt(int_num, index); }
-
-inline void
-IntrControl::clear(int int_num, int index)
-{ cpu->clear_interrupt(int_num, index); }
-
#endif // __INTR_CONTROL_HH__