From owner-svn-src-head@FreeBSD.ORG Thu Jun 14 04:09:21 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id B1CB5106566C; Thu, 14 Jun 2012 04:09:21 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [69.147.83.44]) by mx1.freebsd.org (Postfix) with ESMTP id 9B86E8FC0C; Thu, 14 Jun 2012 04:09:21 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q5E49Lxf068456; Thu, 14 Jun 2012 04:09:21 GMT (envelope-from imp@svn.freebsd.org) Received: (from imp@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q5E49LuR068450; Thu, 14 Jun 2012 04:09:21 GMT (envelope-from imp@svn.freebsd.org) Message-Id: <201206140409.q5E49LuR068450@svn.freebsd.org> From: Warner Losh Date: Thu, 14 Jun 2012 04:09:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r237042 - in head/sys: arm/arm arm/include arm/mv conf X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Jun 2012 04:09:21 -0000 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