Merge tag 'pull-loongarch-20260707' of https://github.com/gaosong715/qemu into staging

pull-loongarch-20260707

# -----BEGIN PGP SIGNATURE-----
#
# iLMEAAEKAB0WIQS4/x2g0v3LLaCcbCxAov/yOSY+3wUCakz1yAAKCRBAov/yOSY+
# 30ghBACjPw9Tv22Qyl3UEImccxWO9opvxq006pkKCRib8et5SdSROzZQHZOre6M8
# jwY3O7nNHem9MyXvzGo6GoDKUo1qmJlrYGydRb9QXeZS/EHdN9OUNm/tHjKnpJdN
# kyvXpv2fT2FnPQ/doGnUHsYCJl6e9gxEsl4iM17F2vaV+VZnCg==
# =NHlN
# -----END PGP SIGNATURE-----
# gpg: Signature made Tue 07 Jul 2026 14:49:12 CEST
# gpg:                using RSA key B8FF1DA0D2FDCB2DA09C6C2C40A2FFF239263EDF
# gpg: Good signature from "Song Gao <m17746591750@163.com>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: B8FF 1DA0 D2FD CB2D A09C  6C2C 40A2 FFF2 3926 3EDF

* tag 'pull-loongarch-20260707' of https://github.com/gaosong715/qemu:
  MAINTAINERS: add LoongArch's maintainers
  MAINTAINERS: update Song Gao's email address
  hw/intc/loongarch_dintc: Fix OOB access in DINT MMIO write handler
  target/loongarch: Enable TARGET_PAGE_BITS_VARY for loongarch64 user-only
  target/loongarch/kvm: fix cpucfg sync error handling
  target/loongarch/kvm: remove redundant cpucfg failure traces
  target/loongarch/kvm: pass device attr by reference to kvm_vcpu_ioctl
  target/loongarch/kvm: fix uninitialized val and unchecked GET in cpucfg2 check

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Stefan Hajnoczi
2026-07-07 19:17:49 +02:00
6 changed files with 51 additions and 25 deletions

View File

@@ -119,6 +119,7 @@ Roman Bolshakov <rbolshakov@ddn.com> <r.bolshakov@yadro.com>
Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> <sriram.yagnaraman@est.tech>
Stefan Brankovic <stefan.brankovic@syrmia.com> <stefan.brankovic@rt-rk.com.com>
Stefan Weil <sw@weilnetz.de> Stefan Weil <stefan@weilnetz.de>
Song Gao <17746591750@163.com> <gaosong@loongson.cn>
Taylor Simpson <ltaylorsimpson@gmail.com> <tsimpson@quicinc.com>
Yongbok Kim <yongbok.kim@mips.com> <yongbok.kim@imgtec.com>

View File

@@ -280,7 +280,9 @@ F: disas/hppa.c
F: tests/tcg/hppa/
LoongArch TCG CPUs
M: Song Gao <gaosong@loongson.cn>
M: Song Gao <17746591750@163.com>
M: Bibo Mao <maobibo@loongson.cn>
R: Xianglai Li <lixianglai@loongson.cn>
S: Maintained
F: target/loongarch/
F: tests/docker/dockerfiles/debian-loongarch-cross.docker
@@ -1360,8 +1362,9 @@ F: docs/devel/hexagon-sys.rst
LoongArch Machines
------------------
Virt
M: Song Gao <gaosong@loongson.cn>
M: Song Gao <17746591750@163.com>
M: Bibo Mao <maobibo@loongson.cn>
R: Xianglai Li <lixianglai@loongson.cn>
R: Jiaxun Yang <jiaxun.yang@flygoat.com>
S: Maintained
F: docs/system/loongarch/virt.rst

View File

@@ -19,6 +19,7 @@
#include "target/loongarch/cpu.h"
#include "qemu/error-report.h"
#include "system/hw_accel.h"
#include "qemu/log.h"
/* msg addr field */
FIELD(MSG_ADDR, IRQ_NUM, 4, 8)
@@ -52,7 +53,19 @@ static void loongarch_dintc_mem_write(void *opaque, hwaddr addr,
CPUState *cs;
cpu_num = FIELD_EX64(msg_addr, MSG_ADDR, CPU_NUM);
/* Validate cpu_num against the configured number of CPUs */
if (cpu_num >= s->num_cpu) {
qemu_log_mask(LOG_GUEST_ERROR,
"loongarch-dintc: invalid cpu number%d\n", cpu_num);
return;
}
cs = cpu_by_arch_id(cpu_num);
if (!cs) {
qemu_log_mask(LOG_GUEST_ERROR,
"loongarch-dintc: no CPU for arch_id %d\n", cpu_num);
return;
}
irq_num = FIELD_EX64(msg_addr, MSG_ADDR, IRQ_NUM);
async_run_on_cpu(cs, do_set_vcpu_dintc_irq,

View File

@@ -10,6 +10,11 @@
#define TARGET_VIRT_ADDR_SPACE_BITS 48
#define TARGET_PAGE_BITS 12
#ifdef CONFIG_USER_ONLY
/* Allow user-only to vary page size from 4k */
# define TARGET_PAGE_BITS_VARY
#else
# define TARGET_PAGE_BITS 12
#endif
#endif

View File

@@ -46,12 +46,12 @@ static int kvm_get_stealtime(CPUState *cs)
.addr = (uint64_t)&env->stealtime.guest_addr,
};
err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, attr);
err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, &attr);
if (err) {
return 0;
}
err = kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, attr);
err = kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, &attr);
if (err) {
error_report("PVTIME: KVM_GET_DEVICE_ATTR: %s", strerror(errno));
return err;
@@ -70,12 +70,12 @@ static int kvm_set_stealtime(CPUState *cs)
.addr = (uint64_t)&env->stealtime.guest_addr,
};
err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, attr);
err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, &attr);
if (err) {
return 0;
}
err = kvm_vcpu_ioctl(cs, KVM_SET_DEVICE_ATTR, attr);
err = kvm_vcpu_ioctl(cs, KVM_SET_DEVICE_ATTR, &attr);
if (err) {
error_report("PVTIME: KVM_SET_DEVICE_ATTR %s with gpa "TARGET_FMT_lx,
strerror(errno), env->stealtime.guest_addr);
@@ -96,13 +96,13 @@ static int kvm_set_pv_features(CPUState *cs)
.addr = (uint64_t)&val,
};
err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, attr);
err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, &attr);
if (err) {
return 0;
}
val = env->pv_features;
err = kvm_vcpu_ioctl(cs, KVM_SET_DEVICE_ATTR, attr);
err = kvm_vcpu_ioctl(cs, KVM_SET_DEVICE_ATTR, &attr);
if (err) {
error_report("Fail to set pv feature "TARGET_FMT_lx " with error %s",
val, strerror(errno));
@@ -713,11 +713,11 @@ static int kvm_loongarch_get_cpucfg(CPUState *cs)
CPULoongArchState *env = cpu_env(cs);
for (i = 0; i < 21; i++) {
ret = kvm_get_one_reg(cs, KVM_IOC_CPUCFG(i), &val);
if (ret < 0) {
trace_kvm_failed_get_cpucfg(strerror(errno));
int r = kvm_get_one_reg(cs, KVM_IOC_CPUCFG(i), &val);
ret |= r;
if (!r) {
env->cpucfg[i] = (uint32_t)val;
}
env->cpucfg[i] = (uint32_t)val;
}
return ret;
}
@@ -725,7 +725,7 @@ static int kvm_loongarch_get_cpucfg(CPUState *cs)
static int kvm_check_cpucfg2(CPUState *cs)
{
int ret;
uint64_t val;
uint64_t val = 0;
struct kvm_device_attr attr = {
.group = KVM_LOONGARCH_VCPU_CPUCFG,
.attr = 2,
@@ -736,8 +736,17 @@ static int kvm_check_cpucfg2(CPUState *cs)
ret = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, &attr);
if (!ret) {
kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, &attr);
env->cpucfg[2] &= val;
/*
* The &= mask is best-effort feature negotiation. If HAS succeeded,
* a GET failure is most likely a copy_{from,to}_user issue; warn and
* keep the cpucfg2 the guest already has rather than failing the sync.
*/
int r = kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, &attr);
if (r) {
warn_report("CPUCFG2: KVM_GET_DEVICE_ATTR: %s", strerror(errno));
} else {
env->cpucfg[2] &= val;
}
if (FIELD_EX32(env->cpucfg[2], CPUCFG2, FP)) {
/* The FP minimal version is 1. */
@@ -761,16 +770,13 @@ static int kvm_loongarch_put_cpucfg(CPUState *cs)
for (i = 0; i < 21; i++) {
if (i == 2) {
ret = kvm_check_cpucfg2(cs);
if (ret) {
return ret;
int r = kvm_check_cpucfg2(cs);
if (r) {
return r;
}
}
val = env->cpucfg[i];
ret = kvm_set_one_reg(cs, KVM_IOC_CPUCFG(i), &val);
if (ret < 0) {
trace_kvm_failed_put_cpucfg(strerror(errno));
}
ret |= kvm_set_one_reg(cs, KVM_IOC_CPUCFG(i), &val);
}
return ret;
}

View File

@@ -9,7 +9,5 @@ kvm_failed_get_mpstate(const char *msg) "Failed to get mp_state from KVM: %s"
kvm_failed_put_mpstate(const char *msg) "Failed to put mp_state into KVM: %s"
kvm_failed_get_counter(const char *msg) "Failed to get counter from KVM: %s"
kvm_failed_put_counter(const char *msg) "Failed to put counter into KVM: %s"
kvm_failed_get_cpucfg(const char *msg) "Failed to get cpucfg from KVM: %s"
kvm_failed_put_cpucfg(const char *msg) "Failed to put cpucfg into KVM: %s"
kvm_arch_handle_exit(int num) "kvm arch handle exit, the reason number: %d"
kvm_set_intr(int irq, int level) "kvm set interrupt, irq num: %d, level: %d"