summaryrefslogtreecommitdiff
path: root/src/arch/x86
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2010-09-14 12:27:30 -0700
committerGabe Black <gblack@eecs.umich.edu>2010-09-14 12:27:30 -0700
commit0bbd88eb40e553deaabd6fbc935a596125701a86 (patch)
tree32bf7a74c88ad4340111b12cf34cf1203eebd6eb /src/arch/x86
parent0dd1f7f01a8a744811aede5814111b8681271a6b (diff)
downloadgem5-0bbd88eb40e553deaabd6fbc935a596125701a86.tar.xz
X86: Make unrecognized instructions behave better in x86.
Diffstat (limited to 'src/arch/x86')
-rw-r--r--src/arch/x86/faults.cc7
-rw-r--r--src/arch/x86/faults.hh5
-rw-r--r--src/arch/x86/isa/formats/unknown.isa3
3 files changed, 13 insertions, 2 deletions
diff --git a/src/arch/x86/faults.cc b/src/arch/x86/faults.cc
index 4c8fb33c2..4f2d97f90 100644
--- a/src/arch/x86/faults.cc
+++ b/src/arch/x86/faults.cc
@@ -270,6 +270,13 @@ namespace X86ISA
#else
void
+ InvalidOpcode::invoke(ThreadContext * tc, StaticInstPtr inst)
+ {
+ panic("Unrecognized/invalid instruction executed:\n %s",
+ inst->machInst);
+ }
+
+ void
PageFault::invoke(ThreadContext * tc, StaticInstPtr inst)
{
PageFaultErrorCode code = errorCode;
diff --git a/src/arch/x86/faults.hh b/src/arch/x86/faults.hh
index f98ef72e9..cfb654b62 100644
--- a/src/arch/x86/faults.hh
+++ b/src/arch/x86/faults.hh
@@ -250,6 +250,11 @@ namespace X86ISA
InvalidOpcode() :
X86Fault("Invalid-Opcode", "#UD", 6)
{}
+
+#if !FULL_SYSTEM
+ void invoke(ThreadContext * tc,
+ StaticInstPtr inst = StaticInst::nullStaticInstPtr);
+#endif
};
class DeviceNotAvailable : public X86Fault
diff --git a/src/arch/x86/isa/formats/unknown.isa b/src/arch/x86/isa/formats/unknown.isa
index 9b283b5d7..11751e861 100644
--- a/src/arch/x86/isa/formats/unknown.isa
+++ b/src/arch/x86/isa/formats/unknown.isa
@@ -77,8 +77,7 @@ output exec {{
Fault Unknown::execute(%(CPU_exec_context)s *xc,
Trace::InstRecord *traceData) const
{
- warn("No instructions are implemented for X86!\n");
- return NoFault;
+ return new InvalidOpcode();
}
}};