Commit 03bfeeb9 authored by Babu Moger's avatar Babu Moger Committed by Paolo Bonzini

KVM: SVM: Change intercept_cr to generic intercepts

Change intercept_cr to generic intercepts in vmcb_control_area.
Use the new vmcb_set_intercept, vmcb_clr_intercept and vmcb_is_intercept
where applicable.
Signed-off-by: default avatarBabu Moger <babu.moger@amd.com>
Reviewed-by: default avatarJim Mattson <jmattson@google.com>
Message-Id: <159985248506.11252.9081085950784508671.stgit@bmoger-ubuntu>
[Change constant names. - Paolo]
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent c45ad722
...@@ -10,9 +10,22 @@ ...@@ -10,9 +10,22 @@
*/ */
enum intercept_words { enum intercept_words {
INTERCEPT_CR = 0,
MAX_INTERCEPT, MAX_INTERCEPT,
}; };
enum {
/* Byte offset 000h (word 0) */
INTERCEPT_CR0_READ = 0,
INTERCEPT_CR3_READ = 3,
INTERCEPT_CR4_READ = 4,
INTERCEPT_CR8_READ = 8,
INTERCEPT_CR0_WRITE = 16,
INTERCEPT_CR3_WRITE = 16 + 3,
INTERCEPT_CR4_WRITE = 16 + 4,
INTERCEPT_CR8_WRITE = 16 + 8,
};
enum { enum {
INTERCEPT_INTR, INTERCEPT_INTR,
INTERCEPT_NMI, INTERCEPT_NMI,
...@@ -66,7 +79,6 @@ enum { ...@@ -66,7 +79,6 @@ enum {
struct __attribute__ ((__packed__)) vmcb_control_area { struct __attribute__ ((__packed__)) vmcb_control_area {
u32 intercepts[MAX_INTERCEPT]; u32 intercepts[MAX_INTERCEPT];
u32 intercept_cr;
u32 intercept_dr; u32 intercept_dr;
u32 intercept_exceptions; u32 intercept_exceptions;
u64 intercept; u64 intercept;
...@@ -296,15 +308,6 @@ struct vmcb { ...@@ -296,15 +308,6 @@ struct vmcb {
#define SVM_SELECTOR_READ_MASK SVM_SELECTOR_WRITE_MASK #define SVM_SELECTOR_READ_MASK SVM_SELECTOR_WRITE_MASK
#define SVM_SELECTOR_CODE_MASK (1 << 3) #define SVM_SELECTOR_CODE_MASK (1 << 3)
#define INTERCEPT_CR0_READ 0
#define INTERCEPT_CR3_READ 3
#define INTERCEPT_CR4_READ 4
#define INTERCEPT_CR8_READ 8
#define INTERCEPT_CR0_WRITE (16 + 0)
#define INTERCEPT_CR3_WRITE (16 + 3)
#define INTERCEPT_CR4_WRITE (16 + 4)
#define INTERCEPT_CR8_WRITE (16 + 8)
#define INTERCEPT_DR0_READ 0 #define INTERCEPT_DR0_READ 0
#define INTERCEPT_DR1_READ 1 #define INTERCEPT_DR1_READ 1
#define INTERCEPT_DR2_READ 2 #define INTERCEPT_DR2_READ 2
......
...@@ -112,15 +112,14 @@ void recalc_intercepts(struct vcpu_svm *svm) ...@@ -112,15 +112,14 @@ void recalc_intercepts(struct vcpu_svm *svm)
for (i = 0; i < MAX_INTERCEPT; i++) for (i = 0; i < MAX_INTERCEPT; i++)
c->intercepts[i] = h->intercepts[i]; c->intercepts[i] = h->intercepts[i];
c->intercept_cr = h->intercept_cr;
c->intercept_dr = h->intercept_dr; c->intercept_dr = h->intercept_dr;
c->intercept_exceptions = h->intercept_exceptions; c->intercept_exceptions = h->intercept_exceptions;
c->intercept = h->intercept; c->intercept = h->intercept;
if (g->int_ctl & V_INTR_MASKING_MASK) { if (g->int_ctl & V_INTR_MASKING_MASK) {
/* We only want the cr8 intercept bits of L1 */ /* We only want the cr8 intercept bits of L1 */
c->intercept_cr &= ~(1U << INTERCEPT_CR8_READ); vmcb_clr_intercept(c, INTERCEPT_CR8_READ);
c->intercept_cr &= ~(1U << INTERCEPT_CR8_WRITE); vmcb_clr_intercept(c, INTERCEPT_CR8_WRITE);
/* /*
* Once running L2 with HF_VINTR_MASK, EFLAGS.IF does not * Once running L2 with HF_VINTR_MASK, EFLAGS.IF does not
...@@ -136,7 +135,6 @@ void recalc_intercepts(struct vcpu_svm *svm) ...@@ -136,7 +135,6 @@ void recalc_intercepts(struct vcpu_svm *svm)
for (i = 0; i < MAX_INTERCEPT; i++) for (i = 0; i < MAX_INTERCEPT; i++)
c->intercepts[i] |= g->intercepts[i]; c->intercepts[i] |= g->intercepts[i];
c->intercept_cr |= g->intercept_cr;
c->intercept_dr |= g->intercept_dr; c->intercept_dr |= g->intercept_dr;
c->intercept_exceptions |= g->intercept_exceptions; c->intercept_exceptions |= g->intercept_exceptions;
c->intercept |= g->intercept; c->intercept |= g->intercept;
...@@ -150,7 +148,6 @@ static void copy_vmcb_control_area(struct vmcb_control_area *dst, ...@@ -150,7 +148,6 @@ static void copy_vmcb_control_area(struct vmcb_control_area *dst,
for (i = 0; i < MAX_INTERCEPT; i++) for (i = 0; i < MAX_INTERCEPT; i++)
dst->intercepts[i] = from->intercepts[i]; dst->intercepts[i] = from->intercepts[i];
dst->intercept_cr = from->intercept_cr;
dst->intercept_dr = from->intercept_dr; dst->intercept_dr = from->intercept_dr;
dst->intercept_exceptions = from->intercept_exceptions; dst->intercept_exceptions = from->intercept_exceptions;
dst->intercept = from->intercept; dst->intercept = from->intercept;
...@@ -495,8 +492,8 @@ int nested_svm_vmrun(struct vcpu_svm *svm) ...@@ -495,8 +492,8 @@ int nested_svm_vmrun(struct vcpu_svm *svm)
vmcb12->control.event_inj, vmcb12->control.event_inj,
vmcb12->control.nested_ctl); vmcb12->control.nested_ctl);
trace_kvm_nested_intercepts(vmcb12->control.intercept_cr & 0xffff, trace_kvm_nested_intercepts(vmcb12->control.intercepts[INTERCEPT_CR] & 0xffff,
vmcb12->control.intercept_cr >> 16, vmcb12->control.intercepts[INTERCEPT_CR] >> 16,
vmcb12->control.intercept_exceptions, vmcb12->control.intercept_exceptions,
vmcb12->control.intercept); vmcb12->control.intercept);
...@@ -775,8 +772,7 @@ static int nested_svm_intercept(struct vcpu_svm *svm) ...@@ -775,8 +772,7 @@ static int nested_svm_intercept(struct vcpu_svm *svm)
vmexit = nested_svm_intercept_ioio(svm); vmexit = nested_svm_intercept_ioio(svm);
break; break;
case SVM_EXIT_READ_CR0 ... SVM_EXIT_WRITE_CR8: { case SVM_EXIT_READ_CR0 ... SVM_EXIT_WRITE_CR8: {
u32 bit = 1U << (exit_code - SVM_EXIT_READ_CR0); if (vmcb_is_intercept(&svm->nested.ctl, exit_code))
if (svm->nested.ctl.intercept_cr & bit)
vmexit = NESTED_EXIT_DONE; vmexit = NESTED_EXIT_DONE;
break; break;
} }
......
...@@ -2812,8 +2812,8 @@ static void dump_vmcb(struct kvm_vcpu *vcpu) ...@@ -2812,8 +2812,8 @@ static void dump_vmcb(struct kvm_vcpu *vcpu)
} }
pr_err("VMCB Control Area:\n"); pr_err("VMCB Control Area:\n");
pr_err("%-20s%04x\n", "cr_read:", control->intercept_cr & 0xffff); pr_err("%-20s%04x\n", "cr_read:", control->intercepts[INTERCEPT_CR] & 0xffff);
pr_err("%-20s%04x\n", "cr_write:", control->intercept_cr >> 16); pr_err("%-20s%04x\n", "cr_write:", control->intercepts[INTERCEPT_CR] >> 16);
pr_err("%-20s%04x\n", "dr_read:", control->intercept_dr & 0xffff); pr_err("%-20s%04x\n", "dr_read:", control->intercept_dr & 0xffff);
pr_err("%-20s%04x\n", "dr_write:", control->intercept_dr >> 16); pr_err("%-20s%04x\n", "dr_write:", control->intercept_dr >> 16);
pr_err("%-20s%08x\n", "exceptions:", control->intercept_exceptions); pr_err("%-20s%08x\n", "exceptions:", control->intercept_exceptions);
......
...@@ -235,7 +235,7 @@ static inline void set_cr_intercept(struct vcpu_svm *svm, int bit) ...@@ -235,7 +235,7 @@ static inline void set_cr_intercept(struct vcpu_svm *svm, int bit)
{ {
struct vmcb *vmcb = get_host_vmcb(svm); struct vmcb *vmcb = get_host_vmcb(svm);
vmcb->control.intercept_cr |= (1U << bit); vmcb_set_intercept(&vmcb->control, bit);
recalc_intercepts(svm); recalc_intercepts(svm);
} }
...@@ -244,7 +244,7 @@ static inline void clr_cr_intercept(struct vcpu_svm *svm, int bit) ...@@ -244,7 +244,7 @@ static inline void clr_cr_intercept(struct vcpu_svm *svm, int bit)
{ {
struct vmcb *vmcb = get_host_vmcb(svm); struct vmcb *vmcb = get_host_vmcb(svm);
vmcb->control.intercept_cr &= ~(1U << bit); vmcb_clr_intercept(&vmcb->control, bit);
recalc_intercepts(svm); recalc_intercepts(svm);
} }
...@@ -253,7 +253,7 @@ static inline bool is_cr_intercept(struct vcpu_svm *svm, int bit) ...@@ -253,7 +253,7 @@ static inline bool is_cr_intercept(struct vcpu_svm *svm, int bit)
{ {
struct vmcb *vmcb = get_host_vmcb(svm); struct vmcb *vmcb = get_host_vmcb(svm);
return vmcb->control.intercept_cr & (1U << bit); return vmcb_is_intercept(&vmcb->control, bit);
} }
static inline void set_dr_intercepts(struct vcpu_svm *svm) static inline void set_dr_intercepts(struct vcpu_svm *svm)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment