diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2011-04-23 15:02:29 -0700 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2011-04-23 15:02:29 -0700 |
commit | 0554885eb941d547eca3400566fb9636599c1b39 (patch) | |
tree | 5d07fc88aa26b6e6868f0b6830bea7308a20ec46 /src/arch/x86/isa | |
parent | a7e27f9a82300f213b268264e1dede222d26bd4d (diff) | |
download | gem5-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/arch/x86/isa')
-rw-r--r-- | src/arch/x86/isa/specialize.isa | 13 |
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": |