]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: x86: Make kvm_lapic_set_reg() a "private" xAPIC helper
authorSean Christopherson <seanjc@google.com>
Fri, 4 Feb 2022 21:42:04 +0000 (21:42 +0000)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 1 Mar 2022 13:50:48 +0000 (08:50 -0500)
Hide the lapic's "raw" write helper inside lapic.c to force non-APIC code
to go through proper helpers when modification the vAPIC state.  Keep the
read helper visible to outsiders for now, refactoring KVM to hide it too
is possible, it will just take more work to do so.

No functional change intended.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220204214205.3306634-11-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/lapic.c
arch/x86/kvm/lapic.h
arch/x86/kvm/trace.h
arch/x86/kvm/x86.c

index 3e6a53210cc42f53b4221a4d55c0c0b8b9f87b30..80a2020c4db401e94d1e189f0b6c505fee06caf7 100644 (file)
@@ -68,6 +68,16 @@ static bool lapic_timer_advance_dynamic __read_mostly;
 /* step-by-step approximation to mitigate fluctuation */
 #define LAPIC_TIMER_ADVANCE_ADJUST_STEP 8
 
+static inline void __kvm_lapic_set_reg(char *regs, int reg_off, u32 val)
+{
+       *((u32 *) (regs + reg_off)) = val;
+}
+
+static inline void kvm_lapic_set_reg(struct kvm_lapic *apic, int reg_off, u32 val)
+{
+       __kvm_lapic_set_reg(apic->regs, reg_off, val);
+}
+
 static __always_inline u64 __kvm_lapic_get_reg64(char *regs, int reg)
 {
        BUILD_BUG_ON(reg != APIC_ICR);
index ab76896a8c3fa0ae7d0c9ff89248f81cf59ecdb0..4e4f8a22754f91e208c29631455bf149a816397f 100644 (file)
@@ -118,6 +118,7 @@ int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr);
 void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu);
 void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu);
 
+int kvm_x2apic_icr_write(struct kvm_lapic *apic, u64 data);
 int kvm_x2apic_msr_write(struct kvm_vcpu *vcpu, u32 msr, u64 data);
 int kvm_x2apic_msr_read(struct kvm_vcpu *vcpu, u32 msr, u64 *data);
 
@@ -150,19 +151,14 @@ static inline void kvm_lapic_set_irr(int vec, struct kvm_lapic *apic)
        apic->irr_pending = true;
 }
 
-static inline u32 kvm_lapic_get_reg(struct kvm_lapic *apic, int reg_off)
+static inline u32 __kvm_lapic_get_reg(char *regs, int reg_off)
 {
-       return *((u32 *) (apic->regs + reg_off));
+       return *((u32 *) (regs + reg_off));
 }
 
-static inline void __kvm_lapic_set_reg(char *regs, int reg_off, u32 val)
-{
-       *((u32 *) (regs + reg_off)) = val;
-}
-
-static inline void kvm_lapic_set_reg(struct kvm_lapic *apic, int reg_off, u32 val)
+static inline u32 kvm_lapic_get_reg(struct kvm_lapic *apic, int reg_off)
 {
-       __kvm_lapic_set_reg(apic->regs, reg_off, val);
+       return __kvm_lapic_get_reg(apic->regs, reg_off);
 }
 
 DECLARE_STATIC_KEY_FALSE(kvm_has_noapic_vcpu);
index e5a8c271b42d9a5345d4419ba894229bd382ac5e..193f5ba930d12f422c195eecaf00006d023bbc15 100644 (file)
@@ -253,13 +253,13 @@ TRACE_EVENT(kvm_cpuid,
  * Tracepoint for apic access.
  */
 TRACE_EVENT(kvm_apic,
-       TP_PROTO(unsigned int rw, unsigned int reg, unsigned int val),
+       TP_PROTO(unsigned int rw, unsigned int reg, u64 val),
        TP_ARGS(rw, reg, val),
 
        TP_STRUCT__entry(
                __field(        unsigned int,   rw              )
                __field(        unsigned int,   reg             )
-               __field(        unsigned int,   val             )
+               __field(        u64,            val             )
        ),
 
        TP_fast_assign(
@@ -268,7 +268,7 @@ TRACE_EVENT(kvm_apic,
                __entry->val            = val;
        ),
 
-       TP_printk("apic_%s %s = 0x%x",
+       TP_printk("apic_%s %s = 0x%llx",
                  __entry->rw ? "write" : "read",
                  __print_symbolic(__entry->reg, kvm_trace_symbol_apic),
                  __entry->val)
index 7a8e8756c01610383dca9caaebff427b72764c94..fce6bc707122069e9a982decfa39d56cff0ddf4b 100644 (file)
@@ -2041,14 +2041,8 @@ static int handle_fastpath_set_x2apic_icr_irqoff(struct kvm_vcpu *vcpu, u64 data
        if (((data & APIC_SHORT_MASK) == APIC_DEST_NOSHORT) &&
            ((data & APIC_DEST_MASK) == APIC_DEST_PHYSICAL) &&
            ((data & APIC_MODE_MASK) == APIC_DM_FIXED) &&
-           ((u32)(data >> 32) != X2APIC_BROADCAST)) {
-               data &= ~APIC_ICR_BUSY;
-               kvm_apic_send_ipi(vcpu->arch.apic, (u32)data, (u32)(data >> 32));
-               kvm_lapic_set_reg(vcpu->arch.apic, APIC_ICR2, (u32)(data >> 32));
-               kvm_lapic_set_reg(vcpu->arch.apic, APIC_ICR, (u32)data);
-               trace_kvm_apic_write(APIC_ICR, (u32)data);
-               return 0;
-       }
+           ((u32)(data >> 32) != X2APIC_BROADCAST))
+               return kvm_x2apic_icr_write(vcpu->arch.apic, data);
 
        return 1;
 }