【问题标题】:Intercept rdtsc instruction from guest vm userspace in KVM拦截来自 KVM 中来宾 vm 用户空间的 rdtsc 指令
【发布时间】:2023-04-04 08:00:01
【问题描述】:

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

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

然后自己处理vm_exit(参考this:mail list)。问题是我不能

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

空间应用,后一个正是我要拦截的。我已经尝试搜索了

通过qemu-kvm-1.2.0 src寻找其他拦截rdtsc指令的方法,我找到了

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

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

【问题讨论】:

    标签: intel kvm hypervisor tsc rdtsc


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

    【讨论】:

    • 非常好 - 有用吗?您是否尝试调试 rdtsc 的延迟?我问,因为我也在做同样的事情
    猜你喜欢
    • 2012-05-14
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多