[PATCH 1/2] acpi: srat: add RINTC affinity validation (mantis 2433)

Ivan Hu ivan.hu at canonical.com
Tue Nov 11 07:18:30 UTC 2025


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

New in ACPI 6.6, the RISC-V RINTC affinity structure needs validation.
Add a checker for the new type and teach the SRAT walk to accept it.
The helper validates length, reserved fields, and flags.

Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
---
 src/acpi/srat/srat.c        | 48 ++++++++++++++++++++++++++++++++++++-
 src/lib/include/fwts_acpi.h | 10 ++++++++
 2 files changed, 57 insertions(+), 1 deletion(-)

diff --git a/src/acpi/srat/srat.c b/src/acpi/srat/srat.c
index 5d7733c4..d1ff54a2 100644
--- a/src/acpi/srat/srat.c
+++ b/src/acpi/srat/srat.c
@@ -399,6 +399,49 @@ done:
 	*data += sizeof(fwts_acpi_table_port_affinity);
 }
 
+static void srat_check_rintc_affinity(
+	fwts_framework *fw,
+	ssize_t		*length,
+	uint8_t		**data,
+	bool		*passed)
+{
+	fwts_acpi_table_rintc_affinity *affinity =
+		(fwts_acpi_table_rintc_affinity *)*data;
+
+	if ((ssize_t)sizeof(fwts_acpi_table_rintc_affinity) > *length) {
+		fwts_failed(fw, LOG_LEVEL_MEDIUM,
+			"SRATRintcAffinityShort",
+			"SRAT RINTC Affinity structure too short, got "
+			"%zu bytes, expecting %zu bytes",
+			*length, sizeof(fwts_acpi_table_rintc_affinity));
+		*passed = false;
+		goto done;
+	}
+
+	if (!fwts_acpi_structure_length(fw, "SRAT", affinity->type,
+	    affinity->length, sizeof(fwts_acpi_table_rintc_affinity))) {
+		*passed = false;
+		goto done;
+	}
+
+	fwts_log_info_verbatim(fw, "SRAT RINTC Affinity Structure:");
+	fwts_log_info_simp_int(fw, "  Type:                     ", affinity->type);
+	fwts_log_info_simp_int(fw, "  Length:                   ", affinity->length);
+	fwts_log_info_simp_int(fw, "  Reserved:                 ", affinity->reserved);
+	fwts_log_info_simp_int(fw, "  Proximity Domain:         ", affinity->proximity_domain);
+	fwts_log_info_simp_int(fw, "  ACPI Processor UID:       ", affinity->acpi_processor_uid);
+	fwts_log_info_simp_int(fw, "  Flags:                    ", affinity->flags);
+	fwts_log_info_simp_int(fw, "  Clock Domain              ", affinity->clock_domain);
+	fwts_log_nl(fw);
+
+	fwts_acpi_reserved_zero("SRAT", "RINTC Affinity Reserved", affinity->reserved, passed);
+	fwts_acpi_reserved_bits("SRAT", "RINTC Affinity Flags", affinity->flags, 1, 31, passed);
+
+done:
+	*length -= sizeof(fwts_acpi_table_rintc_affinity);
+	*data += sizeof(fwts_acpi_table_rintc_affinity);
+}
+
 
 /*
  *  See ACPI 6.0, Section 5.2.16
@@ -438,11 +481,14 @@ static int srat_test1(fwts_framework *fw)
 		case 0x06:
 			srat_check_port_affinity(fw, &length, &data, &passed);
 			break;
+		case 0x07:
+			srat_check_rintc_affinity(fw, &length, &data, &passed);
+			break;
 		default:
 			fwts_failed(fw, LOG_LEVEL_HIGH,
 				"SRATInvalidType",
 				"SRAT Affinity Structure Type 0x%" PRIx8
-				" is an invalid type, expecting 0x00..0x02",
+				" is an invalid type, expecting 0x00..0x07",
 				*data);
 			passed = false;
 			length = 0;
diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
index 18a8d841..025127dd 100644
--- a/src/lib/include/fwts_acpi.h
+++ b/src/lib/include/fwts_acpi.h
@@ -429,6 +429,16 @@ typedef struct {
 	uint32_t	clock_domain;
 } __attribute__ ((packed)) fwts_acpi_table_gicc_affinity;
 
+typedef struct {
+	uint8_t		type;
+	uint8_t		length;
+	uint16_t	reserved;
+	uint32_t	proximity_domain;
+	uint32_t	acpi_processor_uid;
+	uint32_t	flags;
+	uint32_t	clock_domain;
+} __attribute__ ((packed)) fwts_acpi_table_rintc_affinity;
+
 typedef struct {
 	uint8_t		type;
 	uint8_t		length;
-- 
2.43.0




More information about the fwts-devel mailing list