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:
Warner Losh 2012-06-14 04:09:20 +00:00
parent 447fd44a6f
commit 0bb13a26f0
5 changed files with 55 additions and 37 deletions

View File

@ -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

View File

@ -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_ */

View File

@ -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)
/*

View File

@ -3,3 +3,4 @@
files "../mv/files.mv"
cpu CPU_ARM9E
makeoptions CONF_CFLAGS="-march=armv5te"
options FREEBSD_BOOT_LOADER

View File

@ -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