]> www.infradead.org Git - users/hch/misc.git/commitdiff
LoongArch: KVM: Add sign extension with kernel IOCSR read emulation
authorBibo Mao <maobibo@loongson.cn>
Tue, 23 Sep 2025 15:37:08 +0000 (23:37 +0800)
committerHuacai Chen <chenhuacai@kernel.org>
Tue, 23 Sep 2025 15:37:08 +0000 (23:37 +0800)
Function kvm_complete_iocsr_read() is to add sign extension with IOCSR
read emulation, it is used in user space IOCSR read completion now. Also
it should be used in kernel IOCSR read emulation.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kvm/exit.c

index 45833fbe16bf2b3cb1f14f38b042f9c97474ad88..cb493980d874af967bd7f5c8edd4048d1845c316 100644 (file)
@@ -218,16 +218,16 @@ int kvm_emu_iocsr(larch_inst inst, struct kvm_run *run, struct kvm_vcpu *vcpu)
                }
                trace_kvm_iocsr(KVM_TRACE_IOCSR_WRITE, run->iocsr_io.len, addr, val);
        } else {
+               vcpu->arch.io_gpr = rd; /* Set register id for iocsr read completion */
                idx = srcu_read_lock(&vcpu->kvm->srcu);
-               ret = kvm_io_bus_read(vcpu, KVM_IOCSR_BUS, addr, run->iocsr_io.len, val);
+               ret = kvm_io_bus_read(vcpu, KVM_IOCSR_BUS, addr,
+                                     run->iocsr_io.len, run->iocsr_io.data);
                srcu_read_unlock(&vcpu->kvm->srcu, idx);
-               if (ret == 0)
+               if (ret == 0) {
+                       kvm_complete_iocsr_read(vcpu, run);
                        ret = EMULATE_DONE;
-               else {
+               } else
                        ret = EMULATE_DO_IOCSR;
-                       /* Save register id for iocsr read completion */
-                       vcpu->arch.io_gpr = rd;
-               }
                trace_kvm_iocsr(KVM_TRACE_IOCSR_READ, run->iocsr_io.len, addr, NULL);
        }