summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2011-04-23 15:02:29 -0700
committerGabe Black <gblack@eecs.umich.edu>2011-04-23 15:02:29 -0700
commit0554885eb941d547eca3400566fb9636599c1b39 (patch)
tree5d07fc88aa26b6e6868f0b6830bea7308a20ec46 /src
parenta7e27f9a82300f213b268264e1dede222d26bd4d (diff)
downloadgem5-0554885eb941d547eca3400566fb9636599c1b39.tar.xz
X86: When decoding a memory only inst, fault on reg encodings, don't assert.
This change makes the decoder figure out if an instruction that only supports memory is using a register encoding and decodes directly to "Unknown" which will behave appropriately. This prevents other parts of the instruction creation process from seeing the mismatch and asserting.
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86/isa/specialize.isa13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/arch/x86/isa/specialize.isa b/src/arch/x86/isa/specialize.isa
index 779abefc7..5a21c0944 100644
--- a/src/arch/x86/isa/specialize.isa
+++ b/src/arch/x86/isa/specialize.isa
@@ -96,6 +96,15 @@ let {{
}};
let {{
+ def doBadInstDecode():
+ blocks = OutputBlocks()
+ blocks.decode_block = '''
+ return new Unknown(machInst);
+ '''
+ return blocks
+}};
+
+let {{
class OpType(object):
parser = re.compile(r"(?P<tag>[A-Z]+)(?P<size>[a-z]*)|(r(?P<reg>[A-Z0-9]+)(?P<rsize>[a-z]*))")
def __init__(self, opTypeString):
@@ -146,7 +155,9 @@ let {{
# This refers to memory. The macroop constructor sets up modrm
# addressing. Non memory modrm settings should cause an error.
env.doModRM = True
- return doRipRelativeDecode(Name, opTypes, env)
+ return doSplitDecode("MODRM_MOD",
+ {"3" : (doBadInstDecode,) },
+ (doRipRelativeDecode, Name, opTypes, env))
elif opType.tag == None or opType.size == None:
raise Exception, "Problem parsing operand tag: %s" % opType.tag
elif opType.tag == "C":