Various fixes to cbfstool.
[coreboot.git] / util / cbfstool / cbfs-mkpayload.c
index 4f0e2481234fbd7549ec44490367a7f6d33ca353..ff6479dc660e82f2455eabd3523573e3bd6b4b86 100644 (file)
@@ -27,7 +27,6 @@
 #include <fcntl.h>
 #include <getopt.h>
 #include <sys/stat.h>
-#include <arpa/inet.h>
 
 #include "common.h"
 #include "cbfs.h"
@@ -48,6 +47,12 @@ int parse_elf_to_payload(unsigned char *input, unsigned char **output,
        struct cbfs_payload_segment *segs;
        int i;
 
+       if(!iself(input)){
+               printf("Fatal error: the payload file is not in ELF format!\n");
+               exit(1);
+       }
+
+
        comp_func_ptr compress = compression_function(algo);
        if (!compress)
                return -1;
@@ -75,8 +80,10 @@ int parse_elf_to_payload(unsigned char *input, unsigned char **output,
 
                name = (char *)(strtab + shdr[i].sh_name);
 
-               if (!strcmp(name, ".note.pinfo"))
+               if (!strcmp(name, ".note.pinfo")) {
                        segments++;
+                       isize += (unsigned int)shdr[i].sh_size;
+               }
        }
 
        /* Now, regular headers - we only care about PT_LOAD headers,
@@ -145,9 +152,9 @@ int parse_elf_to_payload(unsigned char *input, unsigned char **output,
                if (phdr[i].p_filesz == 0) {
                        segs[segments].type = PAYLOAD_SEGMENT_BSS;
                        segs[segments].load_addr =
-                           (unsigned long long)htonl(phdr[i].p_paddr);
+                           (uint64_t)htonll(phdr[i].p_paddr);
                        segs[segments].mem_len =
-                           (unsigned int)htonl(phdr[i].p_memsz);
+                           (uint32_t)htonl(phdr[i].p_memsz);
                        segs[segments].offset = htonl(doffset);
 
                        segments++;
@@ -155,8 +162,8 @@ int parse_elf_to_payload(unsigned char *input, unsigned char **output,
                }
 
                segs[segments].type = PAYLOAD_SEGMENT_DATA;
-               segs[segments].load_addr = (unsigned int)htonl(phdr[i].p_paddr);
-               segs[segments].mem_len = (unsigned int)htonl(phdr[i].p_memsz);
+               segs[segments].load_addr = (uint64_t)htonll(phdr[i].p_paddr);
+               segs[segments].mem_len = (uint32_t)htonl(phdr[i].p_memsz);
                segs[segments].compression = htonl(algo);
                segs[segments].offset = htonl(doffset);
 
@@ -183,7 +190,7 @@ int parse_elf_to_payload(unsigned char *input, unsigned char **output,
        }
 
        segs[segments].type = PAYLOAD_SEGMENT_ENTRY;
-       segs[segments++].load_addr = (unsigned long long)htonl(ehdr->e_entry);
+       segs[segments++].load_addr = (uint64_t)htonll(ehdr->e_entry);
 
        *output = sptr;