summaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/svm/svm.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-01-30 13:59:15 +0100
committerLouis Burda <quent.burda@gmail.com>2023-01-30 13:59:15 +0100
commit9b32ccbc6df928ef75e15ee361ff64543ec4df95 (patch)
tree5d8bdfb51e286d9f10b3c4f08be829ff4a629871 /arch/x86/kvm/svm/svm.c
parent396b02778d5c007554adf93433588632ea89267d (diff)
downloadcachepc-linux-9b32ccbc6df928ef75e15ee361ff64543ec4df95.tar.gz
cachepc-linux-9b32ccbc6df928ef75e15ee361ff64543ec4df95.zip
Combine TRACK_STEPS_* modes
Diffstat (limited to 'arch/x86/kvm/svm/svm.c')
-rw-r--r--arch/x86/kvm/svm/svm.c45
1 files changed, 20 insertions, 25 deletions
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index 0bef86c8a38c..88b36da13a60 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -2114,6 +2114,7 @@ static int intr_interception(struct kvm_vcpu *vcpu)
struct vmcb_control_area *control;
struct vcpu_svm *svm;
struct cpc_fault *fault, *next;
+ uint64_t inst_gfn;
bool inst_gfn_seen;
size_t count;
@@ -2190,41 +2191,35 @@ static int intr_interception(struct kvm_vcpu *vcpu)
}
break;
case CPC_TRACK_STEPS:
- list_for_each_entry_safe(fault, next, &cpc_faults, list) {
- cpc_track_single(vcpu, fault->gfn, KVM_PAGE_TRACK_EXEC);
- list_del(&fault->list);
- kfree(fault);
- }
- cpc_singlestep_reset = true;
- break;
- case CPC_TRACK_STEPS_AND_FAULTS:
inst_gfn_seen = false;
list_for_each_entry_safe(fault, next, &cpc_faults, list) {
- if (!inst_gfn_seen && (fault->err & PFERR_FETCH_MASK))
+ if (!inst_gfn_seen && (fault->err & PFERR_FETCH_MASK)) {
+ inst_gfn = fault->gfn;
inst_gfn_seen = true;
- if (!inst_gfn_seen) {
+ }
+ if (!inst_gfn_seen && cpc_track_steps.use_filter) {
list_del(&fault->list);
kfree(fault);
- } else {
- cpc_track_single(vcpu, fault->gfn,
- KVM_PAGE_TRACK_ACCESS);
}
}
- cpc_send_track_step_event(&cpc_faults);
- cpc_singlestep_reset = true;
- break;
- case CPC_TRACK_STEPS_SIGNALLED:
- if (cpc_track_steps_signalled.enabled
- && cpc_track_steps_signalled.target_avail) {
- cpc_send_track_step_event_single(
- cpc_track_steps_signalled.target_gfn,
- 0, cpc_retinst);
- cpc_track_single(vcpu,
- cpc_track_steps_signalled.target_gfn,
- KVM_PAGE_TRACK_EXEC);
+ WARN_ON(!inst_gfn_seen);
+ if (cpc_track_steps.use_target &&
+ inst_gfn != cpc_track_steps.target_gfn) {
+ cpc_track_steps.stepping = false;
cpc_prime_probe = false;
cpc_singlestep = false;
}
+ if (cpc_track_steps.stepping)
+ cpc_send_track_step_event(&cpc_faults);
+ list_for_each_entry_safe(fault, next, &cpc_faults, list) {
+ if (cpc_track_steps.with_data && cpc_track_steps.stepping)
+ cpc_track_single(vcpu, fault->gfn, KVM_PAGE_TRACK_ACCESS);
+ else
+ cpc_track_single(vcpu, fault->gfn, KVM_PAGE_TRACK_EXEC);
+ list_del(&fault->list);
+ kfree(fault);
+ }
+ cpc_singlestep_reset = true;
break;
}