On Mon, Apr 22, 2013 at 08:42:18PM -0400, Kevin O'Connor wrote:
On Mon, Apr 22, 2013 at 08:23:39PM +0300, Michael S. Tsirkin wrote:
@@ -0,0 +1,28 @@ +#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 type;
- u8 format;
- u32 reserved;
- u64 src_offset; /* Offset in source. Little endian format. */
src_offset is not needed: host can pre-fill destination table with the offset value. Will probably drop it.
- u64 dst_offset; /* Offset in destination. Little endian format. */
- /* Followed by source and destination
Add "file names"
, optionally padded by
* 0, up to the total of entry_len - 4 bytes.
* Strings are 0-terminated. */
- char src_dst[];
+} PACKED;
+enum linker_entry_type {
Documentation:
ADD: increment value in DST by the address of SRC useful e.g. to fill in pointer values in ACPI tables SUB: decrement value in DST by the address of SRC useful e.g. to fix up checksum values in ACPI tables
I don't see how one could implement a checksum with just a subtraction. If the table is at 0x12345678 the checksum isn't (oldcksum-0x12345678), it's (oldcksum-0x12-0x34-0x56-0x78).
-Kevin
True, it's a bug. I'll add a shift option to fix it.