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
main(int ac,char ** av)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