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);