Bug 1262479

Summary: decode clflushopt instruction
Product: Red Hat Enterprise Linux 7 Reporter: Jan Kratochvil <jan.kratochvil>
Component: crashAssignee: Dave Anderson <anderson>
Status: CLOSED ERRATA QA Contact: Emma Wu <xiawu>
Severity: low Docs Contact:
Priority: low    
Version: 7.2CC: ccui, gdb-bugs, jan.kratochvil, jbastian, lilu, ohudlick, qe-baseos-tools-bugs, sergiodj, xiawu
Target Milestone: rc   
Target Release: 7.3   
Hardware: x86_64   
OS: Linux   
Whiteboard:
Fixed In Version: crash-7.1.5-1.el7 Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: 1262471 Environment:
Last Closed: 2016-11-04 03:45:27 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On: 1262471    
Bug Blocks: 1295826, 1296180, 1313485    

Description Jan Kratochvil 2015-09-11 20:24:46 UTC
+++ 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):
gdb-7.6.1-78.el7
crash-7.1.2-2.el7

How reproducible:
always

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 21:17:07 UTC
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 \
    /usr/lib/debug/lib/modules/3.10.0-315.el7.x86_64/vmlinux
...
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-04 03:45:27 UTC
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.

https://rhn.redhat.com/errata/RHBA-2016-2325.html