Patchwork [RFC,13/13] pc: reuse guest info for legacy fw cfg

login
register
mail settings
Submitter Michael S. Tsirkin
Date May 13, 2013, 8:01 p.m.
Message ID <5a4fcc1346b9b0e0b3ea6d10dd3a9d5c4da28282.1368474222.git.mst@redhat.com>
Download mbox | patch
Permalink /patch/243516/
State New
Headers show

Comments

Michael S. Tsirkin - May 13, 2013, 8:01 p.m.
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(-)

Patch

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) {