[PATCH 1/3] util: Introduce virAcpi module
Andrea Bolognani
abologna at redhat.com
Wed Apr 5 17:21:33 UTC 2023
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
More information about the libvir-list
mailing list