summaryrefslogtreecommitdiffstats
path: root/patch.diff
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2022-11-28 03:24:19 +0100
committerLouis Burda <quent.burda@gmail.com>2022-11-28 03:24:19 +0100
commit7f1da6e8d8fa76dfad3582ffb621e2f6683cabd7 (patch)
treef8195277300f9cfd4a4024daf06b4071cf418ceb /patch.diff
parent0bdf830ba840ce53cb1362acbf71965cd80e9397 (diff)
downloadcachepc-7f1da6e8d8fa76dfad3582ffb621e2f6683cabd7.tar.gz
cachepc-7f1da6e8d8fa76dfad3582ffb621e2f6683cabd7.zip
Attempt to temporarily map vmsa page as shared
Diffstat (limited to 'patch.diff')
-rwxr-xr-xpatch.diff46
1 files changed, 31 insertions, 15 deletions
diff --git a/patch.diff b/patch.diff
index e5082e8..13fec5e 100755
--- a/patch.diff
+++ b/patch.diff
@@ -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: