Commit 707228e7b9 for qemu.org
commit 707228e7b975d4a2d0833adb59263bdb1a69bce6
Author: Bibo Mao <maobibo@loongson.cn>
Date: Mon Sep 14 10:14:15 2026 +0800
hw/intc/loongarch_dintc: Check irqchip in kernel mode firstly
when inject MSI interrupt, check irqchip in kernel mode at first and
then check validity of MSI message in TCG mode, since irqchip in kernel
is used at most popular.
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Song Gao <17746591750@163.com>
diff --git a/hw/intc/loongarch_dintc.c b/hw/intc/loongarch_dintc.c
index 1bedfbce43..674f5d1357 100644
--- a/hw/intc/loongarch_dintc.c
+++ b/hw/intc/loongarch_dintc.c
@@ -72,6 +72,15 @@ static void loongarch_dintc_mem_write(void *opaque, hwaddr addr,
DINTCCore *core;
CPUState *cs;
+ if (kvm_irqchip_in_kernel()) {
+ MSIMessage msg;
+
+ msg.address = msg_addr;
+ msg.data = val;
+ kvm_irqchip_send_msi(kvm_state, msg);
+ return;
+ }
+
arch_id = FIELD_EX64(msg_addr, MSG_ADDR, CPU_NUM);
core = loongarch_dintc_cpu_by_arch_id(s, arch_id);
if (!core || !core->cpu) {
@@ -83,16 +92,6 @@ static void loongarch_dintc_mem_write(void *opaque, hwaddr addr,
cpu_num = core - s->cpu;
cs = core->cpu;
irq_num = FIELD_EX64(msg_addr, MSG_ADDR, IRQ_NUM);
-
- if (kvm_irqchip_in_kernel()) {
- MSIMessage msg;
-
- msg.address = msg_addr;
- msg.data = val;
- kvm_irqchip_send_msi(kvm_state, msg);
- return;
- }
-
async_run_on_cpu(cs, do_set_vcpu_dintc_irq,
RUN_ON_CPU_HOST_INT(irq_num));
qemu_set_irq(s->cpu[cpu_num].parent_irq, 1);