ACK: [PATCH 1/2] acpi: acpidump: use IASL rather than fwts custom table dump code

ivanhu ivan.hu at canonical.com
Tue Dec 8 06:23:41 UTC 2015



On 2015年12月01日 04:21, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Don't duplicate ACPI dumping and instead use IASL.  This reduces
> the maintenance effort and the code size.  The output format has
> been changed now that we are using IASL output, but now fwts is
> in-sync with the core ACPICA standard output, so I think that is
> a benefit rather than a problem.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>   src/acpi/acpidump/acpidump.c | 2284 +++---------------------------------------
>   1 file changed, 124 insertions(+), 2160 deletions(-)
>
> diff --git a/src/acpi/acpidump/acpidump.c b/src/acpi/acpidump/acpidump.c
> index 41df201..765cf9f 100644
> --- a/src/acpi/acpidump/acpidump.c
> +++ b/src/acpi/acpidump/acpidump.c
> @@ -25,2190 +25,103 @@
>   
>   #include "fwts.h"
>   
> -struct fwts_acpidump_field;
> -
> -typedef void (*fwts_acpidump_field_func)(fwts_framework *fw,
> -	const struct fwts_acpidump_field *info, const void *data, const int offset);
> -typedef char *(*fwts_acpidump_str_func)(const uint64_t val);
> -
> -typedef struct fwts_acpidump_field {
> -	const char	*label;			/* Name of field */
> -	const int 	size;			/* Size of field in struct in bytes */
> -	const size_t	offset;			/* Offset of field from start of struct */
> -	const fwts_acpidump_field_func func;	/* Field dumping function */
> -	const uint8_t 	bit_field_nbits;	/* Number of bits in field to dump */
> -	const uint8_t	bit_field_shift;	/* Shift offset in field */
> -	const char 	**strings;		/* field lookup string table */
> -	const size_t	strings_len;		/* length of strings table (number of entries) */
> -	const fwts_acpidump_str_func str_func;	/* string dumping function */
> -} fwts_acpidump_field;
> -
> -/* FIELD maps onto the fields in fwts_acpidump_field */
> -#define FIELD(label, type, field, func, bit_field_nbits, bit_field_shift, strings, strings_len, str_func) \
> -{							\
> -	label,						\
> -	sizeof(((type *)0)->field),			\
> -	offsetof(type, field),				\
> -	func,						\
> -	bit_field_nbits,				\
> -	bit_field_shift,				\
> -	strings,					\
> -	strings_len,					\
> -	str_func					\
> -}
> -
> -#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)
> -
> -#define FIELD_STRZ(text, type, field)			\
> -	FIELD(text, type, field, acpi_dump_strz, 0, 0, NULL, 0, NULL)
> -
> -#define FIELD_STRS(text, type, field, strings, strings_len)			\
> -	FIELD(text, type, field, acpi_dump_strings, 0, 0, strings, strings_len, NULL)
> -
> -#define FIELD_STRF(text, type, field, str_func)			\
> -	FIELD(text, type, field, acpi_dump_string_func, 0, 0, NULL, 0, str_func)
> -
> -#define FIELD_GAS(text, type, field)			\
> -	FIELD(text, type, field, acpi_dump_gas, 0, 0, NULL, 0, NULL)
> -
> -#define FIELD_BITF(text, type, field, nbits, shift)			\
> -	FIELD(text, type, field, acpi_dump_uint, nbits, shift, NULL, 0, NULL)
> -
> -#define FIELD_GUID(text, type, field)			\
> -	FIELD(text, type, field, acpi_dump_guid, 0, 0, NULL, 0, NULL)
> -
> -#define FIELD_END { NULL, 0, 0, NULL, 0, 0, NULL, 0, NULL}
> -
> -static char *acpi_dump_field_info(
> -	const char *label,
> -	const int size,
> -	const int offset)
> -{
> -	static char buffer[1024];
> -
> -	snprintf(buffer, sizeof(buffer), "[0x%3.3x %4.4d %3d] %40.40s:",
> -		offset, offset, size, label);
> -
> -	return buffer;
> -}
> -
> -static void acpi_dump_str(
> -	fwts_framework *fw,
> -	const fwts_acpidump_field *info,
> -	const void *data,
> -	const int offset)
> -{
> -	fwts_log_info_verbatum(fw, "%s %*.*s",
> -		acpi_dump_field_info(info->label, info->size, info->offset + offset),
> -		info->size, info->size, (char *)data);
> -}
> -
> -static void acpi_dump_strz(
> -	fwts_framework *fw,
> -	const fwts_acpidump_field *info,
> -	const void *data,
> -	const int offset)
> -{
> -	fwts_log_info_verbatum(fw, "%s %s",
> -		acpi_dump_field_info(info->label, strlen(data) + 1, info->offset + offset),
> -		(char *)data);
> -}
> -
> -static uint64_t apci_dump_get_uint64_t(
> -	const fwts_acpidump_field *info,
> -	const void *data)
> -{
> -	uint64_t ret = 0;
> -	uint64_t mask = (1ULL << (uint64_t)info->bit_field_nbits) - 1;
> -	uint8_t *ptr;
> -	int i;
> -
> -	switch (info->size) {
> -	case 1:
> -	case 2:
> -	case 4:
> -	case 8:
> -		memcpy(&ret, data, info->size);
> -		break;
> -	default:
> -		ret = 0;
> -		ptr = (uint8_t *)data;
> -		for (i = 0; (i < info->size) && (i < 8); i++) {
> -			uint8_t val8 = *ptr++;
> -			ret = (ret << 8) | val8;
> -		}
> -		break;
> -	}
> -	return mask ? (ret >> info->bit_field_shift) & mask : ret;
> -}
> -
> -
> -static void acpi_dump_uint(
> -	fwts_framework *fw,
> -	const fwts_acpidump_field *info,
> -	const void *data,
> -	const int offset)
> -{
> -	int i, hexdigits = info->size << 1;
> -	uint64_t val = apci_dump_get_uint64_t(info, data);
> -	uint8_t *ptr;
> -
> -	switch (info->size) {
> -	case 1:
> -	case 2:
> -	case 4:
> -	case 8:
> -		if (info->bit_field_nbits) {
> -			hexdigits = (3 + info->bit_field_nbits) / 4;
> -			fwts_log_info_verbatum(fw, "%57.57s: 0x%*.*" PRIx64, info->label,
> -				hexdigits, hexdigits, val);
> -		} else
> -			fwts_log_info_verbatum(fw, "%s 0x%*.*" PRIx64,
> -				acpi_dump_field_info(info->label, info->size, info->offset + offset),
> -				hexdigits, hexdigits, val);
> -		break;
> -	default:
> -		ptr = (uint8_t *)data;
> -		for (i = 0; i < info->size; i++) {
> -			uint8_t val8 = *ptr++;
> -			fwts_log_info_verbatum(fw, "%s 0x%2.2x [%d]",
> -				acpi_dump_field_info(info->label, info->size, info->offset + offset), val8, i);
> -		}
> -		break;
> -	}
> -}
> -
> -static void acpi_dump_uints(
> -	fwts_framework *fw,
> -	const fwts_acpidump_field *info,
> -	const void *data,
> -	const int offset)
> -{
> -	size_t n, 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_guid(
> -	fwts_framework *fw,
> -	const fwts_acpidump_field *info,
> -	const void *data,
> -	const int offset)
> -{
> -	char guid[37];
> -
> -	fwts_guid_buf_to_str(data, guid, sizeof(guid));
> -	fwts_log_info_verbatum(fw, "%s %s",
> -		acpi_dump_field_info(info->label, info->size, info->offset + offset), guid);
> -}
> -
> -static void acpi_dump_strings(
> -	fwts_framework *fw,
> -	const fwts_acpidump_field *info,
> -	const void *data,
> -	const int offset)
> -{
> -	int hexdigits = info->size << 1;
> -	uint64_t val = apci_dump_get_uint64_t(info, data);
> -
> -	fwts_log_info_verbatum(fw, "%s 0x%*.*" PRIx64 " (%s)",
> -		acpi_dump_field_info(info->label, info->size, info->offset + offset),
> -		hexdigits, hexdigits,
> -		val, val > info->strings_len ? "Unknown" : info->strings[val]);
> -}
> -
> -static void acpi_dump_string_func(
> -	fwts_framework *fw,
> -	const fwts_acpidump_field *info,
> -	const void *data,
> -	const int offset)
> -{
> -	int hexdigits = info->size << 1;
> -	uint64_t val = apci_dump_get_uint64_t(info, data);
> -
> -	fwts_log_info_verbatum(fw, "%s 0x%*.*" PRIx64 " (%s)",
> -		acpi_dump_field_info(info->label, info->size, info->offset + offset),
> -		hexdigits, hexdigits,
> -		val, info->str_func(val));
> -}
> -
> -static void acpi_dump_table_fields(
> -	fwts_framework *fw,
> -	const uint8_t *data,
> -	const fwts_acpidump_field *fields,
> -	const int offset,
> -	const size_t table_len)
> -{
> -	const fwts_acpidump_field *field;
> -
> -	for (field = fields; field->label != NULL; field++)
> -		if ((field->offset + field->size) <= table_len)
> -			field->func(fw, field, data + field->offset, offset);
> -}
> -
> -static void __acpi_dump_table_fields(
> -	fwts_framework *fw,
> -	const uint8_t *data,
> -	const fwts_acpidump_field *fields,
> -	const size_t offset)
> -{
> -	const fwts_acpidump_field *field;
> -
> -	for (field = fields; field->label != NULL; field++)
> -		field->func(fw, field, data + field->offset, offset);
> -}
> -
> -static void acpi_dump_raw_data(
> -	fwts_framework *fw,
> -	const uint8_t *data,
> -	const size_t length,
> -	const size_t offset)
> -{
> -        size_t n;
> -
> -        for (n = 0; n < length; n+=16) {
> -                int left = length - n;
> -		char buffer[128];
> -		fwts_dump_raw_data(buffer, sizeof(buffer), data + n, n + offset, left > 16 ? 16 : left);
> -		fwts_log_info_verbatum(fw, "%s", buffer);
> -        }
> -}
> -
> -static void acpi_dump_raw_table(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	fwts_log_nl(fw);
> -	acpi_dump_raw_data(fw, (uint8_t *)table->data, table->length, 0);
> -}
> -
> -static char *acpi_dump_gas_address_space_id(const uint64_t index)
> -{
> -	char *txt;
> -
> -	switch (index) {
> -	case 0x00:
> -		txt = "System Memory";
> -		break;
> -	case 0x01:
> -		txt = "System I/O";
> -		break;
> -	case 0x02:
> -		txt = "PCI Configuration Space";
> -		break;
> -	case 0x03:
> -		txt = "Embedded Controller";
> -		break;
> -	case 0x04:
> -		txt = "SMBus";
> -		break;
> -	case 0x05 ... 0x7e:
> -	case 0x80 ... 0xbf:
> -		txt = "Reserved";
> -		break;
> -	case 0x7f:
> -		txt = "Functional Fixed Hardware";
> -		break;
> -	case 0xc0 ... 0xff:
> -		txt = "OEM Defined";
> -		break;
> -	default:
> -		txt = "Unknown";
> -		break;
> -	}
> -
> -	return txt;
> -}
> -
> -static void acpi_dump_gas(
> -	fwts_framework *fw,
> -	const fwts_acpidump_field *info,
> -	const void *data,
> -	const int offset)
> -{
> -	static const char *access_width[] = {
> -		"Undefined (legacy reasons)",
> -		"Byte Access",
> -		"Word Access",
> -		"DWord Access",
> -		"QWord Access",
> -		"Unknown",
> -	};
> -
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_STRF("  addr_space_id", 	fwts_acpi_gas, address_space_id, acpi_dump_gas_address_space_id),
> -		FIELD_UINT("  reg_bit_width", 	fwts_acpi_gas, register_bit_width),
> -		FIELD_UINT("  reg_bit_offset",	fwts_acpi_gas, register_bit_offset),
> -		FIELD_STRS("  access_width", 	fwts_acpi_gas, access_width, access_width, 6),
> -		FIELD_UINT("  address", 	fwts_acpi_gas, address),
> -		FIELD_END
> -	};
> -
> -	FWTS_UNUSED(offset);
> -
> -	fwts_log_nl(fw);
> -	fwts_log_info_verbatum(fw, "%s (Generic Address Structure)",
> -		acpi_dump_field_info(info->label, info->size, offset + info->offset));
> -
> -	__acpi_dump_table_fields(fw, data, fields, offset + info->offset);
> -}
> -
> -static void acpidump_hdr(
> -	fwts_framework *fw,
> -	const fwts_acpi_table_header *hdr,
> -	const int length)
> -{
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_STR ("Signature", 	fwts_acpi_table_header, signature),
> -		FIELD_UINT("Length", 		fwts_acpi_table_header, length),
> -		FIELD_UINT("Revision", 		fwts_acpi_table_header, revision),
> -		FIELD_UINT("Checksum", 		fwts_acpi_table_header, checksum),
> -		FIELD_STR ("OEM ID", 		fwts_acpi_table_header, oem_id),
> -		FIELD_STR ("OEM Table ID", 	fwts_acpi_table_header, oem_tbl_id),
> -		FIELD_UINT("OEM Revision", 	fwts_acpi_table_header, oem_revision),
> -		FIELD_STR ("Creator ID", 	fwts_acpi_table_header, creator_id),
> -		FIELD_UINT("Creator Revision", 	fwts_acpi_table_header, creator_revision),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, (uint8_t *)hdr, fields, 0, length);
> -}
> -
> -static void acpidump_boot(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	size_t length = table->length;
> -	uint8_t cmos_data;
> -	fwts_acpi_table_boot *boot = (fwts_acpi_table_boot *)table->data;
> -
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_UINT("CMOS offset", 	fwts_acpi_table_boot, cmos_index),
> -		FIELD_END
> -	};
> -
> -	if (length < (int)(sizeof(fwts_acpi_table_header) + 4)) {
> -		fwts_log_info(fw, "Boot table too short\n");
> -		return;
> -	}
> -
> -	acpi_dump_table_fields(fw, table->data, fields, 0, length);
> -
> -	/*
> -	 *  We can only run the CMOS validation if we are sure the
> -	 *  ACPI table was loaded directly from firmware on this
> -	 *  machine.  If the firmware came from file or was from
> -	 *  fwts (as a fixup) then we have to assume it is not from
> -	 *  this machine to be safe, so in this case, bail out with
> -	 *  out checking the CMOS settings.
> -	 */
> -	if (table->provenance != FWTS_ACPI_TABLE_FROM_FIRMWARE)
> -		return;
> -
> -	if (fwts_cmos_read(boot->cmos_index, &cmos_data) == FWTS_OK) {
> -		fwts_log_info_verbatum(fw, "%56.56s: 0x%x", "Boot Register", cmos_data);
> -		fwts_log_info_verbatum(fw, "%56.56s: %x",  "PNP-OS", (cmos_data & FWTS_BOOT_REGISTER_PNPOS) ? 1 : 0);
> -		fwts_log_info_verbatum(fw, "%56.56s: %x",  "Booting", (cmos_data & FWTS_BOOT_REGISTER_BOOTING) ? 1 : 0);
> -		fwts_log_info_verbatum(fw, "%56.56s: %x",  "Diag", (cmos_data & FWTS_BOOT_REGISTER_DIAG) ? 1 : 0);
> -		fwts_log_info_verbatum(fw, "%56.56s: %x",  "Suppress", (cmos_data & FWTS_BOOT_REGISTER_SUPPRESS_BOOT_DISPLAY) ? 1 : 0);
> -		fwts_log_info_verbatum(fw, "%56.56s: %x",  "Parity", (cmos_data & FWTS_BOOT_REGISTER_PARITY) ? 1 : 0);
> -	} else
> -		fwts_log_error(fw, "Cannot get read/write permission on I/O ports.");
> -
> -}
> -
> -static void acpidump_bert(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_UINT("Region Length", 	fwts_acpi_table_bert, boot_error_region_length),
> -		FIELD_UINT("Region Addr", 	fwts_acpi_table_bert, boot_error_region),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -}
> -
> -static void acpidump_cpep(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	size_t i, n = (table->length - sizeof(fwts_acpi_table_bert)) / sizeof(fwts_acpi_cpep_processor_info);
> -
> -	for (i = 0; i < n; i++) {
> -		fwts_acpidump_field fields[] = {
> -			FIELD_UINT("  Type", 		fwts_acpi_table_cpep, cpep_info[i].type),
> -			FIELD_UINT("  Length", 		fwts_acpi_table_cpep, cpep_info[i].length),
> -			FIELD_UINT("  Processor ID", 	fwts_acpi_table_cpep, cpep_info[i].processor_id),
> -			FIELD_UINT("  Processor EID", 	fwts_acpi_table_cpep, cpep_info[i].processor_eid),
> -			FIELD_UINT("  Poll Interval (ms)",fwts_acpi_table_cpep, cpep_info[i].polling_interval),
> -			FIELD_END
> -		};
> -		fwts_log_info_verbatum(fw, "CPEP #%zu\n", i);
> -		__acpi_dump_table_fields(fw, table->data, fields, 0);
> -	};
> -}
> -
> -static void acpidump_ecdt(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	size_t n = table->length - sizeof(fwts_acpi_table_ecdt);
> -	fwts_acpi_table_ecdt *ecdt = (fwts_acpi_table_ecdt *)table->data;
> -
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_GAS ("EC_CONTROL",fwts_acpi_table_ecdt,   ec_control),
> -		FIELD_GAS ("EC_DATA", 	fwts_acpi_table_ecdt,   ec_data),
> -		FIELD_UINT("UID", 	fwts_acpi_table_ecdt,	uid),
> -		FIELD_UINT("GPE_BIT", 	fwts_acpi_table_ecdt,	gpe_bit),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -
> -	fwts_log_info_verbatum(fw, "EC_ID:");
> -	fwts_log_nl(fw);
> -	acpi_dump_raw_data(fw, ecdt->ec_id, n, sizeof(fwts_acpi_table_ecdt));
> -}
> -
> -static void acpidump_erst(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	uint32_t i;
> -
> -	static const char *serialization_actions[] = {
> -		"BEGIN_WRITE_OPERATION",
> -		"BEGIN_READ_OPERATION",
> -		"BEGIN_CLEAR_OPERATION",
> -		"END_OPERATION",
> -
> -		"SET_RECORD_offsetof",
> -		"EXECUTE_OPERATION",
> -		"CHECK_BUSY_STATUS",
> -		"GET_COMMAND_STATUS",
> -
> -		"GET_RECORD_IDENTIFIER",
> -		"SET_RECORD_IDENTIFIER",
> -		"GET_RECOERD_COUNT",
> -		"BEGIN_DUMMY_WRITE_OPERATION",
> -
> -		"RESERVED",
> -		"GET_ERROR_LOG_ADDRESS_RANGE",
> -		"GET_ERROR_LOG_ADDRESS_RANGE_LENGTH",
> -		"GET_ERROR_LOG_ADDRESS_RANGE_ATTRIBUTES"
> -	};
> -
> -	static const char *instructions[] = {
> -		"READ_REGISTER",
> -		"READ_REGISTER_VALUE",
> -		"WRITE_REGISTER",
> -		"WRITE_REGISTER_VALUE",
> -
> -		"NOOP",
> -		"LOAD_VAR1",
> -		"LOAD_VAR2",
> -		"STORE_VAR1",
> -
> -		"ADD",
> -		"SUBTRACT",
> -		"ADD_VALUE",
> -		"SUBTRACT_VALUE",
> -
> -		"STALL",
> -		"STALL_WHILE_TRUE",
> -		"SKIP_NEXT_INSTRUCTION_IF_TRUE",
> -		"GOTO",
> -
> -		"SET_SRC_ADDRESS_BASE",
> -		"SET_DST_ADDRESS_BASE",
> -		"MOVE_DATA"
> -	};
> -
> -	fwts_acpi_table_erst *erst = (fwts_acpi_table_erst *)table->data;
> -
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_UINT("Serialization Hdr. Size", fwts_acpi_table_erst, serialization_header_size),
> -		FIELD_UINT("Insrtuction Entry Count", fwts_acpi_table_erst, instruction_entry_count),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -
> -	for (i = 0; i < erst->instruction_entry_count; i++) {
> -		fwts_acpidump_field entry_fields[] = {
> -			FIELD_STRS("  Action", 		fwts_acpi_table_erst, entries[i].serialization_action, serialization_actions, 16),
> -			FIELD_STRS("  Instruction", 	fwts_acpi_table_erst, entries[i].instruction, instructions, 19),
> -			FIELD_UINT("  Flags", 		fwts_acpi_table_erst, entries[i].flags),
> -			FIELD_GAS ("  Register region", fwts_acpi_table_erst, entries[i].register_region),
> -			FIELD_UINT("  Value", 		fwts_acpi_table_erst, entries[i].value),
> -			FIELD_UINT("  Mask", 		fwts_acpi_table_erst, entries[i].mask),
> -			FIELD_END
> -		};
> -		fwts_log_info_verbatum(fw, "Entry #%" PRIu32, i+1);
> -		__acpi_dump_table_fields(fw, table->data, entry_fields, 0);
> -	}
> -}
> -
> -static void acpidump_amlcode(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	fwts_log_info_verbatum(fw, "Contains 0x%zx bytes of AML byte code",
> -		table->length-sizeof(fwts_acpi_table_header));
> -}
> -
> -static void acpidump_facs(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_STR ("Signature", 	fwts_acpi_table_facs, 	signature),
> -		FIELD_UINT("Length", 		fwts_acpi_table_facs,	length),
> -		FIELD_UINT("H/W Signature", 	fwts_acpi_table_facs,	hardware_signature),
> -		FIELD_UINT("Waking Vector", 	fwts_acpi_table_facs,	firmware_waking_vector),
> -		FIELD_UINT("Global Lock", 	fwts_acpi_table_facs,	global_lock),
> -		FIELD_UINT("Flags", 		fwts_acpi_table_facs,	flags),
> -		FIELD_UINT("X Waking Vector", 	fwts_acpi_table_facs,	x_firmware_waking_vector),
> -		FIELD_UINT("Version", 		fwts_acpi_table_facs,	version),
> -		FIELD_UINT("OSPM Flags", 	fwts_acpi_table_facs,	ospm_flags),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -}
> -
> -static void acpidump_hpet(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_UINT("Event Timer ID", 	fwts_acpi_table_hpet, event_timer_block_id),
> -		FIELD_BITF("  Hardware Rev", 	fwts_acpi_table_hpet, event_timer_block_id, 8, 0),
> -		FIELD_BITF("  Num Comparitors", fwts_acpi_table_hpet, event_timer_block_id, 5, 8),
> -		FIELD_BITF("  Count Size Cap", 	fwts_acpi_table_hpet, event_timer_block_id, 1, 13),
> -		FIELD_BITF("  Reserved", 	fwts_acpi_table_hpet, event_timer_block_id, 1, 14),
> -		FIELD_BITF("  IRQ Routing Cap", fwts_acpi_table_hpet, event_timer_block_id, 1, 15),
> -		FIELD_BITF("  PCI Vendor ID", 	fwts_acpi_table_hpet, event_timer_block_id, 16, 16),
> -		FIELD_GAS ("Base Address", 	fwts_acpi_table_hpet, base_address),
> -		FIELD_UINT("HPET Number", 	fwts_acpi_table_hpet, hpet_number),
> -		FIELD_UINT("Main Counter Min", 	fwts_acpi_table_hpet, main_counter_minimum),
> -		FIELD_UINT("Page Prot Attr", 	fwts_acpi_table_hpet, page_prot_and_oem_attribute),
> -		FIELD_BITF("  Page Protection", fwts_acpi_table_hpet, page_prot_and_oem_attribute, 4, 0),
> -		FIELD_BITF("  OEM Attr", 	fwts_acpi_table_hpet, page_prot_and_oem_attribute, 4, 4),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -}
> -
> -static void acpidump_fadt(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_UINT("FACS Address", 				fwts_acpi_table_fadt, firmware_control),
> -		FIELD_UINT("DSDT Address", 				fwts_acpi_table_fadt, dsdt),
> -		FIELD_UINT("Model",					fwts_acpi_table_fadt, reserved),
> -		FIELD_STRS("PM Profile",				fwts_acpi_table_fadt, preferred_pm_profile, fwts_acpi_fadt_preferred_pm_profile, 8),
> -		FIELD_UINT("SCI Interrupt", 				fwts_acpi_table_fadt, sci_int),
> -		FIELD_UINT("SMI Command Port",				fwts_acpi_table_fadt, smi_cmd),
> -		FIELD_UINT("ACPI Enable Value", 			fwts_acpi_table_fadt, acpi_enable),
> -		FIELD_UINT("ACPI Disable Value",			fwts_acpi_table_fadt, acpi_disable),
> -		FIELD_UINT("S4BIOS Command", 				fwts_acpi_table_fadt, s4bios_req),
> -		FIELD_UINT("P-State Control",				fwts_acpi_table_fadt, pstate_cnt),
> -		FIELD_UINT("PM1A Event Block", 				fwts_acpi_table_fadt, pm1a_evt_blk),
> -		FIELD_UINT("PM1B Event Block", 				fwts_acpi_table_fadt, pm1b_evt_blk),
> -		FIELD_UINT("PM1A Control Block",			fwts_acpi_table_fadt, pm1a_cnt_blk),
> -		FIELD_UINT("PM1B Control Block",			fwts_acpi_table_fadt, pm1b_cnt_blk),
> -		FIELD_UINT("PM2 Control Block", 			fwts_acpi_table_fadt, pm2_cnt_blk),
> -		FIELD_UINT("PM Timer Block", 				fwts_acpi_table_fadt, pm_tmr_blk),
> -		FIELD_UINT("GPE0 Block", 				fwts_acpi_table_fadt, gpe0_blk),
> -		FIELD_UINT("GPE1 Block", 				fwts_acpi_table_fadt, gpe1_blk),
> -		FIELD_UINT("PM1 Event Block Length", 			fwts_acpi_table_fadt, pm1_evt_len),
> -		FIELD_UINT("PM1 Control Block Length", 			fwts_acpi_table_fadt, pm1_cnt_len),
> -		FIELD_UINT("PM2 Control Block Length", 			fwts_acpi_table_fadt, pm2_cnt_len),
> -		FIELD_UINT("PM Timer Block Length",			fwts_acpi_table_fadt, pm_tmr_len),
> -		FIELD_UINT("GPE0 Block Length", 			fwts_acpi_table_fadt, gpe0_blk_len),
> -		FIELD_UINT("GPE1 Block Length", 			fwts_acpi_table_fadt, gpe1_blk_len),
> -		FIELD_UINT("_CST Support", 				fwts_acpi_table_fadt, cst_cnt),
> -		FIELD_UINT("C2 Latency", 				fwts_acpi_table_fadt, p_lvl2_lat),
> -		FIELD_UINT("C3 Latency", 				fwts_acpi_table_fadt, p_lvl3_lat),
> -		FIELD_UINT("CPU Cache Size", 				fwts_acpi_table_fadt, flush_size),
> -		FIELD_UINT("CPU Cache Flush Stride", 			fwts_acpi_table_fadt, flush_stride),
> -		FIELD_UINT("Duty Cycle Offset", 			fwts_acpi_table_fadt, duty_offset),
> -		FIELD_UINT("Duty Cycle Width", 				fwts_acpi_table_fadt, duty_width),
> -		FIELD_UINT("RTC Day Alarm Index", 			fwts_acpi_table_fadt, day_alrm),
> -		FIELD_UINT("RTC Month Alarm Index", 			fwts_acpi_table_fadt, mon_alrm),
> -		FIELD_UINT("RTC Century Index", 			fwts_acpi_table_fadt, century),
> -		FIELD_UINT("IA-PC Boot Flags (see below)", 		fwts_acpi_table_fadt, iapc_boot_arch),
> -		FIELD_BITF("  Legacy Devices Supported (V2)",		fwts_acpi_table_fadt, iapc_boot_arch, 1, 0),
> -		FIELD_BITF("  8042 present on ports 60/64 (V2)",	fwts_acpi_table_fadt, iapc_boot_arch, 1, 1),
> -		FIELD_BITF("  VGA Not Present (V4)",			fwts_acpi_table_fadt, iapc_boot_arch, 1, 2),
> -		FIELD_BITF("  MSI Not Supported (V4)",			fwts_acpi_table_fadt, iapc_boot_arch, 1, 3),
> -		FIELD_BITF("  PCIe ASPM Not supported (V4)",		fwts_acpi_table_fadt, iapc_boot_arch, 1, 4),
> -		FIELD_BITF("  CMOS RTC Not Present (V5)",		fwts_acpi_table_fadt, iapc_boot_arch, 1, 5),
> -		FIELD_UINT("Flags (see below)", 			fwts_acpi_table_fadt, flags),
> -		FIELD_BITF("  WBINVD instruction (V1)", 		fwts_acpi_table_fadt, flags, 1, 0),
> -		FIELD_BITF("  WBINVD flushes all caches (V1)", 		fwts_acpi_table_fadt, flags, 1, 1),
> -		FIELD_BITF("  All CPUs support C1 (V1)", 		fwts_acpi_table_fadt, flags, 1, 2),
> -		FIELD_BITF("  C2 works on MP system (V1)", 		fwts_acpi_table_fadt, flags, 1, 3),
> -		FIELD_BITF("  Control Method Power Button (V1)", 	fwts_acpi_table_fadt, flags, 1, 4),
> -		FIELD_BITF("  Control Method Sleep Button (V1)", 	fwts_acpi_table_fadt, flags, 1, 5),
> -		FIELD_BITF("  RTC wake not in fixed reg space (V1)", 	fwts_acpi_table_fadt, flags, 1, 6),
> -		FIELD_BITF("  RTC can wake system from S4 (V1)", 	fwts_acpi_table_fadt, flags, 1, 7),
> -		FIELD_BITF("  32 bit PM timer (V1)", 			fwts_acpi_table_fadt, flags, 1, 8),
> -		FIELD_BITF("  Docking Capability (V1)", 		fwts_acpi_table_fadt, flags, 1, 9),
> -		FIELD_BITF("  Reset Register Supported (V2)", 		fwts_acpi_table_fadt, flags, 1, 10),
> -		FIELD_BITF("  Sealed Case (V3)", 			fwts_acpi_table_fadt, flags, 1, 11),
> -		FIELD_BITF("  Headless, No Video (V3)", 		fwts_acpi_table_fadt, flags, 1, 12),
> -		FIELD_BITF("  Use native instr. after SLP_TYPx (V3)",	fwts_acpi_table_fadt, flags, 1, 13),
> -		FIELD_BITF("  PCI_EXP_WAK bits supported (V4)", 	fwts_acpi_table_fadt, flags, 1, 14),
> -		FIELD_BITF("  Use platform clock (V4)", 		fwts_acpi_table_fadt, flags, 1, 15),
> -		FIELD_BITF("  RTC_STS Valid after S4 wake (V4)", 	fwts_acpi_table_fadt, flags, 1, 16),
> -		FIELD_BITF("  Remote power on capable (V4)", 		fwts_acpi_table_fadt, flags, 1, 17),
> -		FIELD_BITF("  Use APIC Cluster Model (V4)", 		fwts_acpi_table_fadt, flags, 1, 18),
> -		FIELD_BITF("  Use APIC Physical Dest. Mode (V4)", 	fwts_acpi_table_fadt, flags, 1, 19),
> -		FIELD_BITF("  Hardware-reduced ACPI (V5)",		fwts_acpi_table_fadt, flags, 1, 20),
> -		FIELD_BITF("  S0 power savings are equal or better than S3 (V5)", fwts_acpi_table_fadt, flags, 1, 21),
> -		FIELD_BITF("  Reserved (bits 22..31)",			fwts_acpi_table_fadt, flags, 10, 22),
> -		FIELD_UINT("ARM Boot Flags (V5.1)",			fwts_acpi_table_fadt, arm_boot_flags),
> -		FIELD_BITF("  PSCI Compliant (V5.1)",			fwts_acpi_table_fadt, arm_boot_flags, 1, 0),
> -		FIELD_BITF("  PSCI Use HSC instead of SMC (V5.1)",	fwts_acpi_table_fadt, arm_boot_flags, 1, 1),
> -		FIELD_UINT("FADT Minor Version",			fwts_acpi_table_fadt, minor_version),
> -		FIELD_GAS ("RESET_REG", 				fwts_acpi_table_fadt, reset_reg),
> -		FIELD_UINT("RESET_VALUE", 				fwts_acpi_table_fadt, reset_value),
> -		FIELD_UINT("X_FIRMWARE_CTRL", 				fwts_acpi_table_fadt, x_firmware_ctrl),
> -		FIELD_UINT("X_DSDT", 					fwts_acpi_table_fadt, x_dsdt),
> -		FIELD_GAS ("X_PM1a_EVT_BLK", 				fwts_acpi_table_fadt, x_pm1a_evt_blk),
> -		FIELD_GAS ("X_PM1b_EVT_BLK", 				fwts_acpi_table_fadt, x_pm1b_evt_blk),
> -		FIELD_GAS ("X_PM1a_CNT_BLK", 				fwts_acpi_table_fadt, x_pm1a_cnt_blk),
> -		FIELD_GAS ("X_PM1b_CNT_BLK", 				fwts_acpi_table_fadt, x_pm1b_cnt_blk),
> -		FIELD_GAS ("X_PM2_CNT_BLK", 				fwts_acpi_table_fadt, x_pm2_cnt_blk),
> -		FIELD_GAS ("X_PM_TMR_BLK", 				fwts_acpi_table_fadt, x_pm_tmr_blk),
> -		FIELD_GAS ("X_GPE0_BLK", 				fwts_acpi_table_fadt, x_gpe0_blk),
> -		FIELD_GAS ("X_GPE1_BLK", 				fwts_acpi_table_fadt, x_gpe1_blk),
> -		FIELD_GAS ("SLEEP_CONTROL_REG", 			fwts_acpi_table_fadt, sleep_control_reg),
> -		FIELD_GAS ("SLEEP_STATUS_REG", 				fwts_acpi_table_fadt, sleep_status_reg),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -}
> -
> -static void acpidump_rsdp(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_STR ("Signature", 	fwts_acpi_table_rsdp, signature),
> -		FIELD_UINT("Checksum", 		fwts_acpi_table_rsdp, checksum),
> -		FIELD_STR ("OEM ID", 		fwts_acpi_table_rsdp, oem_id),
> -		FIELD_UINT("Revision", 		fwts_acpi_table_rsdp, revision),
> -		FIELD_UINT("RsdtAddress", 	fwts_acpi_table_rsdp, rsdt_address),
> -		FIELD_UINT("Length", 		fwts_acpi_table_rsdp, length),
> -		FIELD_UINT("XsdtAddress", 	fwts_acpi_table_rsdp, xsdt_address),
> -		FIELD_UINT("Extended Checksum", fwts_acpi_table_rsdp, extended_checksum),
> -		FIELD_UINT("Reserved",		fwts_acpi_table_rsdp, reserved),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -}
> -
> -static void acpidump_rsdt(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	size_t i, n = (table->length - sizeof(fwts_acpi_table_header)) / sizeof(uint32_t);
> -	fwts_acpi_table_rsdt *rsdt = (fwts_acpi_table_rsdt *)table->data;
> -
> -	for (i = 0; i < n; i++)  {
> -		fwts_acpi_table_info *table_info;
> -
> -		if (fwts_acpi_find_table_by_addr(fw, (uint64_t)rsdt->entries[i], &table_info) == FWTS_OK) {
> -			char label[80];
> -			char *name = table_info == NULL ? "unknown" : table_info->name;
> -			snprintf(label, sizeof(label), "Entry %2.2zu %s", i, name);
> -			fwts_log_info_verbatum(fw, "%s 0x%8.8x",
> -				acpi_dump_field_info(label, sizeof(rsdt->entries[i]), offsetof(fwts_acpi_table_rsdt, entries[i])),
> -				rsdt->entries[i]);
> -		}
> -	}
> -}
> -
> -static void acpidump_sbst(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_UINT("Warn. Energy Level", 	fwts_acpi_table_sbst,	warning_energy_level),
> -		FIELD_UINT("Low  Energy Level", 	fwts_acpi_table_sbst,	low_energy_level),
> -		FIELD_UINT("Crit. Energy Level", 	fwts_acpi_table_sbst,	critical_energy_level),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -}
> -
> -static void acpidump_xsdt(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	size_t i, n = (table->length - sizeof(fwts_acpi_table_header)) / sizeof(uint64_t);
> -	fwts_acpi_table_xsdt *xsdt = (fwts_acpi_table_xsdt *)table->data;
> -
> -	for (i = 0; i < n; i++)  {
> -		fwts_acpi_table_info *table_info;
> -
> -		if (fwts_acpi_find_table_by_addr(fw, xsdt->entries[i], &table_info) == FWTS_OK) {
> -			char label[80];
> -			char *name = table_info == NULL ? "unknown" : table_info->name;
> -			snprintf(label, sizeof(label), "Entry %2.2zu %s", i, name);
> -			fwts_log_info_verbatum(fw, "%s 0x%16.16" PRIx64,
> -				acpi_dump_field_info(label, sizeof(xsdt->entries[i]), offsetof(fwts_acpi_table_xsdt, entries[i])),
> -				xsdt->entries[i]);
> -		}
> -	}
> -}
> -
> -static void acpidump_madt(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	uint8_t *data = (uint8_t *)table->data;
> -	size_t offset = 0;
> -	int i = 0;
> -
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_UINT("Local APIC Address", 	fwts_acpi_table_madt, lapic_address),
> -		FIELD_UINT("Flags", 			fwts_acpi_table_madt, flags),
> -		FIELD_BITF("  PCAT_COMPAT", 		fwts_acpi_table_madt, flags, 1, 0),
> -		FIELD_END
> -	};
> -
> -	static const char *types[] = {
> -		"Processor Local APIC",		/* 0 */
> -		"I/O APIC",			/* 1 */
> -		"Interrupt Source Override",	/* 2 */
> -		"Non-maskable Interrupt Source (NMI)", /* 3 */
> -		"Local APIC NMI",		/* 4 */
> -		"Local APIC Address Override",	/* 5 */
> -		"I/O SAPIC",			/* 6 */
> -		"Local SAPIC",			/* 7 */
> -		"Platform Interrupt Sources",	/* 8 */
> -		"Processor Local x2APIC",	/* 9 */
> -		"Local x2APIC NMI",		/* 10 */
> -		"GIC",				/* 11 */
> -		"GIC Distributor",		/* 12 */
> -		"OEM Defined"			/* 13 */
> -	};
> -	static const fwts_acpidump_field fields_sub_table_header[] = {
> -		FIELD_STRS("  Type", fwts_acpi_madt_sub_table_header, type, types, 13),
> -		FIELD_UINT("  Length", fwts_acpi_madt_sub_table_header, length),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, data, fields, 0, table->length);
> -
> -	offset += sizeof(fwts_acpi_table_madt);
> -	data += sizeof(fwts_acpi_table_madt);
> -
> -
> -	while (offset < table->length) {
> -		int skip = 0;
> -		fwts_acpi_madt_sub_table_header *hdr = (fwts_acpi_madt_sub_table_header *)data;
> -
> -		/* Check for unknown type or illegal size */
> -		if (hdr->type > 12 || hdr->length < 6)
> -			break;
> -
> -		fwts_log_info_verbatum(fw, "APIC Structure #%d:", ++i);
> -		__acpi_dump_table_fields(fw, data, fields_sub_table_header, offset);
> -
> -		data += sizeof(fwts_acpi_madt_sub_table_header);
> -		offset += sizeof(fwts_acpi_madt_sub_table_header);
> -
> -		switch (hdr->type) {
> -		case FWTS_ACPI_MADT_LOCAL_APIC: {
> -				static const fwts_acpidump_field fields_processor_local_apic[] = {
> -					FIELD_UINT("  ACPI CPU ID", fwts_acpi_madt_processor_local_apic, acpi_processor_id),
> -					FIELD_UINT("  APIC ID",     fwts_acpi_madt_processor_local_apic, apic_id),
> -					FIELD_UINT("  Flags",       fwts_acpi_madt_processor_local_apic, flags),
> -					FIELD_BITF("   Enabled",    fwts_acpi_madt_processor_local_apic, flags, 1, 0),
> -					FIELD_END
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_processor_local_apic, offset);
> -				skip = sizeof(fwts_acpi_madt_processor_local_apic);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_IO_APIC: {
> -				static const fwts_acpidump_field fields_io_apic[] = {
> -					FIELD_UINT("  I/O APIC ID", 	fwts_acpi_madt_io_apic, io_apic_id),
> -					FIELD_UINT("  Reserved", 	fwts_acpi_madt_io_apic, reserved),
> -					FIELD_UINT("  I/O APIC Addr", 	fwts_acpi_madt_io_apic, io_apic_phys_address),
> -					FIELD_UINT("  Global IRQ Base", fwts_acpi_madt_io_apic, global_irq_base),
> -					FIELD_END
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_io_apic, offset);
> -				skip = sizeof(fwts_acpi_madt_io_apic);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_INTERRUPT_OVERRIDE: {
> -				static const fwts_acpidump_field fields_madt_interrupt_override[] = {
> -					FIELD_UINT("  Bus", 		fwts_acpi_madt_interrupt_override, bus),
> -					FIELD_UINT("  Source", 		fwts_acpi_madt_interrupt_override, source),
> -					FIELD_UINT("  Gbl Sys Int", 	fwts_acpi_madt_interrupt_override, gsi),
> -					FIELD_UINT("  Flags", 		fwts_acpi_madt_interrupt_override, flags),
> -					FIELD_BITF("   Polarity", 	fwts_acpi_madt_interrupt_override, flags, 2, 0),
> -					FIELD_BITF("   Trigger Mode",	fwts_acpi_madt_interrupt_override, flags, 2, 2),
> -					FIELD_END
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_interrupt_override, offset);
> -				skip = sizeof(fwts_acpi_madt_interrupt_override);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_NMI_SOURCE: {
> -				static const fwts_acpidump_field fields_madt_nmi[] = {
> -					FIELD_UINT("  Flags", 		fwts_acpi_madt_nmi, flags),
> -					FIELD_UINT("  Gbl Sys Int", 	fwts_acpi_madt_nmi, gsi),
> -					FIELD_END
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_nmi, offset);
> -				skip = sizeof(fwts_acpi_madt_nmi);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_LOCAL_APIC_NMI: {
> -				static const fwts_acpidump_field fields_madt_local_apic_nmi[] = {
> -					FIELD_UINT("  ACPI CPU ID", 	fwts_acpi_madt_local_apic_nmi, acpi_processor_id),
> -					FIELD_UINT("  Flags", 		fwts_acpi_madt_local_apic_nmi, flags),
> -					FIELD_UINT("  Local APIC LINT", fwts_acpi_madt_local_apic_nmi, local_apic_lint),
> -					FIELD_END
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_local_apic_nmi, offset);
> -				skip = sizeof(fwts_acpi_madt_local_apic_nmi);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_LOCAL_APIC_OVERRIDE: {
> -				static const fwts_acpidump_field fields_madt_local_apic_addr_override[] = {
> -					FIELD_UINT("  Reserved", 	fwts_acpi_madt_local_apic_addr_override, reserved),
> -					FIELD_UINT("  Local APIC Addr", fwts_acpi_madt_local_apic_addr_override, address),
> -					FIELD_END
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_local_apic_addr_override, offset);
> -				skip = sizeof(fwts_acpi_madt_local_apic_addr_override);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_IO_SAPIC: {
> -				static const fwts_acpidump_field fields_madt_io_sapic[] = {
> -					FIELD_UINT("  I/O SAPIC ID", 	fwts_acpi_madt_io_sapic, io_sapic_id),
> -					FIELD_UINT("  Reserved", 	fwts_acpi_madt_io_sapic, reserved),
> -					FIELD_UINT("  Gbl Sys Int", 	fwts_acpi_madt_io_sapic, gsi),
> -					FIELD_UINT("  I/O SAPIC Addr", 	fwts_acpi_madt_io_sapic, address),
> -					FIELD_END
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_io_sapic, offset);
> -				skip = sizeof(fwts_acpi_madt_io_sapic);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_LOCAL_SAPIC: {
> -				fwts_acpi_madt_local_sapic *local_sapic = (fwts_acpi_madt_local_sapic *)data;
> -				static const fwts_acpidump_field fields_madt_local_sapic[] = {
> -					FIELD_UINT("  ACPI CPU ID", 	fwts_acpi_madt_local_sapic, acpi_processor_id),
> -					FIELD_UINT("  Local SAPIC ID", 	fwts_acpi_madt_local_sapic, local_sapic_id),
> -					FIELD_UINT("  Local SAPIC EID",	fwts_acpi_madt_local_sapic, local_sapic_eid),
> -					FIELD_UINTS(" Reserved", 	fwts_acpi_madt_local_sapic, reserved),
> -					FIELD_UINT("  Flags", 		fwts_acpi_madt_local_sapic, flags),
> -					FIELD_UINT("  UID Value", 	fwts_acpi_madt_local_sapic, uid_value),
> -					FIELD_UINT("  UID String", 	fwts_acpi_madt_local_sapic, uid_string),
> -					FIELD_END
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_local_sapic, offset);
> -				skip = (sizeof(fwts_acpi_madt_local_sapic) +
> -					strlen(local_sapic->uid_string) + 1);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_INTERRUPT_SOURCE: {
> -				static const fwts_acpidump_field fields_madt_local_sapic[] = {
> -					FIELD_UINT("  Flags", 		fwts_acpi_madt_platform_int_source, flags),
> -					FIELD_UINT("  Type", 		fwts_acpi_madt_platform_int_source, type),
> -					FIELD_UINT("  Processor ID", 	fwts_acpi_madt_platform_int_source, processor_id),
> -					FIELD_UINT("  Processor EID", 	fwts_acpi_madt_platform_int_source, processor_eid),
> -					FIELD_UINT("  IO SAPIC Vector", fwts_acpi_madt_platform_int_source, io_sapic_vector),
> -					FIELD_UINT("  Gbl Sys Int", 	fwts_acpi_madt_platform_int_source, gsi),
> -					FIELD_UINT("  PIS Flags", 	fwts_acpi_madt_platform_int_source, pis_flags),
> -					FIELD_END
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_local_sapic, offset);
> -				skip = sizeof(fwts_acpi_madt_platform_int_source);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_LOCAL_X2APIC: {
> -				static const fwts_acpidump_field fields_madt_local_x2apic[] = {
> -					FIELD_UINT("  Reserved", 	fwts_acpi_madt_local_x2apic, reserved),
> -					FIELD_UINT("  x2APIC ID", 	fwts_acpi_madt_local_x2apic, x2apic_id),
> -					FIELD_UINT("  Flags", 		fwts_acpi_madt_local_x2apic, flags),
> -					FIELD_UINT("  Processor UID", 	fwts_acpi_madt_local_x2apic, processor_uid),
> -					FIELD_END
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_local_x2apic, offset);
> -				skip = sizeof(fwts_acpi_madt_local_x2apic);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_LOCAL_X2APIC_NMI: {
> -				static const fwts_acpidump_field fields_madt_local_x2apic_nmi[] = {
> -					FIELD_UINT("  Flags", 		fwts_acpi_madt_local_x2apic_nmi, flags),
> -					FIELD_UINT("  Processor UID", 	fwts_acpi_madt_local_x2apic_nmi, processor_uid),
> -					FIELD_UINT("  LINT#", 		fwts_acpi_madt_local_x2apic_nmi, local_x2apic_lint),
> -					FIELD_UINTS(" Reserved", 	fwts_acpi_madt_local_x2apic_nmi, reserved),
> -					FIELD_END
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_local_x2apic_nmi, offset);
> -				skip = sizeof(fwts_acpi_madt_local_x2apic_nmi);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_GIC_C_CPU_INTERFACE: {
> -				/* ACPI 5.1 */
> -				if (table->length == 76) {
> -					static const fwts_acpidump_field fields_madt_gic[] = {
> -						FIELD_UINT("  Reserved", 	fwts_acpi_madt_gic, reserved),
> -						FIELD_UINT("  GIC ID", 		fwts_acpi_madt_gic, gic_id),
> -						FIELD_UINT("  Processor UID", 	fwts_acpi_madt_gic, processor_uid),
> -						FIELD_UINT("  Flags", 		fwts_acpi_madt_gic, flags),
> -						FIELD_UINT("  Parking Protocol",fwts_acpi_madt_gic, parking_protocol_version),
> -						FIELD_UINT("  Perf. Int. GSIV",	fwts_acpi_madt_gic, performance_interrupt_gsiv),
> -						FIELD_UINT("  Parked Address",	fwts_acpi_madt_gic, parked_address),
> -						FIELD_UINT("  Phys. Base. Addr",fwts_acpi_madt_gic, physical_base_address),
> -						FIELD_UINT("  GICV",		fwts_acpi_madt_gic, gicv),
> -						FIELD_UINT("  GICH",		fwts_acpi_madt_gic, gich),
> -						FIELD_UINT("  VGIC Interrupt",	fwts_acpi_madt_gic, vgic),
> -						FIELD_UINT("  GICR Base. Addr", fwts_acpi_madt_gic, gicr_base_address),
> -						FIELD_UINT("  MPIDR",		fwts_acpi_madt_gic, mpidr),
> -					};
> -					__acpi_dump_table_fields(fw, data, fields_madt_gic, offset);
> -				}
> -
> -				/* ACPI 6.0 */
> -				if (table->length == 80) {
> -					static const fwts_acpidump_field fields_madt_gic[] = {
> -						FIELD_UINT("  Reserved", 	fwts_acpi_madt_gic, reserved),
> -						FIELD_UINT("  GIC ID", 		fwts_acpi_madt_gic, gic_id),
> -						FIELD_UINT("  Processor UID", 	fwts_acpi_madt_gic, processor_uid),
> -						FIELD_UINT("  Flags", 		fwts_acpi_madt_gic, flags),
> -						FIELD_UINT("  Parking Protocol",fwts_acpi_madt_gic, parking_protocol_version),
> -						FIELD_UINT("  Perf. Int. GSIV",	fwts_acpi_madt_gic, performance_interrupt_gsiv),
> -						FIELD_UINT("  Parked Address",	fwts_acpi_madt_gic, parked_address),
> -						FIELD_UINT("  Phys. Base. Addr",fwts_acpi_madt_gic, physical_base_address),
> -						FIELD_UINT("  GICV",		fwts_acpi_madt_gic, gicv),
> -						FIELD_UINT("  GICH",		fwts_acpi_madt_gic, gich),
> -						FIELD_UINT("  VGIC Interrupt",	fwts_acpi_madt_gic, vgic),
> -						FIELD_UINT("  GICR Base. Addr", fwts_acpi_madt_gic, gicr_base_address),
> -						FIELD_UINT("  MPIDR",		fwts_acpi_madt_gic, mpidr),
> -						FIELD_UINT("  Processor Power Efficiency Class",	fwts_acpi_madt_gic, processor_power_efficiency_class),
> -						FIELD_UINTS("  Reserved", 	fwts_acpi_madt_gic, reserved2),
> -					};
> -					__acpi_dump_table_fields(fw, data, fields_madt_gic, offset);
> -				}
> -
> -				skip = sizeof(fwts_acpi_madt_gic);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_GIC_D_GOC_DISTRIBUTOR: {
> -				static const fwts_acpidump_field fields_madt_gicd[] = {
> -					FIELD_UINT("  Reserved", 	fwts_acpi_madt_gicd, reserved),
> -					FIELD_UINT("  GIC ID", 		fwts_acpi_madt_gicd, gic_id),
> -					FIELD_UINT("  Phys. Base. Addr",fwts_acpi_madt_gicd, physical_base_address),
> -					FIELD_UINT("  Sys Vector Base",	fwts_acpi_madt_gicd, system_vector_base),
> -					FIELD_UINT("  GIC Version",	fwts_acpi_madt_gicd, gic_version),
> -					FIELD_UINTS("  Reserved", 	fwts_acpi_madt_gicd, reserved2),
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_gicd, offset);
> -				skip = sizeof(fwts_acpi_madt_gicd);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_GIC_V2M_MSI_FRAME: {
> -				static const fwts_acpidump_field fields_madt_gic_msi[] = {
> -					FIELD_UINT("  Reserved", 	fwts_acpi_madt_gic_msi, reserved),
> -					FIELD_UINT("  Frame ID", 	fwts_acpi_madt_gic_msi, frame_id),
> -					FIELD_UINT("  Phys. Base. Addr",fwts_acpi_madt_gic_msi, physical_base_address),
> -					FIELD_UINT("  Flags", 		fwts_acpi_madt_gic_msi, flags),
> -					FIELD_UINT("  SPI Count", 	fwts_acpi_madt_gic_msi, spi_count),
> -					FIELD_UINT("  SPI Base", 	fwts_acpi_madt_gic_msi, spi_base),
> -					FIELD_UINT("  SPI Flags", 	fwts_acpi_madt_gic_msi, spi_flags),
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_gic_msi, offset);
> -				skip = sizeof(fwts_acpi_madt_gic_msi);
> -			}
> -			break;
> -		case FWTS_ACPI_MADT_GIC_R_REDISTRIBUTOR: {
> -				static const fwts_acpidump_field fields_madt_gicr[] = {
> -					FIELD_UINT("  Reserved", 	fwts_acpi_madt_gicr, reserved),
> -					FIELD_UINT("  Disc. Base Addr",	fwts_acpi_madt_gicr, discovery_range_base_address),
> -					FIELD_UINT("  Disc. Range Len", fwts_acpi_madt_gicr, discovery_range_length),
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_gicr, offset);
> -				skip = sizeof(fwts_acpi_madt_gicr);
> -			}
> -			break;
> -		default:
> -			skip = 0;
> -			break;
> -		}
> -		data   += skip;
> -		offset += skip;
> -	}
> -}
> -
> -static void acpidump_mcfg(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	fwts_acpi_table_mcfg *mcfg = (fwts_acpi_table_mcfg *)table->data;
> -	size_t i, n = table->length - sizeof(fwts_acpi_table_mcfg);
> -	fwts_acpi_mcfg_configuration *config = mcfg->configuration;
> -
> -	static const fwts_acpidump_field fields[] = {
> -		FIELD_UINT("Reserved", 	fwts_acpi_table_mcfg,	reserved),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -
> -	for (i = 0; i < n / sizeof(fwts_acpi_mcfg_configuration); i++) {
> -		static const fwts_acpidump_field fields_config[] = {
> -			FIELD_UINT("  Base Address", 	fwts_acpi_mcfg_configuration,	base_address),
> -			FIELD_UINT("  PCI Seg Grp Num", fwts_acpi_mcfg_configuration,	pci_segment_group_number),
> -			FIELD_UINT("  Start Bus Num", 	fwts_acpi_mcfg_configuration,	start_bus_number),
> -			FIELD_UINT("  End Bus Num", 	fwts_acpi_mcfg_configuration,	end_bus_number),
> -			FIELD_UINT("  Reserved", 	fwts_acpi_mcfg_configuration,	reserved),
> -			FIELD_END
> -		};
> -
> -		fwts_log_nl(fw);
> -		fwts_log_info_verbatum(fw, "Configuration #%zd:", i+1);
> -		acpi_dump_table_fields(fw, (uint8_t *)config, fields_config, 0, table->length);
> -		config++;
> -	}
> -}
> -
> -static void acpidump_slit(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	fwts_acpi_table_slit *slit = (fwts_acpi_table_slit *)table->data;
> -	uint64_t n = table->length - sizeof(fwts_acpi_table_slit);
> -
> -	if (table->length < sizeof(fwts_acpi_table_slit)) {
> -		fwts_log_info_verbatum(fw, "SLIT header length too short, expected %zu "
> -			"bytes, got %zu bytes instead. Aborting SLIT table dump.",
> -			sizeof(fwts_acpi_table_slit), table->length);
> -		return;
> -	}
> -
> -	fwts_log_info_verbatum(fw, "# Sys Localities: 0x%" PRIx64 "(%" PRIu64 ")",
> -		slit->num_of_system_localities, slit->num_of_system_localities);
> -	if (n < slit->num_of_system_localities * slit->num_of_system_localities) {
> -		fwts_log_info_verbatum(fw,"Expecting %" PRIu64 " bytes, got only %" PRIu64,
> -			(slit->num_of_system_localities * slit->num_of_system_localities), n);
> -	}
> -	else {
> -		uint64_t i, j = 0, k = 0;
> -		const uint8_t *entry;
> -
> -		entry = table->data + sizeof(fwts_acpi_table_slit);
> -
> -		for (i = 0; i < n; i++) {
> -			fwts_log_info_verbatum(fw, "Entry[%2.2" PRIu64 "][%2.2" PRIu64 "]: %2.2x", j, k, *entry++);
> -			k++;
> -			if (k >= slit->num_of_system_localities) {
> -				k = 0;
> -				j++;
> -			}
> -		}
> -	}
> -}
> -
> -static void acpidump_srat(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	uint8_t *ptr = (uint8_t *)table->data + sizeof(fwts_acpi_table_srat);
> -	int offset = sizeof(fwts_acpi_table_srat);
> -
> -	while (ptr < (uint8_t *)table->data + table->length) {
> -		switch (*ptr) {
> -		case 0:	{
> -				static const fwts_acpidump_field fields_lasa[] = {
> -					FIELD_UINT("  Proximity [7:0]", fwts_acpi_table_local_apic_sapic_affinity, proximity_domain_0),
> -					FIELD_UINT("  APIC ID", fwts_acpi_table_local_apic_sapic_affinity, apic_id),
> -					FIELD_UINT("  Flags", fwts_acpi_table_local_apic_sapic_affinity, flags),
> -					FIELD_UINT("  L_SAPIC_EID", fwts_acpi_table_local_apic_sapic_affinity, local_sapic_eid),
> -					FIELD_UINT("  Proximity [31:24]",fwts_acpi_table_local_apic_sapic_affinity,  proximity_domain_3),
> -					FIELD_UINT("  Proximity [23:16]",fwts_acpi_table_local_apic_sapic_affinity,  proximity_domain_2),
> -					FIELD_UINT("  Proximity [15:8]",fwts_acpi_table_local_apic_sapic_affinity,   proximity_domain_1),
> -					FIELD_UINT("  Clock Domain:   0x", fwts_acpi_table_local_apic_sapic_affinity, clock_domain),
> -					FIELD_END,
> -				};
> -				fwts_log_info_verbatum(fw, " Processor Local APIC/SAPID Affinity Structure:");
> -				__acpi_dump_table_fields(fw, ptr, fields_lasa, offset);
> -				ptr += sizeof(fwts_acpi_table_local_apic_sapic_affinity);
> -				offset += sizeof(fwts_acpi_table_local_apic_sapic_affinity);
> -			}
> -			break;
> -		case 1:	{
> -				static const fwts_acpidump_field fields_ma[] = {
> -					FIELD_UINT("  Prox. Domain", fwts_acpi_table_memory_affinity, proximity_domain),
> -					FIELD_UINT("  Base Addr Lo", fwts_acpi_table_memory_affinity, base_addr_lo),
> -					FIELD_UINT("  Base Addr Hi", fwts_acpi_table_memory_affinity, base_addr_hi),
> -					FIELD_UINT("  Length Lo", fwts_acpi_table_memory_affinity, length_lo),
> -					FIELD_UINT("  Length Hi", fwts_acpi_table_memory_affinity, length_hi),
> -					FIELD_UINT("  Flags", fwts_acpi_table_memory_affinity, flags),
> -					FIELD_END,
> -				};
> -				fwts_log_info_verbatum(fw, " Memory Affinity Structure:");
> -				__acpi_dump_table_fields(fw, ptr, fields_ma, offset);
> -				ptr += sizeof(fwts_acpi_table_memory_affinity);
> -				offset += sizeof(fwts_acpi_table_memory_affinity);
> -			}
> -			break;
> -		case 2: {
> -				static const fwts_acpidump_field fields_xa[] = {
> -					FIELD_UINT("  Prox. Domain", fwts_acpi_table_local_x2apic_affinity, proximity_domain),
> -					FIELD_UINT("  X2APIC ID",    fwts_acpi_table_local_x2apic_affinity, x2apic_id),
> -					FIELD_UINT("  Flags",        fwts_acpi_table_local_x2apic_affinity, flags),
> -					FIELD_UINT("  Clock Domain", fwts_acpi_table_local_x2apic_affinity, clock_domain),
> -					FIELD_END,
> -				};
> -				fwts_log_info_verbatum(fw, " Processor Local x2APIC Affinit Structure:");
> -				__acpi_dump_table_fields(fw, ptr, fields_xa, offset);
> -				ptr += sizeof(fwts_acpi_table_local_x2apic_affinity);
> -				offset += sizeof(fwts_acpi_table_local_x2apic_affinity);
> -			}
> -			break;
> -		default:
> -			ptr = (uint8_t *)table->data + table->length; /* force abort */
> -			break;
> -		}
> -	}
> -}
> -
> -static void acpidump_tcpa(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	fwts_acpi_table_tcpa *tcpa = (fwts_acpi_table_tcpa*)table->data;
> -
> -	switch (tcpa->platform_class) {
> -		case 0: {
> -				static const fwts_acpidump_field fields[] = {
> -					FIELD_UINT("Platform Class",	fwts_acpi_table_tcpa, platform_class),
> -					FIELD_UINT("Log Zone Length", 	fwts_acpi_table_tcpa, client.log_zone_length),
> -					FIELD_UINT("Log Zone Address", 	fwts_acpi_table_tcpa, client.log_zone_addr),
> -					FIELD_END
> -				};
> -
> -				acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -			}
> -			break;
> -		case 1: {
> -				static const fwts_acpidump_field fields[] = {
> -					FIELD_UINT("Platform Class",		fwts_acpi_table_tcpa, platform_class),
> -					FIELD_UINT("Reserved",			fwts_acpi_table_tcpa, server.reserved),
> -					FIELD_UINT("Log Zone Length", 		fwts_acpi_table_tcpa, server.log_zone_length),
> -					FIELD_UINT("Log Zone Address",	 	fwts_acpi_table_tcpa, server.log_zone_addr),
> -					FIELD_UINT("Specification Revision",	fwts_acpi_table_tcpa, server.spec_revision),
> -					FIELD_UINT("Device Flag", 		fwts_acpi_table_tcpa, server.device_flag),
> -					FIELD_UINT("Interrupt Flag", 		fwts_acpi_table_tcpa, server.interrupt_flag),
> -					FIELD_UINT("GPE",			fwts_acpi_table_tcpa, server.gpe),
> -					FIELD_UINT("Reserved",			fwts_acpi_table_tcpa, server.reserved2),
> -					FIELD_UINT("Global System Interrupt",	fwts_acpi_table_tcpa, server.global_sys_interrupt),
> -					FIELD_GAS ("Base Address", 		fwts_acpi_table_tcpa, server.base_addr),
> -					FIELD_UINT("Reserved",	 		fwts_acpi_table_tcpa, server.reserved3),
> -					FIELD_GAS ("Configuration Address",	fwts_acpi_table_tcpa, server.config_addr),
> -					FIELD_UINT("PCI Segment Group", 	fwts_acpi_table_tcpa, server.pci_seg_number),
> -					FIELD_UINT("PCI Bus Number",	 	fwts_acpi_table_tcpa, server.pci_bus_number),
> -					FIELD_UINT("PCI Device Number", 	fwts_acpi_table_tcpa, server.pci_dev_number),
> -					FIELD_UINT("PCI Function Number", 	fwts_acpi_table_tcpa, server.pci_func_number),
> -					FIELD_END
> -				};
> -				acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -
> -			}
> -			break;
> -	}
> -
> -}
> -
> -/*
> - *  acpidump_asf()
> - *	dump out ASF! descruption table
> - *	see: http://dmtf.org/documents/asf/alert-standard-format-asf-specification-200
> - */
> -static void acpidump_asf(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	uint8_t *data = (uint8_t *)table->data;
> -	size_t length = table->length;
> -	uint8_t *ptr = data + sizeof(fwts_acpi_table_header);
> -
> -	static const fwts_acpidump_field asf_info_fields[] = {
> -		FIELD_UINT("Watchdog Reset Value", 	fwts_acpi_table_asf_info, watchdog_reset_value),
> -		FIELD_UINT("Min Sensor Poll Wait Time", fwts_acpi_table_asf_info, min_sensor_poll_wait_time),
> -		FIELD_UINT("System ID",			fwts_acpi_table_asf_info, id),
> -		FIELD_UINT("IANA ID",			fwts_acpi_table_asf_info, iana_id),
> -		FIELD_UINT("Feature Flags",		fwts_acpi_table_asf_info, flags),
> -		FIELD_UINT("Reserved1",			fwts_acpi_table_asf_info, reserved1),
> -		FIELD_UINT("Reserved2",			fwts_acpi_table_asf_info, reserved2),
> -		FIELD_UINT("Reserved3",			fwts_acpi_table_asf_info, reserved3),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field asf_alrt_fields[] = {
> -		FIELD_UINT("Assertion Event Bit Mask", 	fwts_acpi_table_asf_alrt, assertion_mask),
> -		FIELD_UINT("De-assertion Event Bit Mask", fwts_acpi_table_asf_alrt, deassertion_mask),
> -		FIELD_UINT("Number of Alerts", 		fwts_acpi_table_asf_alrt, number_of_alerts),
> -		FIELD_UINT("Array Element Length", 	fwts_acpi_table_asf_alrt, array_length),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field asf_alrt_element_fields[] = {
> -		FIELD_UINT("Alert Device Address", 	fwts_acpi_table_asf_alrt_element, device_addr),
> -		FIELD_UINT("Alert Command", 		fwts_acpi_table_asf_alrt_element, command),
> -		FIELD_UINT("Alert Data Mask", 		fwts_acpi_table_asf_alrt_element, data_mask),
> -		FIELD_UINT("Alert Compare Value", 	fwts_acpi_table_asf_alrt_element, compare_value),
> -		FIELD_UINT("Alert Event Sensor Type", 	fwts_acpi_table_asf_alrt_element, sensor_type),
> -		FIELD_UINT("Alert Event Type", 		fwts_acpi_table_asf_alrt_element, event_type),
> -		FIELD_UINT("Alert Event Offset", 	fwts_acpi_table_asf_alrt_element, event_offset),
> -		FIELD_UINT("Alert Event Source Type", 	fwts_acpi_table_asf_alrt_element, event_source_type),
> -		FIELD_UINT("Alert Event Severity", 	fwts_acpi_table_asf_alrt_element, event_severity),
> -		FIELD_UINT("Alert Sensor Number", 	fwts_acpi_table_asf_alrt_element, sensor_number),
> -		FIELD_UINT("Alert Entity", 		fwts_acpi_table_asf_alrt_element, entity),
> -		FIELD_UINT("Alert Entity Instance", 	fwts_acpi_table_asf_alrt_element, entity_instance),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field asf_rctl_fields[] = {
> -		FIELD_UINT("Number of Controls", 	fwts_acpi_table_asf_rctl, number_of_controls),
> -		FIELD_UINT("Array Element Length", 	fwts_acpi_table_asf_rctl, array_element_length),
> -		FIELD_UINT("Reserved", 			fwts_acpi_table_asf_rctl, reserved),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field asf_rctl_element_fields[] = {
> -		FIELD_UINT("Control Function", 		fwts_acpi_table_asf_rctl_element, control_function),
> -		FIELD_UINT("Control Device Address", 	fwts_acpi_table_asf_rctl_element, control_device_addr),
> -		FIELD_UINT("Control Command", 		fwts_acpi_table_asf_rctl_element, control_command),
> -		FIELD_UINT("Control Value", 		fwts_acpi_table_asf_rctl_element, control_value),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field asf_rmcp_fields[] = {
> -		FIELD_UINT("Remote Control Capabilities", fwts_acpi_table_asf_rmcp, remote_control_capabilities),
> -		FIELD_UINT("RMCP Boot Options Completion Code", fwts_acpi_table_asf_rmcp, completion_code),
> -		FIELD_UINT("RMCP IANA Enterprise ID", 	fwts_acpi_table_asf_rmcp, iana),
> -		FIELD_UINT("RMCP Special Command", 	fwts_acpi_table_asf_rmcp, special_command),
> -		FIELD_UINT("RMCP Special Command Parameter", fwts_acpi_table_asf_rmcp, special_command_param),
> -		FIELD_UINT("RMCP Boot Options", 	fwts_acpi_table_asf_rmcp, boot_options),
> -		FIELD_UINT("RMCP OEM Parameters", 	fwts_acpi_table_asf_rmcp, oem_parameters),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field asf_header_fields[] = {
> -		FIELD_UINT("Type", fwts_acpi_table_asf_header, type),
> -		FIELD_UINT("Reserved", fwts_acpi_table_asf_header, reserved),
> -		FIELD_UINT("Length", fwts_acpi_table_asf_header, length),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field asf_addr_fields[] = {
> -		FIELD_UINT("SEEPROM Address", 		fwts_acpi_table_asf_addr, seeprom_addr),
> -		FIELD_UINT("Number of Devices", 	fwts_acpi_table_asf_addr, number_of_devices),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field asf_addr_element_fields[] = {
> -		FIELD_UINT("Fixed SMBus Address", 	fwts_acpi_table_asf_addr_element, fixed_smbus_addr),
> -		FIELD_END
> -	};
> -
> -	while (ptr < data + length) {
> -		fwts_acpi_table_asf_header *hdr = (fwts_acpi_table_asf_header *)ptr;
> -		fwts_acpi_table_asf_alrt *alrt;
> -		fwts_acpi_table_asf_rctl *rctl;
> -		fwts_acpi_table_asf_addr *addr;
> -		uint8_t type = hdr->type;
> -		uint8_t i;
> -		uint8_t *asf_ptr = ptr;
> -
> -		/* Minimal header check */
> -		if (hdr->length < sizeof(fwts_acpi_table_asf_header)) {
> -			fwts_log_info_verbatum(fw, "ASF header length too short, expected %zu "
> -				"bytes, got %" PRIu16 " bytes instead. Aborting ASF table dump.",
> -				sizeof(fwts_acpi_table_asf_header), hdr->length);
> -			break;
> -		}
> -		fwts_log_nl(fw);
> -		__acpi_dump_table_fields(fw, asf_ptr, asf_header_fields, asf_ptr - data);
> -
> -		asf_ptr += sizeof(fwts_acpi_table_asf_header);
> -
> -		switch (type & 0x7f) {
> -		case 0:
> -			/* Info fields */
> -			__acpi_dump_table_fields(fw, asf_ptr, asf_info_fields, asf_ptr - data);
> -			break;
> -		case 1:
> -			/* Alert fields */
> -			alrt = (fwts_acpi_table_asf_alrt *)asf_ptr;
> -			__acpi_dump_table_fields(fw, asf_ptr, asf_alrt_fields, asf_ptr - data);
> -			asf_ptr += sizeof(fwts_acpi_table_asf_alrt);
> -			for (i = 0; i < alrt->number_of_alerts; i++) {
> -				fwts_log_nl(fw);
> -				fwts_log_info_verbatum(fw, "ASF Alert Data #%" PRId8 ":", i);
> -				__acpi_dump_table_fields(fw, asf_ptr, asf_alrt_element_fields, asf_ptr - data);
> -				asf_ptr += alrt->array_length;
> -			}
> -			break;
> -		case 2:
> -			/* remote control system actions */
> -			rctl = (fwts_acpi_table_asf_rctl *)asf_ptr;
> -			__acpi_dump_table_fields(fw, asf_ptr, asf_rctl_fields, asf_ptr - data);
> -			asf_ptr += sizeof(fwts_acpi_table_asf_rctl);
> -			for (i = 0; i < rctl->number_of_controls; i++) {
> -				fwts_log_nl(fw);
> -				fwts_log_info_verbatum(fw, "ASF Control Data #%" PRId8 ":", i);
> -				__acpi_dump_table_fields(fw, asf_ptr, asf_rctl_element_fields, asf_ptr - data);
> -
> -				asf_ptr += rctl->array_element_length;
> -			}
> -			break;
> -		case 3:
> -			/* remote control capabilties */
> -			__acpi_dump_table_fields(fw, asf_ptr, asf_rmcp_fields, asf_ptr - data);
> -			break;
> -		case 4:
> -			/* fixed SMBus addresses */
> -			addr = (fwts_acpi_table_asf_addr *)asf_ptr;
> -			__acpi_dump_table_fields(fw, asf_ptr, asf_addr_fields, asf_ptr - data);
> -			asf_ptr += sizeof(fwts_acpi_table_asf_addr);
> -			for (i = 0; i < addr->number_of_devices; i++) {
> -				__acpi_dump_table_fields(fw, asf_ptr, asf_addr_element_fields, asf_ptr - data);
> -				asf_ptr += sizeof(fwts_acpi_table_asf_addr_element);
> -			}
> -			break;
> -		default:
> -			break;	/* Unknown! */
> -		}
> -
> -		ptr += hdr->length;	/* Jump to next header */
> -
> -		if (type & 0x80)	/* Last record indicator, top bit of type field */
> -			break;
> -	}
> -}
> -
> -/*
> - *  acpidump_dmar_device_scope()
> - *	dump out DMAR device scope
> - */
> -static void acpidump_dmar_device_scope(
> +static void acpi_dump_raw_table(
>   	fwts_framework *fw,
> -	const uint8_t *data,
> -	const uint8_t *device_scope,
> -	const size_t device_scope_length)
> -{
> -	size_t length = device_scope_length;
> -
> -	static const fwts_acpidump_field dmar_device_scope_fields[] = {
> -		FIELD_UINT("Type",			fwts_acpi_table_dmar_device_scope, type),
> -		FIELD_UINT("Length",			fwts_acpi_table_dmar_device_scope, length),
> -		FIELD_UINT("Reserved",			fwts_acpi_table_dmar_device_scope, reserved),
> -		FIELD_UINT("Enumeration ID",		fwts_acpi_table_dmar_device_scope, enumeration_id),
> -		FIELD_UINT("Start Bus Number",		fwts_acpi_table_dmar_device_scope, start_bus_number),
> -		FIELD_END
> -	};
> -
> -	/* Parse through multiple device scope entries */
> -	while (length > 0) {
> -		ssize_t i, len;
> -
> -		fwts_acpi_table_dmar_device_scope *device_scope_entry =
> -			(fwts_acpi_table_dmar_device_scope *)device_scope;
> -		__acpi_dump_table_fields(fw, device_scope, dmar_device_scope_fields, device_scope - data);
> -		len = device_scope_entry->length - sizeof(fwts_acpi_table_dmar_device_scope);
> -		/* Something not good about the data */
> -		if (len <= 0) {
> -			fwts_log_info_verbatum(fw, "DMAR device scope entry length "
> -				"too short. Aborting device scope dump.");
> -			break;
> -		}
> -		/*
> -		 *  The device scope has a variable length path,
> -		 *  so just dump this raw data out for now.
> -		 */
> -		for (i = 0; i < len; i++) {
> -			uint8_t val8 = device_scope_entry->path[i];
> -			fwts_log_info_verbatum(fw, "%s 0x%2.2x [%zd]", acpi_dump_field_info("Path", 1,
> -				(device_scope - data) + sizeof(fwts_acpi_table_dmar_device_scope) + i),
> -				val8, i);
> -		}
> -		device_scope += device_scope_entry->length;
> -		length -= device_scope_entry->length;
> -	}
> -}
> -
> -/*
> - *  acpidump_dmar()
> - *	dump out DMAR
> - *	http://download.intel.com/technology/computing/vptech/Intel(r)_VT_for_Direct_IO.pdf
> - */
> -static void acpidump_dmar(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	const uint8_t *data = table->data, *ptr = table->data;
> -
> -	static const fwts_acpidump_field dmar_fields[] = {
> -		FIELD_UINT("Host Address Width", 	fwts_acpi_table_dmar, host_addr_width),
> -		FIELD_UINT("Flags", 			fwts_acpi_table_dmar, flags),
> -		FIELD_UINT("Reserved", 			fwts_acpi_table_dmar, reserved),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field dmar_header_fields[] = {
> -		FIELD_UINT("Type",			fwts_acpi_table_dmar_header, type),
> -		FIELD_UINT("Length",			fwts_acpi_table_dmar_header, length),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field dmar_hardware_unit_fields[] = {
> -		FIELD_UINT("Flags",			fwts_acpi_table_dmar_hardware_unit, flags),
> -		FIELD_UINT("Reserved",			fwts_acpi_table_dmar_hardware_unit, reserved),
> -		FIELD_UINT("Segment Number",		fwts_acpi_table_dmar_hardware_unit, segment_number),
> -		FIELD_UINT("Register Base Address",	fwts_acpi_table_dmar_hardware_unit, register_base_addr),
> -		FIELD_UINT("Device Scope",		fwts_acpi_table_dmar_hardware_unit, device_scope),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field dmar_reserved_memory_fields[] = {
> -		FIELD_UINT("Reserved",			fwts_acpi_table_dmar_reserved_memory, reserved),
> -		FIELD_UINT("Segment",			fwts_acpi_table_dmar_reserved_memory, segment),
> -		FIELD_UINT("Base Address",		fwts_acpi_table_dmar_reserved_memory, base_address),
> -		FIELD_UINT("End Address",		fwts_acpi_table_dmar_reserved_memory, end_address),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field dmar_atsr_fields[] = {
> -		FIELD_UINT("Flags",			fwts_acpi_table_dmar_atsr, flags),
> -		FIELD_UINT("Reserved",			fwts_acpi_table_dmar_atsr, reserved),
> -		FIELD_UINT("Segment",			fwts_acpi_table_dmar_atsr, segment),
> -		FIELD_END
> -	};
> -
> -	__acpi_dump_table_fields(fw, ptr, dmar_fields, ptr - data);
> -	ptr += sizeof(fwts_acpi_table_dmar);
> -
> -	while (ptr < data + table->length) {
> -		fwts_acpi_table_dmar_header *header =
> -			(fwts_acpi_table_dmar_header *)ptr;
> -
> -		fwts_log_nl(fw);
> -		/* Something not good with the data */
> -		if (header->length < sizeof(fwts_acpi_table_dmar_header)) {
> -			fwts_log_info_verbatum(fw, "DMAR header length "
> -				"too short, expected %zu bytes, got %" PRIu16
> -				" bytes instead. Aborting DMAR dump.",
> -				sizeof(fwts_acpi_table_dmar_header), header->length);
> -			break;
> -		}
> -
> -		switch (header->type) {
> -		case 0:
> -			fwts_log_info_verbatum(fw, "Hardware Unit Definition:");
> -			__acpi_dump_table_fields(fw, ptr, dmar_header_fields, ptr - data);
> -			__acpi_dump_table_fields(fw, ptr, dmar_hardware_unit_fields, ptr - data);
> -
> -			acpidump_dmar_device_scope(fw, data,
> -				ptr + sizeof(fwts_acpi_table_dmar_hardware_unit),
> -				(size_t)header->length - sizeof(fwts_acpi_table_dmar_hardware_unit));
> -			break;
> -		case 1:
> -			fwts_log_info_verbatum(fw, "Reserved Memory Definition:");
> -			__acpi_dump_table_fields(fw, ptr, dmar_header_fields, ptr - data);
> -			__acpi_dump_table_fields(fw, ptr, dmar_reserved_memory_fields, ptr - data);
> -
> -			acpidump_dmar_device_scope(fw, data,
> -				ptr + sizeof(fwts_acpi_table_dmar_reserved_memory),
> -				(size_t)header->length - sizeof(fwts_acpi_table_dmar_reserved_memory));
> -			break;
> -		case 2:
> -			fwts_log_info_verbatum(fw, "Root Port ATS Capability Reporting Structure:");
> -			__acpi_dump_table_fields(fw, ptr, dmar_header_fields, ptr - data);
> -			__acpi_dump_table_fields(fw, ptr, dmar_atsr_fields, ptr - data);
> -
> -			acpidump_dmar_device_scope(fw, data,
> -				ptr + sizeof(fwts_acpi_table_dmar_atsr),
> -				(size_t)header->length - sizeof(fwts_acpi_table_dmar_atsr));
> -			break;
> -		default:
> -			/* and anything else */
> -			break;
> -		}
> -
> -		ptr += header->length;
> -	}
> -}
> -
> -/*
> - *  acpidump_slic()
> - *	dump out SLIC
> - */
> -static void acpidump_slic(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	uint8_t *data = (uint8_t *)table->data;
> -	size_t length = table->length;
> -	uint8_t *ptr = data;
> -
> -	static const 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 const 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_UINT("Exponent",  fwts_acpi_table_slic_key, exponent),
> -		FIELD_UINTS("Modulus", 	fwts_acpi_table_slic_key, modulus),
> -		FIELD_END
> -	};
> -
> -	static const 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_acpi_table_slic_header *header =
> -			(fwts_acpi_table_slic_header *)ptr;
> -
> -		fwts_log_nl(fw);
> -		/*
> -		 *  Some machines such as the Acer Veritas have a SLIC header that
> -		 *  declares it's length as zero.  So to avoid spinning forever
> -		 *  break out of the loop.
> -		 */
> -		if ((ptr + sizeof(fwts_acpi_table_slic_header) < data + length) &&
> -		    (header->length == 0)) {
> -			fwts_log_info(fw, "SLIC header length is zero, aborting dump of SLIC.");
> -			break;
> -		}
> -
> -		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;
> -	}
> -}
> -
> -/*
> - *  acpidump_uefi()
> - *	dump out UEFI tables
> - */
> -static void acpidump_uefi(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -
> -	/*
> -	 * GUID for SMM Communication ACPI Table
> -	 * {0xc68ed8e2, 0x9dc6, 0x4cbd, 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32}
> -	*/
> -	static const uint8_t guid_smm[16] = { 0xe2, 0xd8, 0x8e, 0xc6, 0xc6, 0x9d, 0xbd, 0x4c,
> -						0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 };
> -
> -	fwts_acpi_table_uefi *uefi = (fwts_acpi_table_uefi *)table->data;
> -
> -	static const fwts_acpidump_field boot_fields[] = {
> -		FIELD_GUID("UUID", 	fwts_acpi_table_uefi, uuid),
> -		FIELD_UINT("DataOffset", fwts_acpi_table_uefi, dataoffset),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field smmcomm_fields[] = {
> -		FIELD_UINT("SW SMI Number", 	fwts_acpi_table_uefi_smmcomm, sw_smi_number),
> -		FIELD_UINT("Buffer Prt Address", fwts_acpi_table_uefi_smmcomm, buf_ptr_addr),
> -		FIELD_END
> -	};
> -	__acpi_dump_table_fields(fw, table->data, boot_fields, 0);
> -
> -	if (memcmp(uefi->uuid, guid_smm, 16) != 0) {
> -		fwts_log_nl(fw);
> -		acpi_dump_raw_data(fw, uefi->data, table->length - sizeof(fwts_acpi_table_uefi),
> -				sizeof(fwts_acpi_table_uefi));
> -	} else
> -		__acpi_dump_table_fields(fw, table->data, smmcomm_fields, 0);
> -}
> -
> -/*
> - *  acpidump_bgrt()
> - *	dump BGRT, see 5.2.22 Boot Graphics Resource Table (BGRT)
> - *	of version 5.0 ACPI spec.
> - */
> -static void acpidump_bgrt(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	static const fwts_acpidump_field bgrt_fields[] = {
> -		FIELD_UINT("Version", 		fwts_acpi_table_bgrt, version),
> -		FIELD_UINT("Status", 		fwts_acpi_table_bgrt, status),
> -		FIELD_UINT("Image Type", 	fwts_acpi_table_bgrt, image_type),
> -		FIELD_UINT("Image Address", 	fwts_acpi_table_bgrt, image_addr),
> -		FIELD_UINT("Image Offset X", 	fwts_acpi_table_bgrt, image_offset_x),
> -		FIELD_UINT("Image Offset Y", 	fwts_acpi_table_bgrt, image_offset_y),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, bgrt_fields, 0, table->length);
> -}
> -
> -/*
> - *  acpidump_gtdt()
> - *	dump GTDT, see 5.2.24 Generic Timer Description Table (GTDT)
> - *	of version 5.0 ACPI spec.
> - */
> -static void acpidump_gtdt(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	uint8_t *data = (uint8_t *)table->data, *ptr = data;
> -
> -	static const fwts_acpidump_field gtdt_fields[] = {
> -		FIELD_UINT("Count Ctrl Physical Addr", 	fwts_acpi_table_gtdt, cnt_control_base_phys_addr),
> -		FIELD_UINT("Reserved", 			fwts_acpi_table_gtdt, reserved),
> -		FIELD_UINT("Secure EL1 Timer GSIV", 	fwts_acpi_table_gtdt, secure_EL1_timer_GSIV),
> -		FIELD_UINT("Secure EL1 Timer Flags", 	fwts_acpi_table_gtdt, secure_EL1_timer_flags),
> -		FIELD_UINT("Non-Secure EL1 Timer GSIV", fwts_acpi_table_gtdt, non_secure_EL1_timer_GSIV),
> -		FIELD_UINT("Non-Secure EL1 Timer Flags",fwts_acpi_table_gtdt, non_secure_EL1_timer_flags),
> -		FIELD_UINT("Virtual Timer GSIV", 	fwts_acpi_table_gtdt, virtual_timer_GSIV),
> -		FIELD_UINT("Virtual Timer flags", 	fwts_acpi_table_gtdt, virtual_timer_flags),
> -		FIELD_UINT("Non-Secure EL2 Timer GSIV", fwts_acpi_table_gtdt, non_secure_EL2_timer_GSIV),
> -		FIELD_UINT("Non-Secure EL2 Timer Flags",fwts_acpi_table_gtdt, non_secure_EL2_timer_flags),
> -		FIELD_UINT("Count Read Physical Addr",	fwts_acpi_table_gtdt, cnt_read_base_phys_addr),
> -		FIELD_UINT("Platform Timer Count",	fwts_acpi_table_gtdt, platform_timer_count),
> -		FIELD_UINT("Platform Timer Offset",	fwts_acpi_table_gtdt, platform_timer_offset),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field gtdt_platform_timer_fields[] = {
> -		FIELD_BITF("  Timer Interrupt Mode", 	fwts_acpi_table_gtdt_platform_timer, timer_flags, 1, 0),
> -		FIELD_BITF("  Timer Interrupt Polarity",fwts_acpi_table_gtdt_platform_timer, timer_flags, 1, 1),
> -		FIELD_BITF("  Always-on Capability", 	fwts_acpi_table_gtdt_platform_timer, timer_flags, 1, 2),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, data, gtdt_fields, 0, table->length);
> -
> -	ptr += sizeof(fwts_acpi_table_gtdt);
> -
> -	/* Now scan through the array of platform timer structures */
> -	while (ptr < data + table->length) {
> -		__acpi_dump_table_fields(fw, ptr, gtdt_platform_timer_fields, ptr - data);
> -		ptr += sizeof(fwts_acpi_table_gtdt_platform_timer);
> -	}
> -}
> -
> -/*
> - *  acpidump_fpdt()
> - *	dump FPDT, see 5.2.23 Firmware Performance Data Table (FPDT)
> - *	of version 5.0 ACPI spec.
> - */
> -static void acpidump_fpdt(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	uint8_t *data = (uint8_t *)table->data, *ptr = data;
> -	const size_t fpdt_hdr_len = sizeof(fwts_acpi_table_fpdt_header);
> -
> -	static const fwts_acpidump_field fpdt_header_fields[] = {
> -		FIELD_UINT("Type", 		fwts_acpi_table_fpdt_header, type),
> -		FIELD_UINT("Length", 		fwts_acpi_table_fpdt_header, length),
> -		FIELD_UINT("Revision", 		fwts_acpi_table_fpdt_header, revision),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field fpdt_basic_boot_perf_ptr_fields[] = {
> -		FIELD_UINT("Reserved", 		fwts_acpi_table_fpdt_basic_boot_perf_ptr, reserved),
> -		FIELD_UINT("FBPT Pointer", 	fwts_acpi_table_fpdt_basic_boot_perf_ptr, fbpt_addr),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field fpdt_s3_perf_ptr_fields[] = {
> -		FIELD_UINT("Reserved", 		fwts_acpi_table_fpdt_s3_perf_ptr, reserved),
> -		FIELD_UINT("S3PT Pointer", 	fwts_acpi_table_fpdt_s3_perf_ptr, s3pt_addr),
> -		FIELD_END
> -	};
> -
> -	ptr += sizeof(fwts_acpi_table_header);
> -
> -	/*
> -	 *  Currently we just dump out the various pointer records.  A more complete
> -	 *  implementation should mmap the memory that the records point to and also
> -	 *  dump these out.  That's an implementation issue for later.
> -	 */
> -	while (ptr < data + table->length) {
> -		fwts_acpi_table_fpdt_header *fpdt = (fwts_acpi_table_fpdt_header *)ptr;
> -
> -		/* fpdt not long enough, bail out early */
> -		if (fpdt->length < 16) {
> -			size_t offset = ptr - data;
> -			fwts_log_info_verbatum(fw, "Cannot decode FPDT header, size %"
> -				PRIu8 " less than 16 bytes. Data:", fpdt->length);
> -			acpi_dump_raw_data(fw, ptr, table->length - offset, offset);
> -			break;
> -		}
> -
> -		fwts_log_nl(fw);
> -
> -		switch (fpdt->type) {
> -		case 0x0000:
> -			fwts_log_info_verbatum(fw, "Basic Boot Performance Data Record pointer:");
> -			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
> -			__acpi_dump_table_fields(fw, ptr, fpdt_basic_boot_perf_ptr_fields, ptr - data);
> -			break;
> -		case 0x0001:
> -			fwts_log_info_verbatum(fw, "S3 Performance Table pointer:");
> -			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
> -			__acpi_dump_table_fields(fw, ptr, fpdt_s3_perf_ptr_fields, ptr - data);
> -			break;
> -		case 0x0002 ... 0x0fff:
> -			fwts_log_info_verbatum(fw, "Reserved for ACPI specification usage:");
> -			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
> -			acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data);
> -			break;
> -		case 0x1000 ... 0x1fff:
> -			fwts_log_info_verbatum(fw, "Reserved for Platform Vendor usage:");
> -			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
> -			acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data);
> -			break;
> -		case 0x2000 ... 0x2fff:
> -			fwts_log_info_verbatum(fw, "Reserved for Hardware Vendor usage:");
> -			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
> -			acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data);
> -			break;
> -		case 0x3000 ... 0x3fff:
> -			fwts_log_info_verbatum(fw, "Reserved for BIOS Vendor usage:");
> -			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
> -			acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data);
> -			break;
> -		default:
> -			fwts_log_info_verbatum(fw, "Reserved for future usage:");
> -			__acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data);
> -			acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data);
> -			break;
> -		}
> -		ptr += fpdt->length;
> -	}
> -}
> -
> -/*
> - *  acpidump_rasf()
> - *	dump RASF, see 5.2.20 ACPI RAS FeatureTable (RASF)
> - *	of version 5.0 ACPI spec.
> - */
> -static void acpidump_rasf(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	static const fwts_acpidump_field rasf_fields[] = {
> -		FIELD_UINTS("Comm. Channel ID", fwts_acpi_table_rasf, platform_cc_id),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, rasf_fields, 0, table->length);
> -
> -	/* No idea how to dump rest of table, spec is a rather poor */
> -	acpi_dump_raw_table(fw, table);
> -}
> -
> -/*
> - *  acpidump_pcct()
> - *	dump PCCT, see 14 ACPI PCCT (Platform Communications Channel)
> - *	of version 5.0 ACPI spec.
> - */
> -static void acpidump_pcct(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	uint8_t *data = (uint8_t *)table->data, *ptr = data;
> -
> -	static const fwts_acpidump_field pcct_fields[] = {
> -		FIELD_UINT ("Flags",	fwts_acpi_table_pcct, flags),
> -		FIELD_UINTS("Reserved", fwts_acpi_table_pcct, reserved),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field type0_fields[] = {
> -		FIELD_UINTS("Reserved",		fwts_acpi_table_pcct_subspace_type_0, reserved),
> -		FIELD_UINT ("Base Address",	fwts_acpi_table_pcct_subspace_type_0, base_address),
> -		FIELD_UINT ("Length",		fwts_acpi_table_pcct_subspace_type_0, length),
> -		FIELD_GAS  ("Doorbell Register",fwts_acpi_table_pcct_subspace_type_0, doorbell_register),
> -		FIELD_UINT ("Doorbell Preserve",fwts_acpi_table_pcct_subspace_type_0, doorbell_preserve),
> -		FIELD_UINT ("Doorbell Write",	fwts_acpi_table_pcct_subspace_type_0, doorbell_write),
> -		FIELD_UINT ("Nominal Latency",	fwts_acpi_table_pcct_subspace_type_0, nominal_latency),
> -		FIELD_UINT ("Max. Access Rate",	fwts_acpi_table_pcct_subspace_type_0, max_periodic_access_rate),
> -		FIELD_UINT ("Min. Turnaround Time", fwts_acpi_table_pcct_subspace_type_0, min_request_turnaround_time),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, data, pcct_fields, 0, table->length);
> -
> -	ptr += sizeof(fwts_acpi_table_pcct);
> -
> -	/* Now scan through the array of subspace structures */
> -	while (ptr < data + table->length) {
> -		fwts_acpi_table_pcct_subspace_header *header =
> -			(fwts_acpi_table_pcct_subspace_header *)ptr;
> -
> -		if (header->length < sizeof(fwts_acpi_table_pcct_subspace_header)) {
> -			fwts_log_info_verbatum(fw, "PCCT subspace header length too short, expected %zu "
> -				"bytes, got %" PRIu8 " bytes instead. Aborting PCCT table dump.",
> -				sizeof(fwts_acpi_table_pcct_subspace_header), header->length);
> -			break;
> -		}
> -
> -		/* Currently just type 0 is supported */
> -		switch (header->type) {
> -		case 0:
> -			fwts_log_info_verbatum(fw,
> -				"General Communications Subspace Structure (type 0):");
> -			__acpi_dump_table_fields(fw, ptr, type0_fields, ptr - data);
> -
> -			break;
> -		default:
> -			break;
> -		}
> -		ptr += header->length;
> -	}
> -}
> -
> -/*
> - *  acpidump_spcr()
> - *	dump spcr, Serial Port Console Redirection Table
> - */
> -static void acpidump_spcr(fwts_framework *fw, const fwts_acpi_table_info *table)
> +	const fwts_acpi_table_info *table)
>   {
> -	static const fwts_acpidump_field spcr_fields[] = {
> -		FIELD_UINT("Interface Type", 		fwts_acpi_table_spcr, interface_type),
> -		FIELD_UINT("Reserved", 			fwts_acpi_table_spcr, reserved1),
> -		FIELD_GAS ("Base Address", 		fwts_acpi_table_spcr, base_address),
> -		FIELD_UINT("Interrupt Type", 		fwts_acpi_table_spcr, interrupt_type),
> -		FIELD_UINT("IRQ", 			fwts_acpi_table_spcr, irq),
> -		FIELD_UINT("Global System Interrupt", 	fwts_acpi_table_spcr, gsi),
> -		FIELD_UINT("Baud Rate", 		fwts_acpi_table_spcr, baud_rate),
> -		FIELD_UINT("Parity", 			fwts_acpi_table_spcr, parity),
> -		FIELD_UINT("Stop Bits", 		fwts_acpi_table_spcr, stop_bits),
> -		FIELD_UINT("Flow Control", 		fwts_acpi_table_spcr, flow_control),
> -		FIELD_UINT("Terminal Type", 		fwts_acpi_table_spcr, terminal_type),
> -		FIELD_UINT("Reserved", 			fwts_acpi_table_spcr, reserved2),
> -		FIELD_UINT("PCI Device ID", 		fwts_acpi_table_spcr, pci_device_id),
> -		FIELD_UINT("PCI Vendor ID", 		fwts_acpi_table_spcr, pci_vendor_id),
> -		FIELD_UINT("PCI Bus Number", 		fwts_acpi_table_spcr, pci_bus_number),
> -		FIELD_UINT("PCI Device Number", 	fwts_acpi_table_spcr, pci_device_number),
> -		FIELD_UINT("PCI Function Number", 	fwts_acpi_table_spcr, pci_function_number),
> -		FIELD_UINT("PCI Flags", 		fwts_acpi_table_spcr, pci_flags),
> -		FIELD_UINT("PCI Segment", 		fwts_acpi_table_spcr, pci_segment),
> -		FIELD_UINT("Reserved", 			fwts_acpi_table_spcr, reserved3),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, spcr_fields, 0, table->length);
> -}
> +	const uint8_t *data = (uint8_t *)table->data;
> +	const size_t length = table->length;
> +        size_t n;
>   
> -/*
> - *  acpidump_dbgp()
> - *	dump dbgp, debug port table
> - */
> -static void acpidump_dbgp(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	static const fwts_acpidump_field dbgp_fields[] = {
> -		FIELD_UINT("Interface Type", 		fwts_acpi_table_dbgp, interface_type),
> -		FIELD_UINT("Reserved", 			fwts_acpi_table_dbgp, reserved1),
> -		FIELD_GAS ("Base Address", 		fwts_acpi_table_dbgp, base_address),
> -		FIELD_END
> -	};
> +	fwts_log_nl(fw);
>   
> -	acpi_dump_table_fields(fw, table->data, dbgp_fields, 0, table->length);
> +        for (n = 0; n < length; n += 16) {
> +                int left = length - n;
> +		char buffer[128];
> +		fwts_dump_raw_data(buffer, sizeof(buffer), data + n, n, left > 16 ? 16 : left);
> +		fwts_log_info_verbatum(fw, "%s", buffer);
> +        }
>   }
>   
>   /*
> - *  acpidump_dbg2()
> - *	dump dbg2, debug port table
> + *  Dump ACPI header in a form that matches IASL's header dump format
>    */
> -static void acpidump_dbg2(fwts_framework *fw, const fwts_acpi_table_info *table)
> +static void acpidump_hdr(
> +	fwts_framework *fw,
> +	const fwts_acpi_table_header *hdr,
> +	const size_t length)
>   {
> -	fwts_acpi_table_dbg2 *dbg2 = (fwts_acpi_table_dbg2 *)table->data;
> -	uint32_t i;
> -	size_t offset;
> -
> -	typedef struct {
> -		fwts_acpi_gas	addr;
> -	} gas_addr;
> -
> -	typedef struct {
> -		uint32_t	size;
> -	} addr_size;
> -
> -	typedef struct {
> -		char		*path;
> -	} namespace;
> -
> -	static const fwts_acpidump_field dbg2_fields[] = {
> -		FIELD_UINT("Info Offset", 		fwts_acpi_table_dbg2, info_offset),
> -		FIELD_UINT("Info Count", 		fwts_acpi_table_dbg2, info_count),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field dbg2_info_fields[] = {
> -		FIELD_UINT("Revision", 			fwts_acpi_table_dbg2_info, revision),
> -		FIELD_UINT("Length", 			fwts_acpi_table_dbg2_info, length),
> -		FIELD_UINT("Register Count",		fwts_acpi_table_dbg2_info, number_of_regs),
> -		FIELD_UINT("Namespace Length", 		fwts_acpi_table_dbg2_info, namespace_length),
> -		FIELD_UINT("Namespace Offset",		fwts_acpi_table_dbg2_info, namespace_offset),
> -		FIELD_UINT("OEM Data Length", 		fwts_acpi_table_dbg2_info, oem_data_length),
> -		FIELD_UINT("OEM Data Offset",		fwts_acpi_table_dbg2_info, oem_data_offset),
> -		FIELD_UINT("Port Type", 		fwts_acpi_table_dbg2_info, port_type),
> -		FIELD_UINT("Port Subtype",		fwts_acpi_table_dbg2_info, port_subtype),
> -		FIELD_UINT("Reserved",			fwts_acpi_table_dbg2_info, reserved),
> -		FIELD_UINT("Base Address Offset",	fwts_acpi_table_dbg2_info, base_address_offset),
> -		FIELD_UINT("Address Size Offset", 	fwts_acpi_table_dbg2_info, address_size_offset),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field dbg2_gas_fields[] = {
> -		FIELD_GAS ("Base Address Register",	gas_addr, addr),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field dbg2_addr_fields[] = {
> -		FIELD_UINT("Address Size", 		addr_size, size),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field dbg2_namespace_fields[] = {
> -		FIELD_STRZ("Namepath", 			namespace, path),
> -		FIELD_END
> -	};
> -
> -	acpi_dump_table_fields(fw, table->data, dbg2_fields, 0, table->length);
> -	fwts_log_nl(fw);
> -
> -	offset = dbg2->info_offset;
> -
> -	/* Dump out info_count number of instances */
> -	for (i = 0; i < dbg2->info_count; i++) {
> -		fwts_acpi_table_dbg2_info *dbg2_info = (fwts_acpi_table_dbg2_info *)(table->data + offset);
> -		uint8_t *base_addr_regs = (uint8_t *)dbg2_info + dbg2_info->base_address_offset;
> -		uint8_t *address_size   = (uint8_t *)dbg2_info + dbg2_info->address_size_offset;
> -		uint8_t *namespace_str  = (uint8_t *)dbg2_info + dbg2_info->namespace_offset;
> -		uint8_t *oem_data       = (uint8_t *)dbg2_info + dbg2_info->oem_data_offset;
> -
> -		__acpi_dump_table_fields(fw, table->data + offset, dbg2_info_fields, offset);
> -
> -		if (dbg2_info->length < sizeof(fwts_acpi_table_dbg2_info)) {
> -			fwts_log_info_verbatum(fw, "DBG2 info header length too short, expected %zu "
> -				"bytes, got %" PRIu16 " bytes instead. Aborting PCCT table dump.",
> -				sizeof(fwts_acpi_table_dbg2_info), dbg2_info->length);
> -			break;
> -		}
> -
> -		if (dbg2_info->number_of_regs) {
> -			uint32_t j;
> -
> -			/* Dump out the register GAS and sizes */
> -			for (j = 0; j < dbg2_info->number_of_regs; j++) {
> -				__acpi_dump_table_fields(fw, &base_addr_regs[j], dbg2_gas_fields,
> -					(void*)&base_addr_regs[j] - table->data);
> -			}
> -			fwts_log_nl(fw);
> -
> -			for (j = 0; j < dbg2_info->number_of_regs; j++)
> -				acpi_dump_uint(fw, dbg2_addr_fields, &address_size[j],
> -					(void *)&address_size[j] - table->data);
> -			fwts_log_nl(fw);
> -
> -		}
> -		/* Do we have a namespace to dump? */
> -		if (dbg2_info->namespace_offset)
> -			acpi_dump_strz(fw, dbg2_namespace_fields, namespace_str,
> -				(void *)namespace_str - table->data);
> -
> -		/* And dump any OEM specific data */
> -		if (dbg2_info->oem_data_length) {
> -			fwts_log_nl(fw);
> -			fwts_log_info_verbatum(fw, "OEM Data:");
> -			acpi_dump_raw_data(fw, oem_data, dbg2_info->oem_data_length,
> -				(void *)oem_data - table->data);
> -		}
> -
> -		offset += dbg2_info->length;
> -		if (offset > table->length)
> -			break;
> -	}
> +	if (length < sizeof(fwts_acpi_table_header))
> +		return;
> +	fwts_log_info_verbatum(fw, "[000h 0000   4]                    Signature : \"%4.4s\"",
> +		hdr->signature);
> +	fwts_log_info_verbatum(fw, "[004h 0004   4]                 Table Length : %8.8" PRIx32,
> +		hdr->length);
> +	fwts_log_info_verbatum(fw, "[008h 0008   1]                     Revision : %2.2" PRIx8,
> +		hdr->revision);
> +	fwts_log_info_verbatum(fw, "[009h 0009   1]                     Checksum : %2.2" PRIx8,
> +		hdr->checksum);
> +	fwts_log_info_verbatum(fw, "[00Ah 0010   6]                       Oem ID : \"%6.6s\"",
> +		hdr->oem_id);
> +	fwts_log_info_verbatum(fw, "[010h 0016   8]                 Oem Table ID : \"%8.8s\"",
> +		hdr->oem_tbl_id);
> +	fwts_log_info_verbatum(fw, "[018h 0024   4]                 Oem Revision : %8.8" PRIx32,
> +		hdr->oem_revision);
> +	fwts_log_info_verbatum(fw, "[01Ch 0028   4]              Asl Compiler ID : \"%4.4s\"",
> +		hdr->creator_id);
> +	fwts_log_info_verbatum(fw, "[020h 0032   4]        Asl Compiler Revision : %8.8" PRIx32,
> +		hdr->creator_revision);
>   }
>   
>   /*
> - *  acpidump_mchi()
> - *	dump mchi, Management Controller Host Interface Table
> - *	http://www.dmtf.org/standards/published_documents/DSP0256_1.0.0.pdf
> + *  Alas, RSDP is a special case
>    */
> -static void acpidump_mchi(fwts_framework *fw, const fwts_acpi_table_info *table)
> -{
> -	static const fwts_acpidump_field mchi_fields_pci_dev_flag0[] = {
> -		FIELD_UINT("Interface Type", 		fwts_acpi_table_mchi, interface_type),
> -		FIELD_UINT("Protocol Identifier", 	fwts_acpi_table_mchi, protocol_identifier),
> -		FIELD_UINTS("Protocol Data", 		fwts_acpi_table_mchi, protocol_data),
> -		FIELD_UINT("Interrupt Type", 		fwts_acpi_table_mchi, interrupt_type),
> -		FIELD_UINT("GPE", 			fwts_acpi_table_mchi, gpe),
> -		FIELD_UINT("PCI Device Flag", 		fwts_acpi_table_mchi, pci_device_flag),
> -		FIELD_UINT("Global System Interrupt",	fwts_acpi_table_mchi, global_system_interrupt),
> -		FIELD_GAS ("Base Address", 		fwts_acpi_table_mchi, base_address),
> -		FIELD_UINTS("UID Bytes 1-4",		fwts_acpi_table_mchi, bytes),
> -		FIELD_END
> -	};
> -
> -	static const fwts_acpidump_field mchi_fields_pci_dev_flag1[] = {
> -		FIELD_UINT("Interface Type", 		fwts_acpi_table_mchi, interface_type),
> -		FIELD_UINT("Protocol Identifier", 	fwts_acpi_table_mchi, protocol_identifier),
> -		FIELD_UINTS("Protocol Data", 		fwts_acpi_table_mchi, protocol_data),
> -		FIELD_UINT("Interrupt Type", 		fwts_acpi_table_mchi, interrupt_type),
> -		FIELD_UINT("GPE", 			fwts_acpi_table_mchi, gpe),
> -		FIELD_UINT("PCI Device Flag", 		fwts_acpi_table_mchi, pci_device_flag),
> -		FIELD_UINT("Global System Interrupt",	fwts_acpi_table_mchi, global_system_interrupt),
> -		FIELD_GAS ("Base Address", 		fwts_acpi_table_mchi, base_address),
> -		FIELD_UINT("PCI Segment Group Number",	fwts_acpi_table_mchi, bytes[0]),
> -		FIELD_UINT("PCI Bus Number", 		fwts_acpi_table_mchi, bytes[1]),
> -		FIELD_UINT("PCI Device Number",  	fwts_acpi_table_mchi, bytes[2]),
> -		FIELD_UINT("PCI Function Number", 	fwts_acpi_table_mchi, bytes[3]),
> -		FIELD_END
> -	};
> -
> -	const fwts_acpi_table_mchi *mchi = (fwts_acpi_table_mchi *)table->data;
> -	const fwts_acpidump_field *fields = (mchi->pci_device_flag & 1) ?
> -		mchi_fields_pci_dev_flag1 : mchi_fields_pci_dev_flag0;
> -
> -	acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
> -}
> -
> -
> -typedef struct {
> -	const char *name;		/* ACPI table signature */
> -	void (*func)(fwts_framework *fw, const fwts_acpi_table_info *table);
> -	const int standard_header;	/* 1 = standard ACPI header */
> -	const char *description;	/* table description */
> -} acpidump_table_vec;
> -
> -/* To be implemented */
> -#define acpidump_aspt		acpi_dump_raw_table
> -#define acpidump_csrt		acpi_dump_raw_table
> -#define acpidump_etdt		acpi_dump_raw_table
> -#define acpidump_einj		acpi_dump_raw_table
> -#define acpidump_hest		acpi_dump_raw_table
> -#define acpidump_ibft		acpi_dump_raw_table
> -#define acpidump_ivrs		acpi_dump_raw_table
> -#define acpidump_msct		acpi_dump_raw_table
> -#define acpidump_msdm		acpi_dump_raw_table
> -#define acpidump_mpst		acpi_dump_raw_table
> -#define acpidump_oemb		acpi_dump_raw_table
> -#define acpidump_pmtt		acpi_dump_raw_table
> -#define acpidump_waet		acpi_dump_raw_table
> -#define acpidump_wdat		acpi_dump_raw_table
> -#define acpidump_wdrt		acpi_dump_raw_table
> -#define acpidump_wpbt		acpi_dump_raw_table
> -
> -static const acpidump_table_vec table_vec[] = {
> -	{ "APIC", 	acpidump_madt, 	1, "Multiple APIC Description Table" },
> -	{ "ASF!", 	acpidump_asf, 	1, "Alert Standard Format Table" },
> -	{ "ASPT",	acpidump_aspt,	1, "ACPI System Performance Tuning Table" },
> -	{ "BERT", 	acpidump_bert, 	1, "Boot Error Record Table" },
> -	{ "BGRT", 	acpidump_bgrt, 	1, "Boot Graphics Resource Table" },
> -	{ "BOOT", 	acpidump_boot, 	1, "Simple Boot Flag Table", },
> -	{ "CPEP", 	acpidump_cpep, 	1, "Corrected Platform Error Polling Table" },
> -	{ "CSRT",	acpidump_csrt,	1, "Core System Resource Table" },
> -	{ "DBG2", 	acpidump_dbg2,	1, "Debug Port Table 2" },
> -	{ "DBGP", 	acpidump_dbgp,	1, "Debug Port Table", },
> -	{ "DSDT", 	acpidump_amlcode, 1, "Differentiated System Description Table" },
> -	{ "DMAR", 	acpidump_dmar,	1, "DMA Remapping Table", },
> -	{ "ECDT", 	acpidump_ecdt, 	1, "Embedded Controller Boot Resources Table" },
> -	{ "EINJ", 	acpidump_einj, 	1, "Error Injection Table" },
> -	{ "ERST", 	acpidump_erst, 	1, "Error Record Serialization Table" },
> -	{ "ETDT",	acpidump_etdt,	1, "Event Timer Description Table (Obsolete)" },
> -	{ "FACP", 	acpidump_fadt, 	1, "Fixed ACPI Description Table" },
> -	{ "FACS", 	acpidump_facs, 	0, "Firmware ACPI Control Structure" },
> -	{ "FPDT",	acpidump_fpdt,	1, "Firmware Performance Data Table" },
> -	{ "GTDT", 	acpidump_gtdt, 	1, "Generic Timer Description Table" },
> -	{ "HEST", 	acpidump_hest, 	1, "Hardware Error Source Table" },
> -	{ "HPET", 	acpidump_hpet, 	1, "IA-PC High Precision Event Timer Table" },
> -	{ "IBFT",	acpidump_ibft,	1, "iSCSI Boot Firmware Table" },
> -	{ "IVRS",	acpidump_ivrs,	1, "I/O Virtualization Reporting Structure" },
> -	{ "MCFG", 	acpidump_mcfg, 	1, "PCI Express Memory Mapped Config Space Base Address Table" },
> -	{ "MCHI", 	acpidump_mchi, 	1, "Management Controller Host Interface Table" },
> -	{ "MPST",	acpidump_mpst,  1, "Memory Power State Table" },
> -	{ "MSCT", 	acpidump_msct, 	1, "Maximum System Characteristics Table" },
> -	{ "MSDM", 	acpidump_msdm, 	1, "Microsoft Data Management Table" },
> -	{ "OEMB",	acpidump_oemb,	1, "OEM-define ACPI Table" },
> -	{ "PCCT",	acpidump_pcct,	1, "Platform Communications Channel" },
> -	{ "PMTT",	acpidump_pmtt,	1, "Platform Memory Topology Table", },
> -	{ "PSDT", 	acpidump_amlcode, 1, "Persistent System Description Table" },
> -	{ "RASF",	acpidump_rasf,	1, "ACPI RAS Feature Table" },
> -	{ "RSDT", 	acpidump_rsdt, 	1, "Root System Description Table" },
> -	{ "RSD PTR ", 	acpidump_rsdp, 	0, "Root System Description Pointer" },
> -	{ "SBST", 	acpidump_sbst,  1, "Smart Battery Specification Table" },
> -	{ "SPCR",	acpidump_spcr,  1, "Serial Port Console Redirection Table" },
> -	{ "SSDT", 	acpidump_amlcode, 1, "Secondary System Description Table" },
> -	{ "SLIC", 	acpidump_slic,  1, "Microsoft Software License Table" },
> -	{ "SLIT", 	acpidump_slit,  1, "System Locality Distance Information Table" },
> -	{ "SRAT", 	acpidump_srat,  1, "System Resource Affinity Tanle" },
> -	{ "TCPA",	acpidump_tcpa,	1, "Trusted Computing Platform Alliance Capabilities Table" },
> -	{ "UEFI", 	acpidump_uefi, 	1, "UEFI ACPI Data Table" },
> -	{ "WAET",	acpidump_waet,	1, "Windows ACPI Emulated Devices Table" },
> -	{ "WDAT",	acpidump_wdat,	1, "Watch Dog Action Table" },
> -	{ "WDRT",	acpidump_wdrt,	1, "Watch Dog Resource Table" },
> -	{ "WPBT",	acpidump_wpbt,	1, "Windows Platform Binary Table" },
> -	{ "XSDT", 	acpidump_xsdt, 	1, "Extended System Description Table" },
> -	{ NULL,		NULL,		0, NULL },
> -};
> -
> -static int acpidump_table(fwts_framework *fw, fwts_acpi_table_info *table)
> +static void acpidump_rsdp(
> +	fwts_framework *fw,
> +	const fwts_acpi_table_info *table)
>   {
> -	uint8_t *data = (uint8_t *)table->data;
> -	fwts_acpi_table_header hdr;
> -	size_t length = table->length;
> -	int i;
> -
> -	for (i = 0; table_vec[i].name != NULL; i++) {
> -		if (strncmp(table_vec[i].name, (char *)data, strlen(table_vec[i].name)) == 0) {
> -			if (table_vec[i].description) {
> -				fwts_log_info_verbatum(fw, "%s:", table_vec[i].description);
> -				fwts_log_nl(fw);
> -			}
> -			if (table_vec[i].standard_header) {
> -				fwts_acpi_table_get_header(&hdr, data);
> -				acpidump_hdr(fw, &hdr, length);
> -			}
> -			table_vec[i].func(fw, table);
> -			return FWTS_OK;
> -		}
> -	}
> +	fwts_acpi_table_rsdp *rsdp = (fwts_acpi_table_rsdp *)table->data;
>   
> -	/* Cannot find, assume standard table header */
> -	fwts_acpi_table_get_header(&hdr, data);
> -	acpidump_hdr(fw, &hdr, length);
> -	acpi_dump_raw_table(fw, table);
> +	if (table->length < sizeof(fwts_acpi_table_rsdp))
> +		return;
>   
> -	return FWTS_OK;
> +	fwts_log_info_verbatum(fw, "[000h 0000   8]                    Signature : \"%8.8s\"",
> +		rsdp->signature);
> +	fwts_log_info_verbatum(fw, "[008h 0008   1]                     Checksum : %1.1" PRIx8,
> +		rsdp->checksum);
> +	fwts_log_info_verbatum(fw, "[009h 0009   6]                       Oem ID : \"%6.6s\"",
> +		rsdp->oem_id);
> +	fwts_log_info_verbatum(fw, "[00fh 0015   1]                     Revision : %2.2" PRIx8,
> +		rsdp->revision);
> +	fwts_log_info_verbatum(fw, "[010h 0016   4]                 RSDT Address : %8.8" PRIx32,
> +		rsdp->rsdt_address);
> +	fwts_log_info_verbatum(fw, "[014h 0020   4]                 Table Length : %8.8" PRIx32,
> +		rsdp->length);
> +	fwts_log_info_verbatum(fw, "[018h 0024   8]                 XSDT Address : %16.16" PRIx64,
> +		rsdp->xsdt_address);
> +	fwts_log_info_verbatum(fw, "[020h 0032   1]            Extended Checksum : %2.2" PRIx8,
> +		rsdp->extended_checksum);
> +	fwts_log_info_verbatum(fw, "[021h 0033   3]                     Reserved : %2.2" PRIx8 " %2.2" PRIx8 " %2.2" PRIx8,
> +		rsdp->reserved[0], rsdp->reserved[1], rsdp->reserved[2]);
>   }
>   
>   static int acpidump_test1(fwts_framework *fw)
>   {
>   	int i;
> -	fwts_acpi_table_info *table;
>   
>   	fwts_infoonly(fw);
> +	fwts_iasl_init(fw);
>   
> -	for (i = 0; (fwts_acpi_get_table(fw, i, &table) == FWTS_OK) && (table !=NULL); i++) {
> +	for (i = 0; i < ACPI_MAX_TABLES; i++) {
> +		fwts_acpi_table_info *table;
> +		fwts_list *output;
>   		char *provenance;
> +
> +		if (fwts_acpi_get_table(fw, i, &table) != FWTS_OK)
> +			break;
> +		if (table == NULL)
> +			break;
> +
>   		switch (table->provenance) {
>   		case FWTS_ACPI_TABLE_FROM_FILE:
>   			provenance = " (loaded from file)";
> @@ -2220,12 +133,63 @@ static int acpidump_test1(fwts_framework *fw)
>   			provenance = "";
>   			break;
>   		}
> +
>   		fwts_log_info_verbatum(fw, "%s @ %lx (%zd bytes)%s",
>   			table->name, (unsigned long)table->addr, table->length, provenance);
>   		fwts_log_info_verbatum(fw, "----");
> -		acpidump_table(fw, table);
> +
> +		if (!strcmp(table->name, "RSDP")) {
> +			/* RSDP is a special case */
> +
> +			acpidump_rsdp(fw, table);
> +		} else if (table->has_aml) {
> +			/* Disassembling the AML bloats the output, so ignore */
> +
> +			uint8_t *data = (uint8_t *)table->data;
> +			fwts_acpi_table_header hdr;
> +
> +			fwts_acpi_table_get_header(&hdr, data);
> +			acpidump_hdr(fw, &hdr, table->length);
> +			fwts_log_info_verbatum(fw, "Contains AML Object Code.");
> +		} else if (fwts_iasl_disassemble(fw, table, true, &output) != FWTS_OK) {
> +			/* Cannot find, assume standard table header */
> +
> +			uint8_t *data = (uint8_t *)table->data;
> +			fwts_acpi_table_header hdr;
> +
> +			fwts_acpi_table_get_header(&hdr, data);
> +			acpidump_hdr(fw, &hdr, table->length);
> +			acpi_dump_raw_table(fw, table);
> +		} else {
> +			/* Successfully disassembled, so parse */
> +
> +			bool skip = false;
> +			bool unknown = false;
> +			fwts_list_link *line;
> +			fwts_list_foreach(line, output) {
> +				char *text = fwts_text_list_text(line);
> +				bool ignore = (strstr(text, "Raw Table Data:") != NULL);
> +
> +				/* We don't want to emit this line */
> +				if (strstr(text, "Unknown ACPI table signature") != NULL) {
> +					unknown = true;
> +					ignore = true;
> +				}
> +				/* and we want to ignore text in comments */
> +				if (!strncmp(text, "/*", 2))
> +					skip = true;
> +				if (!(ignore | skip | unknown))
> +					fwts_log_info_verbatum(fw, "%s", fwts_text_list_text(line));
> +				if (!strncmp(text, " */", 3))
> +					skip = false;
> +			}
> +			fwts_text_list_free(output);
> +			if (unknown)
> +				acpi_dump_raw_table(fw, table);
> +		}
>   		fwts_log_nl(fw);
>   	}
> +	fwts_iasl_deinit();
>   
>   	/* Some systems don't have any ACPI tables */
>   	if (!i)

Acked-by: Colin Ian King<colin.king at canonical.com>





More information about the fwts-devel mailing list