From nobody Fri Aug 21 21:29:39 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787225533924663.0218693060249; Thu, 20 Aug 2026 04:32:13 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wx0zV-0003N4-Vs; Thu, 20 Aug 2026 07:31:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wx0zU-0003KA-6E for qemu-devel@nongnu.org; Thu, 20 Aug 2026 07:31:24 -0400 Received: from mail.loongson.cn ([114.242.206.163]) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wx0zR-0000WG-JB for qemu-devel@nongnu.org; Thu, 20 Aug 2026 07:31:23 -0400 Received: from loongson.cn (unknown [10.2.5.185]) by gateway (Coremail) with SMTP id _____8AxS_CD5YZqnBgDAA--.9322S3; Thu, 20 Aug 2026 19:31:15 +0800 (CST) Received: from localhost.localdomain (unknown [10.2.5.185]) by front1 (Coremail) with SMTP id qMiowJCxvM5_5YZq_N4LAA--.10909S3; Thu, 20 Aug 2026 19:31:14 +0800 (CST) From: Song Gao To: qemu-devel@nongnu.org Cc: richard.henderson@linaro.org, Bibo Mao Subject: [PULL 1/4] target/loongarch: Add kvm support dintc Date: Thu, 20 Aug 2026 19:11:06 +0800 Message-Id: <20260820111109.786405-2-gaosong@loongson.cn> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20260820111109.786405-1-gaosong@loongson.cn> References: <20260820111109.786405-1-gaosong@loongson.cn> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: qMiowJCxvM5_5YZq_N4LAA--.10909S3 X-CM-SenderInfo: 5jdr20tqj6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=114.242.206.163; envelope-from=gaosong@loongson.cn; helo=mail.loongson.cn X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1787225535211158500 Content-Type: text/plain; charset="utf-8" This patch adds Kvm put/get msgint CSRs and check msgint feature. Signed-off-by: Song Gao Reviewed-by: Bibo Mao Message-ID: <20260813111000.446232-2-gaosong@loongson.cn> --- target/loongarch/cpu.c | 5 ++- target/loongarch/cpu.h | 1 + target/loongarch/kvm/kvm.c | 74 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 3 deletions(-) diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c index 8cd5bc18a3..48e1ad83c9 100644 --- a/target/loongarch/cpu.c +++ b/target/loongarch/cpu.c @@ -451,9 +451,6 @@ static void loongarch_max_initfn(Object *obj) =20 cpu->ptw =3D ON_OFF_AUTO_AUTO; if (tcg_enabled()) { - cpu->env.cpucfg[1] =3D FIELD_DP32(cpu->env.cpucfg[1], CPUCFG1, MSG= _INT, 1); - cpu->msgint =3D ON_OFF_AUTO_AUTO; - uint32_t data =3D cpu->env.cpucfg[2]; data =3D FIELD_DP32(data, CPUCFG2, HPTW, 1); /* Enable LA v1.1 instructions */ @@ -468,6 +465,8 @@ static void loongarch_max_initfn(Object *obj) data =3D FIELD_DP32(data, CPUCFG3, DBAR_HINTS, 1); cpu->env.cpucfg[3] =3D data; } + cpu->env.cpucfg[1] =3D FIELD_DP32(cpu->env.cpucfg[1], CPUCFG1, MSG_INT= , 1); + cpu->msgint =3D ON_OFF_AUTO_AUTO; } =20 #if defined(CONFIG_KVM) diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h index ad30c73167..97db3b453f 100644 --- a/target/loongarch/cpu.h +++ b/target/loongarch/cpu.h @@ -301,6 +301,7 @@ enum loongarch_features { LOONGARCH_FEATURE_PV_IPI, LOONGARCH_FEATURE_STEALTIME, LOONGARCH_FEATURE_PTW, + LOONGARCH_FEATURE_MSGINT, }; =20 typedef struct LoongArchBT { diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c index 4d0cad5732..15082a01f8 100644 --- a/target/loongarch/kvm/kvm.c +++ b/target/loongarch/kvm/kvm.c @@ -36,6 +36,13 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[]= =3D { KVM_CAP_LAST_INFO }; =20 +static bool kvm_cpu_has_msgint(CPUState *cs) +{ + LoongArchCPU *cpu =3D LOONGARCH_CPU(cs); + + return FIELD_EX64(cpu->env.cpucfg[1], CPUCFG1, MSG_INT); +} + static int kvm_get_stealtime(CPUState *cs) { CPULoongArchState *env =3D cpu_env(cs); @@ -362,6 +369,25 @@ static int kvm_loongarch_get_csr(CPUState *cs) =20 ret |=3D kvm_loongarch_get_pmu(cs); =20 + /* + * CSR register MSGIS getting must be put after CSR register CSR_ESTAT, + * Since register CSR_ESTAT will sync software pending MSGINT status to + * hardware register and modify HW CSR MSGIS registers. + */ + if (kvm_cpu_has_msgint(cs)) { + ret |=3D kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_MSGIS(0)), + &sys->CSR_MSGIS[0]); + + ret |=3D kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_MSGIS(1)), + &sys->CSR_MSGIS[1]); + + ret |=3D kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_MSGIS(2)), + &sys->CSR_MSGIS[2]); + + ret |=3D kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_MSGIS(3)), + &sys->CSR_MSGIS[3]); + } + ret |=3D kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TVAL), &sys->CSR_TVAL); =20 @@ -538,6 +564,20 @@ static int kvm_loongarch_put_csr(CPUState *cs, KvmPutS= tate level) =20 ret |=3D kvm_loongarch_put_pmu(cs); =20 + if (kvm_cpu_has_msgint(cs)) { + ret |=3D kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_MSGIS(0)), + &sys->CSR_MSGIS[0]); + + ret |=3D kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_MSGIS(1)), + &sys->CSR_MSGIS[1]); + + ret |=3D kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_MSGIS(2)), + &sys->CSR_MSGIS[2]); + + ret |=3D kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_MSGIS(3)), + &sys->CSR_MSGIS[3]); + } + /* * timer cfg must be put at last since it is used to enable * guest timer @@ -993,6 +1033,12 @@ static bool kvm_feature_supported(CPUState *cs, enum = loongarch_features feature) ret =3D kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr); return (ret =3D=3D 0); =20 + case LOONGARCH_FEATURE_MSGINT: + attr.group =3D KVM_LOONGARCH_VM_FEAT_CTRL; + attr.attr =3D KVM_LOONGARCH_VM_FEAT_MSGINT; + ret =3D kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr); + return (ret =3D=3D 0); + default: return false; } @@ -1166,6 +1212,28 @@ static int kvm_cpu_check_pv_features(CPUState *cs, E= rror **errp) return 0; } =20 +static int kvm_cpu_check_msgint(CPUState *cs, Error **errp) +{ + CPULoongArchState *env =3D cpu_env(cs); + LoongArchCPU *cpu =3D LOONGARCH_CPU(cs); + bool kvm_supported; + + kvm_supported =3D kvm_feature_supported(cs, LOONGARCH_FEATURE_MSGINT); + env->cpucfg[1] =3D FIELD_DP32(env->cpucfg[1], CPUCFG1, MSG_INT, 0); + if (cpu->msgint =3D=3D ON_OFF_AUTO_ON) { + if (kvm_supported) { + env->cpucfg[1] =3D FIELD_DP32(env->cpucfg[1], CPUCFG1, MSG_INT= , 1); + } else { + error_setg(errp, "'msgint' feature not supported by KVM on thi= s host"); + return -ENOTSUP; + } + } else if ((cpu->msgint =3D=3D ON_OFF_AUTO_AUTO) && kvm_supported) { + env->cpucfg[1] =3D FIELD_DP32(env->cpucfg[1], CPUCFG1, MSG_INT, 1); + } + + return 0; +} + int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp) { return 0; @@ -1221,6 +1289,12 @@ int kvm_arch_init_vcpu(CPUState *cs) return ret; } =20 + ret =3D kvm_cpu_check_msgint(cs, &local_err); + if (ret < 0) { + error_report_err(local_err); + return ret; + } + return 0; } =20 --=20 2.55.0 From nobody Fri Aug 21 21:29:39 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787225521444941.7901397196124; Thu, 20 Aug 2026 04:32:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wx0zX-0003PD-7K; Thu, 20 Aug 2026 07:31:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wx0zV-0003Mb-53 for qemu-devel@nongnu.org; Thu, 20 Aug 2026 07:31:25 -0400 Received: from mail.loongson.cn ([114.242.206.163]) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wx0zS-0000WV-15 for qemu-devel@nongnu.org; Thu, 20 Aug 2026 07:31:24 -0400 Received: from loongson.cn (unknown [10.2.5.185]) by gateway (Coremail) with SMTP id _____8AxYdGE5YZqnhgDAA--.9430S3; Thu, 20 Aug 2026 19:31:16 +0800 (CST) Received: from localhost.localdomain (unknown [10.2.5.185]) by front1 (Coremail) with SMTP id qMiowJCxvM5_5YZq_N4LAA--.10909S4; Thu, 20 Aug 2026 19:31:15 +0800 (CST) From: Song Gao To: qemu-devel@nongnu.org Cc: richard.henderson@linaro.org, Bibo Mao Subject: [PULL 2/4] Add dintc kvm_irqchip_in_kernel support Date: Thu, 20 Aug 2026 19:11:07 +0800 Message-Id: <20260820111109.786405-3-gaosong@loongson.cn> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20260820111109.786405-1-gaosong@loongson.cn> References: <20260820111109.786405-1-gaosong@loongson.cn> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: qMiowJCxvM5_5YZq_N4LAA--.10909S4 X-CM-SenderInfo: 5jdr20tqj6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=114.242.206.163; envelope-from=gaosong@loongson.cn; helo=mail.loongson.cn X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1787225523885158500 Content-Type: text/plain; charset="utf-8" Function kvm_dintc_realize() is added if kvm_irqchip_in_kernel is set. It is to create and initialize DINTC device in kernel mode. and use kvm_irqchip_send_msi() to send msi to kernel. Signed-off-by: Song Gao Reviewed-by: Bibo Mao Message-ID: <20260813111000.446232-3-gaosong@loongson.cn> --- hw/intc/loongarch_dintc.c | 13 +++++++++ hw/intc/loongarch_dintc_kvm.c | 48 +++++++++++++++++++++++++++++++ hw/intc/meson.build | 2 ++ include/hw/intc/loongarch_dintc.h | 10 +++++++ 4 files changed, 73 insertions(+) create mode 100644 hw/intc/loongarch_dintc_kvm.c diff --git a/hw/intc/loongarch_dintc.c b/hw/intc/loongarch_dintc.c index e40292887c..94d418261c 100644 --- a/hw/intc/loongarch_dintc.c +++ b/hw/intc/loongarch_dintc.c @@ -68,6 +68,15 @@ static void loongarch_dintc_mem_write(void *opaque, hwad= dr addr, } irq_num =3D FIELD_EX64(msg_addr, MSG_ADDR, IRQ_NUM); =20 + if (kvm_irqchip_in_kernel()) { + MSIMessage msg; + + msg.address =3D msg_addr; + msg.data =3D 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); @@ -110,6 +119,10 @@ static void loongarch_dintc_realize(DeviceState *dev, = Error **errp) qdev_init_gpio_out(dev, &s->cpu[i].parent_irq, 1); } =20 + if (kvm_irqchip_in_kernel()) { + kvm_dintc_realize(dev, errp); + } + return; } =20 diff --git a/hw/intc/loongarch_dintc_kvm.c b/hw/intc/loongarch_dintc_kvm.c new file mode 100644 index 0000000000..1137bcd9a6 --- /dev/null +++ b/hw/intc/loongarch_dintc_kvm.c @@ -0,0 +1,48 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * LoongArch DINTC interrupt kvm support + * + * Copyright (C) 2025 Loongson Technology Corporation Limited + */ + +#include "qemu/osdep.h" +#include "hw/intc/loongarch_dintc.h" +#include "linux/kvm.h" +#include "qapi/error.h" +#include "system/kvm.h" + +void kvm_dintc_realize(DeviceState *dev, Error **errp) +{ + LoongArchDINTCState *lds =3D LOONGARCH_DINTC(dev); + int ret; + + ret =3D kvm_create_device(kvm_state, KVM_DEV_TYPE_LOONGARCH_DMSINTC, f= alse); + if (ret < 0) { + fprintf(stderr, "create KVM_DEV_TYPE_LOONGARCH_AVEC failed: %s\n", + strerror(-ret)); + abort(); + } + lds->dev_fd =3D ret; + + /* init dintc config */ + lds->msg_addr_base =3D VIRT_DINTC_BASE; + lds->msg_addr_size =3D VIRT_DINTC_SIZE; + + ret =3D kvm_device_access(lds->dev_fd, KVM_DEV_LOONGARCH_DMSINTC_GRP_C= TRL, + KVM_DEV_LOONGARCH_DMSINTC_MSG_ADDR_BASE, + &lds->msg_addr_base, true, NULL); + if (ret < 0) { + fprintf(stderr, "KVM_DEV_LOONGARCH_DINTC_MSG_ADDR_BASE failed: %s\= n", + strerror(ret)); + abort(); + } + + ret =3D kvm_device_access(lds->dev_fd, KVM_DEV_LOONGARCH_DMSINTC_GRP_C= TRL, + KVM_DEV_LOONGARCH_DMSINTC_MSG_ADDR_SIZE, + &lds->msg_addr_size, true, NULL); + if (ret < 0) { + fprintf(stderr, "KVM_DEV_LOONGARCH_DINTC_MSG_ADDR_SIZE failed: %s\= n", + strerror(ret)); + abort(); + } +} diff --git a/hw/intc/meson.build b/hw/intc/meson.build index a1401cb521..4373f16d0b 100644 --- a/hw/intc/meson.build +++ b/hw/intc/meson.build @@ -90,3 +90,5 @@ specific_ss.add(when: 'CONFIG_LOONGARCH_EXTIOI', if_true:= files('loongarch_extio specific_ss.add(when: ['CONFIG_KVM', 'CONFIG_LOONGARCH_EXTIOI'], if_true: files('loongarch_extioi_kvm.c')) specific_ss.add(when: 'CONFIG_LOONGARCH_DINTC', if_true: files('loongarch_= dintc.c')) +specific_ss.add(when: ['CONFIG_KVM', 'CONFIG_LOONGARCH_DINTC'], + if_true: files('loongarch_dintc_kvm.c')) diff --git a/include/hw/intc/loongarch_dintc.h b/include/hw/intc/loongarch_= dintc.h index 1f4f65705a..95a7879e26 100644 --- a/include/hw/intc/loongarch_dintc.h +++ b/include/hw/intc/loongarch_dintc.h @@ -9,8 +9,13 @@ #include "hw/core/sysbus.h" #include "hw/loongarch/virt.h" #include "system/memory.h" +#include "hw/pci-host/ls7a.h" =20 #define NR_VECTORS 256 +#define IRQ_BIT_BASE 5 +#define IRQ_BIT_LEN 8 +#define CPU_BIT_BASE 13 +#define CPU_BIT_LEN 8 =20 #define TYPE_LOONGARCH_DINTC "loongarch_dintc" OBJECT_DECLARE_TYPE(LoongArchDINTCState, LoongArchDINTCClass, LOONGARCH_DI= NTC) @@ -25,7 +30,10 @@ struct LoongArchDINTCState { SysBusDevice parent_obj; MemoryRegion dintc_mmio; DINTCCore *cpu; + int dev_fd; uint32_t num_cpu; + uint64_t msg_addr_base; + uint64_t msg_addr_size; }; =20 struct LoongArchDINTCClass { @@ -34,3 +42,5 @@ struct LoongArchDINTCClass { DeviceRealize parent_realize; DeviceUnrealize parent_unrealize; }; + +void kvm_dintc_realize(DeviceState *dev, Error **errp); --=20 2.55.0 From nobody Fri Aug 21 21:29:39 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787225521949520.844764544683; Thu, 20 Aug 2026 04:32:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wx0zV-0003MA-IK; Thu, 20 Aug 2026 07:31:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wx0zT-0003IJ-S3 for qemu-devel@nongnu.org; Thu, 20 Aug 2026 07:31:23 -0400 Received: from mail.loongson.cn ([114.242.206.163]) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wx0zR-0000WT-9P for qemu-devel@nongnu.org; Thu, 20 Aug 2026 07:31:23 -0400 Received: from loongson.cn (unknown [10.2.5.185]) by gateway (Coremail) with SMTP id _____8DxUNGE5YZqnxgDAA--.9422S3; Thu, 20 Aug 2026 19:31:16 +0800 (CST) Received: from localhost.localdomain (unknown [10.2.5.185]) by front1 (Coremail) with SMTP id qMiowJCxvM5_5YZq_N4LAA--.10909S5; Thu, 20 Aug 2026 19:31:16 +0800 (CST) From: Song Gao To: qemu-devel@nongnu.org Cc: richard.henderson@linaro.org, gaosong , Bibo Mao Subject: [PULL 3/4] target/loongarch: KVM disable msgint Date: Thu, 20 Aug 2026 19:11:08 +0800 Message-Id: <20260820111109.786405-4-gaosong@loongson.cn> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20260820111109.786405-1-gaosong@loongson.cn> References: <20260820111109.786405-1-gaosong@loongson.cn> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: qMiowJCxvM5_5YZq_N4LAA--.10909S5 X-CM-SenderInfo: 5jdr20tqj6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=114.242.206.163; envelope-from=gaosong@loongson.cn; helo=mail.loongson.cn X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1787225523830158501 Content-Type: text/plain; charset="utf-8" From: gaosong In KVM mode, msgint is disabled by default; please enable it manually. e.g ... -cpu max,msgint=3Don ... Signed-off-by: gaosong Reviewed-by: Bibo Mao Message-ID: <20260813111000.446232-4-gaosong@loongson.cn> Signed-off-by: Song Gao --- target/loongarch/cpu.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c index 48e1ad83c9..bd819247c7 100644 --- a/target/loongarch/cpu.c +++ b/target/loongarch/cpu.c @@ -450,6 +450,9 @@ static void loongarch_max_initfn(Object *obj) loongarch_la464_initfn(obj); =20 cpu->ptw =3D ON_OFF_AUTO_AUTO; + if (kvm_enabled()){ + cpu->msgint=3DON_OFF_AUTO_OFF; + } if (tcg_enabled()) { uint32_t data =3D cpu->env.cpucfg[2]; data =3D FIELD_DP32(data, CPUCFG2, HPTW, 1); @@ -464,9 +467,9 @@ static void loongarch_max_initfn(Object *obj) data =3D cpu->env.cpucfg[3]; data =3D FIELD_DP32(data, CPUCFG3, DBAR_HINTS, 1); cpu->env.cpucfg[3] =3D data; + cpu->env.cpucfg[1] =3D FIELD_DP32(cpu->env.cpucfg[1], CPUCFG1, MSG_INT, = 1); + cpu->msgint =3D ON_OFF_AUTO_AUTO; } - cpu->env.cpucfg[1] =3D FIELD_DP32(cpu->env.cpucfg[1], CPUCFG1, MSG_INT= , 1); - cpu->msgint =3D ON_OFF_AUTO_AUTO; } =20 #if defined(CONFIG_KVM) --=20 2.55.0 From nobody Fri Aug 21 21:29:39 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787225528549858.0098669583939; Thu, 20 Aug 2026 04:32:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wx0zW-0003OQ-Sr; Thu, 20 Aug 2026 07:31:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wx0zV-0003MW-1Q; Thu, 20 Aug 2026 07:31:25 -0400 Received: from mail.loongson.cn ([114.242.206.163]) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wx0zR-0000We-R7; Thu, 20 Aug 2026 07:31:24 -0400 Received: from loongson.cn (unknown [10.2.5.185]) by gateway (Coremail) with SMTP id _____8AxntKF5YZqohgDAA--.9147S3; Thu, 20 Aug 2026 19:31:17 +0800 (CST) Received: from localhost.localdomain (unknown [10.2.5.185]) by front1 (Coremail) with SMTP id qMiowJCxvM5_5YZq_N4LAA--.10909S6; Thu, 20 Aug 2026 19:31:16 +0800 (CST) From: Song Gao To: qemu-devel@nongnu.org Cc: richard.henderson@linaro.org, Jan Mercl <0xjnml@gmail.com>, qemu-stable@nongnu.org Subject: [PULL 4/4] target/loongarch: check FPE before reading fcc in bceqz/bcnez Date: Thu, 20 Aug 2026 19:11:09 +0800 Message-Id: <20260820111109.786405-5-gaosong@loongson.cn> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20260820111109.786405-1-gaosong@loongson.cn> References: <20260820111109.786405-1-gaosong@loongson.cn> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: qMiowJCxvM5_5YZq_N4LAA--.10909S6 X-CM-SenderInfo: 5jdr20tqj6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=114.242.206.163; envelope-from=gaosong@loongson.cn; helo=mail.loongson.cn X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1787225528991158500 Content-Type: text/plain; charset="utf-8" From: Jan Mercl <0xjnml@gmail.com> gen_cz_bc() loads env->cf[cj] without CHECK_FPE, unlike every other translator that touches an fcc register (trans_fcmp.c.inc and trans_fmov.c.inc, for movcf2gr/movgr2cf/movcf2fr/movfr2cf/fsel). A guest that manages the FPU lazily -- Linux clears CSR.EUEN.FPE in lose_fpu() on every context switch -- relies on the next fcc access raising a Floating-Point-Disabled exception so the kernel can restore that task's fcc. Because bceqz and bcnez never raise it, they branch on the condition flag left behind by whichever task last owned the FPU. Real Loongson hardware does raise the exception, so this is TCG-only. It surfaces as Go binaries dying at startup in runtime.check() with "fatal error: float64nan1" -- roughly one process start in a thousand once the guest has more runnable tasks than vCPUs -- and in general as a conditional branch silently taking the wrong path. With four tasks each executing 5M bcnez on a 2-vCPU guest, master mispredicts 89 of 20000000. With this patch, 0 of 100000000 over five runs; a Loongson-3C5000 is likewise 0 of 600000000. CHECK_FPE is defined in trans_farith.c.inc, which translate.c includes before trans_branch.c.inc, so it is already in scope. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/4209 Cc: qemu-stable@nongnu.org Signed-off-by: Jan Mercl <0xjnml@gmail.com> Reviewed-by: Richard Henderson Message-ID: <20260819132422.5164-1-0xjnml@gmail.com> Signed-off-by: Song Gao --- target/loongarch/tcg/insn_trans/trans_branch.c.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/target/loongarch/tcg/insn_trans/trans_branch.c.inc b/target/lo= ongarch/tcg/insn_trans/trans_branch.c.inc index f94c1f37ab..da07778658 100644 --- a/target/loongarch/tcg/insn_trans/trans_branch.c.inc +++ b/target/loongarch/tcg/insn_trans/trans_branch.c.inc @@ -66,6 +66,8 @@ static bool gen_cz_bc(DisasContext *ctx, arg_c_offs *a, T= CGCond cond) TCGv src1 =3D tcg_temp_new(); TCGv src2 =3D tcg_constant_tl(0); =20 + CHECK_FPE; + tcg_gen_ld8u_tl(src1, tcg_env, offsetof(CPULoongArchState, cf[a->cj])); gen_bc(ctx, src1, src2, a->offs, cond); --=20 2.55.0