static void vmx_cpu_skillz() { rd_msr_ia32_mtrr_def(info->vm.mtrr_def); rd_msr_ia32_mtrr_cap(info->vm.mtrr_cap); if(cpuid_ext_highest() < CPUID_MAX_ADDR) info->vm.max_paddr = (1ULL<<36) - 1; else info->vm.max_paddr = cpuid_max_paddr(); info->vm.cpu.skillz.pg_2M = info->vm.vmx_ept_cap.pg_2m; info->vm.cpu.skillz.pg_1G = info->vm.vmx_ept_cap.pg_1g; if(info->vm.vmx_ept_cap.invvpid_s && info->vm.vmx_ept_cap.invvpid_r) { info->vm.cpu.skillz.flush_tlb = VMCS_VPID_INV_SINGLE; info->vm.cpu.skillz.flush_tlb_glb = VMCS_VPID_INV_SINGLE_ALL; } else if(info->vm.vmx_ept_cap.invvpid_a) { info->vm.cpu.skillz.flush_tlb = VMCS_VPID_INV_ALL; info->vm.cpu.skillz.flush_tlb_glb = VMCS_VPID_INV_ALL; } else panic("no valid invvpid type found"); debug(VMX_CPU, "vm 1GB pages support: %s\n" "vm 2MB pages support: %s\n" "vm max physical addr: 0x%X\n" ,info->vm.cpu.skillz.pg_1G?"yes":"no" ,info->vm.cpu.skillz.pg_2M?"yes":"no" ,info->vm.max_paddr); }
static void vmx_cpu_skillz() { rd_msr_ia32_mtrr_def(info->vm.mtrr_def); rd_msr_ia32_mtrr_cap(info->vm.mtrr_cap); info->vm.cpu.skillz.pg_2M = info->vm.vmx_ept_cap.pg_2m; info->vm.cpu.skillz.pg_1G = info->vm.vmx_ept_cap.pg_1g; #ifdef CONFIG_VMX_FEAT_VPID if(info->vm.vmx_ept_cap.invvpid_s && info->vm.vmx_ept_cap.invvpid_r) { info->vm.cpu.skillz.flush_tlb = VMCS_VPID_INV_SINGLE; info->vm.cpu.skillz.flush_tlb_glb = VMCS_VPID_INV_SINGLE_ALL; } else if(info->vm.vmx_ept_cap.invvpid_a) { info->vm.cpu.skillz.flush_tlb = VMCS_VPID_INV_ALL; info->vm.cpu.skillz.flush_tlb_glb = VMCS_VPID_INV_ALL; } else panic("no valid invvpid type found"); #endif debug(VMX_CPU, "\n- vm cpu features\n" "1GB pages support : %s\n" "2MB pages support : %s\n" "max physical addr : 0x%X\n" "max linear addr : 0x%X\n" "mtrr variable count : %d\n" ,info->vm.cpu.skillz.pg_1G?"yes":"no" ,info->vm.cpu.skillz.pg_2M?"yes":"no" ,info->vm.cpu.max_paddr, info->vm.cpu.max_vaddr ,info->vm.mtrr_cap.vcnt); }