Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Feb 2024 16:42:55 -0500
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        Dmitry Salychev <dsl@FreeBSD.org>
Cc:        Baptiste Daroussin <bapt@freebsd.org>, src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org
Subject:   Re: git: 07c64d74917e - main - acpica: Import ACPICA 20230628
Message-ID:  <dfaeaf57-21c2-4051-bf94-9f3a8b536384@FreeBSD.org>
In-Reply-To: <86o7cz99u6.fsf@peasant.tower.home>
References:  <202401310406.40V46B9a000876@gitrepo.freebsd.org> <thik6e6mp53h242l6bhgyxkzl45jne5zhxb7retxgyvot3x6jq@v2yuxtpvczg7> <04c4a0e1-aa79-4d25-a1f7-2196cfa65578@FreeBSD.org> <86o7cz99u6.fsf@peasant.tower.home>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
On 24. 2. 1., Dmitry Salychev wrote:
> 
> Hi,
> 
> Jung-uk Kim <jkim@FreeBSD.org> writes:
> 
>> On 24. 1. 31., Baptiste Daroussin wrote:
>>> Hello,
>>> Either this one or the previous import is breaking arm64 build
>>> --- acpi_iort.o ---
>>> /home/bapt/worktrees/main/sys/arm64/acpica/acpi_iort.c:103:4: error: field
>>> 'data' with variable sized type 'union (unnamed union at
>>> /home/bapt/worktrees/main/sys/arm64/acpica/acpi_iort.c:98:2
>>> )' not at the end of a struct or class is a GNU extension
>>> [-Werror,-Wgnu-variable-sized-type-not-at-end]
>>>     103 |         } data;
>>>           |           ^
>>
>> Sorry for the breakage.  I will fix it soon.
>>
>> BTW, this code was added by this:
>>
>> https://reviews.freebsd.org/D31267
>>
>> It seems struct iort_named_component was a hack, which duplicated
>> ACPI_IORT_NAMED_COMPONENT but with a fixed length field
>> DeviceName[32]. Is it really necessary?
>>
>> Jung-uk Kim
> 
> I'm struggling to understand (a) how the entire anonymous "data" union
> was added by https://reviews.freebsd.org/D31267 as was "named_comp"
> only and (b) what the problem with the "struct iort_named_component" really
> is as ACPI_IORT_ROOT_COMPLEX and ACPI_IORT_SMMU were re-defined as
> incomplete types in the new version of ACPICA. Everything is compilable
> as it used to be with the attached patch.

FYI, ACPICA 20230331 dropped support for ANSI C (C89) and minimum 
requirement is C99 now.  One of the first feature they used was the 
variable-length array, which replaced "foo[1]" hack.  Previously, 
"sizeof(struct bar)" was not real size because of the (fake 
variable-length) array at the end of it.  Now they removed the hack and 
started using real variable-length arrays.  I believe the hack in 
acpi_iort.c was to work around the fake 1-byte array but it does not 
work any more because all ACPI_IORT_* are now using correct VLA.  So, 
the cleanest way to fix this is using ACPI_IORT_NAMED_COMPONENT instead 
of "struct iort_named_component" (see attached PoC patch), which also 
eliminates the need for DeviceName[32].

Jung-uk Kim
[-- Attachment #2 --]
diff --git a/sys/arm64/acpica/acpi_iort.c b/sys/arm64/acpica/acpi_iort.c
index a0e24788b775..298679d05c7d 100644
--- a/sys/arm64/acpica/acpi_iort.c
+++ b/sys/arm64/acpica/acpi_iort.c
@@ -74,14 +74,6 @@ struct iort_its_entry {
 	int			pxm;
 };
 
-struct iort_named_component
-{
-	UINT32                  NodeFlags;
-	UINT64                  MemoryProperties;
-	UINT8                   MemoryAddressLimit;
-	char                    DeviceName[32]; /* Path of namespace object */
-};
-
 /*
  * IORT node. Each node has some device specific data depending on the
  * type of the node. The node can also have a set of mappings, OR in
@@ -103,7 +95,7 @@ struct iort_node {
 		ACPI_IORT_ROOT_COMPLEX		pci_rc;	/* PCI root complex */
 		ACPI_IORT_SMMU			smmu;
 		ACPI_IORT_SMMU_V3		smmu_v3;
-		struct iort_named_component	named_comp;
+		ACPI_IORT_NAMED_COMPONENT	named_comp;
 	} data;
 };
 
@@ -325,6 +317,7 @@ iort_add_nodes(ACPI_IORT_NODE *node_entry, u_int node_offset)
 	ACPI_IORT_SMMU_V3 *smmu_v3;
 	ACPI_IORT_NAMED_COMPONENT *named_comp;
 	struct iort_node *node;
+	size_t name_len;
 
 	node = malloc(sizeof(*node), M_DEVBUF, M_WAITOK | M_ZERO);
 	node->type =  node_entry->Type;
@@ -360,10 +353,14 @@ iort_add_nodes(ACPI_IORT_NODE *node_entry, u_int node_offset)
 		memcpy(&node->data.named_comp, named_comp, sizeof(*named_comp));
 
 		/* Copy name of the node separately. */
+		name_len = node_entry->Length;
+		name_len -= ACPI_OFFSET(ACPI_IORT_NAMED_COMPONENT, DeviceName);
+		name_len = strnlen(node->data.named_comp.DeviceName, name_len);
+		named_comp = realloc(named_comp, sizeof(*node) + name_len + 1,
+		    M_DEVBUF, M_WAITOK | M_ZERO);
 		strncpy(node->data.named_comp.DeviceName,
-		    named_comp->DeviceName,
-		    sizeof(node->data.named_comp.DeviceName));
-		node->data.named_comp.DeviceName[31] = 0;
+		    named_comp->DeviceName, name_len + 1);
+		node->data.named_comp.DeviceName[name_len] = 0;
 
 		iort_copy_data(node, node_entry);
 		TAILQ_INSERT_TAIL(&named_nodes, node, next);

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?dfaeaf57-21c2-4051-bf94-9f3a8b536384>