summaryrefslogtreecommitdiff
path: root/src/arch/arm/types.hh
diff options
context:
space:
mode:
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>2014-12-23 09:31:17 -0500
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>2014-12-23 09:31:17 -0500
commit184fefbb3bbaf93bccd65e73d3d08c7decc16e8a (patch)
tree0e8eb2625b018079821cddbdf1930144c4b762b7 /src/arch/arm/types.hh
parentb33812ba430bba0ab5ff4e6372b47f4b323f0891 (diff)
downloadgem5-184fefbb3bbaf93bccd65e73d3d08c7decc16e8a.tar.xz
arm: Raise an alignment fault if a PC has illegal alignment
We currently don't handle unaligned PCs correctly. There is one check for unaligned PCs in the TLB when running in aarch64 mode, but this check does not cover cases where the CPU does not do a TLB lookup when decoding an instruction (e.g., a branch stays within the same cache line). Additionally, the Decoder class sometimes throws an assertion for unaligned PCs which breaks speculation. This changeset introduces a decoder fault bit field in the ExtMachInst structure. This field can be used to signal a decoder failure. If set, the decoder generates an internal gem5fault instruction instead of a normal instruction. This instruction in turns either panics (fault type PANIC), returns an PCAlignmentFault (fault type UNALIGNED, aarch64) or PrefetchAbort (fault type UNALIGNED, aarch32). The patch causes minor changes to the realview64 regressions, and a stats bump will follow.
Diffstat (limited to 'src/arch/arm/types.hh')
-rw-r--r--src/arch/arm/types.hh14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/arch/arm/types.hh b/src/arch/arm/types.hh
index cebbcef69..eff8f13fb 100644
--- a/src/arch/arm/types.hh
+++ b/src/arch/arm/types.hh
@@ -68,8 +68,10 @@ namespace ArmISA
Bitfield<1, 0> bottom2;
EndBitUnion(ITSTATE)
-
BitUnion64(ExtMachInst)
+ // Decoder state
+ Bitfield<63, 62> decoderFault; // See DecoderFault
+
// ITSTATE bits
Bitfield<55, 48> itstate;
Bitfield<55, 52> itstateCond;
@@ -626,6 +628,16 @@ namespace ArmISA
EC_SERROR = 0x2F
};
+ /**
+ * Instruction decoder fault codes in ExtMachInst.
+ */
+ enum DecoderFault : std::uint8_t {
+ OK = 0x0, ///< No fault
+ UNALIGNED = 0x1, ///< Unaligned instruction fault
+
+ PANIC = 0x3, ///< Internal gem5 error
+ };
+
BitUnion8(OperatingMode64)
Bitfield<0> spX;
Bitfield<3, 2> el;