bi_record and initrd

Richard Laing Richard.Laing at 4rf.com
Thu Nov 28 08:00:41 EST 2002


The following is a diff context patch for misc-embedded.c, it fixes a
problem where the initrd ramdisk image is corrupted during the boot process.
It is based on the untested patch from Tom Rini for misc-simple.c. The patch
corrects a bug in the Tom's original patch. The patch is against the current
linuxppc_2_4_devel branch. The only change from the original patch the
memcpy line

memcpy((void *)initrd_loc, &__ramdisk_begin, initrd_size);

I have tested this patch with my build and it works fine...

Cheers
Richard


*** arch/ppc/boot/simple/old.c	2002-11-28 09:00:08.000000000 +1300
--- arch/ppc/boot/simple/misc-embedded.c	2002-11-28
09:50:21.000000000 +1300
***************
*** 83,88 ****
--- 83,89 ----
  	char *cp, ch;
  	int timer = 0, zimage_size;
  	unsigned long initrd_size;
+ 	unsigned long initrd_loc;

  	/* First, capture the embedded board information.  Then
  	 * initialize the serial console port.
***************
*** 145,150 ****
--- 146,162 ----
  		puts("initrd at:     ");
  		puthex((unsigned long)(&__ramdisk_begin));
  		puts(" "); puthex((unsigned
long)(&__ramdisk_end));puts("\n");
+
+ 		if ((_ALIGN((unsigned long)(zimage_size) + (1 << 20) - 1,
+ 			(1 << 20))) <= (unsigned long)(&__ramdisk_end)) {
+ 			initrd_loc = _ALIGN((unsigned long)(initrd_size) +(2
<< 20) - 1, (2 << 20));
+ 			 memcpy((void *)initrd_loc, &__ramdisk_begin,
initrd_size);
+ 			 puts("relocated to:  "); puthex(initrd_loc);
+ 			 puts(" "); puthex(initrd_loc + initrd_size);
+ 			 puts("\n");
+ 		} else {
+ 			initrd_loc = (unsigned long)(&__ramdisk_begin);
+ 	        }
  	}

  	/*
***************
*** 225,231 ****

  		if ( initrd_size ) {
  			rec->tag = BI_INITRD;
! 			rec->data[0] = (unsigned long)(&__ramdisk_begin);
  			rec->data[1] = initrd_size;
  			rec->size = sizeof(struct bi_record) + 2 *
  				sizeof(unsigned long);
--- 237,243 ----

  		if ( initrd_size ) {
  			rec->tag = BI_INITRD;
! 			rec->data[0] = initrd_loc;
  			rec->data[1] = initrd_size;
  			rec->size = sizeof(struct bi_record) + 2 *
  				sizeof(unsigned long);


** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/




More information about the Linuxppc-embedded mailing list