1a42d3fdeSEduardo Habkost /* 2a42d3fdeSEduardo Habkost * Test for x86 cache and memory instructions 3a42d3fdeSEduardo Habkost * 4a42d3fdeSEduardo Habkost * Copyright (c) 2015 Red Hat Inc 5a42d3fdeSEduardo Habkost * 6a42d3fdeSEduardo Habkost * Authors: 7a42d3fdeSEduardo Habkost * Eduardo Habkost <ehabkost@redhat.com> 8a42d3fdeSEduardo Habkost * 9a42d3fdeSEduardo Habkost * This work is licensed under the terms of the GNU GPL, version 2. 10a42d3fdeSEduardo Habkost */ 11a42d3fdeSEduardo Habkost 12a42d3fdeSEduardo Habkost #include "libcflat.h" 13a42d3fdeSEduardo Habkost #include "desc.h" 14a42d3fdeSEduardo Habkost #include "processor.h" 15a42d3fdeSEduardo Habkost 16a42d3fdeSEduardo Habkost static long target; 17a42d3fdeSEduardo Habkost 18a42d3fdeSEduardo Habkost int main(int ac, char **av) 19a42d3fdeSEduardo Habkost { 20*eb421510SSean Christopherson if (this_cpu_has(X86_FEATURE_CLFLUSH)) 21*eb421510SSean Christopherson asm_safe_report("clflush (%0)", "b" (&target)); 22*eb421510SSean Christopherson else 235b5d27daSPaolo Bonzini report_skip("clflush"); 24a42d3fdeSEduardo Habkost 25*eb421510SSean Christopherson if (this_cpu_has(X86_FEATURE_XMM)) 26*eb421510SSean Christopherson asm_safe_report("sfence"); 27*eb421510SSean Christopherson else 285b5d27daSPaolo Bonzini report_skip("sfence"); 29a42d3fdeSEduardo Habkost 30*eb421510SSean Christopherson if (this_cpu_has(X86_FEATURE_XMM2)) { 31*eb421510SSean Christopherson asm_safe_report("lfence"); 32*eb421510SSean Christopherson asm_safe_report("mfence"); 335b5d27daSPaolo Bonzini } else { 345b5d27daSPaolo Bonzini report_skip("lfence"); 355b5d27daSPaolo Bonzini report_skip("mfence"); 365b5d27daSPaolo Bonzini } 37a42d3fdeSEduardo Habkost 38*eb421510SSean Christopherson if (this_cpu_has(X86_FEATURE_CLFLUSHOPT)) { 39a42d3fdeSEduardo Habkost /* clflushopt (%rbx): */ 40*eb421510SSean Christopherson asm_safe_report(".byte 0x66, 0x0f, 0xae, 0x3b", "b" (&target)); 415b5d27daSPaolo Bonzini } else { 425b5d27daSPaolo Bonzini report_skip("clflushopt"); 435b5d27daSPaolo Bonzini } 44a42d3fdeSEduardo Habkost 45*eb421510SSean Christopherson if (this_cpu_has(X86_FEATURE_CLWB)) { 46a42d3fdeSEduardo Habkost /* clwb (%rbx): */ 47*eb421510SSean Christopherson asm_safe_report(".byte 0x66, 0x0f, 0xae, 0x33", "b" (&target)); 485b5d27daSPaolo Bonzini } else { 495b5d27daSPaolo Bonzini report_skip("clwb"); 505b5d27daSPaolo Bonzini } 51a42d3fdeSEduardo Habkost 525b5d27daSPaolo Bonzini if (this_cpu_has(X86_FEATURE_PCOMMIT)) { /* PCOMMIT */ 53a42d3fdeSEduardo Habkost /* pcommit: */ 54*eb421510SSean Christopherson asm_safe_report(".byte 0x66, 0x0f, 0xae, 0xf8"); 555b5d27daSPaolo Bonzini } else { 565b5d27daSPaolo Bonzini report_skip("pcommit"); 575b5d27daSPaolo Bonzini } 58a42d3fdeSEduardo Habkost 59a42d3fdeSEduardo Habkost return report_summary(); 60a42d3fdeSEduardo Habkost } 61