* 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.
- *
- * Authors: Nathan Binkert
- * Ron Dreslinski
*/
+#include "cpu/intr_control.hh"
+
#include <string>
#include <vector>
+#include "base/trace.hh"
#include "cpu/base.hh"
#include "cpu/thread_context.hh"
-#include "cpu/intr_control.hh"
-#include "params/IntrControl.hh"
+#include "debug/IntrControl.hh"
#include "sim/sim_object.hh"
using namespace std;
-IntrControl::IntrControl(const string &name, System *s)
- : SimObject(name), sys(s)
+IntrControl::IntrControl(const Params *p)
+ : SimObject(p), sys(p->sys)
{}
void
-IntrControl::post(int int_num, int index)
+IntrControl::post(int cpu_id, int int_num, int index)
{
- std::vector<ThreadContext *> &tcvec = sys->threadContexts;
- BaseCPU *temp = tcvec[0]->getCpuPtr();
- temp->post_interrupt(int_num, index);
+ DPRINTF(IntrControl, "post %d:%d (cpu %d)\n", int_num, index, cpu_id);
+ auto *tc = sys->threads[cpu_id];
+ tc->getCpuPtr()->postInterrupt(tc->threadId(), int_num, index);
}
void
-IntrControl::post(int cpu_id, int int_num, int index)
+IntrControl::clear(int cpu_id, int int_num, int index)
{
- std::vector<ThreadContext *> &tcvec = sys->threadContexts;
- BaseCPU *temp = tcvec[cpu_id]->getCpuPtr();
- temp->post_interrupt(int_num, index);
+ DPRINTF(IntrControl, "clear %d:%d (cpu %d)\n", int_num, index, cpu_id);
+ auto *tc = sys->threads[cpu_id];
+ tc->getCpuPtr()->clearInterrupt(tc->threadId(), int_num, index);
}
void
-IntrControl::clear(int int_num, int index)
+IntrControl::clearAll(int cpu_id)
{
- std::vector<ThreadContext *> &tcvec = sys->threadContexts;
- BaseCPU *temp = tcvec[0]->getCpuPtr();
- temp->clear_interrupt(int_num, index);
+ DPRINTF(IntrControl, "Clear all pending interrupts for CPU %d\n", cpu_id);
+ auto *tc = sys->threads[cpu_id];
+ tc->getCpuPtr()->clearInterrupts(tc->threadId());
}
-void
-IntrControl::clear(int cpu_id, int int_num, int index)
+bool
+IntrControl::havePosted(int cpu_id) const
{
- std::vector<ThreadContext *> &tcvec = sys->threadContexts;
- BaseCPU *temp = tcvec[cpu_id]->getCpuPtr();
- temp->clear_interrupt(int_num, index);
+ DPRINTF(IntrControl, "Check pending interrupts for CPU %d\n", cpu_id);
+ auto *tc = sys->threads[cpu_id];
+ return tc->getCpuPtr()->checkInterrupts(tc->threadId());
}
IntrControl *
IntrControlParams::create()
{
- return new IntrControl(name, sys);
+ return new IntrControl(this);
}