mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 22:02:02 +00:00
KVM: x86: Move XSETBV emulation to common code
Move the entirety of XSETBV emulation to x86.c, and assign the function directly to both VMX's and SVM's exit handlers, i.e. drop the unnecessary trampolines. No functional change intended. Signed-off-by: Sean Christopherson <seanjc@google.com> Message-Id: <20210205005750.3841462-6-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
2ac636a6ea
commit
92f9895c14
4 changed files with 11 additions and 26 deletions
|
@ -1550,7 +1550,7 @@ void kvm_get_dr(struct kvm_vcpu *vcpu, int dr, unsigned long *val);
|
||||||
unsigned long kvm_get_cr8(struct kvm_vcpu *vcpu);
|
unsigned long kvm_get_cr8(struct kvm_vcpu *vcpu);
|
||||||
void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw);
|
void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw);
|
||||||
void kvm_get_cs_db_l_bits(struct kvm_vcpu *vcpu, int *db, int *l);
|
void kvm_get_cs_db_l_bits(struct kvm_vcpu *vcpu, int *db, int *l);
|
||||||
int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr);
|
int kvm_emulate_xsetbv(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr);
|
int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr);
|
||||||
int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr);
|
int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr);
|
||||||
|
|
|
@ -2344,15 +2344,6 @@ static int wbinvd_interception(struct kvm_vcpu *vcpu)
|
||||||
return kvm_emulate_wbinvd(vcpu);
|
return kvm_emulate_wbinvd(vcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int xsetbv_interception(struct kvm_vcpu *vcpu)
|
|
||||||
{
|
|
||||||
u64 new_bv = kvm_read_edx_eax(vcpu);
|
|
||||||
u32 index = kvm_rcx_read(vcpu);
|
|
||||||
|
|
||||||
int err = kvm_set_xcr(vcpu, index, new_bv);
|
|
||||||
return kvm_complete_insn_gp(vcpu, err);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int rdpru_interception(struct kvm_vcpu *vcpu)
|
static int rdpru_interception(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
kvm_queue_exception(vcpu, UD_VECTOR);
|
kvm_queue_exception(vcpu, UD_VECTOR);
|
||||||
|
@ -3154,7 +3145,7 @@ static int (*const svm_exit_handlers[])(struct kvm_vcpu *vcpu) = {
|
||||||
[SVM_EXIT_WBINVD] = wbinvd_interception,
|
[SVM_EXIT_WBINVD] = wbinvd_interception,
|
||||||
[SVM_EXIT_MONITOR] = monitor_interception,
|
[SVM_EXIT_MONITOR] = monitor_interception,
|
||||||
[SVM_EXIT_MWAIT] = mwait_interception,
|
[SVM_EXIT_MWAIT] = mwait_interception,
|
||||||
[SVM_EXIT_XSETBV] = xsetbv_interception,
|
[SVM_EXIT_XSETBV] = kvm_emulate_xsetbv,
|
||||||
[SVM_EXIT_RDPRU] = rdpru_interception,
|
[SVM_EXIT_RDPRU] = rdpru_interception,
|
||||||
[SVM_EXIT_EFER_WRITE_TRAP] = efer_trap,
|
[SVM_EXIT_EFER_WRITE_TRAP] = efer_trap,
|
||||||
[SVM_EXIT_CR0_WRITE_TRAP] = cr_trap,
|
[SVM_EXIT_CR0_WRITE_TRAP] = cr_trap,
|
||||||
|
|
|
@ -5216,15 +5216,6 @@ static int handle_wbinvd(struct kvm_vcpu *vcpu)
|
||||||
return kvm_emulate_wbinvd(vcpu);
|
return kvm_emulate_wbinvd(vcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int handle_xsetbv(struct kvm_vcpu *vcpu)
|
|
||||||
{
|
|
||||||
u64 new_bv = kvm_read_edx_eax(vcpu);
|
|
||||||
u32 index = kvm_rcx_read(vcpu);
|
|
||||||
|
|
||||||
int err = kvm_set_xcr(vcpu, index, new_bv);
|
|
||||||
return kvm_complete_insn_gp(vcpu, err);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int handle_apic_access(struct kvm_vcpu *vcpu)
|
static int handle_apic_access(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
if (likely(fasteoi)) {
|
if (likely(fasteoi)) {
|
||||||
|
@ -5686,7 +5677,7 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = {
|
||||||
[EXIT_REASON_APIC_WRITE] = handle_apic_write,
|
[EXIT_REASON_APIC_WRITE] = handle_apic_write,
|
||||||
[EXIT_REASON_EOI_INDUCED] = handle_apic_eoi_induced,
|
[EXIT_REASON_EOI_INDUCED] = handle_apic_eoi_induced,
|
||||||
[EXIT_REASON_WBINVD] = handle_wbinvd,
|
[EXIT_REASON_WBINVD] = handle_wbinvd,
|
||||||
[EXIT_REASON_XSETBV] = handle_xsetbv,
|
[EXIT_REASON_XSETBV] = kvm_emulate_xsetbv,
|
||||||
[EXIT_REASON_TASK_SWITCH] = handle_task_switch,
|
[EXIT_REASON_TASK_SWITCH] = handle_task_switch,
|
||||||
[EXIT_REASON_MCE_DURING_VMENTRY] = handle_machine_check,
|
[EXIT_REASON_MCE_DURING_VMENTRY] = handle_machine_check,
|
||||||
[EXIT_REASON_GDTR_IDTR] = handle_desc,
|
[EXIT_REASON_GDTR_IDTR] = handle_desc,
|
||||||
|
|
|
@ -985,14 +985,17 @@ static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
|
int kvm_emulate_xsetbv(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
if (static_call(kvm_x86_get_cpl)(vcpu) == 0)
|
if (static_call(kvm_x86_get_cpl)(vcpu) != 0 ||
|
||||||
return __kvm_set_xcr(vcpu, index, xcr);
|
__kvm_set_xcr(vcpu, kvm_rcx_read(vcpu), kvm_read_edx_eax(vcpu))) {
|
||||||
|
kvm_inject_gp(vcpu, 0);
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return kvm_skip_emulated_instruction(vcpu);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_set_xcr);
|
EXPORT_SYMBOL_GPL(kvm_emulate_xsetbv);
|
||||||
|
|
||||||
bool kvm_is_valid_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
bool kvm_is_valid_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue