patch-2.4.17 linux/arch/sparc64/mm/init.c
Next file: linux/arch/sparc64/mm/modutil.c
Previous file: linux/arch/sparc64/mm/extable.c
Back to the patch index
Back to the overall index
- Lines: 149
- Date:
Fri Dec 21 16:40:32 2001
- Orig file:
linux-2.4.16/arch/sparc64/mm/init.c
- Orig date:
Tue Nov 13 17:16:05 2001
diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.16/arch/sparc64/mm/init.c linux/arch/sparc64/mm/init.c
@@ -1,4 +1,4 @@
-/* $Id: init.c,v 1.202 2001/11/13 00:49:28 davem Exp $
+/* $Id: init.c,v 1.207 2001/11/30 06:55:39 davem Exp $
* arch/sparc64/mm/init.c
*
* Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu)
@@ -63,6 +63,8 @@
struct page *mem_map_zero;
+int bigkernel = 0;
+
int do_check_pgt_cache(int low, int high)
{
int freed = 0;
@@ -111,7 +113,7 @@
extern void __update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t);
-#ifdef DCFLUSH_DEBUG
+#ifdef CONFIG_DEBUG_DCFLUSH
atomic_t dcpage_flushes = ATOMIC_INIT(0);
#ifdef CONFIG_SMP
atomic_t dcpage_flushes_xcall = ATOMIC_INIT(0);
@@ -120,7 +122,7 @@
__inline__ void flush_dcache_page_impl(struct page *page)
{
-#ifdef DCFLUSH_DEBUG
+#ifdef CONFIG_DEBUG_DCFLUSH
atomic_inc(&dcpage_flushes);
#endif
@@ -152,7 +154,7 @@
"casx [%2], %%g7, %%g5\n\t"
"cmp %%g7, %%g5\n\t"
"bne,pn %%xcc, 1b\n\t"
- " nop"
+ " membar #StoreLoad | #StoreStore"
: /* no outputs */
: "r" (mask), "r" (non_cpu_bits), "r" (&page->flags)
: "g5", "g7");
@@ -172,7 +174,7 @@
"casx [%2], %%g7, %%g5\n\t"
"cmp %%g7, %%g5\n\t"
"bne,pn %%xcc, 1b\n\t"
- " nop\n"
+ " membar #StoreLoad | #StoreStore\n"
"2:"
: /* no outputs */
: "r" (cpu), "r" (mask), "r" (&page->flags)
@@ -261,14 +263,14 @@
else
seq_printf(m, "MMU Type\t: ???\n");
-#ifdef DCFLUSH_DEBUG
+#ifdef CONFIG_DEBUG_DCFLUSH
seq_printf(m, "DCPageFlushes\t: %d\n",
atomic_read(&dcpage_flushes));
#ifdef CONFIG_SMP
seq_printf(m, "DCPageFlushesXC\t: %d\n",
atomic_read(&dcpage_flushes_xcall));
#endif /* CONFIG_SMP */
-#endif /* DCFLUSH_DEBUG */
+#endif /* CONFIG_DEBUG_DCFLUSH */
}
struct linux_prom_translation {
@@ -505,6 +507,10 @@
(unsigned long) KERNBASE,
prom_get_mmu_ihandle());
+ if (bigkernel)
+ remap_func(((tte_data + 0x400000) & _PAGE_PADDR),
+ (unsigned long) KERNBASE + 0x400000, prom_get_mmu_ihandle());
+
/* Flush out that temporary mapping. */
spitfire_flush_dtlb_nucleus_page(0x0);
spitfire_flush_itlb_nucleus_page(0x0);
@@ -512,6 +518,12 @@
/* Now lock us back into the TLBs via OBP. */
prom_dtlb_load(sparc64_highest_locked_tlbent(), tte_data, tte_vaddr);
prom_itlb_load(sparc64_highest_locked_tlbent(), tte_data, tte_vaddr);
+ if (bigkernel) {
+ prom_dtlb_load(sparc64_highest_locked_tlbent()-1, tte_data + 0x400000,
+ tte_vaddr + 0x400000);
+ prom_itlb_load(sparc64_highest_locked_tlbent()-1, tte_data + 0x400000,
+ tte_vaddr + 0x400000);
+ }
/* Re-read translations property. */
if ((n = prom_getproperty(node, "translations", (char *)trans, tsz)) == -1) {
@@ -528,6 +540,8 @@
unsigned long avoid_start = (unsigned long) KERNBASE;
unsigned long avoid_end = avoid_start + (4 * 1024 * 1024);
+ if (bigkernel)
+ avoid_end += (4 * 1024 * 1024);
if (vaddr < avoid_start) {
unsigned long top = vaddr + size;
@@ -714,7 +728,8 @@
}
}
if (tlb_type == spitfire) {
- for (i = 0; i < SPITFIRE_HIGHEST_LOCKED_TLBENT; i++) {
+ int high = SPITFIRE_HIGHEST_LOCKED_TLBENT - bigkernel;
+ for (i = 0; i < high; i++) {
unsigned long data;
/* Spitfire Errata #32 workaround */
@@ -752,7 +767,7 @@
}
}
- for (i = 0; i < SPITFIRE_HIGHEST_LOCKED_TLBENT; i++) {
+ for (i = 0; i < high; i++) {
unsigned long data;
/* Spitfire Errata #32 workaround */
@@ -790,7 +805,9 @@
}
}
} else if (tlb_type == cheetah) {
- for (i = 0; i < CHEETAH_HIGHEST_LOCKED_TLBENT; i++) {
+ int high = CHEETAH_HIGHEST_LOCKED_TLBENT - bigkernel;
+
+ for (i = 0; i < high; i++) {
unsigned long data;
data = cheetah_get_ldtlb_data(i);
@@ -814,7 +831,7 @@
}
}
- for (i = 0; i < CHEETAH_HIGHEST_LOCKED_TLBENT; i++) {
+ for (i = 0; i < high; i++) {
unsigned long data;
data = cheetah_get_litlb_data(i);
@@ -1282,6 +1299,8 @@
set_bit(0, mmu_context_bmap);
real_end = (unsigned long)&_end;
+ if ((real_end > ((unsigned long)KERNBASE + 0x400000)))
+ bigkernel = 1;
#ifdef CONFIG_BLK_DEV_INITRD
if (sparc_ramdisk_image)
real_end = (PAGE_ALIGN(real_end) + PAGE_ALIGN(sparc_ramdisk_size));
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)