]> git.ozlabs.org Git - yaboot.git/blobdiff - second/yaboot.c
Treat iSCSI targets as block devices.
[yaboot.git] / second / yaboot.c
index ac63c462c36d5cd4af3dda15e93714cc8f80e6bb..b7b9280b7577dc7ea8606ade10f002c64bc5d0fb 100644 (file)
@@ -167,33 +167,23 @@ extern unsigned char linux_logo_blue[];
 
 #define DEFAULT_TIMEOUT                -1
 
-/* Entry, currently called directly by crt0 (bss not inited) */
-
-extern char* __bss_start;
-extern char* _end;
-
 int
 yaboot_start (unsigned long r3, unsigned long r4, unsigned long r5)
 {
      int result;
      void* malloc_base = NULL;
-     unsigned long addr;
      prom_handle root;
 
-     /* OF seems to do it, but I'm not very confident */
-     memset(&__bss_start, 0, &_end - &__bss_start);
-
      /* Initialize OF interface */
      prom_init ((prom_entry) r5);
 
+     prom_print_available();
+
      /* Allocate some memory for malloc'ator */
-     for (addr = MALLOCADDR; addr <= MALLOCADDR * 16 ;addr+=0x100000) {
-         malloc_base = prom_claim((void *)addr, MALLOCSIZE, 0);
-         if (malloc_base != (void *)-1) break;
-     }
+     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);
@@ -985,7 +975,7 @@ int get_params(struct boot_param_t* params)
 
            /* check if user seted to use a initrd file from boot console */
            if (!definitrd && p != manualinitrd) {
-               if (manualinitrd[0] != "/" && (prom_get_devtype(defdevice_bak) != FILE_DEVICE_NET)) {
+               if (manualinitrd[0] != '/' && (prom_get_devtype(defdevice_bak) != FILE_DEVICE_NET)) {
                    strcpy(initrdpath, "/");
                    strcat(initrdpath, manualinitrd);
                } else
@@ -1013,8 +1003,6 @@ int get_params(struct boot_param_t* params)
 void
 yaboot_text_ui(void)
 {
-#define MAX_HEADERS    32
-
      struct boot_file_t        file;
      int                       result;
      static struct boot_param_t        params;
@@ -1120,25 +1108,33 @@ yaboot_text_ui(void)
               }
               else {
 #define INITRD_CHUNKSIZE 0x100000
-                   initrd_base = prom_claim(loadinfo.base+loadinfo.memsize, INITRD_CHUNKSIZE, 0);
+                   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.
+                    */
+                   if (file.fs->ino_size && file.fs->ino_size(&file) > 0)
+                        len = file.fs->ino_size(&file) + 0x1000;
+
+                   initrd_base = prom_claim_chunk(loadinfo.base+loadinfo.memsize, len, 0);
                    if (initrd_base == (void *)-1) {
                         prom_printf("Claim failed for initrd memory\n");
                         initrd_base = 0;
                    } else {
-                        initrd_size = file.fs->read(&file, INITRD_CHUNKSIZE, initrd_base);
+                        initrd_size = file.fs->read(&file, len, initrd_base);
                         if (initrd_size == 0)
                              initrd_base = 0;
                         initrd_read = initrd_size;
                         initrd_more = initrd_base;
-                        while (initrd_read == INITRD_CHUNKSIZE ) { /* need to read more? */
-                             initrd_want = (void *)((unsigned long)initrd_more+INITRD_CHUNKSIZE);
-                             initrd_more = prom_claim(initrd_want, INITRD_CHUNKSIZE, 0);
+                        while (initrd_read == len ) { /* need to read more? */
+                             initrd_want = (void *)((unsigned long)initrd_more+len);
+                             initrd_more = prom_claim(initrd_want, len, 0);
                              if (initrd_more != initrd_want) {
                                   prom_printf("Claim failed for initrd memory at %p rc=%p\n",initrd_want,initrd_more);
                                   prom_pause();
                                   break;
                              }
-                             initrd_read = file.fs->read(&file, INITRD_CHUNKSIZE, initrd_more);
+                             initrd_read = file.fs->read(&file, len, initrd_more);
                              DEBUG_F("  block at %p rc=%lu\n",initrd_more,initrd_read);
                              initrd_size += initrd_read;
                         }
@@ -1174,6 +1170,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;
@@ -1211,11 +1209,6 @@ load_elf32(struct boot_file_t *file, loadinfo_t *loadinfo)
 
      loadinfo->entry = e->e_entry;
 
-     if (e->e_phnum > MAX_HEADERS) {
-         prom_printf ("Can only load kernels with one program header\n");
-         goto bail;
-     }
-
      ph = (Elf32_Phdr *)malloc(sizeof(Elf32_Phdr) * e->e_phnum);
      if (!ph) {
          prom_printf ("Malloc error\n");
@@ -1349,11 +1342,6 @@ load_elf64(struct boot_file_t *file, loadinfo_t *loadinfo)
 
      loadinfo->entry = e->e_entry;
 
-     if (e->e_phnum > MAX_HEADERS) {
-         prom_printf ("Can only load kernels with one program header\n");
-         goto bail;
-     }
-
      ph = (Elf64_Phdr *)malloc(sizeof(Elf64_Phdr) * e->e_phnum);
      if (!ph) {
          prom_printf ("Malloc error\n");