[PATCH 03/18] bootwrapper: Remove OF-isms
Scott Wood
scottwood at freescale.com
Tue Jan 30 07:11:56 EST 2007
Remove some OF-specific assumptions in generic bootwrapper code in
preparation for an old-U-Boot compatibility target. Up to five parameter
registers can now be passed to platform_init, and only platform code
should interpret them.
Signed-off-by: Scott Wood <scottwood at freescale.com>
---
arch/powerpc/boot/crt0.S | 2 +-
arch/powerpc/boot/main.c | 35 +++++++++++++++--------------------
arch/powerpc/boot/of.c | 9 +++++++--
arch/powerpc/boot/ops.h | 12 +++++++++++-
4 files changed, 34 insertions(+), 24 deletions(-)
diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S
index 70e65b1..fac9d3d 100644
--- a/arch/powerpc/boot/crt0.S
+++ b/arch/powerpc/boot/crt0.S
@@ -59,6 +59,6 @@ _zimage_start:
sync
isync
- mr r6,r1
+ mr r8,r1
b start
diff --git a/arch/powerpc/boot/main.c b/arch/powerpc/boot/main.c
index 6f6b50d..f60d8cf 100644
--- a/arch/powerpc/boot/main.c
+++ b/arch/powerpc/boot/main.c
@@ -30,14 +30,9 @@ extern char _initrd_end[];
extern char _dtb_start[];
extern char _dtb_end[];
-struct addr_range {
- unsigned long addr;
- unsigned long size;
- unsigned long memsize;
-};
static struct addr_range vmlinux;
static struct addr_range vmlinuz;
-static struct addr_range initrd;
+struct addr_range initrd;
static unsigned long elfoffset;
static int is_64bit;
@@ -46,7 +41,7 @@ static int is_64bit;
static char scratch[46912];
static char elfheader[256];
-typedef void (*kernel_entry_t)(unsigned long, unsigned long, void *);
+typedef void (*kernel_entry_t)(unsigned long, unsigned long, unsigned long);
#undef DEBUG
@@ -169,7 +164,7 @@ static int is_elf32(void *hdr)
return 1;
}
-static void prep_kernel(unsigned long a1, unsigned long a2)
+static void prep_kernel(void)
{
int len;
@@ -210,9 +205,10 @@ static void prep_kernel(unsigned long a1
* First see if we have an image attached to us. If so
* allocate memory for it and copy it there.
*/
- initrd.size = (unsigned long)(_initrd_end - _initrd_start);
- initrd.memsize = initrd.size;
- if (initrd.size > 0) {
+ if (_initrd_end != _initrd_start) {
+ initrd.size = (unsigned long)(_initrd_end - _initrd_start);
+ initrd.memsize = initrd.size;
+
printf("Allocating 0x%lx bytes for initrd ...\n\r",
initrd.size);
initrd.addr = (unsigned long)malloc((u32)initrd.size);
@@ -228,10 +224,8 @@ static void prep_kernel(unsigned long a1
initrd.size);
printf("initrd head: 0x%lx\n\r",
*((unsigned long *)initrd.addr));
- } else if (a2 != 0) {
+ } else if (initrd.size != 0) {
/* Otherwise, see if yaboot or another loader gave us an initrd */
- initrd.addr = a1;
- initrd.memsize = initrd.size = a2;
printf("Using loader supplied initrd at 0x%lx (0x%lx bytes)\n\r",
initrd.addr, initrd.size);
}
@@ -294,7 +288,8 @@ struct platform_ops platform_ops;
struct dt_ops dt_ops;
struct console_ops console_ops;
-void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
+void start(unsigned long r3, unsigned long r4, unsigned long r5,
+ unsigned long r6, unsigned long r7, void *sp)
{
kernel_entry_t kentry;
char cmdline[COMMAND_LINE_SIZE];
@@ -305,7 +300,7 @@ void start(unsigned long a1, unsigned lo
memset(&dt_ops, 0, sizeof(dt_ops));
memset(&console_ops, 0, sizeof(console_ops));
- if (platform_init(promptr, _dtb_start, _dtb_end))
+ if (platform_init(r3, r4, r5, r6, r7, _dtb_start, _dtb_end))
exit();
if (console_ops.open && (console_ops.open() < 0))
exit();
@@ -315,7 +310,7 @@ void start(unsigned long a1, unsigned lo
printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r",
_start, sp);
- prep_kernel(a1, a2);
+ prep_kernel();
/* If cmdline came from zimage wrapper or if we can edit the one
* in the dt, print it out and edit it, if possible.
@@ -335,17 +330,17 @@ void start(unsigned long a1, unsigned lo
if (ft_addr)
printf(" flat tree at 0x%lx\n\r", ft_addr);
else
- printf(" using OF tree (promptr=%p)\n\r", promptr);
+ printf(" using OF tree (promptr=%p)\n\r", r5);
if (console_ops.close)
console_ops.close();
kentry = (kernel_entry_t) vmlinux.addr;
if (ft_addr)
- kentry(ft_addr, 0, NULL);
+ kentry(ft_addr, 0, 0);
else
/* XXX initrd addr/size should be passed in properties */
- kentry(initrd.addr, initrd.size, promptr);
+ kentry(initrd.addr, initrd.size, r5);
/* console closed so printf below may not work */
printf("Error: Linux kernel returned to zImage boot wrapper!\n\r");
diff --git a/arch/powerpc/boot/of.c b/arch/powerpc/boot/of.c
index 0182f38..f6a696c 100644
--- a/arch/powerpc/boot/of.c
+++ b/arch/powerpc/boot/of.c
@@ -256,7 +256,9 @@ static void of_console_write(char *buf,
call_prom("write", 3, 1, of_stdout_handle, buf, len);
}
-int platform_init(void *promptr, char *dt_blob_start, char *dt_blob_end)
+int platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+ unsigned long r6, unsigned long r7,
+ char *dt_blob_start, char *dt_blob_end)
{
platform_ops.image_hdr = of_image_hdr;
platform_ops.malloc = of_try_claim;
@@ -269,6 +271,9 @@ int platform_init(void *promptr, char *d
console_ops.open = of_console_open;
console_ops.write = of_console_write;
- prom = (int (*)(void *))promptr;
+ initrd.addr = r3;
+ initrd.memsize = initrd.size = r4;
+
+ prom = (int (*)(void *))r5;
return 0;
}
diff --git a/arch/powerpc/boot/ops.h b/arch/powerpc/boot/ops.h
index 4ac7b02..42c723d 100644
--- a/arch/powerpc/boot/ops.h
+++ b/arch/powerpc/boot/ops.h
@@ -59,7 +59,9 @@ struct serial_console_data {
void (*close)(void);
};
-int platform_init(void *promptr, char *dt_blob_start, char *dt_blob_end);
+int platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+ unsigned long r6, unsigned long r7,
+ char *dt_blob_start, char *dt_blob_end);
int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device);
int serial_console_init(void);
int ns16550_console_init(void *devp, struct serial_console_data *scdp);
@@ -100,4 +102,12 @@ static inline void exit(void)
for(;;);
}
+struct addr_range {
+ unsigned long addr;
+ unsigned long size;
+ unsigned long memsize;
+};
+
+extern struct addr_range initrd;
+
#endif /* _PPC_BOOT_OPS_H_ */
--
1.4.4
More information about the Linuxppc-dev
mailing list