Author: imp
Date: Thu Jun 14 04:18:56 2012
New Revision: 237045
URL: http://svn.freebsd.org/changeset/base/237045

Log:
  More Linux boot support.  Create arm_dump_avail_init() to initialize
  this array either from Linux boot data, when enabled, or in the
  typical way that most ports do it.  arm_pyhs_avail_init is coming
  soon since it must be a separate function.

Modified:
  head/sys/arm/arm/machdep.c
  head/sys/arm/at91/at91_machdep.c
  head/sys/arm/econa/econa_machdep.c
  head/sys/arm/include/machdep.h
  head/sys/arm/mv/mv_machdep.c
  head/sys/arm/s3c2xx0/s3c24x0_machdep.c
  head/sys/arm/xscale/ixp425/avila_machdep.c

Modified: head/sys/arm/arm/machdep.c
==============================================================================
--- head/sys/arm/arm/machdep.c  Thu Jun 14 04:16:16 2012        (r237044)
+++ head/sys/arm/arm/machdep.c  Thu Jun 14 04:18:56 2012        (r237045)
@@ -678,6 +678,47 @@ makectx(struct trapframe *tf, struct pcb
 }
 
 /*
+ * Make a standard dump_avail array.  Can't make the phys_avail
+ * since we need to do that after we call pmap_bootstrap, but this
+ * is needed before pmap_boostrap.
+ *
+ * ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before
+ * calling pmap_bootstrap.
+ */
+void
+arm_dump_avail_init(vm_offset_t memsize, size_t max)
+{
+#ifdef LINUX_BOOT_ABI
+       /*
+        * Linux boot loader passes us the actual banks of memory, so use them
+        * to construct the dump_avail array.
+        */
+       if (membanks > 0) 
+       {
+               int i, j;
+
+               if (max < (membanks + 1) * 2)
+                       panic("dump_avail[%d] too small for %d banks\n",
+                           max, membanks);
+               for (j = 0, i = 0; i < membanks; i++) {
+                       dump_avail[j++] = round_page(memstart[i]);
+                       dump_avail[j++] = trunc_page(memstart[i] + memsize[i]);
+               }
+               dump_avail[j++] = 0;
+               dump_avail[j++] = 0;
+               return;
+       }
+#endif
+       if (max < 4)
+               panic("dump_avail too small\n");
+
+       dump_avail[0] = round_page(PHYSADDR);
+       dump_avail[1] = trunc_page(PHYSADDR + memsize);
+       dump_avail[2] = 0;
+       dump_avail[3] = 0;
+}
+
+/*
  * Fake up a boot descriptor table
  */
 vm_offset_t

Modified: head/sys/arm/at91/at91_machdep.c
==============================================================================
--- head/sys/arm/at91/at91_machdep.c    Thu Jun 14 04:16:16 2012        
(r237044)
+++ head/sys/arm/at91/at91_machdep.c    Thu Jun 14 04:18:56 2012        
(r237045)
@@ -552,19 +552,8 @@ initarm(struct arm_boot_params *abp)
        arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
 
        pmap_curmaxkvaddr = afterkern + L1_S_SIZE * (KERNEL_PT_KERN_NUM - 1);
-
-       /*
-        * ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before
-        * calling pmap_bootstrap.
-        */
-       dump_avail[0] = PHYSADDR;
-       dump_avail[1] = PHYSADDR + memsize;
-       dump_avail[2] = 0;
-       dump_avail[3] = 0;
-
-       pmap_bootstrap(freemempos,
-           KERNVIRTADDR + 3 * memsize,
-           &kernel_l1pt);
+       arm_dump_avail_init(memsize, sizeof(dump_avail)/sizeof(dump_avail[0]));
+       pmap_bootstrap(freemempos, KERNVIRTADDR + 3 * memsize, &kernel_l1pt);
        msgbufp = (void*)msgbufpv.pv_va;
        msgbufinit(msgbufp, msgbufsize);
        mutex_init();

Modified: head/sys/arm/econa/econa_machdep.c
==============================================================================
--- head/sys/arm/econa/econa_machdep.c  Thu Jun 14 04:16:16 2012        
(r237044)
+++ head/sys/arm/econa/econa_machdep.c  Thu Jun 14 04:18:56 2012        
(r237045)
@@ -342,19 +342,8 @@ initarm(struct arm_boot_params *abp)
        arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
 
        pmap_curmaxkvaddr = afterkern + L1_S_SIZE * (KERNEL_PT_KERN_NUM - 1);
-
-       /*
-        * ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before
-        * calling pmap_bootstrap.
-        */
-       dump_avail[0] = PHYSADDR;
-       dump_avail[1] = PHYSADDR + memsize;
-       dump_avail[2] = 0;
-       dump_avail[3] = 0;
-
-       pmap_bootstrap(freemempos,
-           KERNVIRTADDR + 3 * memsize,
-           &kernel_l1pt);
+       arm_dump_avail_init(memsize, sizeof(dump_avail) / 
sizeof(dump_avail[0]));
+       pmap_bootstrap(freemempos, KERNVIRTADDR + 3 * memsize, &kernel_l1pt);
 
        msgbufp = (void*)msgbufpv.pv_va;
        msgbufinit(msgbufp, msgbufsize);

Modified: head/sys/arm/include/machdep.h
==============================================================================
--- head/sys/arm/include/machdep.h      Thu Jun 14 04:16:16 2012        
(r237044)
+++ head/sys/arm/include/machdep.h      Thu Jun 14 04:18:56 2012        
(r237045)
@@ -11,6 +11,8 @@ void halt(void);
 void data_abort_handler(trapframe_t *);
 void prefetch_abort_handler(trapframe_t *);
 void undefinedinstruction_bounce(trapframe_t *);
+
+/* Early boot related helper functions */
 struct arm_boot_params;
 vm_offset_t default_parse_boot_param(struct arm_boot_params *abp);
 vm_offset_t freebsd_parse_boot_param(struct arm_boot_params *abp);
@@ -18,4 +20,7 @@ vm_offset_t linux_parse_boot_param(struc
 vm_offset_t fake_preload_metadata(struct arm_boot_params *abp);
 vm_offset_t parse_boot_param(struct arm_boot_params *abp);
 
+/* Setup standard arrays */
+void arm_dump_avail_init( vm_offset_t memsize, size_t max);
+
 #endif /* !_MACHINE_MACHDEP_H_ */

Modified: head/sys/arm/mv/mv_machdep.c
==============================================================================
--- head/sys/arm/mv/mv_machdep.c        Thu Jun 14 04:16:16 2012        
(r237044)
+++ head/sys/arm/mv/mv_machdep.c        Thu Jun 14 04:18:56 2012        
(r237045)
@@ -552,12 +552,7 @@ initarm(struct arm_boot_params *abp)
        init_proc0(kernelstack.pv_va);
 
        arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
-
-       dump_avail[0] = 0;
-       dump_avail[1] = memsize;
-       dump_avail[2] = 0;
-       dump_avail[3] = 0;
-
+       arm_dump_avail_init(memsize, sizeof(dump_avail) / 
sizeof(dump_avail[0]));
        pmap_bootstrap(freemempos, pmap_bootstrap_lastaddr, &kernel_l1pt);
        msgbufp = (void *)msgbufpv.pv_va;
        msgbufinit(msgbufp, msgbufsize);

Modified: head/sys/arm/s3c2xx0/s3c24x0_machdep.c
==============================================================================
--- head/sys/arm/s3c2xx0/s3c24x0_machdep.c      Thu Jun 14 04:16:16 2012        
(r237044)
+++ head/sys/arm/s3c2xx0/s3c24x0_machdep.c      Thu Jun 14 04:18:56 2012        
(r237045)
@@ -409,18 +409,8 @@ initarm(struct arm_boot_params *abp)
        arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
 
        pmap_curmaxkvaddr = afterkern + 0x100000 * (KERNEL_PT_KERN_NUM - 1);
-       /*
-        * ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before
-        * calling pmap_bootstrap.
-        */
-       dump_avail[0] = PHYSADDR;
-       dump_avail[1] = PHYSADDR + memsize;
-       dump_avail[2] = 0;
-       dump_avail[3] = 0;
-                                       
-       pmap_bootstrap(freemempos,
-           KERNVIRTADDR + 3 * memsize,
-           &kernel_l1pt);
+       arm_dump_avail_init(memsize, sizeof(dump_avail) / 
sizeof(dump_avail[0]));
+       pmap_bootstrap(freemempos, KERNVIRTADDR + 3 * memsize, &kernel_l1pt);
        msgbufp = (void*)msgbufpv.pv_va;
        msgbufinit(msgbufp, msgbufsize);
        mutex_init();

Modified: head/sys/arm/xscale/ixp425/avila_machdep.c
==============================================================================
--- head/sys/arm/xscale/ixp425/avila_machdep.c  Thu Jun 14 04:16:16 2012        
(r237044)
+++ head/sys/arm/xscale/ixp425/avila_machdep.c  Thu Jun 14 04:18:56 2012        
(r237045)
@@ -446,11 +446,7 @@ initarm(struct arm_boot_params *abp)
        arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
 
        pmap_curmaxkvaddr = afterkern + PAGE_SIZE;
-       dump_avail[0] = PHYSADDR;
-       dump_avail[1] = PHYSADDR + memsize;
-       dump_avail[2] = 0;
-       dump_avail[3] = 0;
-
+       arm_dump_avail_init(memsize, sizeof(dump_avail) / 
sizeof(dump_avail[0]));
        pmap_bootstrap(pmap_curmaxkvaddr, 0xd0000000, &kernel_l1pt);
        msgbufp = (void*)msgbufpv.pv_va;
        msgbufinit(msgbufp, msgbufsize);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to