X-Git-Url: http://git.ozlabs.org/?p=yaboot.git;a=blobdiff_plain;f=second%2Fyaboot.c;h=ec0c0859d71813be46db27937154583b744c6a2a;hp=afa79eeb4feb031ecd9459e533ba8fa0700441dd;hb=677037569e92173195efa04244cd4291721d8f20;hpb=d01b3f4172d368eed8e56ab974e6028ce0710591 diff --git a/second/yaboot.c b/second/yaboot.c index afa79ee..ec0c085 100644 --- a/second/yaboot.c +++ b/second/yaboot.c @@ -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, ¶ms->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(¶ms.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;