diff options
Diffstat (limited to 'arch/openrisc/mm/init.c')
| -rw-r--r-- | arch/openrisc/mm/init.c | 44 | 
1 files changed, 17 insertions, 27 deletions
diff --git a/arch/openrisc/mm/init.c b/arch/openrisc/mm/init.c index 79dea9740a3..b3cbc670383 100644 --- a/arch/openrisc/mm/init.c +++ b/arch/openrisc/mm/init.c @@ -43,6 +43,7 @@  #include <asm/kmap_types.h>  #include <asm/fixmap.h>  #include <asm/tlbflush.h> +#include <asm/sections.h>  int mem_init_done; @@ -167,15 +168,26 @@ void __init paging_init(void)  		unsigned long *dtlb_vector = __va(0x900);  		unsigned long *itlb_vector = __va(0xa00); +		printk(KERN_INFO "itlb_miss_handler %p\n", &itlb_miss_handler); +		*itlb_vector = ((unsigned long)&itlb_miss_handler - +				(unsigned long)itlb_vector) >> 2; + +		/* Soft ordering constraint to ensure that dtlb_vector is +		 * the last thing updated +		 */ +		barrier(); +  		printk(KERN_INFO "dtlb_miss_handler %p\n", &dtlb_miss_handler);  		*dtlb_vector = ((unsigned long)&dtlb_miss_handler -  				(unsigned long)dtlb_vector) >> 2; -		printk(KERN_INFO "itlb_miss_handler %p\n", &itlb_miss_handler); -		*itlb_vector = ((unsigned long)&itlb_miss_handler - -				(unsigned long)itlb_vector) >> 2;  	} +	/* Soft ordering constraint to ensure that cache invalidation and +	 * TLB flush really happen _after_ code has been modified. +	 */ +	barrier(); +  	/* Invalidate instruction caches after code modification */  	mtspr(SPR_ICBIR, 0x900);  	mtspr(SPR_ICBIR, 0xa00); @@ -190,9 +202,6 @@ void __init paging_init(void)  /* References to section boundaries */ -extern char _stext, _etext, _edata, __bss_start, _end; -extern char __init_begin, __init_end; -  static int __init free_pages_init(void)  {  	int reservedpages, pfn; @@ -252,30 +261,11 @@ void __init mem_init(void)  #ifdef CONFIG_BLK_DEV_INITRD  void free_initrd_mem(unsigned long start, unsigned long end)  { -	printk(KERN_INFO "Freeing initrd memory: %ldk freed\n", -	       (end - start) >> 10); - -	for (; start < end; start += PAGE_SIZE) { -		ClearPageReserved(virt_to_page(start)); -		init_page_count(virt_to_page(start)); -		free_page(start); -		totalram_pages++; -	} +	free_reserved_area(start, end, 0, "initrd");  }  #endif  void free_initmem(void)  { -	unsigned long addr; - -	addr = (unsigned long)(&__init_begin); -	for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { -		ClearPageReserved(virt_to_page(addr)); -		init_page_count(virt_to_page(addr)); -		free_page(addr); -		totalram_pages++; -	} -	printk(KERN_INFO "Freeing unused kernel memory: %luk freed\n", -	       ((unsigned long)&__init_end - -		(unsigned long)&__init_begin) >> 10); +	free_initmem_default(0);  }  |