From fc56578682aaeff18773c3c65ea6cdaa1bb44d92 Mon Sep 17 00:00:00 2001 From: Gregory Lirent Date: Sat, 3 Aug 2024 21:05:54 +0300 Subject: [PATCH] Fix rdtsc patch --- patches/9999-rdtsc-hook.patch | 64 +++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 patches/9999-rdtsc-hook.patch diff --git a/patches/9999-rdtsc-hook.patch b/patches/9999-rdtsc-hook.patch new file mode 100644 index 0000000..a2313c6 --- /dev/null +++ b/patches/9999-rdtsc-hook.patch @@ -0,0 +1,64 @@ +diff -Naur --no-dereference a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c +--- a/arch/x86/kvm/vmx/vmx.c 2024-07-01 21:03:34.000000000 +0300 ++++ b/arch/x86/kvm/vmx/vmx.c 2024-07-01 20:24:05.000000000 +0300 +@@ -2714,6 +2714,7 @@ + vmcs_conf->pin_based_exec_ctrl = _pin_based_exec_control; + vmcs_conf->cpu_based_exec_ctrl = _cpu_based_exec_control; + vmcs_conf->cpu_based_2nd_exec_ctrl = _cpu_based_2nd_exec_control; + vmcs_conf->cpu_based_3rd_exec_ctrl = _cpu_based_3rd_exec_control; +- vmcs_conf->vmexit_ctrl = _vmexit_control; ++ vmcs_conf->vmexit_ctrl = _vmexit_control | CPU_BASED_RDTSC_EXITING; + vmcs_conf->vmentry_ctrl = _vmentry_control; + vmcs_conf->misc = misc_msr; +diff -Naur --no-dereference a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c +--- a/arch/x86/kvm/vmx/vmx.c 2024-07-01 21:03:34.000000000 +0300 ++++ b/arch/x86/kvm/vmx/vmx.c 2024-07-01 20:24:05.000000000 +0300 +@@ -6128,6 +6128,7 @@ + [EXIT_REASON_ENCLS] = handle_encls, + [EXIT_REASON_BUS_LOCK] = handle_bus_lock_vmexit, + [EXIT_REASON_NOTIFY] = handle_notify, ++ [EXIT_REASON_RDTSC] = handle_rdtsc, + }; + + static const int kvm_vmx_max_exit_handlers = + +diff -Naur --no-dereference a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c +--- a/arch/x86/kvm/vmx/vmx.c 2024-07-01 21:03:34.000000000 +0300 ++++ b/arch/x86/kvm/vmx/vmx.c 2024-07-01 20:24:05.000000000 +0300 +@@ -6070,6 +6070,36 @@ + return 1; + } + ++static int handle_rdtsc(struct kvm_vcpu *vcpu) ++{ ++ static u32 _ = 1; ++ static u64 rdtsc_cur = 0; ++ static u64 rdtsc_prev = 0; ++ u64 _rdtsc = rdtsc(); ++ ++ printk_once("[HookEntry] fake rdtsc vmx function is working\n"); ++ ++ if (_) ++ { ++ rdtsc_cur = _rdtsc; ++ _ = 0; ++ } ++ if (rdtsc_prev != 0 && _rdtsc > rdtsc_prev) ++ { ++ rdtsc_cur += (_rdtsc - rdtsc_prev) / 16; ++ } ++ ++ if (rdtsc_cur > _rdtsc) ++ { ++ rdtsc_cur = _rdtsc; ++ } ++ ++ rdtsc_prev = rdtsc_cur; ++ vcpu->arch.regs[VCPU_REGS_RAX] = rdtsc_cur & -1u; ++ vcpu->arch.regs[VCPU_REGS_RDX] = (rdtsc_cur >> 32) & -1u; ++ return skip_emulated_instruction(vcpu); ++} ++ + /* + * The exit handlers return 1 if the exit was handled fully and guest execution + * may resume. Otherwise they set the kvm_run parameter to indicate what needs