一、 如何检测是否支持IPI Virtualization
如果CPU支持IPI虚拟化,则会设置IA32_VMX_PROCBASED_CTLS3 MSR(492H)的bit4,通过RDMSR读取这个MSR的值,并检测bit4是否为1来判断,为1则支持。
示例:
static void init_vmx_tertiary_capabilities(u16 cpu_index)
{
struct extra_cpuinfo_x86 *e = &extra_cpu_data(cpu_index);
u32 low, high;
/* All 64 bits of tertiary controls MSR are allowed-1 settings. */
rdmsr_safe(MSR_IA32_VMX_PROCBASED_CTLS3, &low, &high);
e->vmx_tertiary_capability[TERTIARY_CTLS_LOW] = low;
e->vmx_tertiary_capability[TERTIARY_CTLS_HIGH] = high;
}
二、 IPI Virtualization如何使用
在IPI虚拟化的实现代码中,增加了一个kmv-intel.ko的模块参数enable_ipiv,此参数默认为true(即在kvm层面使能ipi虚拟化,最终是否使用此功能还要看cpu是否支持)。
在使能了IPI虚拟化的场景下,会设置VMCS中的MSR bitmap, 设置虚拟机读写ICR不退出。
同时在初始化VMCS时,也会初始化两个重要的数据结构PID_POINTER_TABLE, LAST_PID_POINTER_INDEX。