diff --git a/src/arch/x86/isa/specialize.isa b/src/arch/x86/isa/specialize.isa index 779abefc7f..5a21c09449 100644 --- a/src/arch/x86/isa/specialize.isa +++ b/src/arch/x86/isa/specialize.isa @@ -95,6 +95,15 @@ let {{ return blocks }}; +let {{ + def doBadInstDecode(): + blocks = OutputBlocks() + blocks.decode_block = ''' + return new Unknown(machInst); + ''' + return blocks +}}; + let {{ class OpType(object): parser = re.compile(r"(?P[A-Z]+)(?P[a-z]*)|(r(?P[A-Z0-9]+)(?P[a-z]*))") @@ -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":