]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
LoongArch: KVM: Handle LOONGARCH_CSR_IPR during vCPU context switch
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)
Register LOONGARCH_CSR_IPR is interrupt priority setting for nested
interrupt handling. Though LoongArch Linux AVEC driver does not use
this register, KVM hypervisor needs to save and restore this it during
vCPU context switch. Because Linux AVEC driver may use this register
in future, or other OS may use it.

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

index 553c4dc7a156ef2606bcbf6e886b0384ec4e2353..2a6bc99177d8a87fb5f6037e88574464aa7209ad 100644 (file)
 #define LOONGARCH_CSR_ISR3             0xa3
 
 #define LOONGARCH_CSR_IRR              0xa4
+#define LOONGARCH_CSR_IPR              0xa5
 
 #define LOONGARCH_CSR_PRID             0xc0
 
index f3211fc447fd08ece5dd097648ca919401760aec..d1c5156e02d860d26f726fb2e34c45901c13d7ea 100644 (file)
@@ -194,6 +194,7 @@ static void kvm_init_gcsr_flag(void)
        set_gcsr_sw_flag(LOONGARCH_CSR_PERFCNTR3);
 
        if (cpu_has_msgint) {
+               set_gcsr_hw_flag(LOONGARCH_CSR_IPR);
                set_gcsr_hw_flag(LOONGARCH_CSR_ISR0);
                set_gcsr_hw_flag(LOONGARCH_CSR_ISR1);
                set_gcsr_hw_flag(LOONGARCH_CSR_ISR2);
index 948a3d809aac5ea36b05110abfa3b6ff9bf07c03..fd3a2e60c67072125bab0059282c74b42f8d6a72 100644 (file)
@@ -1681,6 +1681,7 @@ static int _kvm_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
        kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_LLBCTL);
 
        if (kvm_guest_has_msgint(&vcpu->arch)) {
+               kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_IPR);
                kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_ISR0);
                kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_ISR1);
                kvm_restore_hw_gcsr(csr, LOONGARCH_CSR_ISR2);
@@ -1777,6 +1778,7 @@ static int _kvm_vcpu_put(struct kvm_vcpu *vcpu, int cpu)
        kvm_save_hw_gcsr(csr, LOONGARCH_CSR_DMWIN3);
 
        if (kvm_guest_has_msgint(&vcpu->arch)) {
+               kvm_save_hw_gcsr(csr, LOONGARCH_CSR_IPR);
                kvm_save_hw_gcsr(csr, LOONGARCH_CSR_ISR0);
                kvm_save_hw_gcsr(csr, LOONGARCH_CSR_ISR1);
                kvm_save_hw_gcsr(csr, LOONGARCH_CSR_ISR2);