All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: qemu-devel@nongnu.org, Anthony Liguori <anthony@codemonkey.ws>,
	afaerber@suse.de
Subject: Re: [Qemu-devel] [PATCH v4 15/23] i386: add bios linker/loader
Date: Mon, 23 Sep 2013 15:39:10 +0200	[thread overview]
Message-ID: <5240447E.5090601@redhat.com> (raw)
In-Reply-To: <20130923133636.GB1278@redhat.com>

Il 23/09/2013 15:36, Michael S. Tsirkin ha scritto:
> On Mon, Sep 23, 2013 at 02:48:57PM +0200, Paolo Bonzini wrote:
>> Il 22/09/2013 15:37, Michael S. Tsirkin ha scritto:
>>> This adds a dynamic bios linker/loader.
>>> This will be used by acpi table generation
>>> code to:
>>>     - load each table in the appropriate memory segment
>>>     - link tables to each other
>>>     - fix up checksums after said linking
>>>
>>> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
>>> ---
>>>  include/hw/i386/bios-linker-loader.h |  26 ++++++
>>>  hw/i386/bios-linker-loader.c         | 156 +++++++++++++++++++++++++++++++++++
>>>  hw/i386/Makefile.objs                |   1 +
>>
>> Just a naming question...
>>
>> If this is ACPI-specific (or if there are no other uses in sight), it
>> should go in include/hw/acpi and hw/acpi, and renamed with s/bios/acpi/ etc.
>>
>> If this is i386-specific, it should go entirely in hw/i386 and the
>> headers should be included as "bios-linker-loader.h".
> 
> Definitely not ACPI specific.
> It's only used on i386 so I put it all under i386.
> You think we should replace
> #include "hw/i386/bios-linker-loader.h" with
> #include "bios-linker-loader.h"?
> 
> I don't really care, even though this makes headers
> hard to find. What's the benefit?

Private headers are outside include/, public headers within it.  Same
conventions as Linux.  But if it's not ACPI-specific, I don't feel too
strongly about it.

> It's not easy to find a good name for it.
> For now I'll just make all names bios_linker_loader_ consistently.
> We can always rename it later, it's not set in stone.

Ok.

>>> +struct BiosLinkerLoaderEntry {
>>> +    uint32_t command;
>>> +    union {
>>> +        /*
>>> +         * COMMAND_ALLOCATE - allocate a table from @alloc_file
>>> +         * subject to @alloc_align alignment (must be power of 2)
>>> +         * and @alloc_zone (can be HIGH or FSEG) requirements.
>>> +         *
>>> +         * Must appear exactly once for each file, and before
>>> +         * this file is referenced by any other command.
>>> +         */
>>> +        struct {
>>> +            char alloc_file[BIOS_LINKER_LOADER_FILESZ];
>>> +            uint32_t alloc_align;
>>> +            uint8_t alloc_zone;
>>> +        };
>>
>> I would prefer to have named structs, like
>>
>>         struct {
>>             char file[BIOS_LINKER_LOADER_FILESZ];
>>             uint32_t align;
>>             uint8_t zone;
>>         } alloc;
> 
> Why do you prefer this? It just makes code more verbose.

It doesn't, the names were already prefixed with alloc_/pointer_/cksum_.
 All it does is change underscores to periods.

Paolo

>>> +        /*
>>> +         * COMMAND_ADD_POINTER - patch the table (originating from
>>> +         * @dest_file) at @pointer_offset, by adding a pointer to the table
>>> +         * originating from @src_file. 1,2,4 or 8 byte unsigned
>>> +         * addition is used depending on @pointer_size.
>>> +         */
>>> +        struct {
>>> +            char pointer_dest_file[BIOS_LINKER_LOADER_FILESZ];
>>> +            char pointer_src_file[BIOS_LINKER_LOADER_FILESZ];
>>> +            uint32_t pointer_offset;
>>> +            uint8_t pointer_size;
>>> +        };
>>> +
>>> +        /*
>>> +         * COMMAND_ADD_CHECKSUM - calculate checksum of the range specified by
>>> +         * @cksum_start and @cksum_length fields,
>>> +         * and then add the value at @cksum_offset.
>>> +         * Checksum simply sums -X for each byte X in the range
>>> +         * using 8-bit math.
>>> +         */
>>> +        struct {
>>> +            char cksum_file[BIOS_LINKER_LOADER_FILESZ];
>>> +            uint32_t cksum_offset;
>>> +            uint32_t cksum_start;
>>> +            uint32_t cksum_length;
>>> +        };
>>> +
>>> +        /* padding */
>>> +        char pad[124];
>>> +    };
>>> +} QEMU_PACKED;
>>> +typedef struct BiosLinkerLoaderEntry BiosLinkerLoaderEntry;
>>> +
>>> +enum {
>>> +    BIOS_LINKER_LOADER_COMMAND_ALLOCATE     = 0x1,
>>> +    BIOS_LINKER_LOADER_COMMAND_ADD_POINTER  = 0x2,
>>> +    BIOS_LINKER_LOADER_COMMAND_ADD_CHECKSUM = 0x3,
>>> +};
>>> +
>>> +enum {
>>> +    BIOS_LINKER_LOADER_ALLOC_ZONE_HIGH = 0x1,
>>> +    BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG = 0x2,
>>> +};
>>> +
>>> +GArray *bios_linker_init(void)
>>> +{
>>> +    return g_array_new(false, true /* clear */, sizeof(BiosLinkerLoaderEntry));
>>> +}
>>> +
>>> +/* Free linker wrapper and return the linker array. */
>>> +void *bios_linker_cleanup(GArray *linker)
>>> +{
>>> +    return g_array_free(linker, false);
>>> +}
>>> +
>>> +void bios_linker_alloc(GArray *linker,
>>> +                       const char *file,
>>> +                       uint32_t alloc_align,
>>> +                       bool alloc_fseg)
>>> +{
>>> +    BiosLinkerLoaderEntry entry;
>>> +
>>> +    memset(&entry, 0, sizeof entry);
>>> +    strncpy(entry.alloc_file, file, sizeof entry.alloc_file - 1);
>>
>> Please use pstrcpy (also below).
> 
> OK.
> 
>>> +    entry.command = cpu_to_le32(BIOS_LINKER_LOADER_COMMAND_ALLOCATE);
>>> +    entry.alloc_align = cpu_to_le32(alloc_align);
>>> +    entry.alloc_zone = cpu_to_le32(alloc_fseg ?
>>> +                                    BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG :
>>> +                                    BIOS_LINKER_LOADER_ALLOC_ZONE_HIGH);
>>> +
>>> +    /* Alloc entries must come first, so prepend them */
>>> +    g_array_prepend_val(linker, entry);
>>> +}
>>> +
>>> +void bios_linker_add_checksum(GArray *linker, const char *file, void *table,
>>> +                              void *start, unsigned size, uint8_t *checksum)
>>> +{
>>> +    BiosLinkerLoaderEntry entry;
>>> +
>>> +    memset(&entry, 0, sizeof entry);
>>> +    strncpy(entry.cksum_file, file, sizeof entry.cksum_file - 1);
>>> +    entry.command = cpu_to_le32(BIOS_LINKER_LOADER_COMMAND_ADD_CHECKSUM);
>>> +    entry.cksum_offset = cpu_to_le32(checksum - (uint8_t *)table);
>>> +    entry.cksum_start = cpu_to_le32((uint8_t *)start - (uint8_t *)table);
>>> +    entry.cksum_length = cpu_to_le32(size);
>>> +
>>> +    g_array_append_val(linker, entry);
>>> +}
>>> +
>>> +void bios_linker_add_pointer(GArray *linker,
>>> +                             const char *dest_file,
>>> +                             const char *src_file,
>>> +                             GArray *table, void *pointer,
>>> +                             uint8_t pointer_size)
>>> +{
>>> +    BiosLinkerLoaderEntry entry;
>>> +
>>> +    memset(&entry, 0, sizeof entry);
>>> +    strncpy(entry.pointer_dest_file, dest_file,
>>> +            sizeof entry.pointer_dest_file - 1);
>>> +    strncpy(entry.pointer_src_file, src_file,
>>> +            sizeof entry.pointer_src_file - 1);
>>> +    entry.command = cpu_to_le32(BIOS_LINKER_LOADER_COMMAND_ADD_POINTER);
>>> +    entry.pointer_offset = cpu_to_le32((gchar *)pointer - table->data);
>>> +    entry.pointer_size = pointer_size;
>>> +    assert(pointer_size == 1 || pointer_size == 2 ||
>>> +           pointer_size == 4 || pointer_size == 8);
>>> +
>>> +    g_array_append_val(linker, entry);
>>> +}
>>> diff --git a/hw/i386/Makefile.objs b/hw/i386/Makefile.objs
>>> index f950707..b9ca380 100644
>>> --- a/hw/i386/Makefile.objs
>>> +++ b/hw/i386/Makefile.objs
>>> @@ -5,6 +5,7 @@ obj-y += pc_sysfw.o
>>>  obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o
>>>  
>>>  obj-y += kvmvapic.o
>>> +obj-y += bios-linker-loader.o
>>>  
>>>  iasl-option=$(shell if test -z "`$(1) $(2) 2>&1 > /dev/null`" \
>>>      ; then echo "$(2)"; else echo "$(3)"; fi ;)
>>>

  reply	other threads:[~2013-09-23 13:39 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-22 13:37 [Qemu-devel] [PATCH v4 00/23] qemu: generate acpi tables for the guest Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 01/23] qemu: add Error to typedefs Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 02/23] qom: pull in qemu/typedefs Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 03/23] qom: cleanup struct Error references Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 04/23] qom: add pointer to int property helpers Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 05/23] fw_cfg: interface to trigger callback on read Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 06/23] loader: support for unmapped ROM blobs Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 07/23] pcie_host: expose UNMAPPED macro Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 08/23] pcie_host: expose address format Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 09/23] q35: use macro for MCFG property name Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 10/23] q35: expose mmcfg size as a property Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 11/23] i386: add ACPI table files from seabios Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 12/23] acpi: add rules to compile ASL source Michael S. Tsirkin
2013-09-23 12:36   ` Paolo Bonzini
2013-09-23 13:39     ` Michael S. Tsirkin
2013-09-23 13:44       ` Laszlo Ersek
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 13/23] acpi: pre-compiled ASL files Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 14/23] loader: use file path size from fw_cfg.h Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 15/23] i386: add bios linker/loader Michael S. Tsirkin
2013-09-23 12:48   ` Paolo Bonzini
2013-09-23 13:36     ` Michael S. Tsirkin
2013-09-23 13:39       ` Paolo Bonzini [this message]
2013-09-23 13:47         ` Michael S. Tsirkin
2013-09-23 13:52           ` Paolo Bonzini
2013-09-23 19:08             ` Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 16/23] loader: allow adding ROMs in done callbacks Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 17/23] i386: define pc guest info Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 18/23] acpi/piix: add macros for acpi property names Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 19/23] piix: APIs for pc guest info Michael S. Tsirkin
2013-09-23  9:27   ` Igor Mammedov
2013-09-23 10:10     ` Michael S. Tsirkin
2013-09-23 11:14       ` Igor Mammedov
2013-09-23 11:28         ` Michael S. Tsirkin
2013-09-22 13:38 ` [Qemu-devel] [PATCH v4 20/23] ich9: " Michael S. Tsirkin
2013-09-22 13:38 ` [Qemu-devel] [PATCH v4 21/23] pvpanic: add API to access io port Michael S. Tsirkin
2013-09-22 13:38 ` [Qemu-devel] [PATCH v4 22/23] hpet: add API to find it Michael S. Tsirkin
2013-09-22 19:22   ` Paolo Bonzini
2013-09-22 19:58     ` Michael S. Tsirkin
2013-09-22 13:38 ` [Qemu-devel] [PATCH v4 23/23] i386: ACPI table generation code from seabios Michael S. Tsirkin
2013-09-24  9:23 ` [Qemu-devel] [PATCH v4 00/23] qemu: generate acpi tables for the guest Gerd Hoffmann
2013-09-24 21:45   ` 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=5240447E.5090601@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=afaerber@suse.de \
    --cc=anthony@codemonkey.ws \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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.