mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
KVM: SVM: Modify 64 bit intercept field to two 32 bit vectors
Convert all the intercepts to one array of 32 bit vectors in vmcb_control_area. This makes it easy for future intercept vector additions. Also update trace functions. Signed-off-by: Babu Moger <babu.moger@amd.com> Reviewed-by: Jim Mattson <jmattson@google.com> Message-Id: <159985250813.11252.5736581193881040525.stgit@bmoger-ubuntu> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
9780d51dc2
commit
c62e2e94b9
@@ -112,8 +112,6 @@ void recalc_intercepts(struct vcpu_svm *svm)
|
||||
for (i = 0; i < MAX_INTERCEPT; i++)
|
||||
c->intercepts[i] = h->intercepts[i];
|
||||
|
||||
c->intercept = h->intercept;
|
||||
|
||||
if (g->int_ctl & V_INTR_MASKING_MASK) {
|
||||
/* We only want the cr8 intercept bits of L1 */
|
||||
vmcb_clr_intercept(c, INTERCEPT_CR8_READ);
|
||||
@@ -124,16 +122,14 @@ void recalc_intercepts(struct vcpu_svm *svm)
|
||||
* affect any interrupt we may want to inject; therefore,
|
||||
* interrupt window vmexits are irrelevant to L0.
|
||||
*/
|
||||
c->intercept &= ~(1ULL << INTERCEPT_VINTR);
|
||||
vmcb_clr_intercept(c, INTERCEPT_VINTR);
|
||||
}
|
||||
|
||||
/* We don't want to see VMMCALLs from a nested guest */
|
||||
c->intercept &= ~(1ULL << INTERCEPT_VMMCALL);
|
||||
vmcb_clr_intercept(c, INTERCEPT_VMMCALL);
|
||||
|
||||
for (i = 0; i < MAX_INTERCEPT; i++)
|
||||
c->intercepts[i] |= g->intercepts[i];
|
||||
|
||||
c->intercept |= g->intercept;
|
||||
}
|
||||
|
||||
static void copy_vmcb_control_area(struct vmcb_control_area *dst,
|
||||
@@ -144,7 +140,6 @@ static void copy_vmcb_control_area(struct vmcb_control_area *dst,
|
||||
for (i = 0; i < MAX_INTERCEPT; i++)
|
||||
dst->intercepts[i] = from->intercepts[i];
|
||||
|
||||
dst->intercept = from->intercept;
|
||||
dst->iopm_base_pa = from->iopm_base_pa;
|
||||
dst->msrpm_base_pa = from->msrpm_base_pa;
|
||||
dst->tsc_offset = from->tsc_offset;
|
||||
@@ -177,7 +172,7 @@ static bool nested_svm_vmrun_msrpm(struct vcpu_svm *svm)
|
||||
*/
|
||||
int i;
|
||||
|
||||
if (!(svm->nested.ctl.intercept & (1ULL << INTERCEPT_MSR_PROT)))
|
||||
if (!(vmcb_is_intercept(&svm->nested.ctl, INTERCEPT_MSR_PROT)))
|
||||
return true;
|
||||
|
||||
for (i = 0; i < MSRPM_OFFSETS; i++) {
|
||||
@@ -203,7 +198,7 @@ static bool nested_svm_vmrun_msrpm(struct vcpu_svm *svm)
|
||||
|
||||
static bool nested_vmcb_check_controls(struct vmcb_control_area *control)
|
||||
{
|
||||
if ((control->intercept & (1ULL << INTERCEPT_VMRUN)) == 0)
|
||||
if ((vmcb_is_intercept(control, INTERCEPT_VMRUN)) == 0)
|
||||
return false;
|
||||
|
||||
if (control->asid == 0)
|
||||
@@ -489,7 +484,8 @@ int nested_svm_vmrun(struct vcpu_svm *svm)
|
||||
trace_kvm_nested_intercepts(vmcb12->control.intercepts[INTERCEPT_CR] & 0xffff,
|
||||
vmcb12->control.intercepts[INTERCEPT_CR] >> 16,
|
||||
vmcb12->control.intercepts[INTERCEPT_EXCEPTION],
|
||||
vmcb12->control.intercept);
|
||||
vmcb12->control.intercepts[INTERCEPT_WORD3],
|
||||
vmcb12->control.intercepts[INTERCEPT_WORD4]);
|
||||
|
||||
/* Clear internal status */
|
||||
kvm_clear_exception_queue(&svm->vcpu);
|
||||
@@ -708,7 +704,7 @@ static int nested_svm_exit_handled_msr(struct vcpu_svm *svm)
|
||||
u32 offset, msr, value;
|
||||
int write, mask;
|
||||
|
||||
if (!(svm->nested.ctl.intercept & (1ULL << INTERCEPT_MSR_PROT)))
|
||||
if (!(vmcb_is_intercept(&svm->nested.ctl, INTERCEPT_MSR_PROT)))
|
||||
return NESTED_EXIT_HOST;
|
||||
|
||||
msr = svm->vcpu.arch.regs[VCPU_REGS_RCX];
|
||||
@@ -735,7 +731,7 @@ static int nested_svm_intercept_ioio(struct vcpu_svm *svm)
|
||||
u8 start_bit;
|
||||
u64 gpa;
|
||||
|
||||
if (!(svm->nested.ctl.intercept & (1ULL << INTERCEPT_IOIO_PROT)))
|
||||
if (!(vmcb_is_intercept(&svm->nested.ctl, INTERCEPT_IOIO_PROT)))
|
||||
return NESTED_EXIT_HOST;
|
||||
|
||||
port = svm->vmcb->control.exit_info_1 >> 16;
|
||||
@@ -789,8 +785,7 @@ static int nested_svm_intercept(struct vcpu_svm *svm)
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
u64 exit_bits = 1ULL << (exit_code - SVM_EXIT_INTR);
|
||||
if (svm->nested.ctl.intercept & exit_bits)
|
||||
if (vmcb_is_intercept(&svm->nested.ctl, exit_code))
|
||||
vmexit = NESTED_EXIT_DONE;
|
||||
}
|
||||
}
|
||||
@@ -898,7 +893,7 @@ static void nested_svm_intr(struct vcpu_svm *svm)
|
||||
|
||||
static inline bool nested_exit_on_init(struct vcpu_svm *svm)
|
||||
{
|
||||
return (svm->nested.ctl.intercept & (1ULL << INTERCEPT_INIT));
|
||||
return vmcb_is_intercept(&svm->nested.ctl, INTERCEPT_INIT);
|
||||
}
|
||||
|
||||
static void nested_svm_init(struct vcpu_svm *svm)
|
||||
|
||||
Reference in New Issue
Block a user