]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
LoongArch: KVM: Fix base address calculation in kvm_eiointc_regs_access()
authorBibo Mao <maobibo@loongson.cn>
Thu, 26 Mar 2026 06:29:09 +0000 (14:29 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Thu, 26 Mar 2026 06:29:09 +0000 (14:29 +0800)
In function kvm_eiointc_regs_access(), the register base address is
caculated from array base address plus offset, the offset is absolute
value from the base address. The data type of array base address is
u64, it should be converted into the "void *" type and then plus the
offset.

Cc: <stable@vger.kernel.org>
Fixes: d3e43a1f34ac ("LoongArch: KVM: Use 64-bit register definition for EIOINTC").
Reported-by: Aurelien Jarno <aurel32@debian.org>
Link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1131431
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kvm/intc/eiointc.c

index c7badc8139238c1f9d68ca4858a5efb6b0cdda0b..003bd773e11c4d52135446af762ac62e11c891d8 100644 (file)
@@ -472,34 +472,34 @@ static int kvm_eiointc_regs_access(struct kvm_device *dev,
        switch (addr) {
        case EIOINTC_NODETYPE_START ... EIOINTC_NODETYPE_END:
                offset = (addr - EIOINTC_NODETYPE_START) / 4;
-               p = s->nodetype + offset * 4;
+               p = (void *)s->nodetype + offset * 4;
                break;
        case EIOINTC_IPMAP_START ... EIOINTC_IPMAP_END:
                offset = (addr - EIOINTC_IPMAP_START) / 4;
-               p = &s->ipmap + offset * 4;
+               p = (void *)&s->ipmap + offset * 4;
                break;
        case EIOINTC_ENABLE_START ... EIOINTC_ENABLE_END:
                offset = (addr - EIOINTC_ENABLE_START) / 4;
-               p = s->enable + offset * 4;
+               p = (void *)s->enable + offset * 4;
                break;
        case EIOINTC_BOUNCE_START ... EIOINTC_BOUNCE_END:
                offset = (addr - EIOINTC_BOUNCE_START) / 4;
-               p = s->bounce + offset * 4;
+               p = (void *)s->bounce + offset * 4;
                break;
        case EIOINTC_ISR_START ... EIOINTC_ISR_END:
                offset = (addr - EIOINTC_ISR_START) / 4;
-               p = s->isr + offset * 4;
+               p = (void *)s->isr + offset * 4;
                break;
        case EIOINTC_COREISR_START ... EIOINTC_COREISR_END:
                if (cpu >= s->num_cpu)
                        return -EINVAL;
 
                offset = (addr - EIOINTC_COREISR_START) / 4;
-               p = s->coreisr[cpu] + offset * 4;
+               p = (void *)s->coreisr[cpu] + offset * 4;
                break;
        case EIOINTC_COREMAP_START ... EIOINTC_COREMAP_END:
                offset = (addr - EIOINTC_COREMAP_START) / 4;
-               p = s->coremap + offset * 4;
+               p = (void *)s->coremap + offset * 4;
                break;
        default:
                kvm_err("%s: unknown eiointc register, addr = %d\n", __func__, addr);