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