Commit 6bcfb7f4 authored by Bibo Mao's avatar Bibo Mao Committed by Huacai Chen
Browse files

LoongArch: KVM: Fix base address calculation in kvm_eiointc_regs_access()



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: d3e43a1f ("LoongArch: KVM: Use 64-bit register definition for EIOINTC").
Reported-by: default avatarAurelien Jarno <aurel32@debian.org>
Link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1131431


Signed-off-by: default avatarBibo Mao <maobibo@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent b97bd69e
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -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);