[SeaBIOS] [PATCH 2/2] accept MADT over fw_cfg
Michael S. Tsirkin
mst at redhat.com
Tue May 7 18:33:13 CEST 2013
On Tue, Apr 23, 2013 at 08:54:17PM -0400, Kevin O'Connor wrote:
> On Tue, Apr 23, 2013 at 06:22:12PM +0300, Michael S. Tsirkin wrote:
> > So here's the version with shift, that should do it
> > correctly. Add mere 8 lines of code.
> > I'll look into alignment and fseg now.
> [...]
> > --- /dev/null
> > +++ b/src/linker.h
> > @@ -0,0 +1,29 @@
> > +#include "types.h" // u8
> > +#include "util.h" // romfile_s
> > +
> > +/* ROM file linker interface. Linker uses little endian format */
> > +struct linker_entry_s {
> > + u8 size; /* size in bytes including the header */
> > + u8 bytes; /* How many bytes to change. Can be 1,2,4 or 8. */
> > + u8 shift; /* Shift source address right by this many bits. 0-63. */
> > + u8 type;
> > + u8 format;
> > + u8 reserved1;
> > + u16 reserved2;
> > + u64 dst_offset; /* Offset in destination. Little endian format. */
> > + /* Followed by source and destination, optionally padded by
> > + * 0, up to the total of entry_len - 4 bytes.
> > + * Strings are 0-terminated. */
> > + char src_dst[];
> > +} PACKED;
>
> As in my previous email, I think the main emphasis should be on
> getting the content into QEMU, so I don't want to nitpick on the
> details of the seabios side. However, if I understand your proposal,
> an RSDT with 10 table entries would require 50 "linker" entries (10 to
> add the pointers and 40 to update the checksum) - that seems
> excessive.
Well that's not a lot of memory, is it?
And it's freed immediately after we link.
> If the goal is to do a checksum - might as well just
> define a checksum action.
I agree it makes the interface more more straight-forward
to use.
> Also, the variable length filenames aren't
> needed - the QemuCfgFile interface already limits the filename to a
> max of 56 bytes.
True. Two reasons I did not do it this way:
- this makes the code generic. Maybe others will want to reuse this?
- a bit less memory - we dont have long file names in practice.
Valid concerns?
>
> If you really feel QEMU should direct the pointer and checksum
> updates, you might want to consider something like:
>
> struct tabledeploy_s {
> u32 command;
> union {
> // COMMAND_ALLOC - allocate a table from the given "file"
> struct {
> char alloc_file[FILESZ];
> u32 alloc_align;
> u8 alloc_zone;
> };
>
> // COMMAND_PATCH - patch the table (originating from
> // "dest_file") to a pointer to the table originating from
> // "src_file".
> struct {
> char patch_dest_file[FILESZ];
> char patch_src_file[FILESZ];
> u32 patch_offset;
> u8 patch_size;
> };
>
I think ADD is better since this way we can use not the start of table,
but something in the middle. For example, a single fw_cfg can give us
multiple tables, it should be up to QEMU.
It's equivalent to PATCH if the original data is 0.
> // COMMAND_CHECKSUM - Update a checksum in a table
> struct {
> char cksum_file[FILESZ];
> u32 cksum_offset;
> u32 cksum_start;
> u32 cksum_length;
> };
>
Same here. So I would do:
COMMAND_ADD_POINTER
COMMAND_ADD_CHECKSUM
> // PAD
> char pad[124];
> };
> } PACKED;
>
> -Kevin
More information about the SeaBIOS
mailing list