]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
LoongArch: KVM: Check VM msgint feature during interrupt handling
authorBibo Mao <maobibo@loongson.cn>
Fri, 6 Feb 2026 01:27:46 +0000 (09:27 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Fri, 6 Feb 2026 01:27:46 +0000 (09:27 +0800)
During message interrupt handling and relative CSR registers saving and
restore, it is better to check VM msgint feature rather than host msgint
feature, because VM may disable this feature even if host supports this.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/include/asm/kvm_host.h
arch/loongarch/kvm/interrupt.c
arch/loongarch/kvm/vcpu.c

index e4fe5b8e8149f55ddfca129c67d2ec8036223204..bced2d60784921e3dba018c7b2ac0030c4626a65 100644 (file)
@@ -265,6 +265,11 @@ static inline void writel_sw_gcsr(struct loongarch_csrs *csr, int reg, unsigned
        csr->csrs[reg] = val;
 }
 
+static inline bool kvm_guest_has_msgint(struct kvm_vcpu_arch *arch)
+{
+       return arch->cpucfg[1] & CPUCFG1_MSGINT;
+}
+
 static inline bool kvm_guest_has_fpu(struct kvm_vcpu_arch *arch)
 {
        return arch->cpucfg[2] & CPUCFG2_FP;
index a6d42d399a597dc9740db90b3ee395b1ff78697a..fb704f4c8ac593f397b53840d064c48f95349f19 100644 (file)
@@ -32,7 +32,7 @@ static int kvm_irq_deliver(struct kvm_vcpu *vcpu, unsigned int priority)
        if (priority < EXCCODE_INT_NUM)
                irq = priority_to_irq[priority];
 
-       if (cpu_has_msgint && (priority == INT_AVEC)) {
+       if (kvm_guest_has_msgint(&vcpu->arch) && (priority == INT_AVEC)) {
                set_gcsr_estat(irq);
                return 1;
        }
@@ -64,7 +64,7 @@ static int kvm_irq_clear(struct kvm_vcpu *vcpu, unsigned int priority)
        if (priority < EXCCODE_INT_NUM)
                irq = priority_to_irq[priority];
 
-       if (cpu_has_msgint && (priority == INT_AVEC)) {
+       if (kvm_guest_has_msgint(&vcpu->arch) && (priority == INT_AVEC)) {
                clear_gcsr_estat(irq);
                return 1;
        }
index 2ef7bb0ad0474243365becf4539af24b4df5c729..948a3d809aac5ea36b05110abfa3b6ff9bf07c03 100644 (file)
@@ -1679,7 +1679,8 @@ static int _kvm_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
        kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_DMWIN2);
        kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_DMWIN3);
        kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_LLBCTL);
-       if (cpu_has_msgint) {
+
+       if (kvm_guest_has_msgint(&vcpu->arch)) {
                kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_ISR0);
                kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_ISR1);
                kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_ISR2);
@@ -1774,7 +1775,8 @@ static int _kvm_vcpu_put(struct kvm_vcpu *vcpu, int cpu)
        kvm_save_hw_gcsr(csr, LOONGARCH_CSR_DMWIN1);
        kvm_save_hw_gcsr(csr, LOONGARCH_CSR_DMWIN2);
        kvm_save_hw_gcsr(csr, LOONGARCH_CSR_DMWIN3);
-       if (cpu_has_msgint) {
+
+       if (kvm_guest_has_msgint(&vcpu->arch)) {
                kvm_save_hw_gcsr(csr, LOONGARCH_CSR_ISR0);
                kvm_save_hw_gcsr(csr, LOONGARCH_CSR_ISR1);
                kvm_save_hw_gcsr(csr, LOONGARCH_CSR_ISR2);