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