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) {
_______________________________________________
SeaBIOS mailing list
[email protected]
http://www.seabios.org/mailman/listinfo/seabios