[kvm-unit-tests PATCH v3 02/27] x86: Avoid references to fields of ACPI tables

Nikos Nikoleris
2022-06-30T10:03:59Z

ACPI table definitions in <acpi.h> have to be packed. However, once
we do that, direct references to members of the packed struct might
result in unaligned pointers and gcc complains about them. This change
modifies the code to avoid such references in preparation for making
the APCI table definitions packed.

Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
---
x86/s3.c | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/x86/s3.c b/x86/s3.c
index 378d37a..0bcbe18 100644
--- a/x86/s3.c
+++ b/x86/s3.c
@@ -2,15 +2,6 @@
#include "acpi.h"
#include "asm/io.h"

-static u32* find_resume_vector_addr(void)
-{
- struct facs_descriptor_rev1 *facs = find_acpi_table_addr(FACS_SIGNATURE);
- if (!facs)
- return 0;
- printf("FACS is at %p\n", facs);
- return &facs->firmware_waking_vector;
-}
-
#define RTC_SECONDS_ALARM 1
#define RTC_MINUTES_ALARM 3
#define RTC_HOURS_ALARM 5
@@ -40,12 +31,14 @@ extern char resume_start, resume_end;
int main(int argc, char **argv)
{
struct fadt_descriptor_rev1 *fadt = find_acpi_table_addr(FACP_SIGNATURE);
- volatile u32 *resume_vector_ptr = find_resume_vector_addr();
+ struct facs_descriptor_rev1 *facs = find_acpi_table_addr(FACS_SIGNATURE);
char *addr, *resume_vec = (void*)0x1000;

- *resume_vector_ptr = (u32)(ulong)resume_vec;
+ assert(facs);
+ facs->firmware_waking_vector = (u32)(ulong)resume_vec;

- printf("resume vector addr is %p\n", resume_vector_ptr);
+ printf("FACS is at %p\n", facs);
+ printf("resume vector addr is %p\n", &facs->firmware_waking_vector);
for (addr = &resume_start; addr < &resume_end; addr++)
*resume_vec++ = *addr;
printf("copy resume code from %p\n", &resume_start);
--
2.25.1