diff options
author | Giacomo Travaglini <giacomo.travaglini@arm.com> | 2018-02-09 10:01:11 +0000 |
---|---|---|
committer | Giacomo Travaglini <giacomo.travaglini@arm.com> | 2018-03-08 10:11:36 +0000 |
commit | dbf7b0adc53b2ab78ae327653870fdcf8b63b572 (patch) | |
tree | d41d8b9652081bd5550928d6fb6d64efe4e954bc /src/arch/arm/faults.hh | |
parent | 689221c651035ebb8be411893a9cc73f17bba9fb (diff) | |
download | gem5-dbf7b0adc53b2ab78ae327653870fdcf8b63b572.tar.xz |
arch-arm: Introduce update method in ArmFault class
There is a set of internal variables in ArmFault thats get updated once
the fault is invoked (ArmFault::invoke). Sometimes we rely on those even
if the fault is generated but not invoked (e.g. when checking if a
memory access is producing a fault). This patch is moving the update
functionalities inside a public method so that a client can make use of
it even when not invoking the fault.
Change-Id: I3ac5b6835023f28ec569fe25487dffa356e1b2fd
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/8361
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src/arch/arm/faults.hh')
-rw-r--r-- | src/arch/arm/faults.hh | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/arch/arm/faults.hh b/src/arch/arm/faults.hh index 537405cf2..f663b5cfc 100644 --- a/src/arch/arm/faults.hh +++ b/src/arch/arm/faults.hh @@ -71,7 +71,13 @@ class ArmFault : public FaultBase bool to64; // True if the exception is taken in AArch64 state ExceptionLevel fromEL; // Source exception level ExceptionLevel toEL; // Target exception level - OperatingMode fromMode; // Source operating mode + OperatingMode fromMode; // Source operating mode (aarch32) + OperatingMode toMode; // Next operating mode (aarch32) + + // This variable is true if the above fault specific informations + // have been updated. This is to prevent that a client is using their + // un-updated default constructed value. + bool faultUpdated; bool hypRouted; // True if the fault has been routed to Hypervisor @@ -191,7 +197,8 @@ class ArmFault : public FaultBase ArmFault(ExtMachInst _machInst = 0, uint32_t _iss = 0) : machInst(_machInst), issRaw(_iss), from64(false), to64(false), - fromEL(EL0), toEL(EL0), fromMode(MODE_UNDEFINED), hypRouted(false) {} + fromEL(EL0), toEL(EL0), fromMode(MODE_UNDEFINED), + faultUpdated(false), hypRouted(false) {} // Returns the actual syndrome register to use based on the target // exception level @@ -204,6 +211,7 @@ class ArmFault : public FaultBase StaticInst::nullStaticInstPtr) override; void invoke64(ThreadContext *tc, const StaticInstPtr &inst = StaticInst::nullStaticInstPtr); + void update(ThreadContext *tc); virtual void annotate(AnnotationIDs id, uint64_t val) {} virtual FaultStat& countStat() = 0; virtual FaultOffset offset(ThreadContext *tc) = 0; |