#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);
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))
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))
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)
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;
}
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;
}
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;