Skip to content

Commit

Permalink
acpi: convert linker from GArray to BIOSLinker structure
Browse files Browse the repository at this point in the history
Patch just changes type of of linker variables to
a structure, there aren't any functional changes.

Converting linker to a structure will allow to extend
it functionality in follow up patch adding sanity blob
checks.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
Igor Mammedov authored and mstsirkin committed Jun 7, 2016
1 parent 0058c08 commit 0e9b9ed
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 58 deletions.
5 changes: 2 additions & 3 deletions hw/acpi/aml-build.c
Expand Up @@ -24,7 +24,6 @@
#include "hw/acpi/aml-build.h"
#include "qemu/bswap.h"
#include "qemu/bitops.h"
#include "hw/acpi/bios-linker-loader.h"

static GArray *build_alloc_array(void)
{
Expand Down Expand Up @@ -1490,7 +1489,7 @@ Aml *aml_concatenate(Aml *source1, Aml *source2, Aml *target)
}

void
build_header(GArray *linker, GArray *table_data,
build_header(BIOSLinker *linker, GArray *table_data,
AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
const char *oem_id, const char *oem_table_id)
{
Expand Down Expand Up @@ -1558,7 +1557,7 @@ void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre)

/* Build rsdt table */
void
build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets,
build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets,
const char *oem_id, const char *oem_table_id)
{
AcpiRsdtDescriptorRev1 *rsdt;
Expand Down
40 changes: 23 additions & 17 deletions hw/acpi/bios-linker-loader.c
Expand Up @@ -96,33 +96,39 @@ enum {
};

/*
* bios_linker_loader_init: allocate a new linker file blob array.
* bios_linker_loader_init: allocate a new linker object instance.
*
* After initialization, linker commands can be added, and will
* be stored in the array.
* be stored in the linker.cmd_blob array.
*/
GArray *bios_linker_loader_init(void)
BIOSLinker *bios_linker_loader_init(void)
{
return g_array_new(false, true /* clear */, 1);
BIOSLinker *linker = g_new(BIOSLinker, 1);

linker->cmd_blob = g_array_new(false, true /* clear */, 1);
return linker;
}

/* Free linker wrapper and return the linker array. */
void *bios_linker_loader_cleanup(GArray *linker)
/* Free linker wrapper and return the linker commands array. */
void *bios_linker_loader_cleanup(BIOSLinker *linker)
{
return g_array_free(linker, false);
void *cmd_blob = g_array_free(linker->cmd_blob, false);

g_free(linker);
return cmd_blob;
}

/*
* bios_linker_loader_alloc: ask guest to load file into guest memory.
*
* @linker: linker file blob array
* @file: file to be loaded
* @linker: linker object instance
* @file: name of the file blob to be loaded
* @alloc_align: required minimal alignment in bytes. Must be a power of 2.
* @alloc_fseg: request allocation in FSEG zone (useful for the RSDP ACPI table)
*
* Note: this command must precede any other linker command using this file.
*/
void bios_linker_loader_alloc(GArray *linker,
void bios_linker_loader_alloc(BIOSLinker *linker,
const char *file,
uint32_t alloc_align,
bool alloc_fseg)
Expand All @@ -139,7 +145,7 @@ void bios_linker_loader_alloc(GArray *linker,
BIOS_LINKER_LOADER_ALLOC_ZONE_HIGH;

/* Alloc entries must come first, so prepend them */
g_array_prepend_vals(linker, &entry, sizeof entry);
g_array_prepend_vals(linker->cmd_blob, &entry, sizeof entry);
}

/*
Expand All @@ -149,7 +155,7 @@ void bios_linker_loader_alloc(GArray *linker,
* Checksum calculation simply sums -X for each byte X in the range
* using 8-bit math (i.e. ACPI checksum).
*
* @linker: linker file blob array
* @linker: linker object instance
* @file: file that includes the checksum to be calculated
* and the data to be checksummed
* @table: @file blob contents
Expand All @@ -167,7 +173,7 @@ void bios_linker_loader_alloc(GArray *linker,
* - To avoid confusion, caller must always put 0x0 at @checksum.
* - @file must be loaded into Guest memory using bios_linker_loader_alloc
*/
void bios_linker_loader_add_checksum(GArray *linker, const char *file,
void bios_linker_loader_add_checksum(BIOSLinker *linker, const char *file,
GArray *table,
void *start, unsigned size,
uint8_t *checksum)
Expand All @@ -189,14 +195,14 @@ void bios_linker_loader_add_checksum(GArray *linker, const char *file,
entry.cksum.start = cpu_to_le32(start_offset);
entry.cksum.length = cpu_to_le32(size);

g_array_append_vals(linker, &entry, sizeof entry);
g_array_append_vals(linker->cmd_blob, &entry, sizeof entry);
}

/*
* bios_linker_loader_add_pointer: ask guest to add address of source file
* into destination file at the specified pointer.
*
* @linker: linker file blob array
* @linker: linker object instance
* @dest_file: destination file that must be changed
* @src_file: source file who's address must be taken
* @table: @dest_file blob contents array
Expand All @@ -213,7 +219,7 @@ void bios_linker_loader_add_checksum(GArray *linker, const char *file,
* - Both @dest_file and @src_file must be
* loaded into Guest memory using bios_linker_loader_alloc
*/
void bios_linker_loader_add_pointer(GArray *linker,
void bios_linker_loader_add_pointer(BIOSLinker *linker,
const char *dest_file,
const char *src_file,
GArray *table, void *pointer,
Expand All @@ -236,5 +242,5 @@ void bios_linker_loader_add_pointer(GArray *linker,
assert(pointer_size == 1 || pointer_size == 2 ||
pointer_size == 4 || pointer_size == 8);

g_array_append_vals(linker, &entry, sizeof entry);
g_array_append_vals(linker->cmd_blob, &entry, sizeof entry);
}
6 changes: 3 additions & 3 deletions hw/acpi/nvdimm.c
Expand Up @@ -353,7 +353,7 @@ static GArray *nvdimm_build_device_structure(GSList *device_list)
}

static void nvdimm_build_nfit(GSList *device_list, GArray *table_offsets,
GArray *table_data, GArray *linker)
GArray *table_data, BIOSLinker *linker)
{
GArray *structures = nvdimm_build_device_structure(device_list);
unsigned int header;
Expand Down Expand Up @@ -579,7 +579,7 @@ static void nvdimm_build_nvdimm_devices(GSList *device_list, Aml *root_dev)
}

static void nvdimm_build_ssdt(GSList *device_list, GArray *table_offsets,
GArray *table_data, GArray *linker)
GArray *table_data, BIOSLinker *linker)
{
Aml *ssdt, *sb_scope, *dev, *field;
int mem_addr_offset, nvdimm_ssdt;
Expand Down Expand Up @@ -691,7 +691,7 @@ static void nvdimm_build_ssdt(GSList *device_list, GArray *table_offsets,
}

void nvdimm_build_acpi(GArray *table_offsets, GArray *table_data,
GArray *linker)
BIOSLinker *linker)
{
GSList *device_list;

Expand Down
24 changes: 12 additions & 12 deletions hw/arm/virt-acpi-build.c
Expand Up @@ -354,7 +354,7 @@ static void acpi_dsdt_add_power_button(Aml *scope)

/* RSDP */
static GArray *
build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt)
{
AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);

Expand Down Expand Up @@ -383,7 +383,7 @@ build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
}

static void
build_spcr(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
build_spcr(GArray *table_data, BIOSLinker *linker, VirtGuestInfo *guest_info)
{
AcpiSerialPortConsoleRedirection *spcr;
const MemMapEntry *uart_memmap = &guest_info->memmap[VIRT_UART];
Expand Down Expand Up @@ -416,7 +416,7 @@ build_spcr(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
}

static void
build_srat(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
build_srat(GArray *table_data, BIOSLinker *linker, VirtGuestInfo *guest_info)
{
AcpiSystemResourceAffinityTable *srat;
AcpiSratProcessorGiccAffinity *core;
Expand Down Expand Up @@ -456,13 +456,12 @@ build_srat(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
mem_base += numa_info[i].node_mem;
}

build_header(linker, table_data,
(void *)(table_data->data + srat_start), "SRAT",
build_header(linker, table_data, (void *)srat, "SRAT",
table_data->len - srat_start, 3, NULL, NULL);
}

static void
build_mcfg(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
build_mcfg(GArray *table_data, BIOSLinker *linker, VirtGuestInfo *guest_info)
{
AcpiTableMcfg *mcfg;
const MemMapEntry *memmap = guest_info->memmap;
Expand All @@ -482,7 +481,7 @@ build_mcfg(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)

/* GTDT */
static void
build_gtdt(GArray *table_data, GArray *linker)
build_gtdt(GArray *table_data, BIOSLinker *linker)
{
int gtdt_start = table_data->len;
AcpiGenericTimerTable *gtdt;
Expand All @@ -508,7 +507,7 @@ build_gtdt(GArray *table_data, GArray *linker)

/* MADT */
static void
build_madt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
build_madt(GArray *table_data, BIOSLinker *linker, VirtGuestInfo *guest_info)
{
int madt_start = table_data->len;
const MemMapEntry *memmap = guest_info->memmap;
Expand Down Expand Up @@ -567,7 +566,7 @@ build_madt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)

/* FADT */
static void
build_fadt(GArray *table_data, GArray *linker, unsigned dsdt)
build_fadt(GArray *table_data, BIOSLinker *linker, unsigned dsdt)
{
AcpiFadtDescriptorRev5_1 *fadt = acpi_data_push(table_data, sizeof(*fadt));

Expand All @@ -592,7 +591,7 @@ build_fadt(GArray *table_data, GArray *linker, unsigned dsdt)

/* DSDT */
static void
build_dsdt(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
build_dsdt(GArray *table_data, BIOSLinker *linker, VirtGuestInfo *guest_info)
{
Aml *scope, *dsdt;
const MemMapEntry *memmap = guest_info->memmap;
Expand Down Expand Up @@ -731,7 +730,7 @@ static void virt_acpi_build_update(void *build_opaque)

acpi_ram_update(build_state->table_mr, tables.table_data);
acpi_ram_update(build_state->rsdp_mr, tables.rsdp);
acpi_ram_update(build_state->linker_mr, tables.linker);
acpi_ram_update(build_state->linker_mr, tables.linker->cmd_blob);


acpi_build_tables_cleanup(&tables, true);
Expand Down Expand Up @@ -789,7 +788,8 @@ void virt_acpi_setup(VirtGuestInfo *guest_info)
assert(build_state->table_mr != NULL);

build_state->linker_mr =
acpi_add_rom_blob(build_state, tables.linker, "etc/table-loader", 0);
acpi_add_rom_blob(build_state, tables.linker->cmd_blob,
"etc/table-loader", 0);

fw_cfg_add_file(guest_info->fw_cfg, ACPI_BUILD_TPMLOG_FILE,
tables.tcpalog->data, acpi_data_len(tables.tcpalog));
Expand Down
29 changes: 15 additions & 14 deletions hw/i386/acpi-build.c
Expand Up @@ -260,7 +260,7 @@ static void acpi_align_size(GArray *blob, unsigned align)

/* FACS */
static void
build_facs(GArray *table_data, GArray *linker)
build_facs(GArray *table_data, BIOSLinker *linker)
{
AcpiFacsDescriptorRev1 *facs = acpi_data_push(table_data, sizeof *facs);
memcpy(&facs->signature, "FACS", 4);
Expand Down Expand Up @@ -305,7 +305,7 @@ static void fadt_setup(AcpiFadtDescriptorRev1 *fadt, AcpiPmInfo *pm)

/* FADT */
static void
build_fadt(GArray *table_data, GArray *linker, AcpiPmInfo *pm,
build_fadt(GArray *table_data, BIOSLinker *linker, AcpiPmInfo *pm,
unsigned facs, unsigned dsdt,
const char *oem_id, const char *oem_table_id)
{
Expand All @@ -332,7 +332,7 @@ build_fadt(GArray *table_data, GArray *linker, AcpiPmInfo *pm,
}

static void
build_madt(GArray *table_data, GArray *linker, PCMachineState *pcms)
build_madt(GArray *table_data, BIOSLinker *linker, PCMachineState *pcms)
{
MachineClass *mc = MACHINE_GET_CLASS(pcms);
CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(MACHINE(pcms));
Expand Down Expand Up @@ -1869,7 +1869,7 @@ static Aml *build_q35_osc_method(void)
}

static void
build_dsdt(GArray *table_data, GArray *linker,
build_dsdt(GArray *table_data, BIOSLinker *linker,
AcpiPmInfo *pm, AcpiMiscInfo *misc,
PcPciInfo *pci, MachineState *machine)
{
Expand Down Expand Up @@ -2240,7 +2240,7 @@ build_dsdt(GArray *table_data, GArray *linker,
}

static void
build_hpet(GArray *table_data, GArray *linker)
build_hpet(GArray *table_data, BIOSLinker *linker)
{
Acpi20Hpet *hpet;

Expand All @@ -2255,7 +2255,7 @@ build_hpet(GArray *table_data, GArray *linker)
}

static void
build_tpm_tcpa(GArray *table_data, GArray *linker, GArray *tcpalog)
build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog)
{
Acpi20Tcpa *tcpa = acpi_data_push(table_data, sizeof *tcpa);
uint64_t log_area_start_address = acpi_data_len(tcpalog);
Expand All @@ -2280,7 +2280,7 @@ build_tpm_tcpa(GArray *table_data, GArray *linker, GArray *tcpalog)
}

static void
build_tpm2(GArray *table_data, GArray *linker)
build_tpm2(GArray *table_data, BIOSLinker *linker)
{
Acpi20TPM2 *tpm2_ptr;

Expand All @@ -2295,7 +2295,7 @@ build_tpm2(GArray *table_data, GArray *linker)
}

static void
build_srat(GArray *table_data, GArray *linker, MachineState *machine)
build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
{
AcpiSystemResourceAffinityTable *srat;
AcpiSratProcessorAffinity *core;
Expand Down Expand Up @@ -2392,7 +2392,7 @@ build_srat(GArray *table_data, GArray *linker, MachineState *machine)
}

static void
build_mcfg_q35(GArray *table_data, GArray *linker, AcpiMcfgInfo *info)
build_mcfg_q35(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info)
{
AcpiTableMcfg *mcfg;
const char *sig;
Expand Down Expand Up @@ -2421,7 +2421,7 @@ build_mcfg_q35(GArray *table_data, GArray *linker, AcpiMcfgInfo *info)
}

static void
build_dmar_q35(GArray *table_data, GArray *linker)
build_dmar_q35(GArray *table_data, BIOSLinker *linker)
{
int dmar_start = table_data->len;

Expand All @@ -2445,7 +2445,7 @@ build_dmar_q35(GArray *table_data, GArray *linker)
}

static GArray *
build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt)
{
AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);

Expand Down Expand Up @@ -2657,7 +2657,7 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
acpi_align_size(tables_blob, ACPI_BUILD_TABLE_SIZE);
}

acpi_align_size(tables->linker, ACPI_BUILD_ALIGN_SIZE);
acpi_align_size(tables->linker->cmd_blob, ACPI_BUILD_ALIGN_SIZE);

/* Cleanup memory that's no longer used. */
g_array_free(table_offsets, true);
Expand Down Expand Up @@ -2697,7 +2697,7 @@ static void acpi_build_update(void *build_opaque)
acpi_ram_update(build_state->rsdp_mr, tables.rsdp);
}

acpi_ram_update(build_state->linker_mr, tables.linker);
acpi_ram_update(build_state->linker_mr, tables.linker->cmd_blob);
acpi_build_tables_cleanup(&tables, true);
}

Expand Down Expand Up @@ -2761,7 +2761,8 @@ void acpi_setup(void)
assert(build_state->table_mr != NULL);

build_state->linker_mr =
acpi_add_rom_blob(build_state, tables.linker, "etc/table-loader", 0);
acpi_add_rom_blob(build_state, tables.linker->cmd_blob,
"etc/table-loader", 0);

fw_cfg_add_file(pcms->fw_cfg, ACPI_BUILD_TPMLOG_FILE,
tables.tcpalog->data, acpi_data_len(tables.tcpalog));
Expand Down

0 comments on commit 0e9b9ed

Please sign in to comment.