aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/boot/main.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/arch/powerpc/boot/main.c b/arch/powerpc/boot/main.c
index 418497482b6..630a453e16f 100644
--- a/arch/powerpc/boot/main.c
+++ b/arch/powerpc/boot/main.c
@@ -169,7 +169,7 @@ static int is_elf32(void *hdr)
169 return 1; 169 return 1;
170} 170}
171 171
172static void prep_kernel(unsigned long *a1, unsigned long *a2) 172static void prep_kernel(unsigned long a1, unsigned long a2)
173{ 173{
174 int len; 174 int len;
175 175
@@ -205,11 +205,14 @@ static void prep_kernel(unsigned long *a1, unsigned long *a2)
205 } 205 }
206 206
207 /* 207 /*
208 * Now we try to alloc memory for the initrd (and copy it there) 208 * Now find the initrd
209 *
210 * First see if we have an image attached to us. If so
211 * allocate memory for it and copy it there.
209 */ 212 */
210 initrd.size = (unsigned long)(_initrd_end - _initrd_start); 213 initrd.size = (unsigned long)(_initrd_end - _initrd_start);
211 initrd.memsize = initrd.size; 214 initrd.memsize = initrd.size;
212 if ( initrd.size > 0 ) { 215 if (initrd.size > 0) {
213 printf("Allocating 0x%lx bytes for initrd ...\n\r", 216 printf("Allocating 0x%lx bytes for initrd ...\n\r",
214 initrd.size); 217 initrd.size);
215 initrd.addr = (unsigned long)malloc((u32)initrd.size); 218 initrd.addr = (unsigned long)malloc((u32)initrd.size);
@@ -218,8 +221,6 @@ static void prep_kernel(unsigned long *a1, unsigned long *a2)
218 "ramdisk !\n\r"); 221 "ramdisk !\n\r");
219 exit(); 222 exit();
220 } 223 }
221 *a1 = initrd.addr;
222 *a2 = initrd.size;
223 printf("initial ramdisk moving 0x%lx <- 0x%lx " 224 printf("initial ramdisk moving 0x%lx <- 0x%lx "
224 "(0x%lx bytes)\n\r", initrd.addr, 225 "(0x%lx bytes)\n\r", initrd.addr,
225 (unsigned long)_initrd_start, initrd.size); 226 (unsigned long)_initrd_start, initrd.size);
@@ -227,6 +228,12 @@ static void prep_kernel(unsigned long *a1, unsigned long *a2)
227 initrd.size); 228 initrd.size);
228 printf("initrd head: 0x%lx\n\r", 229 printf("initrd head: 0x%lx\n\r",
229 *((unsigned long *)initrd.addr)); 230 *((unsigned long *)initrd.addr));
231 } else if (a2 != 0) {
232 /* Otherwise, see if yaboot or another loader gave us an initrd */
233 initrd.addr = a1;
234 initrd.memsize = initrd.size = a2;
235 printf("Using loader supplied initrd at 0x%lx (0x%lx bytes)\n\r",
236 initrd.addr, initrd.size);
230 } 237 }
231 238
232 /* Eventually gunzip the kernel */ 239 /* Eventually gunzip the kernel */
@@ -307,7 +314,7 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
307 printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r", 314 printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r",
308 _start, sp); 315 _start, sp);
309 316
310 prep_kernel(&a1, &a2); 317 prep_kernel(a1, a2);
311 318
312 /* If cmdline came from zimage wrapper or if we can edit the one 319 /* If cmdline came from zimage wrapper or if we can edit the one
313 * in the dt, print it out and edit it, if possible. 320 * in the dt, print it out and edit it, if possible.
@@ -331,7 +338,7 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
331 } 338 }
332 else 339 else
333 /* XXX initrd addr/size should be passed in properties */ 340 /* XXX initrd addr/size should be passed in properties */
334 kentry(a1, a2, promptr); 341 kentry(initrd.addr, initrd.size, promptr);
335 342
336 /* console closed so printf below may not work */ 343 /* console closed so printf below may not work */
337 printf("Error: Linux kernel returned to zImage boot wrapper!\n\r"); 344 printf("Error: Linux kernel returned to zImage boot wrapper!\n\r");