All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Samuel Ortiz <sameo@linux.intel.com>
Cc: Laurent Vivier <lvivier@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>,
	Thomas Huth <thuth@redhat.com>,
	Eduardo Habkost <ehabkost@redhat.com>,
	Ben Warren <ben@skyportsystems.com>,
	qemu-devel@nongnu.org, Shannon Zhao <shannon.zhaosl@gmail.com>,
	qemu-arm@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,
	Igor Mammedov <imammedo@redhat.com>,
	Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-arm] [Qemu-devel] [PATCH v4 7/8] hw: acpi: Export and share the ARM RSDP build
Date: Mon, 17 Dec 2018 18:04:21 -0500	[thread overview]
Message-ID: <20181217180208-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20181217164648.GG4456@caravaggio>

On Mon, Dec 17, 2018 at 05:46:48PM +0100, Samuel Ortiz wrote:
> On Mon, Dec 17, 2018 at 04:35:36PM +0100, Igor Mammedov wrote:
> > On Mon, 17 Dec 2018 14:49:59 +0100
> > Samuel Ortiz <sameo@linux.intel.com> wrote:
> > 
> > > On Mon, Dec 17, 2018 at 01:20:28PM +0100, Igor Mammedov wrote:
> > > > On Mon, 17 Dec 2018 11:48:37 +0100
> > > > Samuel Ortiz <sameo@linux.intel.com> wrote:
> > > > 
> > > > > Now that build_rsdp() supports building both legacy and current RSDP
> > > > > tables, we can move it to a generic folder (hw/acpi) and have the i386
> > > > > ACPI code reuse it in order to reduce code duplication.
> > > > > 
> > > > > Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
> > > > > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> > > > > Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> > > > > Reviewed-by: Andrew Jones <drjones@redhat.com>
> > > > > Reviewed-by: Igor Mammedov <imammedo@redhat.com>
> > > > for future reference, if one changes patch in a significant way,
> > > > one is supposed to drop Tested/Reviewed-by tags so that reviewers
> > > > would look at it again and we by mistake won't merge not actually
> > > > reviewed changes.
> > > > 
> > > > [...]
> > > > 
> > > > > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> > > > > index fb877648ac..846cb6d755 100644
> > > > > --- a/hw/i386/acpi-build.c
> > > > > +++ b/hw/i386/acpi-build.c
> > > > > @@ -2547,35 +2547,6 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker)
> > > > >                   "IVRS", table_data->len - iommu_start, 1, NULL, NULL);
> > > > >  }
> > > > >  
> > > > > -static void
> > > > > -build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt_tbl_offset)
> > > > > -{
> > > > > -    /* AcpiRsdpDescriptor describes revision 2 RSDP table and as result we
> > > > > -     * allocate extra 16 bytes for pc/q35 RSDP rev1 as well. Keep extra 16 bytes
> > > > > -     * wasted to make sure we won't breake migration for machine types older
> > > > > -     * than 2.3 due to size mismatch.
> > > > > -     */
> > > > > -    AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
> > > > > -    unsigned rsdt_pa_size = sizeof(rsdp->rsdt_physical_address);
> > > > > -    unsigned rsdt_pa_offset =
> > > > > -        (char *)&rsdp->rsdt_physical_address - rsdp_table->data;
> > > > > -
> > > > > -    bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, rsdp_table, 16,
> > > > > -                             true /* fseg memory */);
> > > > > -
> > > > > -    memcpy(&rsdp->signature, "RSD PTR ", 8);
> > > > > -    memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
> > > > > -    /* Address to be filled by Guest linker */
> > > > > -    bios_linker_loader_add_pointer(linker,
> > > > > -        ACPI_BUILD_RSDP_FILE, rsdt_pa_offset, rsdt_pa_size,
> > > > > -        ACPI_BUILD_TABLE_FILE, rsdt_tbl_offset);
> > > > > -
> > > > > -    /* Checksum to be filled by Guest linker */
> > > > > -    bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> > > > > -        (char *)rsdp - rsdp_table->data, 20 /* ACPI rev 1.0 RSDP size */,
> > > > > -        (char *)&rsdp->checksum - rsdp_table->data);
> > > > > -}
> > > > > -
> > > > >  typedef
> > > > >  struct AcpiBuildState {
> > > > >      /* Copy of table in RAM (for patching). */
> > > > > @@ -2732,7 +2703,25 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
> > > > >                 slic_oem.id, slic_oem.table_id);
> > > > >  
> > > > >      /* RSDP is in FSEG memory, so allocate it separately */
> > > > > -    build_rsdp(tables->rsdp, tables->linker, rsdt);
> > > > > +    {
> > > > > +        AcpiRsdpData rsdp_data = {
> > > > > +            .revision = 0,
> > > > > +            .oem_id = ACPI_BUILD_APPNAME6,
> > > > > +            .xsdt_tbl_offset = NULL,
> > > > > +            .rsdt_tbl_offset = &rsdt,
> > > > > +        };
> > > > > +        build_rsdp(tables->rsdp, tables->linker, &rsdp_data);
> > > > > +        if (!pcmc->rsdp_in_ram) {
> > > > > +            /*
> > > > > +             * Legacy machine types (2.2 and older) expect to get a complete
> > > > > +             * revision 2 RSDP table, even though they only look at the
> > > > not true, rev is set to 0 for pc machines,
> > > Rev is set to 0 but they effectively expect to get a structure which
> > > size is the rev 2 one. That's what I meant.
> > > 
> > > > the point of the original comment was
> > > > that we allocate extra 16 bytes but not actually using them and why it's bad
> > > > to drop it suddenly.
> > > >
> > > > > +             * revision 0 fields (xsdt pointer is not set). So in order to
> > > > > +             * not break migration to those machine types we waste 16 bytes
> > > > > +             * that we amend to the RSDP revision 0 structure.
> > > >                           ^^^ added
> > > > > +             */
> > > > Perhaps amended original comment would be clearer:
> > > > 
> > > >    /* We used to allocate extra space for RSDP rev 2 but used only space for
> > > >     * legacy RSDP and extra bytes were zeroed out. Keep wasting extra 16 bytes
> > > >     * to make sure we won't breake migration for machine types 2.2 and older
> > > >     * due to RSDP blob size mismatch.
> > > >     */
> > > > 
> > > > > +            build_append_int_noprefix(tables->rsdp, 0, 16);
> > Looks like I've haven't noticed, it might work but are you sure?
> > 0 here is uint64_t and then it's shifted 16 times which is sort of gray area (undefined behavior)
> AFAIK shifting by N bits when N > width(left operand) is undefined but
> that's not the case here. build_append_int_noprefix(foo, 0, 16) shift a 64 bits
> wide unsigned int by 8 bits, for each iterations of a 16 iterations
> loop. So we're doing 16 iterations of properly defined behaviour.
> 
> Cheers,
> Samuel.

It works fine but is IMHO unnecessarily tricky. Simple

	for (i = 0; i < 16; ++i)
		build_append_byte(tables->rsdp, 0)

is imho clearer.



WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Samuel Ortiz <sameo@linux.intel.com>
Cc: Igor Mammedov <imammedo@redhat.com>,
	Laurent Vivier <lvivier@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>,
	Thomas Huth <thuth@redhat.com>,
	Eduardo Habkost <ehabkost@redhat.com>,
	Ben Warren <ben@skyportsystems.com>,
	qemu-devel@nongnu.org, Shannon Zhao <shannon.zhaosl@gmail.com>,
	qemu-arm@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,
	Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PATCH v4 7/8] hw: acpi: Export and share the ARM RSDP build
Date: Mon, 17 Dec 2018 18:04:21 -0500	[thread overview]
Message-ID: <20181217180208-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20181217164648.GG4456@caravaggio>

On Mon, Dec 17, 2018 at 05:46:48PM +0100, Samuel Ortiz wrote:
> On Mon, Dec 17, 2018 at 04:35:36PM +0100, Igor Mammedov wrote:
> > On Mon, 17 Dec 2018 14:49:59 +0100
> > Samuel Ortiz <sameo@linux.intel.com> wrote:
> > 
> > > On Mon, Dec 17, 2018 at 01:20:28PM +0100, Igor Mammedov wrote:
> > > > On Mon, 17 Dec 2018 11:48:37 +0100
> > > > Samuel Ortiz <sameo@linux.intel.com> wrote:
> > > > 
> > > > > Now that build_rsdp() supports building both legacy and current RSDP
> > > > > tables, we can move it to a generic folder (hw/acpi) and have the i386
> > > > > ACPI code reuse it in order to reduce code duplication.
> > > > > 
> > > > > Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
> > > > > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> > > > > Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> > > > > Reviewed-by: Andrew Jones <drjones@redhat.com>
> > > > > Reviewed-by: Igor Mammedov <imammedo@redhat.com>
> > > > for future reference, if one changes patch in a significant way,
> > > > one is supposed to drop Tested/Reviewed-by tags so that reviewers
> > > > would look at it again and we by mistake won't merge not actually
> > > > reviewed changes.
> > > > 
> > > > [...]
> > > > 
> > > > > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> > > > > index fb877648ac..846cb6d755 100644
> > > > > --- a/hw/i386/acpi-build.c
> > > > > +++ b/hw/i386/acpi-build.c
> > > > > @@ -2547,35 +2547,6 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker)
> > > > >                   "IVRS", table_data->len - iommu_start, 1, NULL, NULL);
> > > > >  }
> > > > >  
> > > > > -static void
> > > > > -build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt_tbl_offset)
> > > > > -{
> > > > > -    /* AcpiRsdpDescriptor describes revision 2 RSDP table and as result we
> > > > > -     * allocate extra 16 bytes for pc/q35 RSDP rev1 as well. Keep extra 16 bytes
> > > > > -     * wasted to make sure we won't breake migration for machine types older
> > > > > -     * than 2.3 due to size mismatch.
> > > > > -     */
> > > > > -    AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
> > > > > -    unsigned rsdt_pa_size = sizeof(rsdp->rsdt_physical_address);
> > > > > -    unsigned rsdt_pa_offset =
> > > > > -        (char *)&rsdp->rsdt_physical_address - rsdp_table->data;
> > > > > -
> > > > > -    bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, rsdp_table, 16,
> > > > > -                             true /* fseg memory */);
> > > > > -
> > > > > -    memcpy(&rsdp->signature, "RSD PTR ", 8);
> > > > > -    memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
> > > > > -    /* Address to be filled by Guest linker */
> > > > > -    bios_linker_loader_add_pointer(linker,
> > > > > -        ACPI_BUILD_RSDP_FILE, rsdt_pa_offset, rsdt_pa_size,
> > > > > -        ACPI_BUILD_TABLE_FILE, rsdt_tbl_offset);
> > > > > -
> > > > > -    /* Checksum to be filled by Guest linker */
> > > > > -    bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> > > > > -        (char *)rsdp - rsdp_table->data, 20 /* ACPI rev 1.0 RSDP size */,
> > > > > -        (char *)&rsdp->checksum - rsdp_table->data);
> > > > > -}
> > > > > -
> > > > >  typedef
> > > > >  struct AcpiBuildState {
> > > > >      /* Copy of table in RAM (for patching). */
> > > > > @@ -2732,7 +2703,25 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
> > > > >                 slic_oem.id, slic_oem.table_id);
> > > > >  
> > > > >      /* RSDP is in FSEG memory, so allocate it separately */
> > > > > -    build_rsdp(tables->rsdp, tables->linker, rsdt);
> > > > > +    {
> > > > > +        AcpiRsdpData rsdp_data = {
> > > > > +            .revision = 0,
> > > > > +            .oem_id = ACPI_BUILD_APPNAME6,
> > > > > +            .xsdt_tbl_offset = NULL,
> > > > > +            .rsdt_tbl_offset = &rsdt,
> > > > > +        };
> > > > > +        build_rsdp(tables->rsdp, tables->linker, &rsdp_data);
> > > > > +        if (!pcmc->rsdp_in_ram) {
> > > > > +            /*
> > > > > +             * Legacy machine types (2.2 and older) expect to get a complete
> > > > > +             * revision 2 RSDP table, even though they only look at the
> > > > not true, rev is set to 0 for pc machines,
> > > Rev is set to 0 but they effectively expect to get a structure which
> > > size is the rev 2 one. That's what I meant.
> > > 
> > > > the point of the original comment was
> > > > that we allocate extra 16 bytes but not actually using them and why it's bad
> > > > to drop it suddenly.
> > > >
> > > > > +             * revision 0 fields (xsdt pointer is not set). So in order to
> > > > > +             * not break migration to those machine types we waste 16 bytes
> > > > > +             * that we amend to the RSDP revision 0 structure.
> > > >                           ^^^ added
> > > > > +             */
> > > > Perhaps amended original comment would be clearer:
> > > > 
> > > >    /* We used to allocate extra space for RSDP rev 2 but used only space for
> > > >     * legacy RSDP and extra bytes were zeroed out. Keep wasting extra 16 bytes
> > > >     * to make sure we won't breake migration for machine types 2.2 and older
> > > >     * due to RSDP blob size mismatch.
> > > >     */
> > > > 
> > > > > +            build_append_int_noprefix(tables->rsdp, 0, 16);
> > Looks like I've haven't noticed, it might work but are you sure?
> > 0 here is uint64_t and then it's shifted 16 times which is sort of gray area (undefined behavior)
> AFAIK shifting by N bits when N > width(left operand) is undefined but
> that's not the case here. build_append_int_noprefix(foo, 0, 16) shift a 64 bits
> wide unsigned int by 8 bits, for each iterations of a 16 iterations
> loop. So we're doing 16 iterations of properly defined behaviour.
> 
> Cheers,
> Samuel.

It works fine but is IMHO unnecessarily tricky. Simple

	for (i = 0; i < 16; ++i)
		build_append_byte(tables->rsdp, 0)

is imho clearer.

  reply	other threads:[~2018-12-17 23:13 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-17 10:48 [Qemu-devel] [PATCH v4 0/8] hw: acpi: RSDP fixes and refactoring Samuel Ortiz
2018-12-17 10:48 ` Samuel Ortiz
2018-12-17 10:48 ` [Qemu-arm] [PATCH v4 1/8] hw: acpi: The RSDP build API can return void Samuel Ortiz
2018-12-17 10:48   ` [Qemu-devel] " Samuel Ortiz
2018-12-17 10:48 ` [Qemu-arm] [PATCH v4 2/8] hw: arm: acpi: Fix incorrect checksums in RSDP Samuel Ortiz
2018-12-17 10:48   ` [Qemu-devel] " Samuel Ortiz
2018-12-17 10:48 ` [Qemu-arm] [PATCH v4 3/8] hw: i386: Use correct RSDT length for checksum Samuel Ortiz
2018-12-17 10:48   ` [Qemu-devel] " Samuel Ortiz
2018-12-17 10:48 ` [Qemu-arm] [PATCH v4 4/8] hw: arm: Carry RSDP specific data through AcpiRsdpData Samuel Ortiz
2018-12-17 10:48   ` [Qemu-devel] " Samuel Ortiz
2018-12-17 10:48 ` [Qemu-arm] [PATCH v4 5/8] hw: arm: Convert the RSDP build to the buid_append_foo() API Samuel Ortiz
2018-12-17 10:48   ` [Qemu-devel] " Samuel Ortiz
2018-12-17 10:48 ` [Qemu-devel] [PATCH v4 6/8] hw: arm: Support both legacy and current RSDP build Samuel Ortiz
2018-12-17 10:48   ` Samuel Ortiz
2018-12-17 10:48 ` [Qemu-arm] [PATCH v4 7/8] hw: acpi: Export and share the ARM " Samuel Ortiz
2018-12-17 10:48   ` [Qemu-devel] " Samuel Ortiz
2018-12-17 12:20   ` [Qemu-arm] " Igor Mammedov
2018-12-17 12:20     ` Igor Mammedov
2018-12-17 13:49     ` [Qemu-arm] " Samuel Ortiz
2018-12-17 13:49       ` Samuel Ortiz
2018-12-17 15:35       ` Igor Mammedov
2018-12-17 16:46         ` Samuel Ortiz
2018-12-17 23:04           ` Michael S. Tsirkin [this message]
2018-12-17 23:04             ` Michael S. Tsirkin
2018-12-17 14:06   ` [Qemu-arm] " Samuel Ortiz
2018-12-17 14:06     ` Samuel Ortiz
2018-12-17 15:25     ` [Qemu-arm] " Igor Mammedov
2018-12-17 15:25       ` Igor Mammedov
2018-12-17 15:32       ` [Qemu-arm] " Samuel Ortiz
2018-12-17 15:32         ` Samuel Ortiz
2018-12-17 15:34   ` [Qemu-arm] [PATCH v5 " Samuel Ortiz
2018-12-17 15:34     ` [Qemu-devel] " Samuel Ortiz
2018-12-17 15:45     ` [Qemu-arm] " Andrew Jones
2018-12-17 15:45       ` Andrew Jones
2018-12-17 10:48 ` [Qemu-arm] [PATCH v4 8/8] hw: acpi: Remove AcpiRsdpDescriptor and fix tests Samuel Ortiz
2018-12-17 10:48   ` [Qemu-devel] " Samuel Ortiz
2018-12-18  1:10 ` [Qemu-arm] [PATCH v4 0/8] hw: acpi: RSDP fixes and refactoring Michael S. Tsirkin
2018-12-18  1:10   ` [Qemu-devel] " Michael S. Tsirkin

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=20181217180208-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=ben@skyportsystems.com \
    --cc=ehabkost@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=sameo@linux.intel.com \
    --cc=shannon.zhaosl@gmail.com \
    --cc=thuth@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.