staticvoid __noreturn cfe_linux_exit(void *arg)
{ int warm = *(int *)arg;
if (smp_processor_id()) { staticint reboot_smp;
/* Don't repeat the process from another CPU */ if (!reboot_smp) { /* Get CPU 0 to do the cfe_exit */
reboot_smp = 1;
smp_call_function(cfe_linux_exit, arg, 0);
}
} else {
printk("Passing control back to CFE...\n");
cfe_exit(warm, 0);
printk("cfe_exit returned??\n");
} while (1);
}
/* Make a copy of the initrd argument so we can smash it up here */ for (idx = 0; idx < sizeof(rdarg)-1; idx++) { if (!str[idx] || (str[idx] == ' ')) break;
rdarg[idx] = str[idx];
}
rdarg[idx] = 0;
str = rdarg;
/* *Initrd location comes in the form "<hex size of ramdisk in bytes>@<location in memory>" * e.g. initrd=3abfd@80010000. This is set up by the loader.
*/ for (tmp = str; *tmp != '@'; tmp++) { if (!*tmp) { goto fail;
}
}
*tmp = 0;
tmp++; if (!*tmp) { goto fail;
}
initrd_size = simple_strtoul(str, &endptr, 16); if (*endptr) {
*(tmp-1) = '@'; goto fail;
}
*(tmp-1) = '@';
initrd_start = simple_strtoul(tmp, &endptr, 16); if (*endptr) { goto fail;
}
initrd_end = initrd_start + initrd_size;
printk("Found initrd of %lx@%lx\n", initrd_size, initrd_start); return 1;
fail:
printk("Bad initrd argument. Disabling initrd\n");
initrd_start = 0;
initrd_end = 0; return 1;
}
/* * prom_init is called just after the cpu type is determined, from setup_arch()
*/ void __init prom_init(void)
{
uint64_t cfe_ept, cfe_handle; unsignedint cfe_eptseal; int argc = fw_arg0; char **envp = (char **) fw_arg2; int *prom_vec = (int *) fw_arg3;
/* * Check if a loader was used; if NOT, the 4 arguments are * what CFE gives us (handle, 0, EPT and EPTSEAL)
*/ if (argc < 0) {
cfe_handle = (uint64_t)(long)argc;
cfe_ept = (long)envp;
cfe_eptseal = (uint32_t)(unsignedlong)prom_vec;
} else { if ((int32_t)(long)prom_vec < 0) { /* * Old loader; all it gives us is the handle, * so use the "known" entrypoint and assume * the seal.
*/
cfe_handle = (uint64_t)(long)prom_vec;
cfe_ept = (uint64_t)((int32_t)0x9fc00500);
cfe_eptseal = CFE_EPTSEAL;
} else { /* * Newer loaders bundle the handle/ept/eptseal * Note: prom_vec is in the loader's useg * which is still alive in the TLB.
*/
cfe_handle = (uint64_t)((int32_t *)prom_vec)[0];
cfe_ept = (uint64_t)((int32_t *)prom_vec)[2];
cfe_eptseal = (unsignedint)((uint32_t *)prom_vec)[3];
}
} if (cfe_eptseal != CFE_EPTSEAL) { /* too early for panic to do any good */
printk("CFE's entrypoint seal doesn't match. Spinning."); while (1) ;
}
cfe_init(cfe_handle, cfe_ept); /* * Get the handle for (at least) prom_putchar, possibly for * boot console
*/
cfe_cons_handle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE); if (cfe_getenv("LINUX_CMDLINE", arcs_cmdline, COMMAND_LINE_SIZE) < 0) { if (argc >= 0) { /* The loader should have set the command line */ /* too early for panic to do any good */
printk("LINUX_CMDLINE not defined in cfe."); while (1) ;
}
}
#ifdef CONFIG_BLK_DEV_INITRD
{ char *ptr; /* Need to find out early whether we've got an initrd. So scan
the list looking now */ for (ptr = arcs_cmdline; *ptr; ptr++) { while (*ptr == ' ') {
ptr++;
} if (!strncmp(ptr, "initrd=", 7)) {
initrd_setup(ptr+7); break;
} else { while (*ptr && (*ptr != ' ')) {
ptr++;
}
}
}
} #endif/* CONFIG_BLK_DEV_INITRD */
/* Not sure this is needed, but it's the safe way. */
arcs_cmdline[COMMAND_LINE_SIZE-1] = 0;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.