stats: update stats for mmap() change.
[gem5.git] / src / arch / arm / decoder.cc
index f57e340deeccafd8aee7b9efeaa87f59469e8a06..1502b061ff54c680d3756820c991c1bcc0bac672 100644 (file)
@@ -41,6 +41,8 @@
  */
 
 #include "arch/arm/decoder.hh"
+
+#include "arch/arm/isa.hh"
 #include "arch/arm/isa_traits.hh"
 #include "arch/arm/utility.hh"
 #include "base/trace.hh"
@@ -51,8 +53,10 @@ namespace ArmISA
 
 GenericISA::BasicDecodeCache Decoder::defaultCache;
 
-Decoder::Decoder()
-    : data(0), fpscrLen(0), fpscrStride(0)
+Decoder::Decoder(ISA* isa)
+    : data(0), fpscrLen(0), fpscrStride(0), decoderFlavour(isa
+            ? isa->decoderFlavour()
+            : Enums::Generic)
 {
     reset();
 }
@@ -139,7 +143,7 @@ void
 Decoder::consumeBytes(int numBytes)
 {
     offset += numBytes;
-    assert(offset <= sizeof(MachInst));
+    assert(offset <= sizeof(MachInst) || emi.decoderFault);
     if (offset == sizeof(MachInst))
         outOfBytes = true;
 }
@@ -154,6 +158,10 @@ Decoder::moreBytes(const PCState &pc, Addr fetchPC, MachInst inst)
     emi.fpscrLen = fpscrLen;
     emi.fpscrStride = fpscrStride;
 
+    const Addr alignment(pc.thumb() ? 0x1 : 0x3);
+    emi.decoderFault = static_cast<uint8_t>(
+        pc.instAddr() & alignment ? DecoderFault::UNALIGNED : DecoderFault::OK);
+
     outOfBytes = false;
     process();
 }