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 1764662079SSean Christopherson #define MSR_TEST(msr, val) \ 1864662079SSean Christopherson { .index = msr, .name = #msr, .value = val } 1964662079SSean Christopherson 207d36db35SAvi Kivity struct msr_info msr_info[] = 217d36db35SAvi Kivity { 2264662079SSean Christopherson MSR_TEST(MSR_IA32_SYSENTER_CS, 0x1234), 2364662079SSean Christopherson MSR_TEST(MSR_IA32_SYSENTER_ESP, addr_ul), 2464662079SSean 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 2664662079SSean Christopherson MSR_TEST(MSR_IA32_MISC_ENABLE, 0x400c51889), 2764662079SSean Christopherson MSR_TEST(MSR_IA32_CR_PAT, 0x07070707), 282ac205f8SSean Christopherson #ifdef __x86_64__ 2964662079SSean Christopherson MSR_TEST(MSR_FS_BASE, addr_64), 3064662079SSean Christopherson MSR_TEST(MSR_GS_BASE, addr_64), 3164662079SSean Christopherson MSR_TEST(MSR_KERNEL_GS_BASE, addr_64), 3264662079SSean Christopherson MSR_TEST(MSR_EFER, 0xD00), 3364662079SSean Christopherson MSR_TEST(MSR_LSTAR, addr_64), 3464662079SSean Christopherson MSR_TEST(MSR_CSTAR, addr_64), 3564662079SSean 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 41*3e788d91SSean Christopherson static void test_msr_rw(struct msr_info *msr, unsigned long long val) 427d36db35SAvi Kivity { 43a73d6ae4SSean Christopherson unsigned long long r, orig; 4450273266SSean Christopherson 45*3e788d91SSean Christopherson orig = rdmsr(msr->index); 46*3e788d91SSean Christopherson wrmsr(msr->index, val); 47*3e788d91SSean Christopherson r = rdmsr(msr->index); 48*3e788d91SSean Christopherson wrmsr(msr->index, orig); 499295327cSSean Christopherson if (r != val) { 50d26193a0SRoman Bolshakov printf("testing %s: output = %#" PRIx32 ":%#" PRIx32 51*3e788d91SSean Christopherson " expected = %#" PRIx32 ":%#" PRIx32 "\n", msr->name, 529295327cSSean Christopherson (u32)(r >> 32), (u32)r, (u32)(val >> 32), (u32)val); 537d36db35SAvi Kivity } 54*3e788d91SSean Christopherson report(val == r, "%s", msr->name); 557d36db35SAvi Kivity } 567d36db35SAvi Kivity 577d36db35SAvi Kivity int main(int ac, char **av) 587d36db35SAvi Kivity { 5964662079SSean Christopherson int i; 6064662079SSean Christopherson 6164662079SSean Christopherson for (i = 0 ; i < ARRAY_SIZE(msr_info); i++) 62*3e788d91SSean Christopherson test_msr_rw(&msr_info[i], msr_info[i].value); 637d36db35SAvi Kivity 64f3cdd159SJan Kiszka return report_summary(); 657d36db35SAvi Kivity } 66