[PATCH] x86: correct {RD,WR}{FS,GS}BASE {dis,}assembly
Jan Beulich
jbeulich@suse.com
Fri Nov 28 08:53:52 GMT 2025
First they are valid only in 64-bit mode. And then an operand size prefix
has no meaning here, hence v_mode is wrong to use; switch to dq_mode.
--- a/gas/testsuite/gas/i386/fsgs-intel.d
+++ /dev/null
@@ -1,27 +0,0 @@
-#objdump: -dwMintel
-#name: i386 FSGSBase (Intel disassembly)
-#source: fsgs.s
-
-.*: +file format .*
-
-
-Disassembly of section .text:
-
-0+ <foo>:
-[ ]*[a-f0-9]+: f3 0f ae c3 rdfsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae cb rdgsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae d3 wrfsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae db wrgsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae c3 rdfsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae cb rdgsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae d3 wrfsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae db wrgsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae c3 rdfsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae cb rdgsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae d3 wrfsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae db wrgsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae c3 rdfsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae cb rdgsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae d3 wrfsbase ebx
-[ ]*[a-f0-9]+: f3 0f ae db wrgsbase ebx
-#pass
--- a/gas/testsuite/gas/i386/fsgs.d
+++ /dev/null
@@ -1,26 +0,0 @@
-#objdump: -dw
-#name: i386 FSGSBase
-
-.*: +file format .*
-
-
-Disassembly of section .text:
-
-0+ <foo>:
-[ ]*[a-f0-9]+: f3 0f ae c3 rdfsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae cb rdgsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae d3 wrfsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae db wrgsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae c3 rdfsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae cb rdgsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae d3 wrfsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae db wrgsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae c3 rdfsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae cb rdgsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae d3 wrfsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae db wrgsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae c3 rdfsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae cb rdgsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae d3 wrfsbase %ebx
-[ ]*[a-f0-9]+: f3 0f ae db wrgsbase %ebx
-#pass
--- a/gas/testsuite/gas/i386/fsgs.s
+++ /dev/null
@@ -1,19 +0,0 @@
-# Check FSGSBase new instructions.
-
- .text
-foo:
- .rept 2
- rdfsbase %ebx
- rdgsbase %ebx
- wrfsbase %ebx
- wrgsbase %ebx
-
- .intel_syntax noprefix
- rdfsbase ebx
- rdgsbase ebx
- wrfsbase ebx
- wrgsbase ebx
-
- .att_syntax prefix
- .code16
- .endr
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -364,8 +364,6 @@ if [gas_32_check] then {
run_dump_test "tbm-16bit"
run_dump_test "f16c"
run_dump_test "f16c-intel"
- run_dump_test "fsgs"
- run_dump_test "fsgs-intel"
run_dump_test "rdrnd"
run_dump_test "rdrnd-intel"
run_dump_test "bundle"
--- a/gas/testsuite/gas/i386/x86-64-fsgs-intel.d
+++ b/gas/testsuite/gas/i386/x86-64-fsgs-intel.d
@@ -1,3 +1,4 @@
+#as: --divide
#objdump: -drwMintel
#name: x86-64 FSGSBase (Intel mode)
#source: x86-64-fsgs.s
@@ -24,6 +25,8 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: f3 48 0f ae db wrgsbase rbx
[ ]*[a-f0-9]+: f3 41 0f ae d8 wrgsbase r8d
[ ]*[a-f0-9]+: f3 49 0f ae d8 wrgsbase r8
+[ ]*[a-f0-9]+: 66 f3 0f ae c1 data16 rdfsbase ecx
+[ ]*[a-f0-9]+: f3 66 0f ae d9 data16 wrgsbase ecx
[ ]*[a-f0-9]+: f3 0f ae c3 rdfsbase ebx
[ ]*[a-f0-9]+: f3 48 0f ae c3 rdfsbase rbx
[ ]*[a-f0-9]+: f3 41 0f ae c0 rdfsbase r8d
--- a/gas/testsuite/gas/i386/x86-64-fsgs.d
+++ b/gas/testsuite/gas/i386/x86-64-fsgs.d
@@ -1,3 +1,4 @@
+#as: --divide
#objdump: -dw
#name: x86-64 FSGSBase
@@ -23,6 +24,8 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: f3 48 0f ae db wrgsbase %rbx
[ ]*[a-f0-9]+: f3 41 0f ae d8 wrgsbase %r8d
[ ]*[a-f0-9]+: f3 49 0f ae d8 wrgsbase %r8
+[ ]*[a-f0-9]+: 66 f3 0f ae c1 data16 rdfsbase %ecx
+[ ]*[a-f0-9]+: f3 66 0f ae d9 data16 wrgsbase %ecx
[ ]*[a-f0-9]+: f3 0f ae c3 rdfsbase %ebx
[ ]*[a-f0-9]+: f3 48 0f ae c3 rdfsbase %rbx
[ ]*[a-f0-9]+: f3 41 0f ae c0 rdfsbase %r8d
--- a/gas/testsuite/gas/i386/x86-64-fsgs.s
+++ b/gas/testsuite/gas/i386/x86-64-fsgs.s
@@ -19,6 +19,10 @@ foo:
wrgsbase %r8d
wrgsbase %r8
+ data16 rdfsbase %ecx
+ repe
+ .insn 0x0fae/3, %cx
+
.intel_syntax noprefix
rdfsbase ebx
rdfsbase rbx
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -1358,6 +1358,10 @@ enum
X86_64_0F388A,
X86_64_0F388B,
X86_64_0F38F8_M_1,
+ X86_64_0FAE_REG_0_MOD_3_PREFIX_1,
+ X86_64_0FAE_REG_1_MOD_3_PREFIX_1,
+ X86_64_0FAE_REG_2_MOD_3_PREFIX_1,
+ X86_64_0FAE_REG_3_MOD_3_PREFIX_1,
X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
X86_64_VEX_0F3848,
@@ -3595,25 +3599,25 @@ static const struct dis386 prefix_table[
/* PREFIX_0FAE_REG_0_MOD_3 */
{
{ Bad_Opcode },
- { "rdfsbase", { Ev }, 0 },
+ { X86_64_TABLE (X86_64_0FAE_REG_0_MOD_3_PREFIX_1) },
},
/* PREFIX_0FAE_REG_1_MOD_3 */
{
{ Bad_Opcode },
- { "rdgsbase", { Ev }, 0 },
+ { X86_64_TABLE (X86_64_0FAE_REG_1_MOD_3_PREFIX_1) },
},
/* PREFIX_0FAE_REG_2_MOD_3 */
{
{ Bad_Opcode },
- { "wrfsbase", { Ev }, 0 },
+ { X86_64_TABLE (X86_64_0FAE_REG_2_MOD_3_PREFIX_1) },
},
/* PREFIX_0FAE_REG_3_MOD_3 */
{
{ Bad_Opcode },
- { "wrgsbase", { Ev }, 0 },
+ { X86_64_TABLE (X86_64_0FAE_REG_3_MOD_3_PREFIX_1) },
},
/* PREFIX_0FAE_REG_4_MOD_0 */
@@ -4707,6 +4711,30 @@ static const struct dis386 x86_64_table[
{ PREFIX_TABLE (PREFIX_0F38F8_M_1_X86_64) },
},
+ /* X86_64_0FAE_REG_0_MOD_3_PREFIX_1 */
+ {
+ { Bad_Opcode },
+ { "rdfsbase", { Edq }, 0 },
+ },
+
+ /* X86_64_0FAE_REG_1_MOD_3_PREFIX_1 */
+ {
+ { Bad_Opcode },
+ { "rdgsbase", { Edq }, 0 },
+ },
+
+ /* X86_64_0FAE_REG_2_MOD_3_PREFIX_1 */
+ {
+ { Bad_Opcode },
+ { "wrfsbase", { Edq }, 0 },
+ },
+
+ /* X86_64_0FAE_REG_3_MOD_3_PREFIX_1 */
+ {
+ { Bad_Opcode },
+ { "wrgsbase", { Edq }, 0 },
+ },
+
/* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
{
{ Bad_Opcode },
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -281,6 +281,8 @@ static const dependency isa_dependencies
"SSE2" },
{ "WIDEKL",
"KL" },
+ { "FSGSBase",
+ "64" },
{ "PBNDKB",
"64" },
{ "UINTR",
More information about the Binutils
mailing list