diff options
Diffstat (limited to 'arch/parisc/mm/init.c')
| -rw-r--r-- | arch/parisc/mm/init.c | 79 | 
1 files changed, 33 insertions, 46 deletions
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index b0f96c0e631..0bef864264c 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c @@ -32,6 +32,7 @@  #include <asm/sections.h>  extern int  data_start; +extern void parisc_kernel_start(void);	/* Kernel entry point in head.S */  #if PT_NLEVELS == 3  /* NOTE: This layout exactly conforms to the hybrid L2/L3 page table layout @@ -324,8 +325,9 @@ static void __init setup_bootmem(void)  	reserve_bootmem_node(NODE_DATA(0), 0UL,  			(unsigned long)(PAGE0->mem_free +  				PDC_CONSOLE_IO_IODC_SIZE), BOOTMEM_DEFAULT); -	reserve_bootmem_node(NODE_DATA(0), __pa((unsigned long)_text), -			(unsigned long)(_end - _text), BOOTMEM_DEFAULT); +	reserve_bootmem_node(NODE_DATA(0), __pa(KERNEL_BINARY_TEXT_START), +			(unsigned long)(_end - KERNEL_BINARY_TEXT_START), +			BOOTMEM_DEFAULT);  	reserve_bootmem_node(NODE_DATA(0), (bootmap_start_pfn << PAGE_SHIFT),  			((bootmap_pfn - bootmap_start_pfn) << PAGE_SHIFT),  			BOOTMEM_DEFAULT); @@ -378,6 +380,17 @@ static void __init setup_bootmem(void)  	request_resource(&sysram_resources[0], &pdcdata_resource);  } +static int __init parisc_text_address(unsigned long vaddr) +{ +	static unsigned long head_ptr __initdata; + +	if (!head_ptr) +		head_ptr = PAGE_MASK & (unsigned long) +			dereference_function_descriptor(&parisc_kernel_start); + +	return core_kernel_text(vaddr) || vaddr == head_ptr; +} +  static void __init map_pages(unsigned long start_vaddr,  			     unsigned long start_paddr, unsigned long size,  			     pgprot_t pgprot, int force) @@ -466,7 +479,7 @@ static void __init map_pages(unsigned long start_vaddr,  				 */  				if (force)  					pte =  __mk_pte(address, pgprot); -				else if (core_kernel_text(vaddr) && +				else if (parisc_text_address(vaddr) &&  					 address != fv_addr)  					pte = __mk_pte(address, PAGE_KERNEL_EXEC);  				else @@ -632,55 +645,30 @@ EXPORT_SYMBOL(empty_zero_page);  void show_mem(unsigned int filter)  { -	int i,free = 0,total = 0,reserved = 0; -	int shared = 0, cached = 0; +	int total = 0,reserved = 0; +	pg_data_t *pgdat;  	printk(KERN_INFO "Mem-info:\n");  	show_free_areas(filter); -	if (filter & SHOW_MEM_FILTER_PAGE_COUNT) -		return; -#ifndef CONFIG_DISCONTIGMEM -	i = max_mapnr; -	while (i-- > 0) { -		total++; -		if (PageReserved(mem_map+i)) -			reserved++; -		else if (PageSwapCache(mem_map+i)) -			cached++; -		else if (!page_count(&mem_map[i])) -			free++; -		else -			shared += page_count(&mem_map[i]) - 1; -	} -#else -	for (i = 0; i < npmem_ranges; i++) { -		int j; -		for (j = node_start_pfn(i); j < node_end_pfn(i); j++) { -			struct page *p; -			unsigned long flags; - -			pgdat_resize_lock(NODE_DATA(i), &flags); -			p = nid_page_nr(i, j) - node_start_pfn(i); - -			total++; -			if (PageReserved(p)) -				reserved++; -			else if (PageSwapCache(p)) -				cached++; -			else if (!page_count(p)) -				free++; -			else -				shared += page_count(p) - 1; -			pgdat_resize_unlock(NODE_DATA(i), &flags); -        	} +	for_each_online_pgdat(pgdat) { +		unsigned long flags; +		int zoneid; + +		pgdat_resize_lock(pgdat, &flags); +		for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) { +			struct zone *zone = &pgdat->node_zones[zoneid]; +			if (!populated_zone(zone)) +				continue; + +			total += zone->present_pages; +			reserved = zone->present_pages - zone->managed_pages; +		} +		pgdat_resize_unlock(pgdat, &flags);  	} -#endif +  	printk(KERN_INFO "%d pages of RAM\n", total);  	printk(KERN_INFO "%d reserved pages\n", reserved); -	printk(KERN_INFO "%d pages shared\n", shared); -	printk(KERN_INFO "%d pages swap cached\n", cached); -  #ifdef CONFIG_DISCONTIGMEM  	{ @@ -740,7 +728,6 @@ static void __init pagetable_init(void)  #endif  	empty_zero_page = alloc_bootmem_pages(PAGE_SIZE); -	memset(empty_zero_page, 0, PAGE_SIZE);  }  static void __init gateway_init(void)  | 
