[PATCH 4/5] acpi: acpidump: Add SLIC table dump

Alex Hung alex.hung at canonical.com
Mon Jul 2 06:15:09 UTC 2012


On 06/29/2012 09:11 PM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Managed to figure out how SLIC tables are formatted, so I'm adding
> the ability to dump these out in acpidump.  This required adding
> an extra helper function to dump out large chunks of unsigned ints
> as a hex dump.
>
> Also, increased the field width in acpi_dump_field_info() to allow
> us to dump fields > 99 bytes in size without messing up the formatting
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>   src/acpi/acpidump/acpidump.c |   90 +++++++++++++++++++++++++++++++++++++++++-
>   src/lib/include/fwts_acpi.h  |   28 +++++++++++++
>   2 files changed, 117 insertions(+), 1 deletion(-)
>
> diff --git a/src/acpi/acpidump/acpidump.c b/src/acpi/acpidump/acpidump.c
> index 79d4c4d..6591bc3 100644
> --- a/src/acpi/acpidump/acpidump.c
> +++ b/src/acpi/acpidump/acpidump.c
> @@ -60,6 +60,9 @@ typedef struct fwts_acpidump_field {
>   #define FIELD_UINT(text, type, field)			\
>   	FIELD(text, type, field, acpi_dump_uint, 0, 0, NULL, 0, NULL)
>
> +#define FIELD_UINTS(text, type, field)			\
> +	FIELD(text, type, field, acpi_dump_uints, 0, 0, NULL, 0, NULL)
> +
>   #define FIELD_STR(text, type, field)			\
>   	FIELD(text, type, field, acpi_dump_str, 0, 0, NULL, 0, NULL)
>
> @@ -81,7 +84,7 @@ static char *acpi_dump_field_info(char *label, int size, int offset)
>   {
>   	static char buffer[1024];
>
> -	snprintf(buffer, sizeof(buffer), "[0x%3.3x %4.4d %2d] %40.40s:",
> +	snprintf(buffer, sizeof(buffer), "[0x%3.3x %4.4d %3d] %40.40s:",
>   		offset, offset, size, label);
>
>   	return buffer;
> @@ -154,6 +157,27 @@ static void acpi_dump_uint(fwts_framework *fw, fwts_acpidump_field *info, void *
>   	}
>   }
>
> +static void acpi_dump_uints(fwts_framework *fw, fwts_acpidump_field *info, void *data, int offset)
> +{
> +	int n;
> +	int length = info->size;
> +	uint8_t *ptr = (uint8_t *)data;
> +
> +        for (n = 0; n < length; n += 8) {
> +		int i;
> +		int j;
> +		int todo = length - n > 8 ? 8 : length - n;
> +		char buffer[128];
> +
> +		for (i = 0, j = 0, *buffer = '\0'; i < todo; i++, ptr++)
> +                	j += snprintf(buffer + j, sizeof(buffer) - j, "%2.2x ", *ptr);
> +
> +		fwts_log_info_verbatum(fw, "%s %s",
> +		 	acpi_dump_field_info(info->label, info->size, info->offset + offset),
> +			buffer);
> +	}
> +}
> +
>   static void acpi_dump_strings(fwts_framework *fw, fwts_acpidump_field *info, void *data, int offset)
>   {
>   	int hexdigits = info->size << 1;
> @@ -1318,6 +1342,69 @@ static void acpidump_dmar(fwts_framework *fw, fwts_acpi_table_info *table)
>   	}
>   }
>
> +/*
> + *  acpidump_slic()
> + *	dump out SLIC
> + */
> +static void acpidump_slic(fwts_framework *fw, fwts_acpi_table_info *table)
> +{
> +	uint8_t *data = (uint8_t *)table->data;
> +	size_t length = table->length;
> +	uint8_t *ptr = data;
> +
> +	static fwts_acpidump_field slic_header_fields[] = {
> +		FIELD_UINT("Type", 	fwts_acpi_table_slic_header, type),
> +		FIELD_UINT("Length", 	fwts_acpi_table_slic_header, length),
> +		FIELD_END
> +	};
> +
> +	static fwts_acpidump_field slic_key_fields[] = {
> +		FIELD_UINT("Key Type", 	fwts_acpi_table_slic_key, key_type),
> +		FIELD_UINT("Version", 	fwts_acpi_table_slic_key, version),
> +		FIELD_UINT("Reserved", 	fwts_acpi_table_slic_key, reserved),
> +		FIELD_UINT("Algorithm", fwts_acpi_table_slic_key, algorithm),
> +		FIELD_UINT("Magic", 	fwts_acpi_table_slic_key, magic),
> +		FIELD_UINT("Bit Length",fwts_acpi_table_slic_key, bit_length),
> +		FIELD_UINTS("Modulus", 	fwts_acpi_table_slic_key, modulus),
> +		FIELD_END
> +	};
> +
> +	static fwts_acpidump_field slic_marker_fields[] = {
> +		FIELD_UINT("Version", 		fwts_acpi_table_slic_marker, version),
> +		FIELD_STR("OEM ID", 		fwts_acpi_table_slic_marker, oem_id),
> +		FIELD_STR("OEM TABLE ID", 	fwts_acpi_table_slic_marker, oem_table_id),
> +		FIELD_UINTS("Windows Flag",	fwts_acpi_table_slic_marker, windows_flag),
> +		FIELD_UINT("SLIC Version", 	fwts_acpi_table_slic_marker, slic_version),
> +		FIELD_UINTS("Reserved",		fwts_acpi_table_slic_marker, reserved),
> +		FIELD_UINTS("Signature", 	fwts_acpi_table_slic_marker, signature),
> +		FIELD_END
> +	};
> +
> +	ptr += sizeof(fwts_acpi_table_header);
> +
> +	while (ptr < data + length) {
> +		fwts_log_nl(fw);
> +		fwts_acpi_table_slic_header *header =
> +			(fwts_acpi_table_slic_header *)ptr;
> +	
> +		switch(header->type) {
> +		case 0:
> +			__acpi_dump_table_fields(fw, ptr, slic_header_fields, ptr - data);
> +			__acpi_dump_table_fields(fw, ptr, slic_key_fields, ptr - data);
> +			break;
> +		case 1:
> +			__acpi_dump_table_fields(fw, ptr, slic_header_fields, ptr - data);
> +			__acpi_dump_table_fields(fw, ptr, slic_marker_fields, ptr - data);
> +			break;
> +		default:
> +			__acpi_dump_table_fields(fw, ptr, slic_header_fields, ptr - data);
> +			break;
> +		}
> +
> +		ptr += header->length;
> +	}
> +}
> +
>   typedef struct {
>   	char *name;
>   	void (*func)(fwts_framework *fw, fwts_acpi_table_info *table);
> @@ -1352,6 +1439,7 @@ static acpidump_table_vec table_vec[] = {
>   	{ "SBST", 	acpidump_sbst,  1 },
>   	{ "SSDT", 	acpidump_amlcode, 1 },
>   	{ "SLIT", 	acpidump_slit,  1 },
> +	{ "SLIC", 	acpidump_slic,  1 },
>   	{ "SRAT", 	acpidump_srat,  1 },
>   	{ "TCPA",	acpidump_tcpa,	1 },
>   	{ "XSDT", 	acpidump_xsdt, 	1 },
> diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
> index ef25ef5..3e5eda9 100644
> --- a/src/lib/include/fwts_acpi.h
> +++ b/src/lib/include/fwts_acpi.h
> @@ -557,6 +557,34 @@ typedef struct {
>   	uint8_t		path[0];
>   } __attribute__ ((packed)) fwts_acpi_table_dmar_device_scope;
>
> +/* SLIC, see "OEM Activation 2.0 for Windows Vista Operating Systems" */
> +typedef struct {
> +	uint32_t	type;
> +	uint32_t	length;
> +} __attribute__ ((packed)) fwts_acpi_table_slic_header;
> +
> +typedef struct {
> +	fwts_acpi_table_slic_header header;
> +	uint8_t		key_type;
> +	uint8_t		version;
> +	uint16_t	reserved;
> +	uint32_t	algorithm;
> +	uint8_t		magic[4];
> +	uint32_t	bit_length;
> +	uint8_t		modulus[128];
> +} __attribute__ ((packed)) fwts_acpi_table_slic_key;
> +
> +typedef struct {
> +	fwts_acpi_table_slic_header header;
> +	uint32_t	version;
> +	uint8_t		oem_id[6];
> +	uint8_t		oem_table_id[8];
> +	uint8_t		windows_flag[8];
> +	uint32_t	slic_version;
> +	uint8_t		reserved[16];
> +	uint8_t		signature[128];
> +} __attribute__ ((packed)) fwts_acpi_table_slic_marker;
> +
>   void fwts_acpi_table_get_header(fwts_acpi_table_header *hdr, uint8_t *data);
>
>   #endif
>
Acked-by: Alex Hung <alex.hung at canonical.com>





More information about the fwts-devel mailing list