svn commit: r237042 - in head/sys: arm/arm arm/include arm/mv conf
Warner Losh
imp at FreeBSD.org
Thu Jun 14 04:09:21 UTC 2012
Author: imp
Date: Thu Jun 14 04:09:20 2012
New Revision: 237042
URL: http://svn.freebsd.org/changeset/base/237042
Log:
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
Modified:
head/sys/arm/arm/machdep.c
head/sys/arm/include/machdep.h
head/sys/arm/mv/mv_machdep.c
head/sys/arm/mv/std.mv
head/sys/conf/options.arm
Modified: head/sys/arm/arm/machdep.c
==============================================================================
--- head/sys/arm/arm/machdep.c Thu Jun 14 04:01:25 2012 (r237041)
+++ head/sys/arm/arm/machdep.c Thu Jun 14 04:09:20 2012 (r237042)
@@ -712,6 +712,47 @@ fake_preload_metadata(struct arm_boot_pa
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_pa
* 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
Modified: head/sys/arm/include/machdep.h
==============================================================================
--- head/sys/arm/include/machdep.h Thu Jun 14 04:01:25 2012 (r237041)
+++ head/sys/arm/include/machdep.h Thu Jun 14 04:09:20 2012 (r237042)
@@ -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_ */
Modified: head/sys/arm/mv/mv_machdep.c
==============================================================================
--- head/sys/arm/mv/mv_machdep.c Thu Jun 14 04:01:25 2012 (r237041)
+++ head/sys/arm/mv/mv_machdep.c Thu Jun 14 04:09:20 2012 (r237042)
@@ -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.
- */
- 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);
- }
+ * Find the dtb passed in by the boot loader.
+ */
+ 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)
/*
Modified: head/sys/arm/mv/std.mv
==============================================================================
--- head/sys/arm/mv/std.mv Thu Jun 14 04:01:25 2012 (r237041)
+++ head/sys/arm/mv/std.mv Thu Jun 14 04:09:20 2012 (r237042)
@@ -3,3 +3,4 @@
files "../mv/files.mv"
cpu CPU_ARM9E
makeoptions CONF_CFLAGS="-march=armv5te"
+options FREEBSD_BOOT_LOADER
Modified: head/sys/conf/options.arm
==============================================================================
--- head/sys/conf/options.arm Thu Jun 14 04:01:25 2012 (r237041)
+++ head/sys/conf/options.arm Thu Jun 14 04:09:20 2012 (r237042)
@@ -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
More information about the svn-src-all
mailing list