summaryrefslogtreecommitdiff
path: root/src/dev/arm/base_gic.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/dev/arm/base_gic.cc')
-rw-r--r--src/dev/arm/base_gic.cc82
1 files changed, 81 insertions, 1 deletions
diff --git a/src/dev/arm/base_gic.cc b/src/dev/arm/base_gic.cc
index ece8352d3..65754d018 100644
--- a/src/dev/arm/base_gic.cc
+++ b/src/dev/arm/base_gic.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012 ARM Limited
+ * Copyright (c) 2012, 2017-2018 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -39,7 +39,11 @@
#include "dev/arm/base_gic.hh"
+#include "cpu/thread_context.hh"
#include "dev/arm/realview.hh"
+#include "params/ArmInterruptPin.hh"
+#include "params/ArmPPI.hh"
+#include "params/ArmSPI.hh"
#include "params/BaseGic.hh"
BaseGic::BaseGic(const Params *p)
@@ -65,3 +69,79 @@ BaseGic::params() const
{
return dynamic_cast<const Params *>(_params);
}
+
+
+ArmInterruptPin::ArmInterruptPin(const ArmInterruptPinParams *p)
+ : SimObject(p),
+ threadContext(nullptr),
+ platform(dynamic_cast<RealView*>(p->platform)),
+ intNum(p->num)
+{
+ fatal_if(!platform, "Interrupt not connected to a RealView platform");
+}
+
+void
+ArmInterruptPin::setThreadContext(ThreadContext *tc)
+{
+ panic_if(threadContext,
+ "InterruptLine::setThreadContext called twice\n");
+
+ threadContext = tc;
+}
+
+ContextID
+ArmInterruptPin::targetContext() const
+{
+ panic_if(!threadContext, "Per-context interrupt triggered without a " \
+ "call to InterruptLine::setThreadContext.\n");
+ return threadContext->contextId();
+}
+
+
+
+ArmSPI::ArmSPI(const ArmSPIParams *p)
+ : ArmInterruptPin(p)
+{
+}
+
+void
+ArmSPI::raise()
+{
+ platform->gic->sendInt(intNum);
+}
+
+void
+ArmSPI::clear()
+{
+ platform->gic->clearInt(intNum);
+}
+
+ArmPPI::ArmPPI(const ArmPPIParams *p)
+ : ArmInterruptPin(p)
+{
+}
+
+void
+ArmPPI::raise()
+{
+ platform->gic->sendPPInt(intNum, targetContext());
+}
+
+void
+ArmPPI::clear()
+{
+ platform->gic->clearPPInt(intNum, targetContext());
+}
+
+
+ArmSPI *
+ArmSPIParams::create()
+{
+ return new ArmSPI(this);
+}
+
+ArmPPI *
+ArmPPIParams::create()
+{
+ return new ArmPPI(this);
+}