[PATCH 4/5] acpi: acpidump: Add SLIC table dump
Keng-Yu Lin
kengyu at canonical.com
Tue Jul 3 06:57:20 UTC 2012
On Fri, Jun 29, 2012 at 9:11 PM, Colin King <colin.king at canonical.com> 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
> --
> 1.7.10.4
>
Acked-by: Keng-Yu Lin <kengyu at canonical.com>
More information about the fwts-devel
mailing list