Bug 1262479 - decode clflushopt instruction
decode clflushopt instruction
Product: Red Hat Enterprise Linux 7
Classification: Red Hat
Component: crash (Show other bugs)
x86_64 Linux
low Severity low
: rc
: 7.3
Assigned To: Dave Anderson
Emma Wu
Depends On: 1262471
Blocks: 1295826 1296180 1313485
  Show dependency treegraph
Reported: 2015-09-11 16:24 EDT by Jan Kratochvil
Modified: 2017-06-27 00:21 EDT (History)
9 users (show)

See Also:
Fixed In Version: crash-7.1.5-1.el7
Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: 1262471
Last Closed: 2016-11-03 23:45:27 EDT
Type: Bug
Regression: ---
Mount Type: ---
Documentation: ---
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---

Attachments (Terms of Use)

  None (edit)
Description Jan Kratochvil 2015-09-11 16:24:46 EDT
+++ This bug was initially created as a clone of Bug #1262471 +++

Description of problem:
Please add support to gdb and crash to decode the new CLFLUSHOPT instruction (in Intel Skylake and newer CPUs).  Currently gdb shows the 0x66 prefix as a separate instruction, but objdump decodes it correctly:

$ echo 'int main(void) { asm volatile("clflushopt (%rdi)"); }' > clflushopt.c
$ gcc -g clflushopt.c
$ objdump -d a.out | grep clflush
  4004f4:       66 0f ae 3f             clflushopt (%rdi)
$ gdb -q ./a.out
Reading symbols from /tmp/clflushopt/a.out...done.
(gdb) disas /r main
Dump of assembler code for function main:
   0x00000000004004f4 <+4>:     66      data16
   0x00000000004004f5 <+5>:     0f ae 3f        clflush (%rdi)

Version-Release number of selected component (if applicable):

How reproducible:

Steps to Reproduce:
1. see above

Actual results:
   0x00000000004004f4 <+4>:     66      data16
   0x00000000004004f5 <+5>:     0f ae 3f        clflush (%rdi)

Expected results:
   0x00000000004004f4 <+4>:     66 0f ae 3f     clflushopt (%rdi)

Additional info:
See bug 1170846 comment 19 for where the issue was seen with crash
Comment 2 Jeff Bastian 2015-09-11 17:17:07 EDT
On an Intel Skylake system, you can see this in the clflush_cache_range() function which uses the alternative_io() macro to replace the clflush instruction with clflushopt in the live kernel:

[root@localhost ~]# objdump -d \
ffffffff8105f4b0 <clflush_cache_range>:
ffffffff8105f4d0:       3e 0f ae 3f             clflush %ds:(%rdi)
ffffffff8105f4e3:       3e 0f ae 3a             clflush %ds:(%rdx)
Disassembly of section .altinstr_replacement:

ffffffff81c07d0c <.altinstr_replacement>:
ffffffff81c0805c:       66 0f ae 3f             clflushopt (%rdi)
ffffffff81c08060:       66 0f ae 3a             clflushopt (%rdx)

[root@localhost ~]# crash \
    /usr/lib/debug/lib/modules/3.10.0-315.el7.x86_64/vmlinux /dev/crash
crash> disas /r clflush_cache_range
Dump of assembler code for function clflush_cache_range:
   0xffffffff8105f4d0 <+32>:    66      data16
   0xffffffff8105f4d1 <+33>:    0f ae 3f        clflush (%rdi)
   0xffffffff8105f4e3 <+51>:    66      data16
   0xffffffff8105f4e4 <+52>:    0f ae 3a        clflush (%rdx)
Comment 7 errata-xmlrpc 2016-11-03 23:45:27 EDT
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.


Note You need to log in before you can comment on or make changes to this bug.