标题说我陷入了问题。我希望通过添加
在VMM中执行此操作 setup_vmcs_config 函数中的vmx.c(arch / x86 / kvm)中的 CPU_BASED_RDTSC_EXITING 标志,以及然后自己处理vm_exit(参考:mail list)。问题是我不能
判断rdtsc的vm_exit是由guest虚拟机内核还是guest虚拟机vm用户引起的
空间应用,后者是我想要拦截的。我试图搜索
通过qemu-kvm-1.2.0 src找到其他拦截rdtsc指令的方法,我发现
在target-i386 / translate.c中的rdtsc线索。我在那里添加了一个printf,但我什么都没有。所以我
想知道是否有人可以给我一些指导来突破。非常感谢〜
答案 0 :(得分:1)
经过一些实验,我几乎找到了自己问题的答案。参见下面的代码:
static int handle_rdtsc(struct kvm_vcpu *vcpu)
{
u64 data;
if (vmx_get_msr(vcpu, MSR_IA32_TSC, &data)) {
kvm_inject_gp(vcpu, 0);
printk("wsh_handle_rdtsc_return\n");
return 1;
}
vcpu->run->exit_reason = 20;
vcpu->arch.regs[VCPU_REGS_RAX] = data & -1u;
vcpu->arch.regs[VCPU_REGS_RDX] = (data >> 32) & -1u;
skip_emulated_instruction(vcpu);
if(vmx_get_cpl(vcpu)>0)
{
printk("wsh_handle_rdtsc,cpl:%d\n",vmx_get_cpl(vcpu));
}
return 1;
}
正如您在上面所看到的,我使用vmx_get_cpl来过滤由客户内核引起的rdtsc vm_exit,事实上,printk总是打印3,因为guest vm应用程序的privellege级别始终是3.欢迎任何更正!