diff --git a/src/arch/arm/isa/insts/misc.isa b/src/arch/arm/isa/insts/misc.isa index 9ee753e385..35b310ecb9 100644 --- a/src/arch/arm/isa/insts/misc.isa +++ b/src/arch/arm/isa/insts/misc.isa @@ -848,7 +848,8 @@ let {{ ''' unknownIop = ArmInstObjParams("unknown", "Unknown", "UnknownOp", \ { "code": unknownCode, - "predicate_test": predicateTest }) + "predicate_test": predicateTest }, + ['IsInvalid']) header_output += BasicDeclare.subst(unknownIop) decoder_output += BasicConstructor.subst(unknownIop) exec_output += PredOpExecute.subst(unknownIop) diff --git a/src/arch/arm/isa/insts/misc64.isa b/src/arch/arm/isa/insts/misc64.isa index 5678195415..266467e9d8 100644 --- a/src/arch/arm/isa/insts/misc64.isa +++ b/src/arch/arm/isa/insts/misc64.isa @@ -183,7 +183,7 @@ let {{ return std::make_shared(machInst, true); ''' unknown64Iop = ArmInstObjParams("unknown", "Unknown64", "UnknownOp64", - unknownCode) + unknownCode, ['IsInvalid']) header_output += BasicDeclare.subst(unknown64Iop) decoder_output += BasicConstructor64.subst(unknown64Iop) exec_output += BasicExecute.subst(unknown64Iop) diff --git a/src/arch/mips/isa/formats/unknown.isa b/src/arch/mips/isa/formats/unknown.isa index 8d3ccdfef1..782b4e1595 100644 --- a/src/arch/mips/isa/formats/unknown.isa +++ b/src/arch/mips/isa/formats/unknown.isa @@ -47,6 +47,7 @@ output header {{ // don't call execute() (which panics) if we're on a // speculative path flags[IsNonSpeculative] = true; + flags[IsInvalid] = true; } Fault execute(ExecContext *, trace::InstRecord *) const override; diff --git a/src/arch/power/isa/formats/unknown.isa b/src/arch/power/isa/formats/unknown.isa index 85dacc5796..78eac5ca8b 100644 --- a/src/arch/power/isa/formats/unknown.isa +++ b/src/arch/power/isa/formats/unknown.isa @@ -49,6 +49,7 @@ output header {{ // don't call execute() (which panics) if we're on a // speculative path flags[IsNonSpeculative] = true; + flags[IsInvalid] = true; } Fault execute(ExecContext *, trace::InstRecord *) const override; diff --git a/src/arch/riscv/insts/unknown.hh b/src/arch/riscv/insts/unknown.hh index 64f94dea00..ca90c453f5 100644 --- a/src/arch/riscv/insts/unknown.hh +++ b/src/arch/riscv/insts/unknown.hh @@ -54,7 +54,9 @@ class Unknown : public RiscvStaticInst public: Unknown(ExtMachInst _machInst) : RiscvStaticInst("unknown", _machInst, No_OpClass) - {} + { + flags[IsInvalid] = true; + } Fault execute(ExecContext *, trace::InstRecord *) const override diff --git a/src/arch/sparc/insts/unknown.hh b/src/arch/sparc/insts/unknown.hh index f4bb143198..f5e4b70d43 100644 --- a/src/arch/sparc/insts/unknown.hh +++ b/src/arch/sparc/insts/unknown.hh @@ -47,7 +47,9 @@ class Unknown : public SparcStaticInst // Constructor Unknown(ExtMachInst _machInst) : SparcStaticInst("unknown", _machInst, No_OpClass) - {} + { + flags[IsInvalid] = true; + } Fault execute(ExecContext *, trace::InstRecord *) const override diff --git a/src/arch/x86/isa/formats/unknown.isa b/src/arch/x86/isa/formats/unknown.isa index eca297bab2..d7bca54cd1 100644 --- a/src/arch/x86/isa/formats/unknown.isa +++ b/src/arch/x86/isa/formats/unknown.isa @@ -53,6 +53,7 @@ output header {{ Unknown(ExtMachInst _machInst) : X86ISA::X86StaticInst("unknown", _machInst, No_OpClass) { + flags[IsInvalid] = true; } Fault execute(ExecContext *, trace::InstRecord *) const override; diff --git a/src/cpu/StaticInstFlags.py b/src/cpu/StaticInstFlags.py index 4ab6cc499c..2e02833d1a 100644 --- a/src/cpu/StaticInstFlags.py +++ b/src/cpu/StaticInstFlags.py @@ -99,4 +99,5 @@ class StaticInstFlags(Enum): "IsHtmStart", # Starts a HTM transaction "IsHtmStop", # Stops (commits) a HTM transaction "IsHtmCancel", # Explicitely aborts a HTM transaction + "IsInvalid", # An invalid instruction ] diff --git a/src/cpu/static_inst.hh b/src/cpu/static_inst.hh index 12b05f9b0e..78e47f4ed8 100644 --- a/src/cpu/static_inst.hh +++ b/src/cpu/static_inst.hh @@ -196,6 +196,8 @@ class StaticInst : public RefCounted, public StaticInstFlags bool isHtmStop() const { return flags[IsHtmStop]; } bool isHtmCancel() const { return flags[IsHtmCancel]; } + bool isInvalid() const { return flags[IsInvalid]; } + bool isHtmCmd() const {