xref: /kvm-unit-tests/x86/msr.c (revision 646620798b60c1a8931396df42597ecb700aba68)
17d36db35SAvi Kivity /* msr tests */
27d36db35SAvi Kivity 
37d36db35SAvi Kivity #include "libcflat.h"
4850479e3SJason Wang #include "processor.h"
5d1bdd07cSAvi Kivity #include "msr.h"
67d36db35SAvi Kivity 
77d36db35SAvi Kivity struct msr_info {
87d36db35SAvi Kivity 	int index;
9797d79a2SThomas Huth 	const char *name;
107d36db35SAvi Kivity 	unsigned long long value;
117d36db35SAvi Kivity };
127d36db35SAvi Kivity 
137d36db35SAvi Kivity 
147d36db35SAvi Kivity #define addr_64 0x0000123456789abcULL
158feb8cfbSSean Christopherson #define addr_ul (unsigned long)addr_64
167d36db35SAvi Kivity 
17*64662079SSean Christopherson #define MSR_TEST(msr, val)	\
18*64662079SSean Christopherson 	{ .index = msr, .name = #msr, .value = val }
19*64662079SSean Christopherson 
207d36db35SAvi Kivity struct msr_info msr_info[] =
217d36db35SAvi Kivity {
22*64662079SSean Christopherson 	MSR_TEST(MSR_IA32_SYSENTER_CS, 0x1234),
23*64662079SSean Christopherson 	MSR_TEST(MSR_IA32_SYSENTER_ESP, addr_ul),
24*64662079SSean Christopherson 	MSR_TEST(MSR_IA32_SYSENTER_EIP, addr_ul),
257d36db35SAvi Kivity 	// reserved: 1:2, 4:6, 8:10, 13:15, 17, 19:21, 24:33, 35:63
26*64662079SSean Christopherson 	MSR_TEST(MSR_IA32_MISC_ENABLE, 0x400c51889),
27*64662079SSean Christopherson 	MSR_TEST(MSR_IA32_CR_PAT, 0x07070707),
282ac205f8SSean Christopherson #ifdef __x86_64__
29*64662079SSean Christopherson 	MSR_TEST(MSR_FS_BASE, addr_64),
30*64662079SSean Christopherson 	MSR_TEST(MSR_GS_BASE, addr_64),
31*64662079SSean Christopherson 	MSR_TEST(MSR_KERNEL_GS_BASE, addr_64),
32*64662079SSean Christopherson 	MSR_TEST(MSR_EFER, 0xD00),
33*64662079SSean Christopherson 	MSR_TEST(MSR_LSTAR, addr_64),
34*64662079SSean Christopherson 	MSR_TEST(MSR_CSTAR, addr_64),
35*64662079SSean Christopherson 	MSR_TEST(MSR_SYSCALL_MASK, 0xffffffff),
36ff2525d7SSean Christopherson #endif
377d36db35SAvi Kivity //	MSR_IA32_DEBUGCTLMSR needs svm feature LBRV
387d36db35SAvi Kivity //	MSR_VM_HSAVE_PA only AMD host
397d36db35SAvi Kivity };
407d36db35SAvi Kivity 
417d36db35SAvi Kivity static int find_msr_info(int msr_index)
427d36db35SAvi Kivity {
437d36db35SAvi Kivity 	int i;
4450273266SSean Christopherson 
457d36db35SAvi Kivity 	for (i = 0; i < sizeof(msr_info)/sizeof(msr_info[0]) ; i++) {
4650273266SSean Christopherson 		if (msr_info[i].index == msr_index)
477d36db35SAvi Kivity 			return i;
487d36db35SAvi Kivity 	}
497d36db35SAvi Kivity 	return -1;
507d36db35SAvi Kivity }
517d36db35SAvi Kivity 
529295327cSSean Christopherson static void test_msr_rw(int msr_index, unsigned long long val)
537d36db35SAvi Kivity {
54a73d6ae4SSean Christopherson 	unsigned long long r, orig;
557d36db35SAvi Kivity 	int index;
56797d79a2SThomas Huth 	const char *sptr;
5750273266SSean Christopherson 
587d36db35SAvi Kivity 	if ((index = find_msr_info(msr_index)) != -1) {
597d36db35SAvi Kivity 		sptr = msr_info[index].name;
607d36db35SAvi Kivity 	} else {
61fd6aada0SRadim Krčmář 		printf("couldn't find name for msr # %#x, skipping\n", msr_index);
627d36db35SAvi Kivity 		return;
637d36db35SAvi Kivity 	}
649295327cSSean Christopherson 
65a73d6ae4SSean Christopherson 	orig = rdmsr(msr_index);
669295327cSSean Christopherson 	wrmsr(msr_index, val);
677d36db35SAvi Kivity 	r = rdmsr(msr_index);
68a73d6ae4SSean Christopherson 	wrmsr(msr_index, orig);
699295327cSSean Christopherson 	if (r != val) {
70d26193a0SRoman Bolshakov 		printf("testing %s: output = %#" PRIx32 ":%#" PRIx32
71d26193a0SRoman Bolshakov 		       " expected = %#" PRIx32 ":%#" PRIx32 "\n", sptr,
729295327cSSean Christopherson 		       (u32)(r >> 32), (u32)r, (u32)(val >> 32), (u32)val);
737d36db35SAvi Kivity 	}
749295327cSSean Christopherson 	report(val == r, "%s", sptr);
757d36db35SAvi Kivity }
767d36db35SAvi Kivity 
777d36db35SAvi Kivity int main(int ac, char **av)
787d36db35SAvi Kivity {
79*64662079SSean Christopherson 	int i;
80*64662079SSean Christopherson 
81*64662079SSean Christopherson 	for (i = 0 ; i < ARRAY_SIZE(msr_info); i++)
82*64662079SSean Christopherson 		test_msr_rw(msr_info[i].index, msr_info[i].value);
837d36db35SAvi Kivity 
84f3cdd159SJan Kiszka 	return report_summary();
857d36db35SAvi Kivity }
86