拦截来自KVM中来宾vm用户空间的rdtsc指令

时间:2014-09-06 01:43:30

标签: intel kvm hypervisor tsc rdtsc

标题说我陷入了问题。我希望通过添加

在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,但我什么都没有。所以我

想知道是否有人可以给我一些指导来突破。非常感谢〜

1 个答案:

答案 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.欢迎任何更正!