2

正如标题所说,我陷入了这个问题。我想在 VMM 中通过添加

setup_vmcs_config中 vmx.c(arch/x86/kvm) 中的CPU_BASED_RDTSC_EXITING标志标志,以及

然后自己处理 vm_exit(参考:邮件列表)。问题是我不能

判断rdtsc的vm_exit是guest内核还是guest vm用户引起的

空间应用,后一个正是我想要拦截的。我试图搜索

通过qemu-kvm-1.2.0 src找其他方法拦截rdtsc指令,我发现

target-i386/translate.c 中的 rdtsc 线索。我在那里添加了一个 printf,但我什么也没得到。所以我

不知道有没有人可以给我一些突破的指导。非常感谢~

4

1 回答 1

3

经过一些实验,我几乎找到了自己问题的答案。请参见下面的代码:

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来过滤那些由guest内核引起的rdtsc vm_exit,事实上,printk总是打印3,因为guest vm应用程序的privellege级别总是3。欢迎任何更正!

于 2014-09-10T03:16:37.297 回答