Reduce code duplication by getting legacy fw cfg data from guest info structure.
Signed-off-by: Michael S. Tsirkin mst@redhat.com --- hw/i386/pc.c | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c index af414a4..41bfb5b 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -594,14 +594,13 @@ static unsigned int pc_apic_id_limit(unsigned int max_cpus) return x86_cpu_apic_id_from_index(max_cpus - 1) + 1; }
-static FWCfgState *bochs_bios_init(void) +static FWCfgState *bochs_bios_init(PcGuestInfo *guest_info) { FWCfgState *fw_cfg; uint8_t *smbios_table; size_t smbios_len; uint64_t *numa_fw_cfg; - int i, j; - unsigned int apic_id_limit = pc_apic_id_limit(max_cpus); + int i;
fw_cfg = fw_cfg_init(BIOS_CFG_IOPORT, BIOS_CFG_IOPORT + 1, 0, 0); /* FW_CFG_MAX_CPUS is a bit confusing/problematic on x86: @@ -618,7 +617,7 @@ static FWCfgState *bochs_bios_init(void) * [1] The only kind of "CPU identifier" used between SeaBIOS and QEMU is * the APIC ID, not the "CPU index" */ - fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)apic_id_limit); + fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)guest_info->apic_id_limit); fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1); fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size); fw_cfg_add_bytes(fw_cfg, FW_CFG_ACPI_TABLES, @@ -637,24 +636,19 @@ static FWCfgState *bochs_bios_init(void) * of nodes, one word for each VCPU->node and one word for each node to * hold the amount of memory. */ - numa_fw_cfg = g_new0(uint64_t, 1 + apic_id_limit + nb_numa_nodes); - numa_fw_cfg[0] = cpu_to_le64(nb_numa_nodes); - for (i = 0; i < max_cpus; i++) { - unsigned int apic_id = x86_cpu_apic_id_from_index(i); - assert(apic_id < apic_id_limit); - for (j = 0; j < nb_numa_nodes; j++) { - if (test_bit(i, node_cpumask[j])) { - numa_fw_cfg[apic_id + 1] = cpu_to_le64(j); - break; - } - } + numa_fw_cfg = g_new0(uint64_t, 1 + guest_info->apic_id_limit + + guest_info->numa_nodes); + numa_fw_cfg[0] = cpu_to_le64(guest_info->numa_nodes); + for (i = 0; i < guest_info->apic_id_limit; i++) { + numa_fw_cfg[i + 1] = cpu_to_le64(guest_info->node_cpu[i]); } - for (i = 0; i < nb_numa_nodes; i++) { - numa_fw_cfg[apic_id_limit + 1 + i] = cpu_to_le64(node_mem[i]); + for (i = 0; i < guest_info->numa_nodes; i++) { + numa_fw_cfg[guest_info->apic_id_limit + 1 + i] = + cpu_to_le64(guest_info->node_mem[i]); } fw_cfg_add_bytes(fw_cfg, FW_CFG_NUMA, numa_fw_cfg, - (1 + apic_id_limit + nb_numa_nodes) * - sizeof(*numa_fw_cfg)); + (1 + guest_info->apic_id_limit + + guest_info->numa_nodes) * sizeof(*numa_fw_cfg));
return fw_cfg; } @@ -1151,7 +1145,7 @@ FWCfgState *pc_memory_init(MemoryRegion *system_memory, option_rom_mr, 1);
- fw_cfg = bochs_bios_init(); + fw_cfg = bochs_bios_init(guest_info); rom_set_fw(fw_cfg);
if (linux_boot) {