
From: Dave McCracken <dmmcr@us.ibm.com>

runtime fixes for nonlinear on i386

Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
---

 include/linux/nonlinear.h                     |    0 
 memhotplug1-dave/arch/i386/kernel/acpi/boot.c |    4 ++--
 memhotplug1-dave/arch/i386/kernel/apic.c      |    2 +-
 memhotplug1-dave/arch/i386/kernel/efi.c       |    4 ++--
 memhotplug1-dave/arch/i386/kernel/setup.c     |   14 ++++++++++----
 memhotplug1-dave/arch/i386/kernel/smpboot.c   |    2 +-
 memhotplug1-dave/arch/i386/mm/init.c          |   10 ++++------
 memhotplug1-dave/arch/i386/mm/pgtable.c       |    3 +--
 memhotplug1-dave/include/asm-i386/io.h        |    5 ++++-
 memhotplug1-dave/include/asm-i386/processor.h |    2 +-
 10 files changed, 26 insertions(+), 20 deletions(-)

diff -puN arch/i386/kernel/acpi/boot.c~F1-nonlinear-i386-more arch/i386/kernel/acpi/boot.c
--- memhotplug1/arch/i386/kernel/acpi/boot.c~F1-nonlinear-i386-more	2004-11-04 16:45:40.000000000 -0800
+++ memhotplug1-dave/arch/i386/kernel/acpi/boot.c	2004-11-04 16:45:40.000000000 -0800
@@ -624,9 +624,9 @@ acpi_find_rsdp (void)
 
 	if (efi_enabled) {
 		if (efi.acpi20)
-			return __pa(efi.acpi20);
+			return __boot_pa(efi.acpi20);
 		else if (efi.acpi)
-			return __pa(efi.acpi);
+			return __boot_pa(efi.acpi);
 	}
 	/*
 	 * Scan memory looking for the RSDP signature. First search EBDA (low
diff -puN arch/i386/kernel/apic.c~F1-nonlinear-i386-more arch/i386/kernel/apic.c
--- memhotplug1/arch/i386/kernel/apic.c~F1-nonlinear-i386-more	2004-11-04 16:45:40.000000000 -0800
+++ memhotplug1-dave/arch/i386/kernel/apic.c	2004-11-04 16:45:40.000000000 -0800
@@ -807,7 +807,7 @@ void __init init_apic_mappings(void)
 	 */
 	if (!smp_found_config && detect_init_APIC()) {
 		apic_phys = (unsigned long) alloc_bootmem_pages(PAGE_SIZE);
-		apic_phys = __pa(apic_phys);
+		apic_phys = __boot_pa(apic_phys);
 	} else
 		apic_phys = mp_lapic_addr;
 
diff -puN arch/i386/kernel/doublefault.c~F1-nonlinear-i386-more arch/i386/kernel/doublefault.c
diff -puN arch/i386/kernel/efi.c~F1-nonlinear-i386-more arch/i386/kernel/efi.c
--- memhotplug1/arch/i386/kernel/efi.c~F1-nonlinear-i386-more	2004-11-04 16:45:40.000000000 -0800
+++ memhotplug1-dave/arch/i386/kernel/efi.c	2004-11-04 16:45:40.000000000 -0800
@@ -102,9 +102,9 @@ static void efi_call_phys_prelog(void)
 	 */
 	local_flush_tlb();
 
-	cpu_gdt_descr[0].address = __pa(cpu_gdt_descr[0].address);
+	cpu_gdt_descr[0].address = __boot_pa(cpu_gdt_descr[0].address);
 	__asm__ __volatile__("lgdt %0":"=m"
-			    (*(struct Xgt_desc_struct *) __pa(&cpu_gdt_descr[0])));
+			    (*(struct Xgt_desc_struct *) __boot_pa(&cpu_gdt_descr[0])));
 }
 
 static void efi_call_phys_epilog(void)
diff -puN arch/i386/kernel/setup.c~F1-nonlinear-i386-more arch/i386/kernel/setup.c
--- memhotplug1/arch/i386/kernel/setup.c~F1-nonlinear-i386-more	2004-11-04 16:45:40.000000000 -0800
+++ memhotplug1-dave/arch/i386/kernel/setup.c	2004-11-04 16:45:40.000000000 -0800
@@ -121,6 +121,7 @@ unsigned char aux_device_present;
 extern void early_cpu_init(void);
 extern void dmi_scan_machine(void);
 extern void generic_apic_probe(char *);
+extern void zone_sizes_init(void);
 extern int root_mountflags;
 
 unsigned long saved_videomode;
@@ -1038,6 +1039,9 @@ static unsigned long __init setup_memory
 
 	find_max_pfn();
 
+	setup_memsections();
+	alloc_memsections(0, 0, max_pfn);
+
 	max_low_pfn = find_max_low_pfn();
 
 #ifdef CONFIG_HIGHMEM
@@ -1365,10 +1369,10 @@ void __init setup_arch(char **cmdline_p)
 	init_mm.end_data = (unsigned long) _edata;
 	init_mm.brk = init_pg_tables_end + PAGE_OFFSET;
 
-	code_resource.start = virt_to_phys(_text);
-	code_resource.end = virt_to_phys(_etext)-1;
-	data_resource.start = virt_to_phys(_etext);
-	data_resource.end = virt_to_phys(_edata)-1;
+	code_resource.start = __boot_pa(_text);
+	code_resource.end = __boot_pa(_etext)-1;
+	data_resource.start = __boot_pa(_etext);
+	data_resource.end = __boot_pa(_edata)-1;
 
 	parse_cmdline_early(cmdline_p);
 
@@ -1393,6 +1397,8 @@ void __init setup_arch(char **cmdline_p)
 	 * NOTE: at this point the bootmem allocator is fully available.
 	 */
 
+	zone_sizes_init();
+
 #ifdef CONFIG_EARLY_PRINTK
 	{
 		char *s = strstr(*cmdline_p, "earlyprintk=");
diff -puN arch/i386/kernel/smpboot.c~F1-nonlinear-i386-more arch/i386/kernel/smpboot.c
--- memhotplug1/arch/i386/kernel/smpboot.c~F1-nonlinear-i386-more	2004-11-04 16:45:40.000000000 -0800
+++ memhotplug1-dave/arch/i386/kernel/smpboot.c	2004-11-04 16:45:40.000000000 -0800
@@ -117,7 +117,7 @@ void __init smp_alloc_memory(void)
 	 * Has to be in very low memory so we can execute
 	 * real-mode AP code.
 	 */
-	if (__pa(trampoline_base) >= 0x9F000)
+	if (__boot_pa(trampoline_base) >= 0x9F000)
 		BUG();
 	/*
 	 * Make the SMP trampoline executable:
diff -puN arch/i386/mm/init.c~F1-nonlinear-i386-more arch/i386/mm/init.c
--- memhotplug1/arch/i386/mm/init.c~F1-nonlinear-i386-more	2004-11-04 16:45:40.000000000 -0800
+++ memhotplug1-dave/arch/i386/mm/init.c	2004-11-04 16:45:40.000000000 -0800
@@ -428,8 +428,6 @@ void __init zone_sizes_init(void)
 	}
 	free_area_init(zones_size);	
 }
-#else
-extern void zone_sizes_init(void);
 #endif /* !CONFIG_DISCONTIGMEM */
 
 static int disable_nx __initdata = 0;
@@ -715,14 +713,14 @@ static int noinline do_test_wp_bit(void)
 
 void free_initmem(void)
 {
-	unsigned long addr;
+	char *addr;
 
-	addr = (unsigned long)(&__init_begin);
-	for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
+	addr = &__init_begin[0];
+	for (; addr < &__init_end[0]; addr += PAGE_SIZE) {
 		ClearPageReserved(virt_to_page(addr));
 		set_page_count(virt_to_page(addr), 1);
 		memset((void *)addr, 0xcc, PAGE_SIZE);
-		free_page(addr);
+		free_page((unsigned long)addr);
 		totalram_pages++;
 	}
 	printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", (__init_end - __init_begin) >> 10);
diff -puN arch/i386/mm/pgtable.c~F1-nonlinear-i386-more arch/i386/mm/pgtable.c
--- memhotplug1/arch/i386/mm/pgtable.c~F1-nonlinear-i386-more	2004-11-04 16:45:40.000000000 -0800
+++ memhotplug1-dave/arch/i386/mm/pgtable.c	2004-11-04 16:45:40.000000000 -0800
@@ -36,7 +36,7 @@ void show_mem(void)
 	printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
 	for_each_pgdat(pgdat) {
 		for (i = 0; i < pgdat->node_spanned_pages; ++i) {
-			page = pgdat->node_mem_map + i;
+			page = pfn_to_page(pgdat->node_start_pfn + i);
 			total++;
 			if (PageHighMem(page))
 				highmem++;
@@ -54,7 +54,6 @@ void show_mem(void)
 	printk("%d pages shared\n",shared);
 	printk("%d pages swap cached\n",cached);
 }
-#endif
 
 /*
  * Associate a virtual page frame with a given physical page frame 
diff -puN arch/ppc64/kernel/prom.c~F1-nonlinear-i386-more arch/ppc64/kernel/prom.c
diff -puN arch/ppc64/mm/init.c~F1-nonlinear-i386-more arch/ppc64/mm/init.c
diff -puN include/asm-i386/io.h~F1-nonlinear-i386-more include/asm-i386/io.h
--- memhotplug1/include/asm-i386/io.h~F1-nonlinear-i386-more	2004-11-04 16:45:40.000000000 -0800
+++ memhotplug1-dave/include/asm-i386/io.h	2004-11-04 16:45:40.000000000 -0800
@@ -4,6 +4,9 @@
 #include <linux/config.h>
 #include <linux/string.h>
 #include <linux/compiler.h>
+#include <asm/page.h>
+#include <linux/nonlinear.h>
+
 
 /*
  * This file contains the definitions for the x86 IO instructions
@@ -64,7 +67,7 @@
  
 static inline unsigned long virt_to_phys(volatile void * address)
 {
-	return __pa(address);
+	return __pa((void *)address);
 }
 
 /**
diff -puN include/asm-i386/nonlinear.h~F1-nonlinear-i386-more include/asm-i386/nonlinear.h
diff -puN include/asm-i386/page.h~F1-nonlinear-i386-more include/asm-i386/page.h
diff -puN include/asm-i386/processor.h~F1-nonlinear-i386-more include/asm-i386/processor.h
--- memhotplug1/include/asm-i386/processor.h~F1-nonlinear-i386-more	2004-11-04 16:45:40.000000000 -0800
+++ memhotplug1-dave/include/asm-i386/processor.h	2004-11-04 16:45:40.000000000 -0800
@@ -182,7 +182,7 @@ static inline unsigned int cpuid_edx(uns
 }
 
 #define load_cr3(pgdir) \
-	asm volatile("movl %0,%%cr3": :"r" (__pa(pgdir)))
+	asm volatile("movl %0,%%cr3": :"r" (__boot_pa(pgdir)))
 
 
 /*
diff -puN include/linux/mm.h~F1-nonlinear-i386-more include/linux/mm.h
diff -puN include/linux/mmzone.h~F1-nonlinear-i386-more include/linux/mmzone.h
diff -puN include/linux/nonlinear.h~F1-nonlinear-i386-more include/linux/nonlinear.h
_
