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
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to