On Sat, 2005-01-15 at 20:29 -0800, William Lee Irwin III wrote:

> I suspected the same. Perhaps time to brew up another BTFIXUP.

I tried to whip up a BTFIXUP patch for this, but it wouldn't work, since
VMALLOC_START is in entry.S. Peter Jones took my patch and made a
version that works. His patch to resolve this is attached.

~spot
---
Tom "spot" Callaway <tcallawa(a)redhat*com> LCA, RHCE 
Red Hat Sales Engineer || Aurora Linux Project Leader

"If you are going through hell, keep going."
-- Sir Winston Churchill
--- linux-2.6.10/arch/sparc/kernel/entry.S.BAD	2005-01-30 14:28:32.537336110 -0500
+++ linux-2.6.10/arch/sparc/kernel/entry.S	2005-01-30 14:33:24.781908182 -0500
@@ -863,8 +863,11 @@
 	.globl	vac_hwflush_patch2
 
 	.align	4
+	.globl	vmalloc_start_addr
+vmalloc_start_addr:
+	.word	0xfe300000
	.globl	sun4c_fault

 ! %l0 = %psr
 ! %l1 = %pc
 ! %l2 = %npc
@@ -944,7 +947,8 @@
 	 and	%l5, %l4, %l5
 
 	/* Test for NULL pte_t * in vmalloc area. */
-	sethi   %hi(VMALLOC_START), %l4
+	sethi	%hi(vmalloc_start_addr), %l4
+	ld	[%l4 + %lo(vmalloc_start_addr)], %l4
 	cmp     %l5, %l4
 	blu,a   invalid_segment_patch1
 	 lduXa	[%l5] ASI_SEGMAP, %l4
@@ -1072,7 +1076,8 @@
 	andn	%l4, 0x1ff, %l5
 
 1:
-	sethi	%hi(VMALLOC_START), %l4
+	sethi	%hi(vmalloc_start_addr), %l4
+	ld	[%l4 + %lo(vmalloc_start_addr)], %l4
 	cmp	%l5, %l4
 
 	bgeu	1f
--- linux-2.6.10/arch/sparc/mm/init.c.BAD	2005-01-30 14:33:34.300461142 -0500
+++ linux-2.6.10/arch/sparc/mm/init.c	2005-01-30 14:36:27.501130638 -0500
@@ -402,6 +402,23 @@
 	int reservedpages = 0;
 	int i;
 
+	switch(sparc_cpu_model) {
+		case sun4:
+		case sun4c:
+			vmalloc_start_addr = VMALLOC_START_SUN4;
+			break;
+		case sun4d:
+		case sun4e:
+		case sun4m:
+			vmalloc_start_addr = VMALLOC_START_SUN4M;
+			break;
+		/* these are just to pacify gcc warnings */
+		case sun4u:
+		case sun_unknown:
+		case ap1000:
+			break;
+	};
+
 	if (PKMAP_BASE+LAST_PKMAP*PAGE_SIZE >= FIXADDR_START) {
 		prom_printf("BUG: fixmap and pkmap areas overlap\n");
 		prom_printf("pkbase: 0x%lx pkend: 0x%lx fixstart 0x%lx\n",
--- linux-2.6.10/arch/sparc/mm/sun4c.c.BAD	2005-01-30 14:38:04.846331918 -0500
+++ linux-2.6.10/arch/sparc/mm/sun4c.c	2005-01-30 14:38:30.156484190 -0500
@@ -2085,7 +2085,7 @@
 	memset(pg3, 0, PAGE_SIZE);
 
 	/* Save work later. */
-	vaddr = VMALLOC_START;
+	vaddr = vmalloc_start_addr;
 	swapper_pg_dir[vaddr>>SUN4C_PGDIR_SHIFT] = __pgd(PGD_TABLE | (unsigned long) pg0);
 	vaddr += SUN4C_PGDIR_SIZE;
 	swapper_pg_dir[vaddr>>SUN4C_PGDIR_SHIFT] = __pgd(PGD_TABLE | (unsigned long) pg1);
--- linux-2.6.10/include/asm-sparc/vaddrs.h.BAD	2005-01-30 14:36:39.942239302 -0500
+++ linux-2.6.10/include/asm-sparc/vaddrs.h	2005-01-30 14:37:56.557591998 -0500
@@ -35,7 +35,13 @@
 #define IOBASE_VADDR		0xfe000000
 #define IOBASE_END		0xfe600000
 
-#define VMALLOC_START		0xfe600000
+#ifndef __ASSEMBLY__
+extern unsigned long vmalloc_start_addr;
+#endif
+
+#define VMALLOC_START_SUN4	0xfe600000
+#define VMALLOC_START_SUN4M	0xfe300000
+#define VMALLOC_START		vmalloc_start_addr
 
 /* XXX Alter this when I get around to fixing sun4c - Anton */
 #define VMALLOC_END		0xffc00000
--- linux-2.6.10/arch/sparc/kernel/sparc_ksyms.c.BAD	2005-01-30 18:06:30.221225966 -0500
+++ linux-2.6.10/arch/sparc/kernel/sparc_ksyms.c	2005-01-30 18:06:59.802728894 -0500
@@ -135,6 +135,7 @@
 EXPORT_SYMBOL(__down_trylock);
 EXPORT_SYMBOL(__down_interruptible);
 
+EXPORT_SYMBOL(vmalloc_start_addr);
 EXPORT_SYMBOL(sparc_valid_addr_bitmap);
 EXPORT_SYMBOL(phys_base);
 EXPORT_SYMBOL(pfn_base);

Reply via email to