Author: hailfinger
Date: 2008-02-08 13:15:46 +0100 (Fri, 08 Feb 2008)
New Revision: 580

Modified:
   coreboot-v3/util/lar/stream.c
Log:
Fix lar so that it parses .bss section headers. 
This is not terribly clean but it works. 

Signed-off-by: Ronald G. Minnich <[EMAIL PROTECTED]>

Tested with a qemu boot to work correctly.
Acked-by: Carl-Daniel Hailfinger <[EMAIL PROTECTED]>


Modified: coreboot-v3/util/lar/stream.c
===================================================================
--- coreboot-v3/util/lar/stream.c       2008-02-08 11:57:07 UTC (rev 579)
+++ coreboot-v3/util/lar/stream.c       2008-02-08 12:15:46 UTC (rev 580)
@@ -74,8 +74,9 @@
                        int filelen, enum compalgo algo)
 {
        int ret;
-        Elf32_Phdr *phdr;
+       Elf32_Phdr *phdr;
        Elf32_Ehdr *ehdr;
+       Elf32_Shdr *shdr;
        u32 entry;
        int i;
        int size;
@@ -121,11 +122,53 @@
                ehdr->e_phnum,
                ehdr->e_shentsize,
                ehdr->e_shnum);
-        phdr = (Elf32_Phdr *)&(header[ehdr->e_phoff]);
+       phdr = (Elf32_Phdr *)&(header[ehdr->e_phoff]);
+       shdr = (Elf32_Shdr *)&(header[ehdr->e_shoff]);
 
        if (verbose())
                fprintf(stderr, "%s: header %p #headers %d\n", __FUNCTION__, 
ehdr, headers);
+
        entry = ehdr->e_entry;
+       /* bss segments are special. They are in the section headers, 
+        * not program headers. So, sadly, we have to look at section headers. 
+        */
+
+       for(i = 0; i < ehdr->e_shnum; i++) {
+               char *p, *q;
+               /* Ignore data that I don't need to handle */
+               if (shdr[i].sh_type != SHT_NOBITS) {
+                       if (verbose())
+                               fprintf(stderr, "Dropping non SHT_NOBITS 
section\n");
+                       continue;
+               }
+               /* might need to test flags with SHF_ALLOC */
+               if (shdr[i].sh_size == 0) {
+                       if (verbose())
+                               fprintf(stderr, "Dropping empty section\n");
+                       continue;
+               }
+               thisalgo = algo;
+               if (verbose())
+                       fprintf(stderr,  "New section addr %#x size %#x\n",
+                       (u32)shdr[i].sh_addr, (u32)shdr[i].sh_size);
+               /* Clean up the values */
+               size = shdr[i].sh_size;
+               if (verbose()) {
+                       fprintf(stderr, "(cleaned up) New section addr %p size 
0x%#x\n",
+                               (void *)shdr[i].sh_addr, (u32)shdr[i].sh_size);
+               }
+                       /* ok, copy it out */
+               sprintf(ename, "%s/segment%d", name, segment++);
+               /* just allocate a bunch of zeros */
+               p = calloc(sizeof(*p), size);
+               q = calloc(sizeof(*q), size);
+               complen = lar_compress(p, size, q, &thisalgo);
+               ret = lar_add_entry(lar, ename, q, complen, size, 
+                                   shdr[i].sh_addr, entry, thisalgo);
+               free(p);
+               free(q);
+       }
+
        for(i = 0; i < headers; i++) {
                /* Ignore data that I don't need to handle */
                if (phdr[i].p_type != PT_LOAD) {


-- 
coreboot mailing list
[email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to