summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2012-06-14 04:00:30 +0000
committerimp <imp@FreeBSD.org>2012-06-14 04:00:30 +0000
commitf69b442d94ad25c4757da3576ce5afd2ca318cd5 (patch)
treecfdbf8858829ac4ab6783d0c91f5d459501ed435 /sys/arm
parent261e450cc4dc2265056f6ef9669212e5bfb06493 (diff)
downloadFreeBSD-src-f69b442d94ad25c4757da3576ce5afd2ca318cd5.zip
FreeBSD-src-f69b442d94ad25c4757da3576ce5afd2ca318cd5.tar.gz
Modify all the arm platform files to call parse_boot_param passing in
the boot parameters from initarm first thing. parse_boot_param parses the boot arguments and converts them to the /boot/loader metadata the rest of the kernel uses. parse_boot_param is a weak alias to fake_preload_metadata, which all the platforms use now, but may become more extensive in the future. Since it is a weak symbol, specific boards may define their own parse_boot_param to interface to custom boot loaders. Reviewed by: cognet@, Ian Lapore
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/arm/machdep.c19
-rw-r--r--sys/arm/at91/at91_machdep.c2
-rw-r--r--sys/arm/econa/econa_machdep.c3
-rw-r--r--sys/arm/include/machdep.h5
-rw-r--r--sys/arm/mv/mv_machdep.c4
-rw-r--r--sys/arm/s3c2xx0/s3c24x0_machdep.c5
-rw-r--r--sys/arm/sa11x0/assabet_machdep.c4
-rw-r--r--sys/arm/xscale/i80321/ep80219_machdep.c2
-rw-r--r--sys/arm/xscale/i80321/iq31244_machdep.c2
-rw-r--r--sys/arm/xscale/i8134x/crb_machdep.c2
-rw-r--r--sys/arm/xscale/ixp425/avila_machdep.c2
11 files changed, 34 insertions, 16 deletions
diff --git a/sys/arm/arm/machdep.c b/sys/arm/arm/machdep.c
index 7f5cdfe..7ac21a4 100644
--- a/sys/arm/arm/machdep.c
+++ b/sys/arm/arm/machdep.c
@@ -666,7 +666,7 @@ makectx(struct trapframe *tf, struct pcb *pcb)
* Fake up a boot descriptor table
*/
vm_offset_t
-fake_preload_metadata(void)
+fake_preload_metadata(struct arm_boot_params *abp __unused)
{
#ifdef DDB
vm_offset_t zstart = 0, zend = 0;
@@ -713,6 +713,23 @@ fake_preload_metadata(void)
}
/*
+ * Stub version of the boot parameter parsing routine. We are
+ * called early in initarm, before even VM has been initialized.
+ * This routine needs to preserve any data that the boot loader
+ * has passed in before the kernel starts to grow past the end
+ * of the BSS, traditionally the place boot-loaders put this data.
+ *
+ * Since this is called so early, things that depend on the vm system
+ * being setup (including access to some SoC's serial ports), about
+ * all that can be done in this routine is to copy the arguments.
+ *
+ * This is the default boot parameter parsing routine. Individual
+ * kernels/boards can override this weak function with one of their
+ * own. We just fake metadata...
+ */
+__weak_reference(fake_preload_metadata, parse_boot_param);
+
+/*
* Initialize proc0
*/
void
diff --git a/sys/arm/at91/at91_machdep.c b/sys/arm/at91/at91_machdep.c
index 6b3f56e..ba3d7cb 100644
--- a/sys/arm/at91/at91_machdep.c
+++ b/sys/arm/at91/at91_machdep.c
@@ -392,8 +392,8 @@ initarm(struct arm_boot_params *abp)
uint32_t memsize;
vm_offset_t lastaddr;
+ lastaddr = parse_boot_param(abp);
set_cpufuncs();
- lastaddr = fake_preload_metadata();
pcpu_init(pcpup, 0, sizeof(struct pcpu));
PCPU_SET(curthread, &thread0);
diff --git a/sys/arm/econa/econa_machdep.c b/sys/arm/econa/econa_machdep.c
index 9b7042f..eec5a23 100644
--- a/sys/arm/econa/econa_machdep.c
+++ b/sys/arm/econa/econa_machdep.c
@@ -194,9 +194,8 @@ initarm(struct arm_boot_params *abp)
int mem_info;
boothowto = RB_VERBOSE;
-
+ lastaddr = parse_boot_param(abp);
set_cpufuncs();
- lastaddr = fake_preload_metadata();
pcpu_init(pcpup, 0, sizeof(struct pcpu));
PCPU_SET(curthread, &thread0);
diff --git a/sys/arm/include/machdep.h b/sys/arm/include/machdep.h
index b403d94..192c35d 100644
--- a/sys/arm/include/machdep.h
+++ b/sys/arm/include/machdep.h
@@ -6,11 +6,14 @@
/* misc prototypes used by the many arm machdeps */
void arm_lock_cache_line(vm_offset_t);
-vm_offset_t fake_preload_metadata(void);
void init_proc0(vm_offset_t kstack);
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 *);
+
#endif /* !_MACHINE_MACHDEP_H_ */
diff --git a/sys/arm/mv/mv_machdep.c b/sys/arm/mv/mv_machdep.c
index 76ab99e..cf055a2 100644
--- a/sys/arm/mv/mv_machdep.c
+++ b/sys/arm/mv/mv_machdep.c
@@ -331,7 +331,7 @@ initarm(struct arm_boot_params *abp)
*/
mdp = (void *)((uint32_t)mdp & ~PAGE_MASK);
- /* Parse metadata and fetch parameters */
+ /* Parse metadata and fetch parameters (move to common machdep.c?) */
if (mdp != NULL) {
preload_metadata = mdp;
kmdp = preload_search_by_type("elf kernel");
@@ -350,7 +350,7 @@ initarm(struct arm_boot_params *abp)
preload_addr_relocate = KERNVIRTADDR - KERNPHYSADDR;
} else {
/* Fall back to hardcoded metadata. */
- lastaddr = fake_preload_metadata();
+ lastaddr = fake_preload_metadata(abp);
}
#if defined(FDT_DTB_STATIC)
diff --git a/sys/arm/s3c2xx0/s3c24x0_machdep.c b/sys/arm/s3c2xx0/s3c24x0_machdep.c
index 6879581..d183ff9 100644
--- a/sys/arm/s3c2xx0/s3c24x0_machdep.c
+++ b/sys/arm/s3c2xx0/s3c24x0_machdep.c
@@ -244,10 +244,9 @@ initarm(struct arm_boot_params *abp)
int i;
uint32_t memsize;
+ boothowto = 0; /* Likely not needed */
+ lastaddr = parse_boot_param(abp);
i = 0;
-
- boothowto = 0;
-
set_cpufuncs();
cpufuncs.cf_sleep = s3c24x0_sleep;
lastaddr = fake_preload_metadata();
diff --git a/sys/arm/sa11x0/assabet_machdep.c b/sys/arm/sa11x0/assabet_machdep.c
index 39fbadc..9bc80d5 100644
--- a/sys/arm/sa11x0/assabet_machdep.c
+++ b/sys/arm/sa11x0/assabet_machdep.c
@@ -215,10 +215,10 @@ initarm(struct arm_boot_params *abp)
uint32_t memsize = 32 * 1024 * 1024;
sa1110_uart_vaddr = SACOM1_VBASE;
- boothowto = RB_VERBOSE | RB_SINGLE;
+ boothowto = RB_VERBOSE | RB_SINGLE; /* Default value */
+ lastaddr = parse_boot_param(abp);
cninit();
set_cpufuncs();
- lastaddr = fake_preload_metadata();
physmem = memsize / PAGE_SIZE;
pc = &__pcpu;
pcpu_init(pc, 0, sizeof(struct pcpu));
diff --git a/sys/arm/xscale/i80321/ep80219_machdep.c b/sys/arm/xscale/i80321/ep80219_machdep.c
index d96b103..0508244 100644
--- a/sys/arm/xscale/i80321/ep80219_machdep.c
+++ b/sys/arm/xscale/i80321/ep80219_machdep.c
@@ -192,8 +192,8 @@ initarm(struct arm_boot_params *abp)
vm_offset_t lastaddr;
uint32_t memsize, memstart;
+ lastaddr = parse_boot_param(abp);
set_cpufuncs();
- lastaddr = fake_preload_metadata();
pcpu_init(pcpup, 0, sizeof(struct pcpu));
PCPU_SET(curthread, &thread0);
diff --git a/sys/arm/xscale/i80321/iq31244_machdep.c b/sys/arm/xscale/i80321/iq31244_machdep.c
index bb2f554..9790c0b 100644
--- a/sys/arm/xscale/i80321/iq31244_machdep.c
+++ b/sys/arm/xscale/i80321/iq31244_machdep.c
@@ -193,8 +193,8 @@ initarm(struct arm_boot_params *abp)
vm_offset_t lastaddr;
uint32_t memsize, memstart;
+ lastaddr = parse_boot_param(abp);
set_cpufuncs();
- lastaddr = fake_preload_metadata();
pcpu_init(pcpup, 0, sizeof(struct pcpu));
PCPU_SET(curthread, &thread0);
diff --git a/sys/arm/xscale/i8134x/crb_machdep.c b/sys/arm/xscale/i8134x/crb_machdep.c
index b047692..8567b17 100644
--- a/sys/arm/xscale/i8134x/crb_machdep.c
+++ b/sys/arm/xscale/i8134x/crb_machdep.c
@@ -189,8 +189,8 @@ initarm(struct arm_boot_params *abp)
vm_offset_t lastaddr;
uint32_t memsize, memstart;
+ lastaddr = parse_boot_param(abp);
set_cpufuncs();
- lastaddr = fake_preload_metadata();
pcpu_init(pcpup, 0, sizeof(struct pcpu));
PCPU_SET(curthread, &thread0);
diff --git a/sys/arm/xscale/ixp425/avila_machdep.c b/sys/arm/xscale/ixp425/avila_machdep.c
index 97623bd..22b0e10 100644
--- a/sys/arm/xscale/ixp425/avila_machdep.c
+++ b/sys/arm/xscale/ixp425/avila_machdep.c
@@ -238,8 +238,8 @@ initarm(struct arm_boot_params *abp)
vm_offset_t lastaddr;
uint32_t memsize;
+ lastaddr = parse_boot_param(abp);
set_cpufuncs(); /* NB: sets cputype */
- lastaddr = fake_preload_metadata();
pcpu_init(pcpup, 0, sizeof(struct pcpu));
PCPU_SET(curthread, &thread0);
OpenPOWER on IntegriCloud