[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL v2 4/6] hw/loongarch/virt: Improve fdt table creation for CPU obje
From: |
Bibo Mao |
Subject: |
[PULL v2 4/6] hw/loongarch/virt: Improve fdt table creation for CPU object |
Date: |
Fri, 27 Dec 2024 14:22:06 +0800 |
For CPU object, possible_cpu_arch_ids() function is used rather than
smp.cpus. With command -smp x, -device la464-loongarch-cpu, smp.cpus
is not accurate for all possible CPU objects, possible_cpu_arch_ids()
is used here.
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
---
hw/loongarch/virt.c | 39 +++++++++++++++++++++++++--------------
1 file changed, 25 insertions(+), 14 deletions(-)
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 266f291509..99594a13a0 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -365,26 +365,35 @@ static void create_fdt(LoongArchVirtMachineState *lvms)
static void fdt_add_cpu_nodes(const LoongArchVirtMachineState *lvms)
{
int num;
- const MachineState *ms = MACHINE(lvms);
- int smp_cpus = ms->smp.cpus;
+ MachineState *ms = MACHINE(lvms);
+ MachineClass *mc = MACHINE_GET_CLASS(ms);
+ const CPUArchIdList *possible_cpus;
+ LoongArchCPU *cpu;
+ CPUState *cs;
+ char *nodename, *map_path;
qemu_fdt_add_subnode(ms->fdt, "/cpus");
qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1);
qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0);
/* cpu nodes */
- for (num = smp_cpus - 1; num >= 0; num--) {
- char *nodename = g_strdup_printf("/cpus/cpu@%d", num);
- LoongArchCPU *cpu = LOONGARCH_CPU(qemu_get_cpu(num));
- CPUState *cs = CPU(cpu);
+ possible_cpus = mc->possible_cpu_arch_ids(ms);
+ for (num = 0; num < possible_cpus->len; num++) {
+ cs = possible_cpus->cpus[num].cpu;
+ if (cs == NULL) {
+ continue;
+ }
+
+ nodename = g_strdup_printf("/cpus/cpu@%d", num);
+ cpu = LOONGARCH_CPU(cs);
qemu_fdt_add_subnode(ms->fdt, nodename);
qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "cpu");
qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
cpu->dtb_compatible);
- if (ms->possible_cpus->cpus[cs->cpu_index].props.has_node_id) {
+ if (possible_cpus->cpus[num].props.has_node_id) {
qemu_fdt_setprop_cell(ms->fdt, nodename, "numa-node-id",
- ms->possible_cpus->cpus[cs->cpu_index].props.node_id);
+ possible_cpus->cpus[num].props.node_id);
}
qemu_fdt_setprop_cell(ms->fdt, nodename, "reg", num);
qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle",
@@ -394,11 +403,13 @@ static void fdt_add_cpu_nodes(const
LoongArchVirtMachineState *lvms)
/*cpu map */
qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map");
+ for (num = 0; num < possible_cpus->len; num++) {
+ cs = possible_cpus->cpus[num].cpu;
+ if (cs == NULL) {
+ continue;
+ }
- for (num = smp_cpus - 1; num >= 0; num--) {
- char *cpu_path = g_strdup_printf("/cpus/cpu@%d", num);
- char *map_path;
-
+ nodename = g_strdup_printf("/cpus/cpu@%d", num);
if (ms->smp.threads > 1) {
map_path = g_strdup_printf(
"/cpus/cpu-map/socket%d/core%d/thread%d",
@@ -412,10 +423,10 @@ static void fdt_add_cpu_nodes(const
LoongArchVirtMachineState *lvms)
num % ms->smp.cores);
}
qemu_fdt_add_path(ms->fdt, map_path);
- qemu_fdt_setprop_phandle(ms->fdt, map_path, "cpu", cpu_path);
+ qemu_fdt_setprop_phandle(ms->fdt, map_path, "cpu", nodename);
g_free(map_path);
- g_free(cpu_path);
+ g_free(nodename);
}
}
--
2.43.5
- [PULL v2 0/6] loongarch-to-apply queue, Bibo Mao, 2024/12/27
- [PULL v2 1/6] target/loongarch: Fix vldi inst, Bibo Mao, 2024/12/27
- [PULL v2 2/6] target/loongarch: Use actual operand size with vbsrl check, Bibo Mao, 2024/12/27
- [PULL v2 4/6] hw/loongarch/virt: Improve fdt table creation for CPU object,
Bibo Mao <=
- [PULL v2 3/6] hw/loongarch/virt: Create fdt table on machine creation done notification, Bibo Mao, 2024/12/27
- [PULL v2 5/6] target/loongarch: Use auto method with LSX feature, Bibo Mao, 2024/12/27
- [PULL v2 6/6] target/loongarch: Use auto method with LASX feature, Bibo Mao, 2024/12/27
- Re: [PULL v2 0/6] loongarch-to-apply queue, Stefan Hajnoczi, 2024/12/28