[SeaBIOS] The cbfs header for a payloads dest addr is a u64, use ntohll instead of ntohl

Dave Frodin dave.frodin at se-eng.com
Wed Aug 8 00:52:05 CEST 2012


All,
I found an issue with seabios when it is attempting to download and execute a payload
that has been added to a coreboot rom image img/ directory. The cbfs header has a destination
address of "u64 load_addr". The code that reads the destination address out of the header is
using ntohl which only works on u32, so the address that the cbfstool puts in the
header, 0x00000000000100000 gets converted to 0x00000000. I couldn't find where there was 64
bit version of the ntohl ftn/macro so I copied one out of coreboot.

Feel free to change where/how the ntohll gets implemented.

Thanks,
Dave Frodin

P.S. Thanks to whomever came up with the img/payload method of adding payloads. It's slick.




diff --git a/src/coreboot.c b/src/coreboot.c
index e116a14..4efec9c 100644
--- a/src/coreboot.c
+++ b/src/coreboot.c
@@ -470,6 +470,17 @@ struct cbfs_payload {
     struct cbfs_payload_segment segments[1];
 };

+#define ntohll(x) \
+       ((u64)( \
+               (((u64)(x) & (u64)0x00000000000000ffULL) << 56) | \
+               (((u64)(x) & (u64)0x000000000000ff00ULL) << 40) | \
+               (((u64)(x) & (u64)0x0000000000ff0000ULL) << 24) | \
+               (((u64)(x) & (u64)0x00000000ff000000ULL) <<  8) | \
+               (((u64)(x) & (u64)0x000000ff00000000ULL) >>  8) | \
+               (((u64)(x) & (u64)0x0000ff0000000000ULL) >> 24) | \
+               (((u64)(x) & (u64)0x00ff000000000000ULL) >> 40) | \
+               (((u64)(x) & (u64)0xff00000000000000ULL) >> 56) ))
+
 void
 cbfs_run_payload(struct cbfs_file *file)
 {
@@ -480,7 +491,7 @@ cbfs_run_payload(struct cbfs_file *file)
     struct cbfs_payload_segment *seg = pay->segments;
     for (;;) {
         void *src = (void*)pay + ntohl(seg->offset);
-        void *dest = (void*)ntohl((u32)seg->load_addr);
+        void *dest = (void*)ntohll((u64)seg->load_addr);
         u32 src_len = ntohl(seg->len);
         u32 dest_len = ntohl(seg->mem_len);
         switch (seg->type) {




More information about the SeaBIOS mailing list