Handle invalid prefixes for rdrand and rdseed
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 15 Apr 2015 16:53:13 +0000 (09:53 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 15 Apr 2015 16:57:55 +0000 (09:57 -0700)
This patch puts rdrand and rdseed in prefix_table so that invalid
prefixes for rdrand and rdseed are handled properly.

gas/testsuite/

PR binutils/17898
* gas/i386/prefix.s: Add rdrand/rdseed prefix tests.
* gas/i386/prefix.d: Updated.

opcodes/

PR binutils/17898
* i386-dis.c (PREFIX_0FC7_REG_6): Renamed to ...
(PREFIX_MOD_0_0FC7_REG_6): This.
(PREFIX_MOD_3_0FC7_REG_6): New.
(PREFIX_MOD_3_0FC7_REG_7): Likewise.
(prefix_table): Replace PREFIX_0FC7_REG_6 with
PREFIX_MOD_0_0FC7_REG_6.  Add PREFIX_MOD_3_0FC7_REG_6 and
PREFIX_MOD_3_0FC7_REG_7.
(mod_table): Replace PREFIX_0FC7_REG_6 with
PREFIX_MOD_0_0FC7_REG_6.  Use PREFIX_MOD_3_0FC7_REG_6 and
PREFIX_MOD_3_0FC7_REG_7.

gas/testsuite/ChangeLog
gas/testsuite/gas/i386/prefix.d
gas/testsuite/gas/i386/prefix.s
opcodes/ChangeLog
opcodes/i386-dis.c

index ea6a87a6eafbd696ec4cd2e8534abd7c91692fd3..5fa02ac4a55234aeab25d0dff4b9299f0769030a 100644 (file)
@@ -1,3 +1,9 @@
+2015-04-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/17898
+       * gas/i386/prefix.s: Add rdrand/rdseed prefix tests.
+       * gas/i386/prefix.d: Updated.
+
 2015-04-15  Renlin Li  <renlin.li@arm.com>
 
        * gas/arm/arch7em.d: Adjust required ssat and ssat16 immediate field.
index a334ab8e4ac8db19e428db1d4f8ca69cffa21a62..7afb0c18401bfa306c3fd3aedaacba7ce468bfa5 100644 (file)
@@ -63,4 +63,15 @@ Disassembly of section .text:
 [      ]*[a-f0-9]+:    f3 f0 66 3e 36 90       lock data16 ds ss pause 
 [      ]*[a-f0-9]+:    f3 f2 67 3e 36 90       repz repnz addr16 ds ss nop
 [      ]*[a-f0-9]+:    f3 67 f2 66 3e 36 90    repz addr16 repnz ds ss xchg %ax,%ax
+[      ]*[a-f0-9]+:    f3 0f c7                \(bad\)  
+[      ]*[a-f0-9]+:    f8                      clc    
+[      ]*[a-f0-9]+:    90                      nop
+[      ]*[a-f0-9]+:    f3 0f c7                \(bad\)  
+[      ]*[a-f0-9]+:    f0 90                   lock nop
+[      ]*[a-f0-9]+:    f2 0f c7                \(bad\)  
+[      ]*[a-f0-9]+:    f8                      clc    
+[      ]*[a-f0-9]+:    90                      nop
+[      ]*[a-f0-9]+:    f2 0f c7                \(bad\)  
+[      ]*[a-f0-9]+:    f0 90                   lock nop
+       ...
 #pass
index 9f90afab6bf993f2bcaf2183e80f68340a52bfa0..12d8bbc007d570d024fc49b41f2aac386d3db5b9 100644 (file)
        .byte 0x36
        .byte 0x90
 
+# repz; rdseed %eax
+       .byte 0xf3
+       .byte 0x0f
+       .byte 0xc7
+       .byte 0xf8
+
+       nop
+
+# repz; rdrand %eax
+       .byte 0xf3
+       .byte 0x0f
+       .byte 0xc7
+       .byte 0xf0
+
+       nop
+
+# repnz; rdseed %eax
+       .byte 0xf2
+       .byte 0x0f
+       .byte 0xc7
+       .byte 0xf8
+
+       nop
+
+# repnz; rdrand %eax
+       .byte 0xf2
+       .byte 0x0f
+       .byte 0xc7
+       .byte 0xf0
+
+       nop
+
 # Get a good alignment.
  .p2align      4,0
index b378dc1255576198bb9ff1a6cd4f12373e99daf6..b46c861032592c03baf2bf4e96222063c0487b2f 100644 (file)
@@ -1,3 +1,17 @@
+2015-04-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/17898
+       * i386-dis.c (PREFIX_0FC7_REG_6): Renamed to ...
+       (PREFIX_MOD_0_0FC7_REG_6): This.
+       (PREFIX_MOD_3_0FC7_REG_6): New.
+       (PREFIX_MOD_3_0FC7_REG_7): Likewise.
+       (prefix_table): Replace PREFIX_0FC7_REG_6 with
+       PREFIX_MOD_0_0FC7_REG_6.  Add PREFIX_MOD_3_0FC7_REG_6 and
+       PREFIX_MOD_3_0FC7_REG_7.
+       (mod_table): Replace PREFIX_0FC7_REG_6 with
+       PREFIX_MOD_0_0FC7_REG_6.  Use PREFIX_MOD_3_0FC7_REG_6 and
+       PREFIX_MOD_3_0FC7_REG_7.
+
 2015-04-15  H.J. Lu  <hongjiu.lu@intel.com>
 
        * i386-dis.c (PREFIX_MANDATORY_REPZ): Removed.
index 1841488f11262e3ab371827f81e583bbde743b39..76ecb5a78bb94cab935faf7565625060625aa7db 100644 (file)
@@ -933,7 +933,9 @@ enum
   PREFIX_0FBD,
   PREFIX_0FC2,
   PREFIX_0FC3,
-  PREFIX_0FC7_REG_6,
+  PREFIX_MOD_0_0FC7_REG_6,
+  PREFIX_MOD_3_0FC7_REG_6,
+  PREFIX_MOD_3_0FC7_REG_7,
   PREFIX_0FD0,
   PREFIX_0FD6,
   PREFIX_0FE6,
@@ -4047,13 +4049,27 @@ static const struct dis386 prefix_table[][4] = {
     { "movntiS", { Ma, Gv }, PREFIX_OPCODE },
   },
 
-  /* PREFIX_0FC7_REG_6 */
+  /* PREFIX_MOD_0_0FC7_REG_6 */
   {
     { "vmptrld",{ Mq }, 0 },
     { "vmxon", { Mq }, 0 },
     { "vmclear",{ Mq }, 0 },
   },
 
+  /* PREFIX_MOD_3_0FC7_REG_6 */
+  {
+    { "rdrand",        { Ev }, 0 },
+    { Bad_Opcode },
+    { "rdrand",        { Ev }, 0 }
+  },
+
+  /* PREFIX_MOD_3_0FC7_REG_7 */
+  {
+    { "rdseed",        { Ev }, 0 },
+    { Bad_Opcode },
+    { "rdseed",        { Ev }, 0 },
+  },
+
   /* PREFIX_0FD0 */
   {
     { Bad_Opcode },
@@ -11808,13 +11824,13 @@ static const struct dis386 mod_table[][2] = {
   },
   {
     /* MOD_0FC7_REG_6 */
-    { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
-    { "rdrand",                { Ev }, 0 },
+    { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
+    { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
   },
   {
     /* MOD_0FC7_REG_7 */
     { "vmptrst",       { Mq }, 0 },
-    { "rdseed",                { Ev }, 0 },
+    { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
   },
   {
     /* MOD_0FD7 */