xref: /kvm-unit-tests/x86/memory.c (revision cd5f2fb4ad641c51fe0f1a85264dc3f6ede6e131)
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