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