Skip to content

Commit 9ea8623

Browse files
bibo-maochenhuacai
authored andcommitted
LoongArch: KVM: Fully clear some CSRs when VM reboot
Some registers such as LOONGARCH_CSR_ESTAT and LOONGARCH_CSR_GINTC are partly cleared with function _kvm_setcsr(). This comes from the hardware specification, some bits are read only in VM mode, and however they can be written in host mode. So they are partly cleared in VM mode, and can be fully cleared in host mode. These read only bits show pending interrupt or exception status. When VM reset, the read-only bits should be cleared, otherwise vCPU will receive unknown interrupts in boot stage. Here registers LOONGARCH_CSR_ESTAT/LOONGARCH_CSR_GINTC are fully cleared in ioctl KVM_REG_LOONGARCH_VCPU_RESET vCPU reset path. Cc: stable@vger.kernel.org Signed-off-by: Bibo Mao <maobibo@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
1 parent 8b2d01f commit 9ea8623

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

arch/loongarch/kvm/vcpu.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -902,6 +902,13 @@ static int kvm_set_one_reg(struct kvm_vcpu *vcpu,
902902
vcpu->arch.st.guest_addr = 0;
903903
memset(&vcpu->arch.irq_pending, 0, sizeof(vcpu->arch.irq_pending));
904904
memset(&vcpu->arch.irq_clear, 0, sizeof(vcpu->arch.irq_clear));
905+
906+
/*
907+
* When vCPU reset, clear the ESTAT and GINTC registers
908+
* Other CSR registers are cleared with function _kvm_setcsr().
909+
*/
910+
kvm_write_sw_gcsr(vcpu->arch.csr, LOONGARCH_CSR_GINTC, 0);
911+
kvm_write_sw_gcsr(vcpu->arch.csr, LOONGARCH_CSR_ESTAT, 0);
905912
break;
906913
default:
907914
ret = -EINVAL;

0 commit comments

Comments
 (0)