Fix warnings in load_elf{32,64}()
[yaboot.git] / second / yaboot.c
index afa79eeb4feb031ecd9459e533ba8fa0700441dd..ec0c0859d71813be46db27937154583b744c6a2a 100644 (file)
@@ -76,6 +76,8 @@
 #define KERNEL_LINK_ADDR_PPC32 0xC0000000UL
 #define KERNEL_LINK_ADDR_PPC64 0xC000000000000000ULL
 
+#define INITRD_CHUNKSIZE 0x100000
+
 typedef struct {
      union {
          Elf32_Ehdr  elf32hdr;
@@ -177,11 +179,13 @@ yaboot_start (unsigned long r3, unsigned long r4, unsigned long r5)
      /* Initialize OF interface */
      prom_init ((prom_entry) r5);
 
+     prom_print_available();
+
      /* Allocate some memory for malloc'ator */
-     malloc_base = prom_claim_chunk((void *)MALLOCADDR, MALLOCSIZE, 0);
+     malloc_base = prom_claim_chunk_top(MALLOCSIZE, 0);
      if (malloc_base == (void *)-1) {
-         prom_printf("Can't claim malloc buffer (%d bytes at 0x%08x)\n",
-                     MALLOCSIZE, MALLOCADDR);
+         prom_printf("Can't claim malloc buffer of %d bytes\n",
+                     MALLOCSIZE);
          return -1;
      }
      malloc_init(malloc_base, MALLOCSIZE);
@@ -203,6 +207,9 @@ yaboot_start (unsigned long r3, unsigned long r4, unsigned long r5)
          else if (prom_getprop(root, "device_type", model, 256 ) > 0 &&
              !strncmp("chrp", model, 4))
               _machine = _MACH_chrp;
+         else if (prom_getprop(root, "compatible", model, 256 ) > 0 &&
+                  strstr(model, "ibm,powernv"))
+              _machine = _MACH_chrp;
          else {
               if (prom_getprop(root, "model", model, 256 ) > 0 &&
                   !strncmp(model, "IBM", 3))
@@ -601,7 +608,7 @@ void check_password(char *str)
          prom_printf ("\n");
 #ifdef USE_MD5_PASSWORDS
          if (!strncmp (password, "$1$", 3)) {
-              if (!check_md5_password(passwdbuff, password))
+              if (!check_md5_password((unsigned char*)passwdbuff, (unsigned char*)password))
                    return;
          }
          else if (!strcmp (password, passwdbuff))
@@ -707,9 +714,10 @@ int get_params(struct boot_param_t* params)
          if (!imagename) {
               if (bootoncelabel[0] != 0)
                    imagename = bootoncelabel;
-              else if (bootlastlabel[0] != 0)
-                         imagename = bootlastlabel;
-               else
+              else if (bootlastlabel[0] != 0) {
+                   imagename = bootlastlabel;
+                   word_split(&imagename, &params->args);
+              } else
                    imagename = cfg_get_default();
          }
          if (imagename)
@@ -771,7 +779,13 @@ int get_params(struct boot_param_t* params)
          imagename = cfg_get_default();
 
      /* write the imagename out so it can be reused on reboot if necessary */
-     prom_set_options("boot-last-label", imagename, strlen(imagename));
+     strcpy(bootlastlabel, imagename);
+     if (params->args && params->args[0]) {
+         strcat(bootlastlabel, " ");
+         strcat(bootlastlabel, params->args);
+     }
+     prom_set_options("boot-last-label", bootlastlabel,
+                     strlen(bootlastlabel) + 1);
 
      label = 0;
      defdevice = boot.dev;
@@ -1011,6 +1025,7 @@ yaboot_text_ui(void)
      loadinfo_t          loadinfo;
      void                *initrd_more,*initrd_want;
      unsigned long       initrd_read;
+     unsigned int        len = INITRD_CHUNKSIZE;
 
      loadinfo.load_loc = 0;
 
@@ -1100,19 +1115,18 @@ yaboot_text_ui(void)
               }
               prom_printf("Loading ramdisk...\n");
               result = open_file(&params.rd, &file);
+              if (result == FILE_ERR_OK && file.fs->ino_size) {
+                   result = file.fs->ino_size(&file, &len);
+               }
               if (result != FILE_ERR_OK) {
                    prom_printf("%s:%d,", params.rd.dev, params.rd.part);
                    prom_perror(result, params.rd.file);
               }
               else {
-#define INITRD_CHUNKSIZE 0x100000
-                   unsigned int len = INITRD_CHUNKSIZE;
-
-                   /* We add a bit to the actual size so the loop below doesn't think
-                    * there is more to load.
+                   /* We add a bit to the actual size so the loop below
+                    * doesn't think there is more to load.
                     */
-                   if (file.fs->ino_size && file.fs->ino_size(&file) > 0)
-                        len = file.fs->ino_size(&file) + 0x1000;
+                    len += 0x1000;
 
                    initrd_base = prom_claim_chunk(loadinfo.base+loadinfo.memsize, len, 0);
                    if (initrd_base == (void *)-1) {
@@ -1168,6 +1182,8 @@ yaboot_text_ui(void)
 
          DEBUG_F("Entering kernel...\n");
 
+         prom_print_available();
+
           /* call the kernel with our stack. */
          kernel_entry(initrd_base + loadinfo.load_loc, initrd_size, prom, 0, 0);
          continue;
@@ -1181,7 +1197,7 @@ load_elf32(struct boot_file_t *file, loadinfo_t *loadinfo)
 {
      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     loadaddr;
 
@@ -1314,7 +1330,7 @@ load_elf64(struct boot_file_t *file, loadinfo_t *loadinfo)
 {
      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     loadaddr;