On Thu, Aug 15, 2013 at 3:48 PM, Jan Kiszka <jan.kiszka@xxxxxx> wrote: > On 2013-08-15 09:41, Arthur Chunqi Li wrote: >> On Thu, Aug 15, 2013 at 3:17 PM, Jan Kiszka <jan.kiszka@xxxxxx> wrote: >>> On 2013-08-13 17:56, Arthur Chunqi Li wrote: >>>> Add test cases for ENT_LOAD_PAT, ENT_LOAD_EFER, EXI_LOAD_PAT, >>>> EXI_SAVE_PAT, EXI_LOAD_EFER, EXI_SAVE_PAT flags in enter/exit >>>> control fields. >>>> >>>> Signed-off-by: Arthur Chunqi Li <yzt356@xxxxxxxxx> >>>> --- >>>> x86/vmx.h | 7 +++ >>>> x86/vmx_tests.c | 185 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ >>>> 2 files changed, 192 insertions(+) >>>> >>>> diff --git a/x86/vmx.h b/x86/vmx.h >>>> index 28595d8..18961f1 100644 >>>> --- a/x86/vmx.h >>>> +++ b/x86/vmx.h >>>> @@ -152,10 +152,12 @@ enum Encoding { >>>> GUEST_DEBUGCTL = 0x2802ul, >>>> GUEST_DEBUGCTL_HI = 0x2803ul, >>>> GUEST_EFER = 0x2806ul, >>>> + GUEST_PAT = 0x2804ul, >>>> GUEST_PERF_GLOBAL_CTRL = 0x2808ul, >>>> GUEST_PDPTE = 0x280aul, >>>> >>>> /* 64-Bit Host State */ >>>> + HOST_PAT = 0x2c00ul, >>>> HOST_EFER = 0x2c02ul, >>>> HOST_PERF_GLOBAL_CTRL = 0x2c04ul, >>>> >>>> @@ -330,11 +332,15 @@ enum Ctrl_exi { >>>> EXI_HOST_64 = 1UL << 9, >>>> EXI_LOAD_PERF = 1UL << 12, >>>> EXI_INTA = 1UL << 15, >>>> + EXI_SAVE_PAT = 1UL << 18, >>>> + EXI_LOAD_PAT = 1UL << 19, >>>> + EXI_SAVE_EFER = 1UL << 20, >>>> EXI_LOAD_EFER = 1UL << 21, >>>> }; >>>> >>>> enum Ctrl_ent { >>>> ENT_GUEST_64 = 1UL << 9, >>>> + ENT_LOAD_PAT = 1UL << 14, >>>> ENT_LOAD_EFER = 1UL << 15, >>>> }; >>>> >>>> @@ -354,6 +360,7 @@ enum Ctrl0 { >>>> CPU_NMI_WINDOW = 1ul << 22, >>>> CPU_IO = 1ul << 24, >>>> CPU_IO_BITMAP = 1ul << 25, >>>> + CPU_MSR_BITMAP = 1ul << 28, >>>> CPU_SECONDARY = 1ul << 31, >>>> }; >>>> >>>> diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c >>>> index c1b39f4..61b0cef 100644 >>>> --- a/x86/vmx_tests.c >>>> +++ b/x86/vmx_tests.c >>>> @@ -1,4 +1,15 @@ >>>> #include "vmx.h" >>>> +#include "msr.h" >>>> +#include "processor.h" >>>> +#include "vm.h" >>>> + >>>> +u64 ia32_pat; >>>> +u64 ia32_efer; >>>> + >>>> +static inline void vmcall() >>>> +{ >>>> + asm volatile("vmcall"); >>>> +} >>>> >>>> void basic_init() >>>> { >>>> @@ -76,6 +87,176 @@ int vmenter_exit_handler() >>>> return VMX_TEST_VMEXIT; >>>> } >>>> >>>> +void msr_bmp_init() >>>> +{ >>>> + void *msr_bitmap; >>>> + u32 ctrl_cpu0; >>>> + >>>> + msr_bitmap = alloc_page(); >>>> + memset(msr_bitmap, 0x0, PAGE_SIZE); >>>> + ctrl_cpu0 = vmcs_read(CPU_EXEC_CTRL0); >>>> + ctrl_cpu0 |= CPU_MSR_BITMAP; >>>> + vmcs_write(CPU_EXEC_CTRL0, ctrl_cpu0); >>>> + vmcs_write(MSR_BITMAP, (u64)msr_bitmap); >>>> +} >>> >>> Better safe this function for the test case where you actually stress >>> the bitmap. >> What do you mean by "safe"? > > I meant the other "save": This function serves no purpose here. Let's > only introduce it when that changes, i.e. when you actually test the MSR > bitmap. No, the function is meaningful here. We need directly access to MSRs in guest and if msr bitmap is not set, any access to MSRs will cause vmexit. Here we just let all rdmsr/wrmsr pass in guest. Arthur > > Jan > > -- Arthur Chunqi Li Department of Computer Science School of EECS Peking University Beijing, China -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html