ARM: Make undefined instructions obey predication.
This commit is contained in:
@@ -261,3 +261,11 @@ RegImmRegShiftOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
|
||||
printReg(ss, op1);
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
std::string
|
||||
UnknownOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
|
||||
{
|
||||
return csprintf("%-10s (inst 0x%x, opcode 0x%x, binary:%s)",
|
||||
"unknown", machInst, machInst.opcode,
|
||||
inst2string(machInst));
|
||||
}
|
||||
|
||||
@@ -258,4 +258,15 @@ class RegImmRegShiftOp : public PredOp
|
||||
std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
|
||||
};
|
||||
|
||||
class UnknownOp : public PredOp
|
||||
{
|
||||
protected:
|
||||
|
||||
UnknownOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
|
||||
PredOp(mnem, _machInst, __opClass)
|
||||
{}
|
||||
|
||||
std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -40,58 +40,6 @@
|
||||
//
|
||||
// Authors: Stephen Hines
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Unknown instructions
|
||||
//
|
||||
|
||||
output header {{
|
||||
/**
|
||||
* Static instruction class for unknown (illegal) instructions.
|
||||
* These cause simulator termination if they are executed in a
|
||||
* non-speculative mode. This is a leaf class.
|
||||
*/
|
||||
class Unknown : public ArmStaticInst
|
||||
{
|
||||
public:
|
||||
/// Constructor
|
||||
Unknown(ExtMachInst _machInst)
|
||||
: ArmStaticInst("unknown", _machInst, No_OpClass)
|
||||
{
|
||||
// don't call execute() (which panics) if we're on a
|
||||
// speculative path
|
||||
flags[IsNonSpeculative] = true;
|
||||
}
|
||||
|
||||
%(BasicExecDeclare)s
|
||||
|
||||
std::string
|
||||
generateDisassembly(Addr pc, const SymbolTable *symtab) const;
|
||||
};
|
||||
}};
|
||||
|
||||
output decoder {{
|
||||
std::string
|
||||
Unknown::generateDisassembly(Addr pc, const SymbolTable *symtab) const
|
||||
{
|
||||
return csprintf("%-10s (inst 0x%x, opcode 0x%x, binary:%s)",
|
||||
"unknown", machInst, OPCODE, inst2string(machInst));
|
||||
}
|
||||
}};
|
||||
|
||||
output exec {{
|
||||
Fault
|
||||
Unknown::execute(%(CPU_exec_context)s *xc,
|
||||
Trace::InstRecord *traceData) const
|
||||
{
|
||||
#if FULL_SYSTEM
|
||||
return new UndefinedInstruction;
|
||||
#else
|
||||
return new UndefinedInstruction(machInst, true);
|
||||
#endif
|
||||
}
|
||||
}};
|
||||
|
||||
def format Unknown() {{
|
||||
decode_block = 'return new Unknown(machInst);\n'
|
||||
}};
|
||||
|
||||
@@ -468,6 +468,19 @@ let {{
|
||||
header_output += BasicDeclare.subst(itIop)
|
||||
decoder_output += BasicConstructor.subst(itIop)
|
||||
exec_output += PredOpExecute.subst(itIop)
|
||||
unknownCode = '''
|
||||
#if FULL_SYSTEM
|
||||
return new UndefinedInstruction;
|
||||
#else
|
||||
return new UndefinedInstruction(machInst, true);
|
||||
#endif
|
||||
'''
|
||||
unknownIop = InstObjParams("unknown", "Unknown", "UnknownOp", \
|
||||
{ "code": unknownCode,
|
||||
"predicate_test": predicateTest })
|
||||
header_output += BasicDeclare.subst(unknownIop)
|
||||
decoder_output += BasicConstructor.subst(unknownIop)
|
||||
exec_output += PredOpExecute.subst(unknownIop)
|
||||
|
||||
ubfxCode = '''
|
||||
Dest = bits(Op1, imm2, imm1);
|
||||
|
||||
Reference in New Issue
Block a user