Author: sparky
Date: Sat Feb 25 21:08:48 2006
New Revision: 7013

Modified:
   ppcrcd/trunk/yaboot/yaboot.c
Log:
- sync with 1.3.14rc1


Modified: ppcrcd/trunk/yaboot/yaboot.c
==============================================================================
--- ppcrcd/trunk/yaboot/yaboot.c        (original)
+++ ppcrcd/trunk/yaboot/yaboot.c        Sat Feb 25 21:08:48 2006
@@ -467,7 +467,7 @@
        if (opened)
                file.fs->close(&file);
 
-       if (result != 1 && conf_file)
+       if (conf_file)
                free(conf_file);
 
        return result;
@@ -987,6 +987,7 @@
                                        0x100000, 0);
                                if (sysmap_base == (void *)-1) {
                                        prom_printf("Claim failed for sysmap 
memory\n");
+                                       prom_pause();
                                        sysmap_base = 0;
                                } else {
                                        sysmap_size = file.fs->read(&file, 
0xfffff, sysmap_base);
@@ -1090,7 +1091,7 @@
                                        prom_printf("%s:%d,", params.rd.dev, 
params.rd.part);
                                        prom_perror(result, params.rd.file);
                                } else {
-#define INITRD_CHUNKSIZE 0x200000
+#define INITRD_CHUNKSIZE 0x100000
                                        initrd_base = 
prom_claim(loadinfo.base+loadinfo.memsize,
                                                INITRD_CHUNKSIZE, 0);
                                        if (initrd_base == (void *)-1) {
@@ -1113,6 +1114,7 @@
                                                        if (initrd_more != 
initrd_want) {
                                                                
prom_printf("\nClaim failed for initrd memory"
                                                                        " at %p 
rc=%p\n",initrd_want,initrd_more);
+                                                               prom_pause();
                                                                break;
                                                        }
                                                        initrd_read = 
file.fs->read(&file,
@@ -1215,7 +1217,7 @@
 {
        int                     i;
        Elf32_Ehdr      *e = &(loadinfo->elf.elf32hdr);
-       Elf32_Phdr      *p, *ph;
+       Elf32_Phdr      *p, *ph = NULL;
        int                     size = sizeof(Elf32_Ehdr) - sizeof(Elf_Ident);
        unsigned long   addr, loadaddr;
 
@@ -1225,7 +1227,7 @@
                        (*(file->fs->read))(file, size, &e->e_version)
                        ) < size) {
                prom_printf("\nCan't read Elf32 image header\n");
-               return 0;
+               goto bail;
        }
 
        DEBUG_F("Elf32 header:\n");
@@ -1244,13 +1246,13 @@
 
        if (e->e_phnum > MAX_HEADERS) {
                prom_printf ("Can only load kernels with one program header\n");
-               return 0;
+               goto bail;
        }
 
        ph = (Elf32_Phdr *)malloc(sizeof(Elf32_Phdr) * e->e_phnum);
        if (!ph) {
                prom_printf ("Malloc error\n");
-               return 0;
+               goto bail;
        }
 
        /* Now, we read the section header */
@@ -1259,14 +1261,14 @@
                        (*(file->fs->seek))(file, e->e_phoff)
                        ) != FILE_ERR_OK) {
                prom_printf ("seek error\n");
-               return 0;
+               goto bail;
        }
        if ( ( compressed_file ?
                        gunzip_read(ph, sizeof(Elf32_Phdr) * e->e_phnum) :
                        (*(file->fs->read))(file, sizeof(Elf32_Phdr) * 
e->e_phnum, ph)
                        ) != sizeof(Elf32_Phdr) * e->e_phnum) {
                prom_printf ("read error\n");
-               return 0;
+               goto bail;
        }
 
        /* Scan through the program header
@@ -1294,7 +1296,7 @@
 
        if (loadinfo->memsize == 0) {
                prom_printf("Can't find a loadable segment !\n");
-               return 0;
+               goto bail;
        }
 
        /* Determine whether we are trying to boot a vmlinux or some
@@ -1306,7 +1308,7 @@
                loadaddr = KERNELADDR;
        } else {
                flat_vmlinux = 0;
-               loadaddr = e->e_entry;
+               loadaddr = loadinfo->load_loc;
        }
        if ( kernel_position > 0 ) {
                flat_vmlinux = 1;
@@ -1333,7 +1335,7 @@
        }
        if (loadinfo->base == (void *)-1) {
                prom_printf("Claim error, can't allocate kernel memory\n");
-               return 0;
+               goto bail;
        }
 
        DEBUG_F("After ELF parsing, load base: %p, mem_sz: 0x%08lx\n",
@@ -1356,7 +1358,7 @@
                                        ) != FILE_ERR_OK) {
                                prom_printf ("Seek error\n");
                                prom_release(loadinfo->base, loadinfo->memsize);
-                               return 0;
+                               goto bail;
                        }
                        offset = p->p_vaddr - loadinfo->load_loc;
                        if ( ( compressed_file ?
@@ -1365,7 +1367,7 @@
                                        ) != p->p_filesz ) {
                                prom_printf ("Read failed\n");
                                prom_release(loadinfo->base, loadinfo->memsize);
-                               return 0;
+                               goto bail;
                        }
                }
        } else {
@@ -1373,19 +1375,19 @@
                if ( (*(file->fs->seek))(file, kernel_position) != FILE_ERR_OK) 
{
                        prom_printf ("Seek error\n");
                        prom_release(loadinfo->base, loadinfo->memsize);
-                       return 0;
+                       goto bail;
                }
                gunzip_file = *file;
                gunzip_test_header();
                if ( !compressed_file ) {
                        prom_printf ("Error: not compressed data at vmlinux 
position\n");
                        prom_release(loadinfo->base, loadinfo->memsize);
-                       return 0;
+                       goto bail;
                }
                if ( gunzip_read(loadinfo->base, kernel_size) != kernel_size ) {
                        prom_printf ("Gunzip read failed\n");
                        prom_release(loadinfo->base, loadinfo->memsize);
-                       return 0;
+                       goto bail;
                } else {
                        prom_printf ("vmlinux extracted successfully !\n");
                }
@@ -1395,6 +1397,11 @@
 
        /* Return success at loading the Elf32 kernel */
        return 1;
+
+bail:
+       if (ph)
+               free(ph);
+       return 0;
 }
 
 static int
@@ -1402,14 +1409,14 @@
 {
        int                     i;
        Elf64_Ehdr      *e = &(loadinfo->elf.elf64hdr);
-       Elf64_Phdr      *p, *ph;
+       Elf64_Phdr      *p, *ph = NULL;
        int                     size = sizeof(Elf64_Ehdr) - sizeof(Elf_Ident);
        unsigned long   addr, loadaddr;
 
        /* Read the rest of the Elf header... */
        if ((*(file->fs->read))(file, size, &e->e_version) < size) {
                prom_printf("\nCan't read Elf64 image header\n");
-               return 0;
+               goto bail;
        }
 
        DEBUG_F("Elf64 header:\n");
@@ -1428,24 +1435,24 @@
 
        if (e->e_phnum > MAX_HEADERS) {
                prom_printf ("Can only load kernels with one program header\n");
-               return 0;
+               goto bail;
        }
 
        ph = (Elf64_Phdr *)malloc(sizeof(Elf64_Phdr) * e->e_phnum);
        if (!ph) {
                prom_printf ("Malloc error\n");
-               return 0;
+               goto bail;
        }
 
        /* Now, we read the section header */
        if ((*(file->fs->seek))(file, e->e_phoff) != FILE_ERR_OK) {
                prom_printf ("Seek error\n");
-               return 0;
+               goto bail;
        }
        if ((*(file->fs->read))(file, sizeof(Elf64_Phdr) * e->e_phnum, ph) !=
                sizeof(Elf64_Phdr) * e->e_phnum) {
                prom_printf ("Read error\n");
-               return 0;
+               goto bail;
        }
 
        /* Scan through the program header
@@ -1473,7 +1480,7 @@
 
        if (loadinfo->memsize == 0) {
                prom_printf("Can't find a loadable segment !\n");
-               return 0;
+               goto bail;
        }
 
        /* leave some room (1Mb) for boot infos */
@@ -1502,7 +1509,7 @@
        }
        if (loadinfo->base == (void *)-1) {
                prom_printf("Claim error, can't allocate kernel memory\n");
-               return 0;
+               goto bail;
        }
 
        DEBUG_F("After ELF parsing, load base: %p, mem_sz: 0x%08lx\n",
@@ -1521,14 +1528,14 @@
                if ((*(file->fs->seek))(file, p->p_offset) != FILE_ERR_OK) {
                        prom_printf ("Seek error\n");
                        prom_release(loadinfo->base, loadinfo->memsize);
-                       return 0;
+                       goto bail;
                }
                offset = p->p_vaddr - loadinfo->load_loc;
                if ((*(file->fs->read))(file, p->p_filesz, 
loadinfo->base+offset)
                                != p->p_filesz) {
                        prom_printf ("Read failed\n");
                        prom_release(loadinfo->base, loadinfo->memsize);
-                       return 0;
+                       goto bail;
                }
        }
 
@@ -1536,6 +1543,11 @@
 
        /* Return success at loading the Elf64 kernel */
        return 1;
+
+bail:
+       if (ph)
+               free(ph);
+       return 0;
 }
 
 static int
@@ -1715,6 +1727,8 @@
                                prom_printf("\nWARNING: Bootstrap partition 
type is wrong:"
                                        " \"%s\"\n"
                                        "       type should be: 
\"Apple_Bootstrap\"\n\n", ptype);
+                       if (ptype)
+                               free(ptype);
                }
        }
 
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to