diff options
| author | Louis Burda <quent.burda@gmail.com> | 2023-01-30 13:59:15 +0100 |
|---|---|---|
| committer | Louis Burda <quent.burda@gmail.com> | 2023-01-30 13:59:15 +0100 |
| commit | 9b32ccbc6df928ef75e15ee361ff64543ec4df95 (patch) | |
| tree | 5d8bdfb51e286d9f10b3c4f08be829ff4a629871 /arch/x86/kvm/svm/svm.c | |
| parent | 396b02778d5c007554adf93433588632ea89267d (diff) | |
| download | cachepc-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.c | 45 |
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; } |
