@@ -562,13 +562,21 @@ static unsigned int pc_apic_id_limit(unsigned int max_cpus)
return x86_cpu_apic_id_from_index(max_cpus - 1) + 1;
}
+typedef struct SRATData {
+ uint64_t apic_map; /* size is MAX_NODES */
+ uint64_t memory_size;
+} SRATData;
+
static void *bios_init(void)
{
void *fw_cfg;
uint8_t *smbios_table;
size_t smbios_len;
- uint64_t *numa_fw_cfg;
- int i, j;
+ struct FwNUMACfg {
+ uint32_t nr_node;
+ SRATData *srat_data;
+ } fw_cfg_numa;
+ int i;
unsigned int apic_id_limit = pc_apic_id_limit(max_cpus);
fw_cfg = fw_cfg_init(FW_CFG_CTL_IOPORT, FW_CFG_DATA_IOPORT, 0, 0);
@@ -601,28 +609,16 @@ static void *bios_init(void)
&e820_table, sizeof(e820_table));
fw_cfg_add_bytes(fw_cfg, FW_CFG_HPET, &hpet_cfg, sizeof(hpet_cfg));
- /* allocate memory for the NUMA channel: one (64bit) word for the number
- * 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;
- }
- }
- }
+
+ fw_cfg_numa.srat_data = g_new0(SRATData, nb_numa_nodes);
+ fw_cfg_numa.nr_node = cpu_to_le64(nb_numa_nodes);
+
for (i = 0; i < nb_numa_nodes; i++) {
- numa_fw_cfg[apic_id_limit + 1 + i] = cpu_to_le64(node_mem[i]);
+ fw_cfg_numa.srat_data[i].apic_map = *node_cpumask[i];
+ fw_cfg_numa.srat_data[i].memory_size = cpu_to_le64(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));
+
+ fw_cfg_add_bytes(fw_cfg, FW_CFG_NUMA, &fw_cfg_numa, sizeof(fw_cfg_numa));
return fw_cfg;
}
orginally, numa data was packed into an array, which was implicit and hard to maintain, we define a struct for this data, hope to be as clear as enough. also, we only pass cpumask of corresponding nodes to seabios, and leave the paring work for it. Signed-off-by: liguang <lig.fnst@cn.fujitsu.com> --- hw/pc.c | 40 ++++++++++++++++++---------------------- 1 files changed, 18 insertions(+), 22 deletions(-)