[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20190204144128.9489-4-suravee.suthikulpanit@amd.com>
Date: Mon, 4 Feb 2019 14:42:08 +0000
From: "Suthikulpanit, Suravee" <Suravee.Suthikulpanit@....com>
To: "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
"kvm@...r.kernel.org" <kvm@...r.kernel.org>,
"x86@...nel.org" <x86@...nel.org>
CC: "joro@...tes.org" <joro@...tes.org>,
"rkrcmar@...hat.com" <rkrcmar@...hat.com>,
"pbonzini@...hat.com" <pbonzini@...hat.com>,
"tglx@...utronix.de" <tglx@...utronix.de>,
"mingo@...hat.com" <mingo@...hat.com>,
"bp@...en8.de" <bp@...en8.de>, "hpa@...or.com" <hpa@...or.com>,
"jsteckli@...zon.de" <jsteckli@...zon.de>,
"sironi@...zon.de" <sironi@...zon.de>,
"wawei@...zon.de" <wawei@...zon.de>,
"Suthikulpanit, Suravee" <Suravee.Suthikulpanit@....com>
Subject: [RFC PATCH 3/8] KVM: x86: Add callback functions for handling APIC
ID, DFR and LDR update
Add hooks for handling the case when guest VM update APIC ID, DFR and LDR.
This is needed during when AMD AVIC is temporary deactivated.
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@....com>
---
arch/x86/include/asm/kvm_host.h | 3 +++
arch/x86/kvm/lapic.c | 11 +++++++++--
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 05b5778c769e..cad47b4955e2 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -1083,6 +1083,9 @@ struct kvm_x86_ops {
void (*refresh_apicv_exec_ctrl)(struct kvm_vcpu *vcpu);
void (*hwapic_irr_update)(struct kvm_vcpu *vcpu, int max_irr);
void (*hwapic_isr_update)(struct kvm_vcpu *vcpu, int isr);
+ void (*hwapic_apic_id_update)(struct kvm_vcpu *vcpu);
+ void (*hwapic_dfr_update)(struct kvm_vcpu *vcpu);
+ void (*hwapic_ldr_update)(struct kvm_vcpu *vcpu);
bool (*guest_apic_has_interrupt)(struct kvm_vcpu *vcpu);
void (*load_eoi_exitmap)(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap);
void (*set_virtual_apic_mode)(struct kvm_vcpu *vcpu);
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 9f089e2e09d0..a067a7292a5f 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -267,6 +267,8 @@ static inline void kvm_apic_set_xapic_id(struct kvm_lapic *apic, u8 id)
static inline void kvm_apic_set_ldr(struct kvm_lapic *apic, u32 id)
{
kvm_lapic_set_reg(apic, APIC_LDR, id);
+ if (kvm_x86_ops->hwapic_ldr_update)
+ kvm_x86_ops->hwapic_ldr_update(apic->vcpu);
recalculate_apic_map(apic->vcpu->kvm);
}
@@ -1809,10 +1811,13 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
switch (reg) {
case APIC_ID: /* Local APIC ID */
- if (!apic_x2apic_mode(apic))
+ if (!apic_x2apic_mode(apic)) {
kvm_apic_set_xapic_id(apic, val >> 24);
- else
+ if (kvm_x86_ops->hwapic_apic_id_update)
+ kvm_x86_ops->hwapic_apic_id_update(apic->vcpu);
+ } else {
ret = 1;
+ }
break;
case APIC_TASKPRI:
@@ -1834,6 +1839,8 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
case APIC_DFR:
if (!apic_x2apic_mode(apic)) {
kvm_lapic_set_reg(apic, APIC_DFR, val | 0x0FFFFFFF);
+ if (kvm_x86_ops->hwapic_dfr_update)
+ kvm_x86_ops->hwapic_dfr_update(apic->vcpu);
recalculate_apic_map(apic->vcpu->kvm);
} else
ret = 1;
--
2.17.1
Powered by blists - more mailing lists