On Wed, Apr 05, 2023 at 01:30:17PM +0200, Michal Privoznik wrote:
+++ b/src/util/viracpi.c
+VIR_ENUM_IMPL(virIORTNodeType,
+ VIR_IORT_NODE_TYPE_LAST,
+ "ITS Group",
+ "Named Component",
+ "Root Complex",
+ "SMMU v1/v2",
+ "SMMU v3",
+ "PMCG",
+ "Memory range");
Just a thought: it could be nice to have these match exactly the
strings found in the specification, i.e.
VIR_ENUM_IMPL(virIORTNodeType,
VIR_IORT_NODE_TYPE_LAST,
"ITS Group",
"Named component",
"Root complex",
"SMMUv1 or SMMUv2",
"SMMUv3",
"PMCG",
"Memory range");
But it's fine to leave things as they are.
+static int
+virAcpiParseIORTNodeHeader(int fd,
+ const char *filename,
+ virIORTNodeHeader *nodeHeader)
+{
+ g_autofree char *nodeHeaderBuf = NULL;
+ const char *typeStr = NULL;
+ int nodeHeaderLen;
+
+ nodeHeaderLen = virFileReadHeaderFD(fd, sizeof(*nodeHeader), &nodeHeaderBuf);
+ if (nodeHeaderLen < 0) {
+ virReportSystemError(errno,
+ _("cannot read node header '%1$s'"),
+ filename);
+ return -1;
+ }
+
+ if (nodeHeaderLen != sizeof(*nodeHeader)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("IORT table node header ended early"));
+ return -1;
+ }
+
+ memcpy(nodeHeader, nodeHeaderBuf, nodeHeaderLen);
+
+ typeStr = virIORTNodeTypeTypeToString(nodeHeader->type);
+
+ VIR_DEBUG("IORT node header: type = %" PRIu8 " (%s) len = %"
PRIu16,
+ nodeHeader->type, typeStr, nodeHeader->len);
Missing NULLSTR() call around typeStr here.
+ /* Basic sanity check. While there's a type specific data
+ * that follows the node header, the node length should be at
+ * least size of header itself. */
+ if (nodeHeader->len < sizeof(*nodeHeader)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("IORT table node type %1$s has invalid length: %2$"
PRIu16),
I'm not sure this plays well with the recently introduced changes to
translatable strings. Have you checked with Jirka?
+++ b/src/util/viracpipriv.h
+typedef enum {
+ VIR_IORT_NODE_TYPE_UNKNOWN = -1,
Do we need this? virIORTNodeHeader.type is defined as unsigned.
+ VIR_IORT_NODE_TYPE_ITS_GROUP = 0,
+ VIR_IORT_NODE_TYPE_NAMED_COMPONENT,
+ VIR_IORT_NODE_TYPE_ROOT_COMPLEX,
+ VIR_IORT_NODE_TYPE_SMMU_V1_2,
+ VIR_IORT_NODE_TYPE_SMMU_V3,
+ VIR_IORT_NODE_TYPE_PMCG,
+ VIR_IORT_NODE_TYPE_MEMORY_RANGE,
Same comment as above for the names of these. Again, the current ones
are fine.
+ VIR_IORT_NODE_TYPE_LAST,
+} virIORTNodeType;
+
+VIR_ENUM_DECL(virIORTNodeType);
+
+typedef struct virIORTNodeHeader virIORTNodeHeader;
+struct virIORTNodeHeader {
+ uint8_t type; /* One of virIORTNodeType */
+ uint16_t len;
+ uint8_t revision;
+ uint32_t identifier;
+ uint32_t nmappings;
+ uint32_t reference_id;
Since we only care about type and length, we could simply not declare
the other four fields at all, right?
--
Andrea Bolognani / Red Hat / Virtualization