Subject: initrd_header for mips64 kernel

From: Atsushi Nemoto <[email-masked]>
Date: Fri, 02 May 2003 22:05:17 +0900 (JST)

I found that initrd_header in mips64 cvs kernel is broken.  The
initrd_header should be consist of two 32bit words while 32bit
addinitrd is used for 64bit kernel too.

diff -ur linux-mips-cvs/arch/mips64/kernel/setup.c linux.new/arch/mips64/kernel/setup.c
--- linux-mips-cvs/arch/mips64/kernel/setup.c	Wed Apr  9 22:06:57 2003
+++ linux.new/arch/mips64/kernel/setup.c	Fri May  2 21:47:36 2003
@@ -245,7 +245,7 @@
 {
 #ifdef CONFIG_BLK_DEV_INITRD
 	unsigned long tmp;
-	unsigned long *initrd_header;
+	unsigned int *initrd_header;
 #endif
 	unsigned long bootmap_size;
 	unsigned long start_pfn, max_pfn;
@@ -255,7 +255,7 @@
 	tmp = (((unsigned long)&_end + PAGE_SIZE-1) & PAGE_MASK) - 8;
 	if (tmp < (unsigned long)&_end)
 		tmp += PAGE_SIZE;
-	initrd_header = (unsigned long *)tmp;
+	initrd_header = (unsigned int *)tmp;
 	if (initrd_header[0] == 0x494E5244) {
 		initrd_start = (unsigned long)&initrd_header[2];
 		initrd_end = initrd_start + initrd_header[1];
---
Atsushi Nemoto

---

From: Geert Uytterhoeven <[email-masked]>
Date: Fri, 2 May 2003 16:18:42 +0200 (MEST)

> +++ linux.new/arch/mips64/kernel/setup.c	Fri May  2 21:47:36 2003

I think you better use u32 if it must be a 32-bit value.

>  	unsigned long start_pfn, max_pfn;

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email-masked]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

---

From: Atsushi Nemoto <[email-masked]>
Date: Sat, 03 May 2003 14:15:18 +0900 (JST)

>>>>> On Fri, 2 May 2003 16:18:42 +0200 (MEST), Geert Uytterhoeven <[email-masked]> said:
geert> I think you better use u32 if it must be a 32-bit value.

Certainly.  Also it is better to use u32 in 32bit kernel too.

diff -ur linux-mips-cvs/arch/mips/kernel/setup.c linux.new/arch/mips/kernel/setup.c
--- linux-mips-cvs/arch/mips/kernel/setup.c	Thu Apr 17 23:54:17 2003
+++ linux.new/arch/mips/kernel/setup.c	Sat May  3 14:09:27 2003
@@ -246,17 +246,17 @@
 {
 #ifdef CONFIG_BLK_DEV_INITRD
 	unsigned long tmp;
-	unsigned long *initrd_header;
+	u32 *initrd_header;
 #endif
 	unsigned long bootmap_size;
 	unsigned long start_pfn, max_pfn, max_low_pfn, first_usable_pfn;
 	int i;
 
 #ifdef CONFIG_BLK_DEV_INITRD
-	tmp = (((unsigned long)&_end + PAGE_SIZE-1) & PAGE_MASK) - 8;
+	tmp = (((unsigned long)&_end + PAGE_SIZE-1) & PAGE_MASK) - sizeof(u32) * 2;
 	if (tmp < (unsigned long)&_end)
 		tmp += PAGE_SIZE;
-	initrd_header = (unsigned long *)tmp;
+	initrd_header = (u32 *)tmp;
 	if (initrd_header[0] == 0x494E5244) {
 		initrd_start = (unsigned long)&initrd_header[2];
 		initrd_end = initrd_start + initrd_header[1];
diff -ur linux-mips-cvs/arch/mips64/kernel/setup.c linux.new/arch/mips64/kernel/setup.c
--- linux-mips-cvs/arch/mips64/kernel/setup.c	Wed Apr  9 22:06:57 2003
+++ linux.new/arch/mips64/kernel/setup.c	Sat May  3 14:09:35 2003
@@ -245,17 +245,17 @@
 {
 #ifdef CONFIG_BLK_DEV_INITRD
 	unsigned long tmp;
-	unsigned long *initrd_header;
+	u32 *initrd_header;
 #endif
 	unsigned long bootmap_size;
 	unsigned long start_pfn, max_pfn;
 	int i;
 
 #ifdef CONFIG_BLK_DEV_INITRD
-	tmp = (((unsigned long)&_end + PAGE_SIZE-1) & PAGE_MASK) - 8;
+	tmp = (((unsigned long)&_end + PAGE_SIZE-1) & PAGE_MASK) - sizeof(u32) * 2;
 	if (tmp < (unsigned long)&_end)
 		tmp += PAGE_SIZE;
-	initrd_header = (unsigned long *)tmp;
+	initrd_header = (u32 *)tmp;
 	if (initrd_header[0] == 0x494E5244) {
 		initrd_start = (unsigned long)&initrd_header[2];
 		initrd_end = initrd_start + initrd_header[1];
---
Atsushi Nemoto