[PATCH] acpi: phat: fix the device path for the health data record

Ivan Hu ivan.hu at canonical.com
Fri Jul 14 08:29:13 UTC 2023


BugLink: https://bugs.launchpad.net/fwts/+bug/2027782

>From ACPI spec. the device path should not be the general string, should be
"The UEFI Device Path associated with the record producer. See
the UEFI specification for the EFI_DEVICE_PATH_PROTOCOL
definition."

Firmware Health Data Record (Type 1):
    Type: 0x0001
    Record Length: 0x007d
    Revision: 0x01
    Reserved: 0x0000
    AmHealthy: 0x01
    Device Signature: A30DFF09-56BF-4622-A9E7-399B0A79E7C7
    Device-specific Data Offset: 0x00000074
    Device Path: V
    Vendor Data: 0x01
    Vendor Data: 0x01
    Vendor Data: 0x05
    Vendor Data: 0x00
    Vendor Data: 0x00
    Vendor Data: 0x00
    Vendor Data: 0x00
    Vendor Data: 0x01
    Vendor Data: 0x00

Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
---
 src/acpi/phat/phat.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/acpi/phat/phat.c b/src/acpi/phat/phat.c
index 02fb17c9..9a72e732 100644
--- a/src/acpi/phat/phat.c
+++ b/src/acpi/phat/phat.c
@@ -23,6 +23,8 @@
 #include <inttypes.h>
 #include <stdbool.h>
 
+#include "fwts_uefi.h"
+
 static fwts_acpi_table_info *table;
 acpi_table_init(PHAT, &table)
 
@@ -81,11 +83,13 @@ static void phat_health_test(
 	uint32_t offset,
 	bool *passed)
 {
-	char *device_path;
+	uint16_t *device_path;
+
 	char guid[37];
+	char buffer[2048];
 
 	fwts_guid_buf_to_str(entry->data_signature, guid, sizeof(guid));
-	device_path = (char *)entry + sizeof(fwts_acpi_table_phat_health);
+	device_path = (uint16_t *)((char *)entry + sizeof(fwts_acpi_table_phat_health));
 
 	fwts_log_info_verbatim(fw, " Firmware Health Data Record (Type 1):");
 	print_record_header(fw, &entry->header);
@@ -93,9 +97,11 @@ static void phat_health_test(
 	fwts_log_info_simp_int(fw, "    AmHealthy:                      ", entry->healthy);
 	fwts_log_info_verbatim(fw, "    Device Signature:               %s", guid);
 	fwts_log_info_simp_int(fw, "    Device-specific Data Offset:    ", entry->data_offset);
-	fwts_log_info_verbatim(fw, "    Device Path:                    %s", device_path);
 
-	offset = offset + sizeof(fwts_acpi_table_phat_health) + strlen(device_path);
+	fwts_uefi_str16_to_str(buffer, sizeof(buffer), device_path);
+	fwts_log_info_verbatim(fw, "    Device Path:                    %s", buffer);
+
+	offset = offset + sizeof(fwts_acpi_table_phat_health) + (fwts_uefi_str16len(device_path) + 1) * 2;
 
 	if (entry->data_offset != 0) {
 		uint16_t i;
-- 
2.34.1




More information about the fwts-devel mailing list