[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 20:07:50 CEST 2012


Peter,

You're right, that u64 cast wasn't needed, but I needed to cast the result to u32.
The (void*) is evidently expecting a u32. Is that correct? Would SeaBIOS always be
expecting a u32 for an address to execute from?

I also cleaned up the macro to use the existing ntohl.
The new patch is below. I also tested it.

dave

commit 66c82fdbf283340067a8531ef6e3afae82102396
Author: Dave Frodin <dave.frodin at se-eng.com>
Date:   Tue Aug 7 17:01:08 2012 -0600

    Seabios: This fixes reading of CBFS 64 bit destination addresses from payload headers.
    This allows img/payloads to run.

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

+#define ntohll(in) (((u64) ntohl( (in) & 0xFFFFFFFF) << 32) | ((u64) ntohl( (in) >> 32)))
+
 void
 cbfs_run_payload(struct cbfs_file *file)
 {
@@ -480,7 +482,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*)(u32)ntohll(seg->load_addr);
         u32 src_len = ntohl(seg->len);
         u32 dest_len = ntohl(seg->mem_len);
         switch (seg->type) {




----- Original Message -----
> From: "Peter Stuge" <peter at stuge.se>
> To: seabios at seabios.org
> Sent: Wednesday, August 8, 2012 5:29:57 AM
> Subject: Re: [SeaBIOS] The cbfs header for a payloads dest addr is a u64,	use ntohll instead of ntohl
> 
> Dave Frodin wrote:
> > @@ -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);
> 
> Is the (u64) cast still needed? The less casts the better.
> 
> 
> //Peter
> 
> _______________________________________________
> SeaBIOS mailing list
> SeaBIOS at seabios.org
> http://www.seabios.org/mailman/listinfo/seabios
> 



More information about the SeaBIOS mailing list