Kernel KVM virtualization development
 help / color / mirror / Atom feed
From: Andrew Jones <drjones@redhat.com>
To: Nikos Nikoleris <nikos.nikoleris@arm.com>
Cc: kvm@vger.kernel.org, pbonzini@redhat.com, jade.alglave@arm.com,
	alexandru.elisei@arm.com
Subject: Re: [kvm-unit-tests PATCH v2 02/23] lib: Ensure all struct definition for ACPI tables are packed
Date: Thu, 19 May 2022 19:14:12 +0200	[thread overview]
Message-ID: <20220519171412.hy3awn56ivfn7d3c@gator> (raw)
In-Reply-To: <be60c5e6-8313-6547-49d2-ab0700cabd89@arm.com>

On Thu, May 19, 2022 at 04:52:04PM +0100, Nikos Nikoleris wrote:
> Hi Drew,
> 
> On 19/05/2022 14:17, Andrew Jones wrote:
> > On Fri, May 06, 2022 at 09:55:44PM +0100, Nikos Nikoleris wrote:
> > > All ACPI table definitions are provided with precise definitions of
> > > field sizes and offsets, make sure that no compiler optimization can
> > > interfere with the memory layout of the corresponding structs.
> > 
> > That seems like a reasonable thing to do. I'm wondering why Linux doesn't
> > appear to do it. I see u-boot does, but not for all tables, which also
> > makes me scratch my head... I see this patch packs every struct except
> > rsdp_descriptor. Is there a reason it was left out?
> > 
> 
> Thanks for the review!
> 
> Linux uses the following:
> 
> /*
>  * All tables must be byte-packed to match the ACPI specification, since
>  * the tables are provided by the system BIOS.
>  */
> #pragma pack(1)
> 
> 
> ...
> 
> 
> /* Reset to default packing */
> 
> #pragma pack()

Ah, that makes sense.

> 
> 
> Happy to switch to #pragma, if we prefer this style.
> 
> I missed rsdp_descriptor, it should be packed will fix in v3.

Maybe we should switch to the #pragma to avoid the verbosity and missing
structures? (I don't have a strong opinion...)

> 
> 
> > Another comment below
> > 
> > > 
> > > Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
> > > ---
> > >   lib/acpi.h | 11 ++++++++---
> > >   x86/s3.c   | 16 ++++------------
> > >   2 files changed, 12 insertions(+), 15 deletions(-)
> > > 
> > > diff --git a/lib/acpi.h b/lib/acpi.h
> > > index 1e89840..42a2c16 100644
> > > --- a/lib/acpi.h
> > > +++ b/lib/acpi.h
> > > @@ -3,6 +3,11 @@
> > >   #include "libcflat.h"
> > > +/*
> > > + * All tables and structures must be byte-packed to match the ACPI
> > > + * specification, since the tables are provided by the system BIOS
> > > + */
> > > +
> > >   #define ACPI_SIGNATURE(c1, c2, c3, c4) \
> > >   	((c1) | ((c2) << 8) | ((c3) << 16) | ((c4) << 24))
> > > @@ -44,12 +49,12 @@ struct rsdp_descriptor {        /* Root System Descriptor Pointer */
> > >   struct acpi_table {
> > >       ACPI_TABLE_HEADER_DEF
> > >       char data[0];
> > > -};
> > > +} __attribute__ ((packed));
> > >   struct rsdt_descriptor_rev1 {
> > >       ACPI_TABLE_HEADER_DEF
> > >       u32 table_offset_entry[0];
> > > -};
> > > +} __attribute__ ((packed));
> > >   struct fadt_descriptor_rev1
> > >   {
> > > @@ -104,7 +109,7 @@ struct facs_descriptor_rev1
> > >       u32 S4bios_f        : 1;    /* Indicates if S4BIOS support is present */
> > >       u32 reserved1       : 31;   /* Must be 0 */
> > >       u8  reserved3 [40];         /* Reserved - must be zero */
> > > -};
> > > +} __attribute__ ((packed));
> > >   void set_efi_rsdp(struct rsdp_descriptor *rsdp);
> > >   void* find_acpi_table_addr(u32 sig);
> > > diff --git a/x86/s3.c b/x86/s3.c
> > 
> > The changes below in this file are unrelated, so they should be in a
> > separate patch. However, I'm also curious why they're needed. I see
> > that find_acpi_table_addr() can return NULL, so it doesn't seem like
> > we should be removing the check, but instead changing the check to
> > an assert.
> > 
> 
> These changes are necessary to appease gcc after requiring struct
> facs_descriptor_rev1 to be packed.
> 
> > > index 378d37a..89d69fc 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;
> 
> This statement in particular results to a gcc warning. We can't get a
> reference to member of a packed struct.
> 
> "taking address of packed member of ‘struct facs_descriptor_rev1’ may result
> in an unaligned pointer value"
> 
> What I could do is move the x86/* changes in a separate patch in preparation
> of this one that packs all structs in <acpi.h>

Yes, please. Also please add an assert(facs) or 'if (!facs) exit()' to
preserve that NULL check (although it doesn't look like the original code
cared about the return being NULL anyway...)

Thanks,
drew

> 
> Thanks,
> 
> Nikos
> 
> > > -}
> > > -
> > >   #define RTC_SECONDS_ALARM       1
> > >   #define RTC_MINUTES_ALARM       3
> > >   #define RTC_HOURS_ALARM         5
> > > @@ -40,12 +31,13 @@ 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;
> > > +	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
> > > 
> > 
> > Thanks,
> > drew
> > 
> 


  reply	other threads:[~2022-05-19 17:14 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-06 20:55 [kvm-unit-tests PATCH v2 00/23] EFI and ACPI support for arm64 Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 01/23] lib: Move acpi header and implementation to lib Nikos Nikoleris
2022-05-19 13:21   ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 02/23] lib: Ensure all struct definition for ACPI tables are packed Nikos Nikoleris
2022-05-19 13:17   ` Andrew Jones
2022-05-19 15:52     ` Nikos Nikoleris
2022-05-19 17:14       ` Andrew Jones [this message]
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 03/23] lib: Add support for the XSDT ACPI table Nikos Nikoleris
2022-05-19 13:30   ` Andrew Jones
2022-06-18  0:38   ` Ricardo Koller
2022-06-20  8:53     ` Alexandru Elisei
2022-06-20 11:06       ` Nikos Nikoleris
2022-06-21 12:25         ` Alexandru Elisei
2022-06-21 11:26     ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 04/23] lib: Extend the definition of the ACPI table FADT Nikos Nikoleris
2022-05-19 13:42   ` Andrew Jones
2022-06-18  1:00   ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 05/23] arm/arm64: Add support for setting up the PSCI conduit through ACPI Nikos Nikoleris
2022-05-19 13:54   ` Andrew Jones
2022-06-21 16:06   ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 06/23] arm/arm64: Add support for discovering the UART " Nikos Nikoleris
2022-05-19 13:59   ` Andrew Jones
2022-06-21 16:07   ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 07/23] arm/arm64: Add support for timer initialization " Nikos Nikoleris
2022-05-19 14:10   ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 08/23] arm/arm64: Add support for cpu " Nikos Nikoleris
2022-05-19 14:23   ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 09/23] lib/printf: Support for precision modifier in printing strings Nikos Nikoleris
2022-05-19 14:52   ` Andrew Jones
2022-05-19 16:02     ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 10/23] lib/printf: Add support for printing wide strings Nikos Nikoleris
2022-06-21 16:11   ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 11/23] lib/efi: Add support for getting the cmdline Nikos Nikoleris
2022-06-21 16:33   ` Ricardo Koller
2022-06-27 16:12     ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 12/23] arm/arm64: mmu_disable: Clean and invalidate before disabling Nikos Nikoleris
2022-05-13 13:15   ` Alexandru Elisei
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 13/23] arm/arm64: Rename etext to _etext Nikos Nikoleris
2022-06-21 16:42   ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 14/23] lib: Avoid ms_abi for calls related to EFI on arm64 Nikos Nikoleris
2022-05-20 14:02   ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 15/23] arm64: Add a new type of memory type flag MR_F_RESERVED Nikos Nikoleris
2022-06-21 16:44   ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 16/23] arm/arm64: Add a setup sequence for systems that boot through EFI Nikos Nikoleris
2022-05-13 13:31   ` Alexandru Elisei
2022-06-27 16:36     ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 17/23] arm64: Copy code from GNU-EFI Nikos Nikoleris
2022-06-21 17:59   ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 18/23] arm64: Change gnu-efi imported file to use defined types Nikos Nikoleris
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 19/23] arm64: Use code from the gnu-efi when booting with EFI Nikos Nikoleris
2022-06-21 22:32   ` Ricardo Koller
2022-06-27 17:10     ` Nikos Nikoleris
2022-06-30  5:13       ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 20/23] lib: Avoid external dependency in libelf Nikos Nikoleris
2022-06-21 22:39   ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 21/23] x86: Move x86_64-specific EFI CFLAGS to x86_64 Makefile Nikos Nikoleris
2022-06-21 22:45   ` Ricardo Koller
2022-06-22 13:47     ` Nikos Nikoleris
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 22/23] arm64: Add support for efi in Makefile Nikos Nikoleris
2022-06-21 22:51   ` Ricardo Koller
2022-06-22 13:52     ` Nikos Nikoleris
2022-06-21 22:52   ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 23/23] arm64: Add an efi/run script Nikos Nikoleris
2022-06-21 23:09   ` Ricardo Koller
2022-06-22 14:13     ` Nikos Nikoleris
2022-06-30  5:22       ` Ricardo Koller
2022-05-13 14:09 ` [kvm-unit-tests PATCH v2 00/23] EFI and ACPI support for arm64 Alexandru Elisei
2022-05-18  9:00   ` Nikos Nikoleris
2022-05-20  9:58     ` Alexandru Elisei
2022-05-17 17:56 ` Ricardo Koller
2022-05-18 12:44   ` Nikos Nikoleris
2022-05-18 16:10     ` Ricardo Koller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220519171412.hy3awn56ivfn7d3c@gator \
    --to=drjones@redhat.com \
    --cc=alexandru.elisei@arm.com \
    --cc=jade.alglave@arm.com \
    --cc=kvm@vger.kernel.org \
    --cc=nikos.nikoleris@arm.com \
    --cc=pbonzini@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox