1*aa2efa4dSPaolo Bonzini /* msr tests */ 2*aa2efa4dSPaolo Bonzini 3*aa2efa4dSPaolo Bonzini #include "libcflat.h" 4*aa2efa4dSPaolo Bonzini #include "processor.h" 5*aa2efa4dSPaolo Bonzini #include "msr.h" 6*aa2efa4dSPaolo Bonzini #include "desc.h" 7*aa2efa4dSPaolo Bonzini 8*aa2efa4dSPaolo Bonzini static void test_syscall_lazy_load(void) 9*aa2efa4dSPaolo Bonzini { 10*aa2efa4dSPaolo Bonzini extern void syscall_target(); 11*aa2efa4dSPaolo Bonzini u16 cs = read_cs(), ss = read_ss(); 12*aa2efa4dSPaolo Bonzini ulong tmp; 13*aa2efa4dSPaolo Bonzini 14*aa2efa4dSPaolo Bonzini wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_SCE); 15*aa2efa4dSPaolo Bonzini wrmsr(MSR_LSTAR, (ulong)syscall_target); 16*aa2efa4dSPaolo Bonzini wrmsr(MSR_STAR, (uint64_t)cs << 32); 17*aa2efa4dSPaolo Bonzini asm volatile("pushf; syscall; syscall_target: popf" : "=c"(tmp) : : "r11"); 18*aa2efa4dSPaolo Bonzini write_ss(ss); 19*aa2efa4dSPaolo Bonzini // will crash horribly if broken 20*aa2efa4dSPaolo Bonzini report("MSR_*STAR eager loading", true); 21*aa2efa4dSPaolo Bonzini } 22*aa2efa4dSPaolo Bonzini 23*aa2efa4dSPaolo Bonzini int main(int ac, char **av) 24*aa2efa4dSPaolo Bonzini { 25*aa2efa4dSPaolo Bonzini test_syscall_lazy_load(); 26*aa2efa4dSPaolo Bonzini 27*aa2efa4dSPaolo Bonzini return report_summary(); 28*aa2efa4dSPaolo Bonzini } 29