diff options
| author | Louis Burda <quent.burda@gmail.com> | 2022-11-28 03:24:19 +0100 |
|---|---|---|
| committer | Louis Burda <quent.burda@gmail.com> | 2022-11-28 03:24:19 +0100 |
| commit | 7f1da6e8d8fa76dfad3582ffb621e2f6683cabd7 (patch) | |
| tree | f8195277300f9cfd4a4024daf06b4071cf418ceb /patch.diff | |
| parent | 0bdf830ba840ce53cb1362acbf71965cd80e9397 (diff) | |
| download | cachepc-7f1da6e8d8fa76dfad3582ffb621e2f6683cabd7.tar.gz cachepc-7f1da6e8d8fa76dfad3582ffb621e2f6683cabd7.zip | |
Attempt to temporarily map vmsa page as shared
Diffstat (limited to 'patch.diff')
| -rwxr-xr-x | patch.diff | 46 |
1 files changed, 31 insertions, 15 deletions
@@ -467,7 +467,7 @@ index a4f6d10b0ef3..0c5aae1de162 100644 case SVM_EXIT_RDTSCP: break; diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c -index cf0bf456d520..ff84cedfefd0 100644 +index cf0bf456d520..d915c8a3aff7 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -2,6 +2,10 @@ @@ -510,10 +510,10 @@ index cf0bf456d520..ff84cedfefd0 100644 + if (cachepc_track_mode == CPC_TRACK_DATA_ACCESS && cachepc_single_step) { + svm = to_svm(vcpu); + -+ if (svm->sev_es.vmsa->rip == cachepc_prev_rip) { -+ cachepc_apic_timer += 1; -+ return 1; -+ } ++ // if (svm->sev_es.vmsa->rip == cachepc_prev_rip) { ++ // cachepc_apic_timer += 1; ++ // return 1; ++ // } + + cachepc_single_step = false; + @@ -582,20 +582,32 @@ index cf0bf456d520..ff84cedfefd0 100644 #ifdef CONFIG_RETPOLINE if (exit_code == SVM_EXIT_MSR) return msr_interception(vcpu); -@@ -3788,14 +3861,42 @@ static noinstr void svm_vcpu_enter_exit(struct kvm_vcpu *vcpu) +@@ -3788,14 +3861,58 @@ static noinstr void svm_vcpu_enter_exit(struct kvm_vcpu *vcpu) { struct vcpu_svm *svm = to_svm(vcpu); unsigned long vmcb_pa = svm->current_vmcb->pa; -+ int cpu; ++ int cpu, ret; ++ u64 pfn; guest_state_enter_irqoff(); -+ if (cachepc_apic_timer == 0) { -+ cachepc_prev_rip = svm->sev_es.vmsa->rip; -+ cachepc_apic_timer = 100; -+ } -+ if (sev_es_guest(vcpu->kvm)) { ++ if (cachepc_single_step && cachepc_apic_timer == 0) { ++ pfn = __pa(svm->sev_es.vmsa) >> PAGE_SHIFT; ++ ++ cachepc_apic_timer = 100; ++ ++ ret = rmp_make_shared(pfn, PG_LEVEL_4K); ++ if (!ret) { ++ CPC_DBG("VMSA %p\n", svm->sev_es.vmsa); ++ CPC_DBG("RIP %llu\n", svm->sev_es.vmsa->rip); ++ cachepc_prev_rip = svm->sev_es.vmsa->rip; ++ ++ ret = rmp_make_private(pfn, -1, PG_LEVEL_4K, svm->asid, true); ++ if (ret) CPC_ERR("Could not make VMSA private again\n"); ++ } ++ } ++ + cpu = get_cpu(); + // local_irq_disable(); + WARN_ON(cpu != 2); @@ -615,6 +627,10 @@ index cf0bf456d520..ff84cedfefd0 100644 } else { struct svm_cpu_data *sd = per_cpu(svm_data, vcpu->cpu); ++ if (cachepc_apic_timer == 0) { ++ cachepc_apic_timer = 100; ++ } ++ + cpu = get_cpu(); + // local_irq_disable(); + WARN_ON(cpu != 2); @@ -625,7 +641,7 @@ index cf0bf456d520..ff84cedfefd0 100644 /* * Use a single vmcb (vmcb01 because it's always valid) for * context switching guest state via VMLOAD/VMSAVE, that way -@@ -3806,7 +3907,15 @@ static noinstr void svm_vcpu_enter_exit(struct kvm_vcpu *vcpu) +@@ -3806,7 +3923,15 @@ static noinstr void svm_vcpu_enter_exit(struct kvm_vcpu *vcpu) __svm_vcpu_run(vmcb_pa, (unsigned long *)&vcpu->arch.regs); vmsave(svm->vmcb01.pa); @@ -774,7 +790,7 @@ index dfaeb47fcf2a..0626f3fdddfd 100644 2: cli diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c -index d9adf79124f9..fc64f9b7614d 100644 +index d9adf79124f9..dfe54e6ca5cc 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -82,6 +82,10 @@ @@ -809,7 +825,7 @@ index d9adf79124f9..fc64f9b7614d 100644 } + case KVM_HC_CPC_VMMCALL: + CPC_WARN("Cachepc: Hypecrcall Run\n"); -+ cachepc_send_cpuid_event(a0, a1); ++ cachepc_send_guest_event(a0, a1); + ret = 0; + break; default: |
