patch-2.4.0-test3 linux/arch/mips64/mm/init.c

Next file: linux/arch/mips64/mm/r4xx0.c
Previous file: linux/arch/mips64/mm/fault.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test2/linux/arch/mips64/mm/init.c linux/arch/mips64/mm/init.c
@@ -56,7 +56,7 @@
 void __bad_pmd(pgd_t *pgd)
 {
 	printk("Bad pgd in pmd_alloc: %08lx\n", pgd_val(*pgd));
-	pgd_set(pgd, (pmd_t *) BAD_PAGETABLE);
+	pgd_set(pgd, empty_bad_pmd_table);
 }
 
 void pgd_init(unsigned long page)
@@ -93,7 +93,7 @@
 	return ret;
 }
 
-void pmd_init(unsigned long addr)
+void pmd_init(unsigned long addr, unsigned long pagetable)
 {
 	unsigned long *p, *end;
 
@@ -101,14 +101,14 @@
 	end = p + PTRS_PER_PMD;
 
 	while (p < end) {
-		p[0] = (unsigned long) invalid_pte_table;
-		p[1] = (unsigned long) invalid_pte_table;
-		p[2] = (unsigned long) invalid_pte_table;
-		p[3] = (unsigned long) invalid_pte_table;
-		p[4] = (unsigned long) invalid_pte_table;
-		p[5] = (unsigned long) invalid_pte_table;
-		p[6] = (unsigned long) invalid_pte_table;
-		p[7] = (unsigned long) invalid_pte_table;
+		p[0] = (unsigned long)pagetable;
+		p[1] = (unsigned long)pagetable;
+		p[2] = (unsigned long)pagetable;
+		p[3] = (unsigned long)pagetable;
+		p[4] = (unsigned long)pagetable;
+		p[5] = (unsigned long)pagetable;
+		p[6] = (unsigned long)pagetable;
+		p[7] = (unsigned long)pagetable;
 		p += 8;
 	}
 }
@@ -120,7 +120,7 @@
 	pmd = (pmd_t *) __get_free_pages(GFP_KERNEL, 1);
 	if (pgd_none(*pgd)) {
 		if (pmd) {
-			pmd_init((unsigned long)pmd);
+			pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
 			pgd_set(pgd, pmd);
 			return pmd + offset;
 		}
@@ -161,7 +161,7 @@
 {
 	pte_t *page;
 
-	page = (pte_t *) __get_free_pages(GFP_KERNEL, 1);
+	page = (pte_t *) __get_free_pages(GFP_KERNEL, 0);
 	if (pmd_none(*pmd)) {
 		if (page) {
 			clear_page(page);
@@ -171,7 +171,7 @@
 		pmd_set(pmd, BAD_PAGETABLE);
 		return NULL;
 	}
-	free_pages((unsigned long)page, 1);
+	free_pages((unsigned long)page, 0);
 	if (pmd_bad(*pmd)) {
 		__bad_pte(pmd);
 		return NULL;
@@ -246,21 +246,6 @@
 	return 1UL << order;
 }
 
-extern inline void pte_init(unsigned long page)
-{
-	unsigned long *p, *end, bp;
-
-	bp = pte_val(BAD_PAGE);
- 	p = (unsigned long *) page;
-	end = p + (2 * PTRS_PER_PTE);
-
-	while (p < end) {
-		p[0] = p[1] = p[2] = p[3] =
-		p[4] = p[5] = p[6] = p[7] = bp;
-		p += 8;
-	}
-}
-
 /*
  * BAD_PAGE is the page that is used for page faults when linux
  * is out-of-memory. Older versions of linux just did a
@@ -276,33 +261,17 @@
  */
 pmd_t * __bad_pmd_table(void)
 {
-	extern pmd_t invalid_pmd_table[PTRS_PER_PMD];
-	unsigned long page;
-
-	page = (unsigned long) invalid_pmd_table;
-	pmd_init(page);
-
-	return (pmd_t *) page;
+	return empty_bad_pmd_table;
 }
 
 pte_t * __bad_pagetable(void)
 {
-	extern char empty_bad_page_table[PAGE_SIZE];
-	unsigned long page;
-
-	page = (unsigned long) empty_bad_page_table;
-	pte_init(page);
-
-	return (pte_t *) page;
+	return empty_bad_page_table;
 }
 
 pte_t __bad_page(void)
 {
-	extern char empty_bad_page[PAGE_SIZE];
-	unsigned long page = (unsigned long) empty_bad_page;
-
-	clear_page((void *)page);
-	return pte_mkdirty(mk_pte_phys(__pa(page), PAGE_SHARED));
+	return __pte(0);
 }
 
 void show_mem(void)
@@ -337,7 +306,7 @@
 #ifndef CONFIG_DISCONTIGMEM
 /* References to section boundaries */
 
-extern char _ftext, _etext, _fdata, _edata;
+extern char _stext, _etext, _fdata, _edata;
 extern char __init_begin, __init_end;
 
 void __init paging_init(void)
@@ -347,8 +316,10 @@
 
 	/* Initialize the entire pgd.  */
 	pgd_init((unsigned long)swapper_pg_dir);
-	pmd_init((unsigned long)invalid_pmd_table);
-	memset((void *)invalid_pte_table, 0, sizeof(pte_t) * 2 * PTRS_PER_PTE);
+	pmd_init((unsigned long)invalid_pmd_table, (unsigned long)invalid_pte_table);
+	memset((void *)invalid_pte_table, 0, sizeof(pte_t) * PTRS_PER_PTE);
+	pmd_init((unsigned long)empty_bad_pmd_table, (unsigned long)empty_bad_page_table);
+	memset((void *)empty_bad_page_table, 0, sizeof(pte_t) * PTRS_PER_PTE);
 
 	max_dma =  virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
 	low = max_low_pfn;
@@ -384,7 +355,7 @@
 				reservedpages++;
 		}
 
-	codesize =  (unsigned long) &_etext - (unsigned long) &_ftext;
+	codesize =  (unsigned long) &_etext - (unsigned long) &_stext;
 	datasize =  (unsigned long) &_edata - (unsigned long) &_fdata;
 	initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
 

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)