summaryrefslogtreecommitdiff
path: root/src/arch/arm/isa/formats
diff options
context:
space:
mode:
authorMitchell Hayenga <Mitchell.Hayenga@ARM.com>2014-04-23 05:18:20 -0400
committerMitchell Hayenga <Mitchell.Hayenga@ARM.com>2014-04-23 05:18:20 -0400
commit0fad0c7f7dbb91b693805f94f1cf4040590491a0 (patch)
tree601b8ebaec27c9ae5f619b54e9d1440485a0b457 /src/arch/arm/isa/formats
parent84f8fe637cbf15c403f39aaa10c0ea66ace6083d (diff)
downloadgem5-0fad0c7f7dbb91b693805f94f1cf4040590491a0.tar.xz
arm: Don't use a stack allocated mnemonic
FailUnimplemented passed a stack created mnemonic as a const char * which causes some grief when the stack goes away.
Diffstat (limited to 'src/arch/arm/isa/formats')
-rw-r--r--src/arch/arm/isa/formats/aarch64.isa8
-rw-r--r--src/arch/arm/isa/formats/misc.isa29
-rw-r--r--src/arch/arm/isa/formats/unimp.isa20
3 files changed, 37 insertions, 20 deletions
diff --git a/src/arch/arm/isa/formats/aarch64.isa b/src/arch/arm/isa/formats/aarch64.isa
index 3ed70ce81..c7cc776e3 100644
--- a/src/arch/arm/isa/formats/aarch64.isa
+++ b/src/arch/arm/isa/formats/aarch64.isa
@@ -374,9 +374,11 @@ namespace Aarch64
return new WarnUnimplemented(read ? "mrs" : "msr",
machInst, full_mnem);
} else {
- return new FailUnimplemented(csprintf("%s %s",
- read ? "mrs" : "msr", miscRegName[miscReg]).c_str(),
- machInst);
+ return new FailUnimplemented(read ? "mrs" : "msr",
+ machInst,
+ csprintf("%s %s",
+ read ? "mrs" : "msr",
+ miscRegName[miscReg]));
}
}
break;
diff --git a/src/arch/arm/isa/formats/misc.isa b/src/arch/arm/isa/formats/misc.isa
index 647f9846d..0ba114e86 100644
--- a/src/arch/arm/isa/formats/misc.isa
+++ b/src/arch/arm/isa/formats/misc.isa
@@ -139,10 +139,10 @@ let {{
case MISCREG_NOP:
return new NopInst(machInst);
case MISCREG_CP14_UNIMPL:
- return new FailUnimplemented(
+ return new FailUnimplemented(isRead ? "mrc unknown" : "mcr unknown",
+ machInst,
csprintf("miscreg crn:%d opc1:%d crm:%d opc2:%d %s unknown",
- crn, opc1, crm, opc2, isRead ? "read" : "write").c_str(),
- machInst);
+ crn, opc1, crm, opc2, isRead ? "read" : "write"));
default:
uint32_t iss = mcrMrcIssBuild(isRead, crm, rt, crn, opc1, opc2);
if (isRead) {
@@ -183,10 +183,10 @@ let {{
case MISCREG_NOP:
return new NopInst(machInst);
case MISCREG_CP15_UNIMPL:
- return new FailUnimplemented(
+ return new FailUnimplemented(isRead ? "mrc unkown" : "mcr unkown",
+ machInst,
csprintf("miscreg crn:%d opc1:%d crm:%d opc2:%d %s unknown",
- crn, opc1, crm, opc2, isRead ? "read" : "write").c_str(),
- machInst);
+ crn, opc1, crm, opc2, isRead ? "read" : "write"));
case MISCREG_DCCMVAC:
return new FlushPipeInst(
isRead ? "mrc dccmvac" : "mcr dccmvac", machInst);
@@ -217,9 +217,9 @@ let {{
return new Mrc15(machInst, rt, (IntRegIndex)miscReg, iss);
return new Mcr15(machInst, (IntRegIndex)miscReg, rt, iss);
} else {
- return new FailUnimplemented(csprintf("%s %s",
- isRead ? "mrc" : "mcr", miscRegName[miscReg]).c_str(),
- machInst);
+ return new FailUnimplemented(isRead ? "mrc" : "mcr", machInst,
+ csprintf("%s %s", isRead ? "mrc" : "mcr",
+ miscRegName[miscReg]));
}
}
}
@@ -251,10 +251,9 @@ let {{
switch (miscReg) {
case MISCREG_CP15_UNIMPL:
- return new FailUnimplemented(
+ return new FailUnimplemented(isRead ? "mrc" : "mcr", machInst,
csprintf("miscreg crm:%d opc1:%d 64-bit %s unknown",
- crm, opc1, isRead ? "read" : "write").c_str(),
- machInst);
+ crm, opc1, isRead ? "read" : "write"));
default:
if (miscRegInfo[miscReg][MISCREG_WARN_NOT_FAIL]) {
std::string full_mnem = csprintf("%s %s",
@@ -278,9 +277,9 @@ let {{
return new Mrrc15(machInst, (IntRegIndex) miscReg, rt2, rt, iss);
return new Mcrr15(machInst, rt2, rt, (IntRegIndex) miscReg, iss);
} else {
- return new FailUnimplemented(csprintf("%s %s",
- isRead ? "mrrc" : "mcrr", miscRegName[miscReg]).c_str(),
- machInst);
+ return new FailUnimplemented(isRead ? "mrrc" : "mcrr", machInst,
+ csprintf("%s %s",
+ isRead ? "mrrc" : "mcrr", miscRegName[miscReg]));
}
}
}
diff --git a/src/arch/arm/isa/formats/unimp.isa b/src/arch/arm/isa/formats/unimp.isa
index 8e346112c..393a210cb 100644
--- a/src/arch/arm/isa/formats/unimp.isa
+++ b/src/arch/arm/isa/formats/unimp.isa
@@ -56,6 +56,10 @@ output header {{
class FailUnimplemented : public ArmStaticInst
{
public:
+ /// Full mnemonic for MRC and MCR instructions including the
+ /// coproc. register name
+ std::string fullMnemonic;
+
/// Constructor
FailUnimplemented(const char *_mnemonic, ExtMachInst _machInst)
: ArmStaticInst(_mnemonic, _machInst, No_OpClass)
@@ -65,6 +69,16 @@ output header {{
flags[IsNonSpeculative] = true;
}
+ FailUnimplemented(const char *_mnemonic, ExtMachInst _machInst,
+ const std::string& _fullMnemonic)
+ : ArmStaticInst(_mnemonic, _machInst, No_OpClass),
+ fullMnemonic(_fullMnemonic)
+ {
+ // don't call execute() (which panics) if we're on a
+ // speculative path
+ flags[IsNonSpeculative] = true;
+ }
+
%(BasicExecDeclare)s
std::string
@@ -137,14 +151,16 @@ output decoder {{
FailUnimplemented::generateDisassembly(Addr pc,
const SymbolTable *symtab) const
{
- return csprintf("%-10s (unimplemented)", mnemonic);
+ return csprintf("%-10s (unimplemented)",
+ fullMnemonic.size() ? fullMnemonic.c_str() : mnemonic);
}
std::string
WarnUnimplemented::generateDisassembly(Addr pc,
const SymbolTable *symtab) const
{
- return csprintf("%-10s (unimplemented)", mnemonic);
+ return csprintf("%-10s (unimplemented)",
+ fullMnemonic.size() ? fullMnemonic.c_str() : mnemonic);
}
std::string