]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
LoongArch: KVM: Fix interrupt route update with EIOINTC
authorBibo Mao <maobibo@loongson.cn>
Fri, 27 Jun 2025 10:27:44 +0000 (18:27 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Fri, 27 Jun 2025 10:27:44 +0000 (18:27 +0800)
With function eiointc_update_sw_coremap(), there is forced assignment
like val = *(u64 *)pvalue. Parameter pvalue may be pointer to char type
or others, there is problem with forced assignment with u64 type.

Here the detailed value is passed rather address pointer.

Cc: stable@vger.kernel.org
Fixes: 3956a52bc05b ("LoongArch: KVM: Add EIOINTC read and write functions")
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kvm/intc/eiointc.c

index 236cbf97916712d4115affb23aaf0c2a97198d30..8d3f48e2a7f07d188790d33d99914ae5a8c05a10 100644 (file)
@@ -66,10 +66,9 @@ static void eiointc_update_irq(struct loongarch_eiointc *s, int irq, int level)
 }
 
 static inline void eiointc_update_sw_coremap(struct loongarch_eiointc *s,
-                                       int irq, void *pvalue, u32 len, bool notify)
+                                       int irq, u64 val, u32 len, bool notify)
 {
        int i, cpu;
-       u64 val = *(u64 *)pvalue;
 
        for (i = 0; i < len; i++) {
                cpu = val & 0xff;
@@ -403,7 +402,7 @@ static int loongarch_eiointc_writeb(struct kvm_vcpu *vcpu,
                irq = offset - EIOINTC_COREMAP_START;
                index = irq;
                s->coremap.reg_u8[index] = data;
-               eiointc_update_sw_coremap(s, irq, (void *)&data, sizeof(data), true);
+               eiointc_update_sw_coremap(s, irq, data, sizeof(data), true);
                break;
        default:
                ret = -EINVAL;
@@ -488,7 +487,7 @@ static int loongarch_eiointc_writew(struct kvm_vcpu *vcpu,
                irq = offset - EIOINTC_COREMAP_START;
                index = irq >> 1;
                s->coremap.reg_u16[index] = data;
-               eiointc_update_sw_coremap(s, irq, (void *)&data, sizeof(data), true);
+               eiointc_update_sw_coremap(s, irq, data, sizeof(data), true);
                break;
        default:
                ret = -EINVAL;
@@ -573,7 +572,7 @@ static int loongarch_eiointc_writel(struct kvm_vcpu *vcpu,
                irq = offset - EIOINTC_COREMAP_START;
                index = irq >> 2;
                s->coremap.reg_u32[index] = data;
-               eiointc_update_sw_coremap(s, irq, (void *)&data, sizeof(data), true);
+               eiointc_update_sw_coremap(s, irq, data, sizeof(data), true);
                break;
        default:
                ret = -EINVAL;
@@ -658,7 +657,7 @@ static int loongarch_eiointc_writeq(struct kvm_vcpu *vcpu,
                irq = offset - EIOINTC_COREMAP_START;
                index = irq >> 3;
                s->coremap.reg_u64[index] = data;
-               eiointc_update_sw_coremap(s, irq, (void *)&data, sizeof(data), true);
+               eiointc_update_sw_coremap(s, irq, data, sizeof(data), true);
                break;
        default:
                ret = -EINVAL;
@@ -816,7 +815,7 @@ static int kvm_eiointc_ctrl_access(struct kvm_device *dev,
                for (i = 0; i < (EIOINTC_IRQS / 4); i++) {
                        start_irq = i * 4;
                        eiointc_update_sw_coremap(s, start_irq,
-                                       (void *)&s->coremap.reg_u32[i], sizeof(u32), false);
+                                       s->coremap.reg_u32[i], sizeof(u32), false);
                }
                break;
        default: