Changeset View
Changeset View
Standalone View
Standalone View
stand/uboot/lib/elf_freebsd.c
Show First 20 Lines • Show All 65 Lines • ▼ Show 20 Lines | |||||
#endif | #endif | ||||
return (0); | return (0); | ||||
} | } | ||||
int | int | ||||
__elfN(uboot_exec)(struct preloaded_file *fp) | __elfN(uboot_exec)(struct preloaded_file *fp) | ||||
{ | { | ||||
struct file_metadata *fmp; | struct file_metadata *fmp; | ||||
vm_offset_t mdp; | vm_offset_t mdp, dtbp; | ||||
Elf_Ehdr *e; | Elf_Ehdr *e; | ||||
int error; | int error; | ||||
void (*entry)(void *); | void (*entry)(void *); | ||||
if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) | if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) | ||||
return (EFTYPE); | return (EFTYPE); | ||||
e = (Elf_Ehdr *)&fmp->md_data; | e = (Elf_Ehdr *)&fmp->md_data; | ||||
if ((error = md_load(fp->f_args, &mdp, NULL)) != 0) | if ((error = md_load(fp->f_args, &mdp, &dtbp)) != 0) | ||||
return (error); | return (error); | ||||
entry = (void *)e->e_entry; | entry = (void *)e->e_entry; | ||||
printf("Kernel entry at %p...\n", entry); | printf("Kernel entry at %p...\n", entry); | ||||
dev_cleanup(); | dev_cleanup(); | ||||
printf("Kernel args: %s\n", fp->f_args); | printf("Kernel args: %s\n", fp->f_args); | ||||
#ifdef __powerpc__ | |||||
((void (*)(u_long, u_long, u_long, void *, u_long))entry)(dtbp, 0, 0, | |||||
(void *)mdp, 0xfb5d104d); | |||||
mizhka: I wonder what is magic constant? | |||||
jhibbitsAuthorUnsubmitted Done Inline ActionsNathan put this magic constant in for PowerPC booting, to denote booting with the new loader, about a year ago, with the goal of distinguishing r6 as having a real metadata pointer instead of potentially garbage. Right now everything beyond dtbp is not used, but it will be in the future, as I bring booke booting up to parity with AIM. jhibbits: Nathan put this magic constant in for PowerPC booting, to denote booting with the new loader… | |||||
#else | |||||
(*entry)((void *)mdp); | (*entry)((void *)mdp); | ||||
#endif | |||||
panic("exec returned"); | panic("exec returned"); | ||||
} | } | ||||
struct file_format uboot_elf = { | struct file_format uboot_elf = { | ||||
__elfN(uboot_load), | __elfN(uboot_load), | ||||
__elfN(uboot_exec) | __elfN(uboot_exec) | ||||
}; | }; |
I wonder what is magic constant?