diff options
author | Curtis Dunham <Curtis.Dunham@arm.com> | 2017-04-26 15:21:34 +0000 |
---|---|---|
committer | Andreas Sandberg <andreas.sandberg@arm.com> | 2017-07-07 10:32:28 +0000 |
commit | 81db5ccf3c41e28966ce547e3fd783634581a077 (patch) | |
tree | e24f9301470b39d959472d6b66b360ce81361a87 /src/dev | |
parent | feb91ce576f2da6e1941697100d14bc10ace6a90 (diff) | |
download | gem5-81db5ccf3c41e28966ce547e3fd783634581a077.tar.xz |
kvm, arm: don't create interrupt events while saving GIC state
If an interrupt was pending according to Kvm state during a drain,
the Pl390 model would create an interrupt event that could not be
serviced, preventing the system from draining. The proper behavior
is for the Pl390 not actively being used for simulation to just skip
the GIC state machine that delivers interrupts.
Change-Id: Icb37e7e992f1fb441a9b3a26daa1bb5a6fe19228
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/3661
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src/dev')
-rw-r--r-- | src/dev/arm/gic_pl390.cc | 8 | ||||
-rw-r--r-- | src/dev/arm/gic_pl390.hh | 3 |
2 files changed, 10 insertions, 1 deletions
diff --git a/src/dev/arm/gic_pl390.cc b/src/dev/arm/gic_pl390.cc index 7b63306c3..93aaf5c45 100644 --- a/src/dev/arm/gic_pl390.cc +++ b/src/dev/arm/gic_pl390.cc @@ -871,6 +871,14 @@ Pl390::drain() } } + +void +Pl390::drainResume() +{ + // There may be pending interrupts if checkpointed from Kvm; post them. + updateIntState(-1); +} + void Pl390::serialize(CheckpointOut &cp) const { diff --git a/src/dev/arm/gic_pl390.hh b/src/dev/arm/gic_pl390.hh index 5c8a71222..3b35b59fb 100644 --- a/src/dev/arm/gic_pl390.hh +++ b/src/dev/arm/gic_pl390.hh @@ -318,7 +318,7 @@ class Pl390 : public BaseGic, public BaseGicRegisters /** See if some processor interrupt flags need to be enabled/disabled * @param hint which set of interrupts needs to be checked */ - void updateIntState(int hint); + virtual void updateIntState(int hint); /** Update the register that records priority of the highest priority * active interrupt*/ @@ -368,6 +368,7 @@ class Pl390 : public BaseGic, public BaseGicRegisters ~Pl390(); DrainState drain() override; + void drainResume() override; void serialize(CheckpointOut &cp) const override; void unserialize(CheckpointIn &cp) override; |