summaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/svm/svm.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-01-26 04:20:22 +0100
committerLouis Burda <quent.burda@gmail.com>2023-01-26 04:20:42 +0100
commit6cf18b1b9cfdea49213682851e4c0560af6fd4dd (patch)
treee7470c4a3b172d4cf52ccde57f1591fba0f779e2 /arch/x86/kvm/svm/svm.c
parenteb72c0f78ddce1c340f2407a6f1fbcd511a05bb5 (diff)
downloadcachepc-linux-6cf18b1b9cfdea49213682851e4c0560af6fd4dd.tar.gz
cachepc-linux-6cf18b1b9cfdea49213682851e4c0560af6fd4dd.zip
Add signalled stepping track mode
Diffstat (limited to 'arch/x86/kvm/svm/svm.c')
-rw-r--r--arch/x86/kvm/svm/svm.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index 9ebb60f590e5..79a83b65c979 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -2175,20 +2175,24 @@ static int intr_interception(struct kvm_vcpu *vcpu)
count += 1;
CPC_INFO("Caught single step with %lu faults!\n", count);
- if (cachepc_track_mode == CPC_TRACK_EXEC) {
+ switch (cachepc_track_mode) {
+ case CPC_TRACK_PAGES:
list_for_each_entry_safe(fault, next, &cachepc_faults, list) {
cachepc_track_single(vcpu, fault->gfn, KVM_PAGE_TRACK_EXEC);
list_del(&fault->list);
kfree(fault);
}
cachepc_singlestep = false;
- } else if (cachepc_track_mode == CPC_TRACK_FULL) {
+ break;
+ case CPC_TRACK_STEPS:
+ case CPC_TRACK_STEPS_SIGNALLED:
list_for_each_entry(fault, &cachepc_faults, list) {
cachepc_track_single(vcpu, fault->gfn,
KVM_PAGE_TRACK_ACCESS);
}
cachepc_send_track_step_event(&cachepc_faults);
+ break;
}
cachepc_apic_timer -= 50 * CPC_APIC_TIMER_SOFTDIV;
@@ -3934,7 +3938,11 @@ static noinstr void svm_vcpu_enter_exit(struct kvm_vcpu *vcpu)
cachepc_retinst = 0;
if (cachepc_singlestep_reset) {
- cachepc_apic_timer = 100 * CPC_APIC_TIMER_SOFTDIV;
+ if (cachepc_apic_timer) {
+ cachepc_apic_timer -= 50 * CPC_APIC_TIMER_SOFTDIV;
+ } else {
+ cachepc_apic_timer = 100 * CPC_APIC_TIMER_SOFTDIV;
+ }
cachepc_rip_prev_set = false;
cachepc_singlestep = true;
cachepc_singlestep_reset = false;
@@ -3972,11 +3980,12 @@ static noinstr void svm_vcpu_enter_exit(struct kvm_vcpu *vcpu)
cachepc_retinst = cachepc_read_pmc(CPC_RETINST_PMC) - cachepc_retinst;
- cachepc_save_msrmts(cachepc_ds);
+ if (cachepc_prime_probe)
+ cachepc_save_msrmts(cachepc_ds);
cachepc_apic_oneshot = false;
- if (cachepc_track_mode == CPC_TRACK_EXEC)
+ if (cachepc_track_mode == CPC_TRACK_PAGES)
cachepc_track_exec.retinst += cachepc_retinst;
if (!cachepc_singlestep)