X-Git-Url: http://git.ozlabs.org/?p=yaboot.git;a=blobdiff_plain;f=second%2Fyaboot.c;h=1f3f1518845aa67b0a81847f226a775a2ea9c34d;hp=5c8c8ea2310344d081b97473d2c19d64b65c48bd;hb=94adb3aee138118174e34f519ff6ce3e8ece707c;hpb=1bdc16516d7e67a30fa48a594f91aafff0c5eb46 diff --git a/second/yaboot.c b/second/yaboot.c index 5c8c8ea..1f3f151 100644 --- a/second/yaboot.c +++ b/second/yaboot.c @@ -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); @@ -719,9 +709,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, ¶ms->args); + } else imagename = cfg_get_default(); } if (imagename) @@ -783,7 +774,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; @@ -1118,25 +1115,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; } @@ -1172,6 +1177,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;