[PATCH 1/2] lib: fwts_acpi_tables: add ACPI table provenance

Alex Hung alex.hung at canonical.com
Mon Jun 25 03:08:57 UTC 2012


On 06/22/2012 07:01 PM, Colin King wrote:
> From: Colin Ian King<colin.king at canonical.com>
>
> It is useful (for example in the acpidump test) to be able
> to determine where an ACPI table came from.  In normal mode, fwts
> loads ACPI tables directly from firmware in memory, but it can also
> load them from file (e.g. from acpidump) or even generate them if
> they are missing in a fix-up processing stage.
>
> So, lets add an extra field in the acpi table structure that keeps
> track of each tables provenance.
>
> Signed-off-by: Colin Ian King<colin.king at canonical.com>
> ---
>   src/lib/include/fwts_acpi_tables.h |    7 +++++
>   src/lib/src/fwts_acpi_tables.c     |   57 ++++++++++++++++++++++++------------
>   2 files changed, 46 insertions(+), 18 deletions(-)
>
> diff --git a/src/lib/include/fwts_acpi_tables.h b/src/lib/include/fwts_acpi_tables.h
> index 80fe75e..33f4e4d 100644
> --- a/src/lib/include/fwts_acpi_tables.h
> +++ b/src/lib/include/fwts_acpi_tables.h
> @@ -22,12 +22,19 @@
>
>   #include "fwts.h"
>
> +typedef enum {
> +	FWTS_ACPI_TABLE_FROM_FIRMWARE,	/* directly from firmware */
> +	FWTS_ACPI_TABLE_FROM_FILE,	/* loaded from file, e.g. from acpidump */
> +	FWTS_ACPI_TABLE_FROM_FIXUP,	/* auto-generated fixup by fwts */
> +} fwts_acpi_table_provenance;
> +
>   typedef struct {
>   	char    name[5];
>   	const void *data;
>   	size_t	length;
>   	int 	which;
>   	uint64_t addr;
> +	fwts_acpi_table_provenance provenance;
>   } fwts_acpi_table_info;
>
>   int fwts_acpi_load_tables(fwts_framework *fw);
> diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c
> index 513dfff..042c3ec 100644
> --- a/src/lib/src/fwts_acpi_tables.c
> +++ b/src/lib/src/fwts_acpi_tables.c
> @@ -152,7 +152,12 @@ static void *fwts_acpi_load_table(const off_t addr)
>    *	Add a table to internal ACPI table cache. Ignore duplicates based on
>    *	their address.
>    */
> -static void fwts_acpi_add_table(const char *name, const void *table, const uint64_t addr, const size_t length)
> +static void fwts_acpi_add_table(
> +	const char *name,			/* Table Name */
> +	const void *table,			/* Table binary blob */
> +	const uint64_t addr,			/* Address of table */
> +	const size_t length,			/* Length of table */
> +	fwts_acpi_table_provenance provenance)	/* Where we got the table from */
>   {
>   	int i;
>   	int which = 0;
> @@ -172,6 +177,7 @@ static void fwts_acpi_add_table(const char *name, const void *table, const uint6
>   			tables[i].addr = addr;
>   			tables[i].length = length;
>   			tables[i].which = which;
> +			tables[i].provenance = provenance;
>   			return;
>   		}
>   	}
> @@ -199,7 +205,11 @@ int fwts_acpi_free_tables(void)
>    *	depending on whether 32 or 64 bit address is usable, get the FADT table
>    *	address and load the FADT.
>    */
> -static void fwts_acpi_handle_fadt_tables(fwts_acpi_table_fadt *fadt, const uint32_t *addr32, const uint64_t *addr64)
> +static void fwts_acpi_handle_fadt_tables(
> +	fwts_acpi_table_fadt *fadt,
> +	const uint32_t *addr32,
> +	const uint64_t *addr64,
> +	fwts_acpi_table_provenance provenance)
>   {
>   	off_t addr;
>   	fwts_acpi_table_header *header;
> @@ -212,14 +222,15 @@ static void fwts_acpi_handle_fadt_tables(fwts_acpi_table_fadt *fadt, const uint3
>
>   	if (addr) {
>   		if ((header = fwts_acpi_load_table(addr)) != NULL)
> -			fwts_acpi_add_table(header->signature, header, (uint64_t)addr, header->length);
> +			fwts_acpi_add_table(header->signature, header,
> +				(uint64_t)addr, header->length, provenance);
>   	}
>   }
>
> -static void fwts_acpi_handle_fadt(fwts_acpi_table_fadt *fadt)
> +static void fwts_acpi_handle_fadt(fwts_acpi_table_fadt *fadt, fwts_acpi_table_provenance provenance)
>   {
> -	fwts_acpi_handle_fadt_tables(fadt,&fadt->dsdt,&fadt->x_dsdt);
> -	fwts_acpi_handle_fadt_tables(fadt,&fadt->firmware_control,&fadt->x_firmware_ctrl);
> +	fwts_acpi_handle_fadt_tables(fadt,&fadt->dsdt,&fadt->x_dsdt, provenance);
> +	fwts_acpi_handle_fadt_tables(fadt,&fadt->firmware_control,&fadt->x_firmware_ctrl, provenance);
>   }
>
>   /*
> @@ -246,19 +257,22 @@ static int fwts_acpi_load_tables_from_firmware(void)
>   	/* Load and save cached RSDP */
>   	if ((rsdp = fwts_acpi_get_rsdp(rsdp_addr,&rsdp_len)) == NULL)
>   		return FWTS_ERROR;
> -	fwts_acpi_add_table("RSDP", rsdp, (uint64_t)(off_t)rsdp_addr, rsdp_len);
> +	fwts_acpi_add_table("RSDP", rsdp, (uint64_t)(off_t)rsdp_addr, rsdp_len, FWTS_ACPI_TABLE_FROM_FIRMWARE);
>
>   	/* Load any tables from RSDT if it's valid */
>   	if (rsdp->rsdt_address) {
>   		if ((rsdt = fwts_acpi_load_table((off_t)rsdp->rsdt_address)) != NULL) {
> -			fwts_acpi_add_table("RSDT", rsdt, (uint64_t)rsdp->rsdt_address, rsdt->header.length);
> +			fwts_acpi_add_table("RSDT", rsdt, (uint64_t)rsdp->rsdt_address,
> +				rsdt->header.length, FWTS_ACPI_TABLE_FROM_FIRMWARE);
>   			num_entries = (rsdt->header.length - sizeof(fwts_acpi_table_header)) / 4;
>   			for (i=0; i<num_entries; i++) {
>   				if (rsdt->entries[i]) {
>   					if ((header = fwts_acpi_load_table((off_t)rsdt->entries[i])) != NULL) {
>   						if (strncmp("FACP", header->signature, 4) == 0)
> -							fwts_acpi_handle_fadt((fwts_acpi_table_fadt*)header);
> -						fwts_acpi_add_table(header->signature, header, (uint64_t)rsdt->entries[i], header->length);
> +							fwts_acpi_handle_fadt((fwts_acpi_table_fadt*)header,
> +								FWTS_ACPI_TABLE_FROM_FIRMWARE);
> +						fwts_acpi_add_table(header->signature, header, (uint64_t)rsdt->entries[i],
> +							header->length, FWTS_ACPI_TABLE_FROM_FIRMWARE);
>   					}
>   				}
>   			}
> @@ -268,14 +282,17 @@ static int fwts_acpi_load_tables_from_firmware(void)
>   	/* Load any tables from XSDT if it's valid */
>   	if (rsdp->xsdt_address) {
>   		if ((xsdt = fwts_acpi_load_table((off_t)rsdp->xsdt_address)) != NULL) {
> -			fwts_acpi_add_table("XSDT", xsdt, (uint64_t)rsdp->xsdt_address, xsdt->header.length);
> +			fwts_acpi_add_table("XSDT", xsdt, (uint64_t)rsdp->xsdt_address,
> +				xsdt->header.length, FWTS_ACPI_TABLE_FROM_FIRMWARE);
>   			num_entries = (xsdt->header.length - sizeof(fwts_acpi_table_header)) / 8;
>   			for (i=0; i<num_entries; i++) {
>   				if (xsdt->entries[i]) {
>   					if ((header = fwts_acpi_load_table((off_t)xsdt->entries[i])) != NULL) {
>   						if (strncmp("FACP", header->signature, 4) == 0)
> -							fwts_acpi_handle_fadt((fwts_acpi_table_fadt*)header);
> -						fwts_acpi_add_table(header->signature, header, xsdt->entries[i], header->length);
> +							fwts_acpi_handle_fadt((fwts_acpi_table_fadt*)header,
> +								FWTS_ACPI_TABLE_FROM_FIRMWARE);
> +						fwts_acpi_add_table(header->signature, header, xsdt->entries[i],
> +							header->length, FWTS_ACPI_TABLE_FROM_FIRMWARE);
>   					}
>   				}
>   			}
> @@ -402,7 +419,7 @@ static int fwts_acpi_load_tables_from_acpidump(fwts_framework *fw)
>   		char name[16];
>
>   		if ((table = fwts_acpi_load_table_from_acpidump(fp, name,&addr,&length)) != NULL)
> -			fwts_acpi_add_table(name, table, addr, length);
> +			fwts_acpi_add_table(name, table, addr, length, FWTS_ACPI_TABLE_FROM_FILE);
>   	}
>
>   	fclose(fp);
> @@ -475,7 +492,8 @@ static int fwts_acpi_load_tables_from_file(fwts_framework *fw)
>   				name[strlen(name)-4] = '\0';
>   				if ((table = fwts_acpi_load_table_from_file(fd,&length)) != NULL)
>   					fwts_acpi_add_table(name, table,
> -						(uint64_t)fwts_fake_physical_addr(length), length);
> +						(uint64_t)fwts_fake_physical_addr(length), length,
> +						FWTS_ACPI_TABLE_FROM_FILE);
>   				close(fd);
>   			} else
>   				fwts_log_error(fw, "Cannot load ACPI table from file '%s'\n", path);
> @@ -590,7 +608,8 @@ static int fwts_acpi_load_tables_fixup(fwts_framework *fw)
>   		rsdt->header.creator_revision = 1;
>   		rsdt->header.checksum = 256 - fwts_checksum((uint8_t*)rsdt, size);
>
> -		fwts_acpi_add_table("RSDT", rsdt, (uint64_t)fwts_fake_physical_addr(size), size);
> +		fwts_acpi_add_table("RSDT", rsdt, (uint64_t)fwts_fake_physical_addr(size),
> +			size, FWTS_ACPI_TABLE_FROM_FIXUP);
>   	}
>
>   	/* No XSDT? go and fake one */
> @@ -614,7 +633,8 @@ static int fwts_acpi_load_tables_fixup(fwts_framework *fw)
>   		xsdt->header.creator_revision = 1;
>   		xsdt->header.checksum = 256 - fwts_checksum((uint8_t*)xsdt, size);
>
> -		fwts_acpi_add_table("XSDT", xsdt, (uint64_t)fwts_fake_physical_addr(size), size);
> +		fwts_acpi_add_table("XSDT", xsdt, (uint64_t)fwts_fake_physical_addr(size),
> +			size, FWTS_ACPI_TABLE_FROM_FIXUP);
>   	}
>
>   	/* No RSDP? go and fake one */
> @@ -636,7 +656,8 @@ static int fwts_acpi_load_tables_fixup(fwts_framework *fw)
>   		rsdp->checksum = 256 - fwts_checksum((uint8_t*)rsdp, 20);
>   		rsdp->extended_checksum = 256 - fwts_checksum((uint8_t*)rsdp, sizeof(fwts_acpi_table_rsdp));
>
> -		fwts_acpi_add_table("RSDP", rsdp, (uint64_t)fwts_fake_physical_addr(size), sizeof(fwts_acpi_table_rsdp));
> +		fwts_acpi_add_table("RSDP", rsdp, (uint64_t)fwts_fake_physical_addr(size),
> +			sizeof(fwts_acpi_table_rsdp), FWTS_ACPI_TABLE_FROM_FIXUP);
>   	}
>   	return FWTS_OK;
>   }

Acked-by: Alex Hung <alex.hung at canonical.com>




More information about the fwts-devel mailing list