summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/arm/arm/machdep.c41
-rw-r--r--sys/arm/at91/at91_machdep.c15
-rw-r--r--sys/arm/econa/econa_machdep.c15
-rw-r--r--sys/arm/include/machdep.h5
-rw-r--r--sys/arm/mv/mv_machdep.c7
-rw-r--r--sys/arm/s3c2xx0/s3c24x0_machdep.c14
-rw-r--r--sys/arm/xscale/ixp425/avila_machdep.c6
7 files changed, 54 insertions, 49 deletions
diff --git a/sys/arm/arm/machdep.c b/sys/arm/arm/machdep.c
index ae00210..ac7b60f 100644
--- a/sys/arm/arm/machdep.c
+++ b/sys/arm/arm/machdep.c
@@ -678,6 +678,47 @@ makectx(struct trapframe *tf, struct pcb *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
diff --git a/sys/arm/at91/at91_machdep.c b/sys/arm/at91/at91_machdep.c
index ba3d7cb..468b4c0 100644
--- a/sys/arm/at91/at91_machdep.c
+++ b/sys/arm/at91/at91_machdep.c
@@ -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();
diff --git a/sys/arm/econa/econa_machdep.c b/sys/arm/econa/econa_machdep.c
index eec5a23..62c8a1b 100644
--- a/sys/arm/econa/econa_machdep.c
+++ b/sys/arm/econa/econa_machdep.c
@@ -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);
diff --git a/sys/arm/include/machdep.h b/sys/arm/include/machdep.h
index 0f83108..7c5f56f 100644
--- a/sys/arm/include/machdep.h
+++ b/sys/arm/include/machdep.h
@@ -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(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);
+/* Setup standard arrays */
+void arm_dump_avail_init( vm_offset_t memsize, size_t max);
+
#endif /* !_MACHINE_MACHDEP_H_ */
diff --git a/sys/arm/mv/mv_machdep.c b/sys/arm/mv/mv_machdep.c
index 0008f65..360267a 100644
--- a/sys/arm/mv/mv_machdep.c
+++ b/sys/arm/mv/mv_machdep.c
@@ -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);
diff --git a/sys/arm/s3c2xx0/s3c24x0_machdep.c b/sys/arm/s3c2xx0/s3c24x0_machdep.c
index d183ff9..b9817ac 100644
--- a/sys/arm/s3c2xx0/s3c24x0_machdep.c
+++ b/sys/arm/s3c2xx0/s3c24x0_machdep.c
@@ -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();
diff --git a/sys/arm/xscale/ixp425/avila_machdep.c b/sys/arm/xscale/ixp425/avila_machdep.c
index 22b0e10..5c1819c 100644
--- a/sys/arm/xscale/ixp425/avila_machdep.c
+++ b/sys/arm/xscale/ixp425/avila_machdep.c
@@ -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);
OpenPOWER on IntegriCloud