Create default_parse_boot_param which, if FreeBSD /boot/loader support
is enabled, sets values based on the metadata passed in. Otherwise fake_preload_metadata is called. Change the default parse_boot_param to default_parse_boot_param. Enable this functionality only on the mv platform, which is where most of the code is from. Reviewed by: cognet, Ian Lapore
This commit is contained in:
parent
447fd44a6f
commit
0bb13a26f0
@ -712,6 +712,47 @@ fake_preload_metadata(struct arm_boot_params *abp __unused)
|
||||
return (lastaddr);
|
||||
}
|
||||
|
||||
vm_offset_t
|
||||
default_parse_boot_param(struct arm_boot_params *abp)
|
||||
{
|
||||
vm_offset_t lastaddr;
|
||||
#if defined(FREEBSD_BOOT_LOADER)
|
||||
void *mdp;
|
||||
void *kmdp;
|
||||
|
||||
/*
|
||||
* Mask metadata pointer: it is supposed to be on page boundary. If
|
||||
* the first argument (mdp) doesn't point to a valid address the
|
||||
* bootloader must have passed us something else than the metadata
|
||||
* ptr... In this case we want to fall back to some built-in settings.
|
||||
*/
|
||||
mdp = (void *)(abp->abp_r0 & ~PAGE_MASK);
|
||||
|
||||
kmdp = NULL;
|
||||
/* Parse metadata and fetch parameters (move to common machdep.c?) */
|
||||
if (mdp != NULL) {
|
||||
preload_metadata = mdp;
|
||||
kmdp = preload_search_by_type("elf kernel");
|
||||
if (kmdp != NULL) {
|
||||
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
|
||||
kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
|
||||
lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND,
|
||||
vm_offset_t);
|
||||
#ifdef DDB
|
||||
ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
|
||||
ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
|
||||
#endif
|
||||
} else
|
||||
lastaddr = fake_preload_metadata(abp);
|
||||
|
||||
preload_addr_relocate = KERNVIRTADDR - KERNPHYSADDR;
|
||||
} else
|
||||
#endif
|
||||
/* Fall back to hardcoded metadata. */
|
||||
lastaddr = fake_preload_metadata(abp);
|
||||
return lastaddr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Stub version of the boot parameter parsing routine. We are
|
||||
* called early in initarm, before even VM has been initialized.
|
||||
@ -727,7 +768,7 @@ fake_preload_metadata(struct arm_boot_params *abp __unused)
|
||||
* kernels/boards can override this weak function with one of their
|
||||
* own. We just fake metadata...
|
||||
*/
|
||||
__weak_reference(fake_preload_metadata, parse_boot_param);
|
||||
__weak_reference(default_parse_boot_param, parse_boot_param);
|
||||
|
||||
/*
|
||||
* Initialize proc0
|
||||
|
@ -11,9 +11,9 @@ void halt(void);
|
||||
void data_abort_handler(trapframe_t *);
|
||||
void prefetch_abort_handler(trapframe_t *);
|
||||
void undefinedinstruction_bounce(trapframe_t *);
|
||||
|
||||
struct arm_boot_params;
|
||||
vm_offset_t fake_preload_metadata(struct arm_boot_params *);
|
||||
vm_offset_t parse_boot_param(struct arm_boot_params *);
|
||||
vm_offset_t default_parse_boot_param(struct arm_boot_params *abp);
|
||||
vm_offset_t fake_preload_metadata(struct arm_boot_params *abp);
|
||||
vm_offset_t parse_boot_param(struct arm_boot_params *abp);
|
||||
|
||||
#endif /* !_MACHINE_MACHDEP_H_ */
|
||||
|
@ -311,47 +311,22 @@ initarm(struct arm_boot_params *abp)
|
||||
vm_offset_t dtbp, freemempos, l2_start, lastaddr;
|
||||
uint32_t memsize, l2size;
|
||||
void *kmdp;
|
||||
void *mdp;
|
||||
u_int l1pagetable;
|
||||
int i = 0, j = 0, err_devmap = 0;
|
||||
|
||||
mdp = (void *)abp->abp_r0;
|
||||
kmdp = NULL;
|
||||
lastaddr = 0;
|
||||
lastaddr = parse_boot_param(abp);
|
||||
memsize = 0;
|
||||
dtbp = (vm_offset_t)NULL;
|
||||
|
||||
set_cpufuncs();
|
||||
|
||||
/*
|
||||
* Mask metadata pointer: it is supposed to be on page boundary. If
|
||||
* the first argument (mdp) doesn't point to a valid address the
|
||||
* bootloader must have passed us something else than the metadata
|
||||
* ptr... In this case we want to fall back to some built-in settings.
|
||||
* Find the dtb passed in by the boot loader.
|
||||
*/
|
||||
mdp = (void *)((uint32_t)mdp & ~PAGE_MASK);
|
||||
|
||||
/* Parse metadata and fetch parameters (move to common machdep.c?) */
|
||||
if (mdp != NULL) {
|
||||
preload_metadata = mdp;
|
||||
kmdp = preload_search_by_type("elf kernel");
|
||||
if (kmdp != NULL) {
|
||||
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
|
||||
kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
|
||||
dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t);
|
||||
lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND,
|
||||
vm_offset_t);
|
||||
#ifdef DDB
|
||||
ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
|
||||
ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
|
||||
#endif
|
||||
}
|
||||
|
||||
preload_addr_relocate = KERNVIRTADDR - KERNPHYSADDR;
|
||||
} else {
|
||||
/* Fall back to hardcoded metadata. */
|
||||
lastaddr = fake_preload_metadata(abp);
|
||||
}
|
||||
kmdp = preload_search_by_type("elf kernel");
|
||||
if (kmdp != NULL)
|
||||
dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t);
|
||||
else
|
||||
dtbp = (vm_offset_t)NULL;
|
||||
|
||||
|
||||
#if defined(FDT_DTB_STATIC)
|
||||
/*
|
||||
|
@ -3,3 +3,4 @@
|
||||
files "../mv/files.mv"
|
||||
cpu CPU_ARM9E
|
||||
makeoptions CONF_CFLAGS="-march=armv5te"
|
||||
options FREEBSD_BOOT_LOADER
|
||||
|
@ -16,6 +16,7 @@ CPU_XSCALE_IXP425 opt_global.h
|
||||
CPU_XSCALE_IXP435 opt_global.h
|
||||
CPU_XSCALE_PXA2X0 opt_global.h
|
||||
FLASHADDR opt_global.h
|
||||
FREEBSD_BOOT_LOADER opt_global.h
|
||||
IXP4XX_FLASH_SIZE opt_global.h
|
||||
KERNPHYSADDR opt_global.h
|
||||
KERNVIRTADDR opt_global.h
|
||||
|
Loading…
x
Reference in New Issue
Block a user