acpi: arm/x86: build_srat: use acpi_table_begin()/acpi_table_end() instead of build_header()
it replaces error-prone pointer arithmetic for build_header() API, with 2 calls to start and finish table creation, which hides offsets magic from API user. While at it switch to build_append_int_noprefix() to build table entries (which also removes some manual offset calculations) Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Message-Id: <20210924122802.1455362-17-imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
57cb8cfbf2
commit
255bf20f2e
|
@ -477,18 +477,19 @@ build_spcr(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||||
static void
|
static void
|
||||||
build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||||
{
|
{
|
||||||
AcpiSystemResourceAffinityTable *srat;
|
|
||||||
AcpiSratProcessorGiccAffinity *core;
|
AcpiSratProcessorGiccAffinity *core;
|
||||||
AcpiSratMemoryAffinity *numamem;
|
AcpiSratMemoryAffinity *numamem;
|
||||||
int i, srat_start;
|
int i;
|
||||||
uint64_t mem_base;
|
uint64_t mem_base;
|
||||||
MachineClass *mc = MACHINE_GET_CLASS(vms);
|
MachineClass *mc = MACHINE_GET_CLASS(vms);
|
||||||
MachineState *ms = MACHINE(vms);
|
MachineState *ms = MACHINE(vms);
|
||||||
const CPUArchIdList *cpu_list = mc->possible_cpu_arch_ids(ms);
|
const CPUArchIdList *cpu_list = mc->possible_cpu_arch_ids(ms);
|
||||||
|
AcpiTable table = { .sig = "SRAT", .rev = 3, .oem_id = vms->oem_id,
|
||||||
|
.oem_table_id = vms->oem_table_id };
|
||||||
|
|
||||||
srat_start = table_data->len;
|
acpi_table_begin(&table, table_data);
|
||||||
srat = acpi_data_push(table_data, sizeof(*srat));
|
build_append_int_noprefix(table_data, 1, 4); /* Reserved */
|
||||||
srat->reserved1 = cpu_to_le32(1);
|
build_append_int_noprefix(table_data, 0, 8); /* Reserved */
|
||||||
|
|
||||||
for (i = 0; i < cpu_list->len; ++i) {
|
for (i = 0; i < cpu_list->len; ++i) {
|
||||||
core = acpi_data_push(table_data, sizeof(*core));
|
core = acpi_data_push(table_data, sizeof(*core));
|
||||||
|
@ -522,9 +523,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||||
MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
|
MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
build_header(linker, table_data, (void *)(table_data->data + srat_start),
|
acpi_table_end(linker, &table);
|
||||||
"SRAT", table_data->len - srat_start, 3, vms->oem_id,
|
|
||||||
vms->oem_table_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* GTDT */
|
/* GTDT */
|
||||||
|
|
|
@ -1942,11 +1942,10 @@ build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
|
||||||
static void
|
static void
|
||||||
build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
|
build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
|
||||||
{
|
{
|
||||||
AcpiSystemResourceAffinityTable *srat;
|
|
||||||
AcpiSratMemoryAffinity *numamem;
|
AcpiSratMemoryAffinity *numamem;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
int srat_start, numa_start, slots;
|
int numa_start, slots;
|
||||||
uint64_t mem_len, mem_base, next_base;
|
uint64_t mem_len, mem_base, next_base;
|
||||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||||
X86MachineState *x86ms = X86_MACHINE(machine);
|
X86MachineState *x86ms = X86_MACHINE(machine);
|
||||||
|
@ -1957,11 +1956,12 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
|
||||||
ram_addr_t hotpluggable_address_space_size =
|
ram_addr_t hotpluggable_address_space_size =
|
||||||
object_property_get_int(OBJECT(pcms), PC_MACHINE_DEVMEM_REGION_SIZE,
|
object_property_get_int(OBJECT(pcms), PC_MACHINE_DEVMEM_REGION_SIZE,
|
||||||
NULL);
|
NULL);
|
||||||
|
AcpiTable table = { .sig = "SRAT", .rev = 1, .oem_id = x86ms->oem_id,
|
||||||
|
.oem_table_id = x86ms->oem_table_id };
|
||||||
|
|
||||||
srat_start = table_data->len;
|
acpi_table_begin(&table, table_data);
|
||||||
|
build_append_int_noprefix(table_data, 1, 4); /* Reserved */
|
||||||
srat = acpi_data_push(table_data, sizeof *srat);
|
build_append_int_noprefix(table_data, 0, 8); /* Reserved */
|
||||||
srat->reserved1 = cpu_to_le32(1);
|
|
||||||
|
|
||||||
for (i = 0; i < apic_ids->len; i++) {
|
for (i = 0; i < apic_ids->len; i++) {
|
||||||
int node_id = apic_ids->cpus[i].props.node_id;
|
int node_id = apic_ids->cpus[i].props.node_id;
|
||||||
|
@ -2067,11 +2067,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
|
||||||
MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
|
MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
build_header(linker, table_data,
|
acpi_table_end(linker, &table);
|
||||||
(void *)(table_data->data + srat_start),
|
|
||||||
"SRAT",
|
|
||||||
table_data->len - srat_start, 1, x86ms->oem_id,
|
|
||||||
x86ms->oem_table_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -358,17 +358,6 @@ struct AcpiGenericTimerTable {
|
||||||
} QEMU_PACKED;
|
} QEMU_PACKED;
|
||||||
typedef struct AcpiGenericTimerTable AcpiGenericTimerTable;
|
typedef struct AcpiGenericTimerTable AcpiGenericTimerTable;
|
||||||
|
|
||||||
/*
|
|
||||||
* SRAT (NUMA topology description) table
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct AcpiSystemResourceAffinityTable {
|
|
||||||
ACPI_TABLE_HEADER_DEF
|
|
||||||
uint32_t reserved1;
|
|
||||||
uint32_t reserved2[2];
|
|
||||||
} QEMU_PACKED;
|
|
||||||
typedef struct AcpiSystemResourceAffinityTable AcpiSystemResourceAffinityTable;
|
|
||||||
|
|
||||||
#define ACPI_SRAT_PROCESSOR_APIC 0
|
#define ACPI_SRAT_PROCESSOR_APIC 0
|
||||||
#define ACPI_SRAT_MEMORY 1
|
#define ACPI_SRAT_MEMORY 1
|
||||||
#define ACPI_SRAT_PROCESSOR_x2APIC 2
|
#define ACPI_SRAT_PROCESSOR_x2APIC 2
|
||||||
|
|
Loading…
Reference in New Issue