[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