[PATCH] Lots of changes to PReP booting

STALE9050d

2 messages, 1 author, 2001-11-01 · open the first message on its own page

[PATCH] Lots of changes to PReP booting

From: Tom Rini <hidden>
Date: 2001-10-26 00:59:15

Hey all.  Can people _please_ go and test this (disk and net if
possible) and tell me if their machine still works?  The following
changes have been made:
1) On 'znetboot' and 'znetboot.initrd', no longer give mkprep the -pbp
option.  This allows my PowerStack (PPCBUG) to netboot successfully.
This _hopefully_ won't break anyone else tho.
2) Notify the user where we are just after we init the serial & vga
ports.
3) Notify the user where the residual data is only if we have it.  If we
don't have it tell the user that too.
4) _Always_ relocate the zImage, and if we have an initrd, always
relocate that too.
5) Kill the checks for things being above 16M.  We've now garrenteed
that initrd_start will be valid, and hold_residual and cmd_line are part
of the wrapper and thus must be close to the 8M mark, or wherever we've
relocated the wrapper to after boot.

Comments?  This is vs current linuxppc_2_4, but should apply to older
versions easily (not too old tho, maybe a week or 2 at most) and
probably to _devel too.

--
Tom Rini (TR1265)
http://gate.crashing.org/~trini/

===== arch/ppc/boot/prep/Makefile 1.28 vs edited =====
--- 1.28/arch/ppc/boot/prep/Makefile	Sun Oct 21 20:47:58 2001
+++ edited/arch/ppc/boot/prep/Makefile	Thu Oct 25 17:34:29 2001
@@ -17,10 +17,9 @@

 USE_STANDARD_AS_RULE		:= true

-ifeq ($(CONFIG_SMP),y)
-TFTPIMAGE			= /tftpboot/zImage.prep.smp
-else
 TFTPIMAGE			= /tftpboot/zImage.prep
+ifeq ($(CONFIG_SMP),y)
+TFTPIMAGE			= $(TFTPBOOT).smp
 endif

 ZLINKFLAGS			= -T $(TOPDIR)/arch/$(ARCH)/vmlinux.lds \
@@ -68,14 +67,6 @@
 		$@.tmp $@
 	rm -f $@.tmp

-zImage: zvmlinux $(MKPREP)
-	$(MKPREP) -pbp zvmlinux ../images/$@.prep
-	rm -f zvmlinux
-
-zImage.initrd: zvmlinux.initrd $(MKPREP)
-	$(MKPREP) -pbp zvmlinux.initrd ../images/$@.prep
-	rm -f zvmlinux.initrd
-
 zvmlinux: $(obj-y) $(LIBS) ../images/vmlinux.gz
 #
 # Recompile misc.oagain with more 'correct' bogus offsets
@@ -102,13 +93,25 @@
 		--add-section=image=../images/vmlinux.gz $@.tmp $@
 	rm -f $@.tmp

+zImage: zvmlinux $(MKPREP)
+	$(MKPREP) -pbp zvmlinux ../images/$@.prep
+	rm -f zvmlinux
+
+zImage.initrd: zvmlinux.initrd $(MKPREP)
+	$(MKPREP) -pbp zvmlinux.initrd ../images/$@.prep
+	rm -f zvmlinux.initrd
+
 floppy: zImage
 	dd if=../images/zImage.prep of=/dev/fd0H1440 bs=64b

-znetboot : zImage
+znetboot : zvmlinux $(MKPREP)
+	$(MKPREP) zvmlinux ../images/zImage.prep
 	cp ../images/zImage.prep $(TFTPIMAGE)
+	rm -f zvmlinux

-znetboot.initrd : zImage.initrd
+znetboot.initrd : zvmlinux.initrd
+	$(MKPREP) zvmlinux.initrd ../images/zImage.initrd.prep
 	cp ../images/zImage.initrd.prep $(TFTPIMAGE)
+	rm -f zvmlinux.initrd

 include $(TOPDIR)/Rules.make
===== arch/ppc/boot/prep/misc.c 1.22 vs edited =====
--- 1.22/arch/ppc/boot/prep/misc.c	Mon Oct 15 17:46:21 2001
+++ edited/arch/ppc/boot/prep/misc.c	Thu Oct 25 17:51:38 2001
@@ -172,8 +172,35 @@
 	vga_init((unsigned char *)0xC0000000);
 #endif /* CONFIG_VGA_CONSOLE */

+	/*
+	 * Tell the user where we were loaded at and where we were relocated
+	 * to for debugging this process.
+	 */
+	puts("loaded at:     "); puthex(load_addr);
+	puts(" "); puthex((unsigned long)(load_addr + (4*num_words))); puts("\n");
+	if ( (unsigned long)load_addr != (unsigned long)&start )
+	{
+		puts("relocated to:  "); puthex((unsigned long)&start);
+		puts(" ");
+		puthex((unsigned long)((unsigned long)&start + (4*num_words)));
+		puts("\n");
+	}
+
 	if (residual)
 	{
+		/*
+		 * Tell the user where the residual data is.
+		 */
+		puts("board data at: "); puthex((unsigned long)residual);
+		puts(" ");
+		puthex((unsigned long)((unsigned long)residual +
+					sizeof(RESIDUAL)));
+		puts("\nrelocated to:  ");puthex((unsigned long)hold_residual);
+		puts(" ");
+		puthex((unsigned long)((unsigned long)hold_residual +
+					sizeof(RESIDUAL)));
+		puts("\n");
+
 		/* Is this Motorola PPCBug? */
 		if ((1 & residual->VitalProductData.FirmwareSupports) &&
 		    (1 == residual->VitalProductData.FirmwareSupplier)) {
@@ -223,8 +250,12 @@
 		}
 		memcpy(hold_residual,residual,sizeof(RESIDUAL));
 	} else {
+		/* Tell the user we didn't find anything. */
+		puts("No residual data found.\n");
+
 		/* Assume 32M in the absence of more info... */
 		TotalMemory = 0x02000000;
+
 		/*
 		 * This is a 'best guess' check.  We want to make sure
 		 * we don't try this on a PReP box without OF
@@ -239,23 +270,21 @@
 			/* get handle to memory description */
 			res = of_finddevice("/memory@0",
 					    &dev_handle);
-			// puthex(res);  puts("\n");
 			if (res) break;

 			/* get the info */
-			// puts("get info = ");
 			res = of_getprop(dev_handle,
 					 "reg",
 					 mem_info,
 					 sizeof(mem_info),
 					 &size);
-			// puthex(res);  puts(", info = "); puthex(mem_info[0]);
-			// puts(" ");  puthex(mem_info[1]);   puts("\n");
-			if (res) break;
-
+			if (res)
+				break;
+
 			TotalMemory = mem_info[1];
 			break;
 		}
+
 		hold_residual->TotalMemory = TotalMemory;
 		residual = hold_residual;
 		/* Turn MMU back off */
@@ -273,32 +302,6 @@
 	/* assume the chunk below 8M is free */
 	end_avail = (char *)0x00800000;

-	/* tell the user where we were loaded at and where we
-	 * were relocated to for debugging this process
-	 */
-	puts("loaded at:     "); puthex(load_addr);
-	puts(" "); puthex((unsigned long)(load_addr + (4*num_words))); puts("\n");
-	if ( (unsigned long)load_addr != (unsigned long)&start )
-	{
-		puts("relocated to:  "); puthex((unsigned long)&start);
-		puts(" ");
-		puthex((unsigned long)((unsigned long)&start + (4*num_words)));
-		puts("\n");
-	}
-
-	if ( residual )
-	{
-		puts("board data at: "); puthex((unsigned long)residual);
-		puts(" ");
-		puthex((unsigned long)((unsigned long)residual + sizeof(RESIDUAL)));
-		puts("\n");
-		puts("relocated to:  ");
-		puthex((unsigned long)hold_residual);
-		puts(" ");
-		puthex((unsigned long)((unsigned long)hold_residual + sizeof(RESIDUAL)));
-		puts("\n");
-	}
-
 	/* we have to subtract 0x10000 here to correct for objdump including the
 	   size of the elf header which we strip -- Cort */
 	zimage_start = (char *)(load_addr - 0x10000 + ZIMAGE_OFFSET);
@@ -311,37 +314,31 @@
 	initrd_end = INITRD_SIZE + initrd_start;

 	/*
-	 * Find a place to stick the zimage and initrd and
-	 * relocate them if we have to. -- Cort
+	 * Stick the zImage at the end of ourself (page aligned).  If there's
+	 * an initrd, stick that on the next page following the zImage.
+	 * -- Tom
 	 */
 	avail_ram = (char *)PAGE_ALIGN((unsigned long)_end);
 	puts("zimage at:     "); puthex((unsigned long)zimage_start);
 	puts(" "); puthex((unsigned long)(zimage_size+zimage_start)); puts("\n");
-	if ( (unsigned long)zimage_start <= 0x00800000 )
-	{
-		memcpy( (void *)avail_ram, (void *)zimage_start, zimage_size );
-		zimage_start = (char *)avail_ram;
-		puts("relocated to:  "); puthex((unsigned long)zimage_start);
-		puts(" ");
-		puthex((unsigned long)zimage_size+(unsigned long)zimage_start);
-		puts("\n");
+	memcpy( (void *)avail_ram, (void *)zimage_start, zimage_size );
+	zimage_start = (char *)avail_ram;
+	puts("relocated to:  "); puthex((unsigned long)zimage_start);
+	puts(" ");
+	puthex((unsigned long)zimage_size+(unsigned long)zimage_start);
+	puts("\n");

-		/* relocate initrd */
-		if ( initrd_start )
-		{
-			puts("initrd at:     "); puthex(initrd_start);
-			puts(" "); puthex(initrd_end); puts("\n");
-			avail_ram = (char *)PAGE_ALIGN(
-				(unsigned long)zimage_size+(unsigned long)zimage_start);
-			memcpy ((void *)avail_ram, (void *)initrd_start, INITRD_SIZE );
-			initrd_start = (unsigned long)avail_ram;
-			initrd_end = initrd_start + INITRD_SIZE;
-			puts("relocated to:  "); puthex(initrd_start);
-			puts(" "); puthex(initrd_end); puts("\n");
-		}
-	} else if ( initrd_start ) {
+	if ( initrd_start )
+	{
 		puts("initrd at:     "); puthex(initrd_start);
 		puts(" "); puthex(initrd_end); puts("\n");
+		avail_ram = (char *)PAGE_ALIGN(
+			(unsigned long)zimage_size+(unsigned long)zimage_start);
+		memcpy ((void *)avail_ram, (void *)initrd_start, INITRD_SIZE );
+		initrd_start = (unsigned long)avail_ram;
+		initrd_end = initrd_start + INITRD_SIZE;
+		puts("relocated to:  "); puthex(initrd_start);
+		puts(" "); puthex(initrd_end); puts("\n");
 	}

 	avail_ram = (char *)0x00400000;
@@ -384,24 +381,15 @@
 	*cp = 0;
 	puts("\n");

-	/* mappings on early boot can only handle 16M */
-	if ( (int)(cmd_line) > (16<<20))
-		puts("cmd_line located > 16M\n");
-	if ( (int)hold_residual > (16<<20))
-		puts("hold_residual located > 16M\n");
-	if ( initrd_start > (16<<20))
-		puts("initrd_start located > 16M\n");
-
 	puts("Uncompressing Linux...");
-
 	gunzip(0, 0x400000, zimage_start, &zimage_size);
 	puts("done.\n");

 	{
 		struct bi_record *rec;
-
+
 		rec = (struct bi_record *)_ALIGN((unsigned long)(zimage_size)+(1<<20)-1,(1<<20));
-
+
 		rec->tag = BI_FIRST;
 		rec->size = sizeof(struct bi_record);
 		rec = (struct bi_record *)((unsigned long)rec + rec->size);
@@ -410,31 +398,22 @@
 		memcpy( (void *)rec->data, "prepboot", 9);
 		rec->size = sizeof(struct bi_record) + 8 + 1;
 		rec = (struct bi_record *)((unsigned long)rec + rec->size);
-
+
 		rec->tag = BI_MACHTYPE;
 		rec->data[0] = _MACH_prep;
 		rec->data[1] = 0;
 		rec->size = sizeof(struct bi_record) + 2 * sizeof(unsigned long);
 		rec = (struct bi_record *)((unsigned long)rec + rec->size);
-
+
 		rec->tag = BI_CMD_LINE;
 		memcpy( (char *)rec->data, cmd_line, strlen(cmd_line)+1);
 		rec->size = sizeof(struct bi_record) + strlen(cmd_line) + 1;
-		rec = (struct bi_record *)((ulong)rec + rec->size);
-
+		rec = (struct bi_record *)((unsigned long)rec + rec->size);
+
 		rec->tag = BI_LAST;
 		rec->size = sizeof(struct bi_record);
 		rec = (struct bi_record *)((unsigned long)rec + rec->size);
 	}
 	puts("Now booting the kernel\n");
 	return (unsigned long)hold_residual;
-}
-
-/*
- * PCI/ISA I/O support
- */
-unsigned long
-local_to_PCI(unsigned long addr)
-{
-	return (addr | 0x80000000);
 }
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

Re: [PATCH] Lots of changes to PReP booting

From: Tom Rini <hidden>
Date: 2001-11-01 17:04:54

On Thu, Oct 25, 2001 at 05:59:15PM -0700, Tom Rini wrote:
2) Notify the user where we are just after we init the serial & vga
ports.
3) Notify the user where the residual data is only if we have it.  If we
don't have it tell the user that too.
4) _Always_ relocate the zImage, and if we have an initrd, always
relocate that too.
5) Kill the checks for things being above 16M.  We've now garrenteed
that initrd_start will be valid, and hold_residual and cmd_line are part
of the wrapper and thus must be close to the 8M mark, or wherever we've
relocated the wrapper to after boot.
These parts of the patch are now in the linuxppc_2_4_devel tree.  If you
haven't tested these changes yet and have a machine which you can
reboot, please try these changes.  They quite probably won't harm
anything, and do fix a few known problems.

--
Tom Rini (TR1265)
http://gate.crashing.org/~trini/

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help