Skip to contentSkip to conversation

x86: move e820_resource_resources to e820.c

PATCH New Yinghai Lu 4 participants 13 messages Jun 16, 2008 – Jun 19, 2008

Subsystems (2)
lore
Share & tools
lore

Yinghai Lu

author
#0 lore raw

PATCH 1/1 x86: move e820_resource_resources to e820.c

and make 32bit resource register more like 64 bit.

also move probe_roms back to setup_32.c

arch/x86/kernel/e820.c +32 -0
Index: linux-2.6/arch/x86/kernel/e820.c
===================================================================
@@ -965,3 +965,35 @@ void __init finish_e820_parsing(void)
 		e820_print_map("user");
 	}
 }
+
+/*
+ * Mark e820 reserved areas as busy for the resource manager.
+ */
+void __init e820_reserve_resources(void)
+{
+	int i;
+	struct resource *res;
+
+	res = alloc_bootmem_low(sizeof(struct resource) * e820.nr_map);
+	for (i = 0; i < e820.nr_map; i++) {
+		switch (e820.map[i].type) {
+		case E820_RAM:	res->name = "System RAM"; break;
+		case E820_ACPI:	res->name = "ACPI Tables"; break;
+		case E820_NVS:	res->name = "ACPI Non-volatile Storage"; break;
+		default:	res->name = "reserved";
+		}
+		res->start = e820.map[i].addr;
+		res->end = res->start + e820.map[i].size - 1;
+#ifndef CONFIG_RESOURCES_64BIT
+		if (res->end > 0x100000000ULL) {
+			res++;
+			continue;
+		}
+#endif
+		res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
+		insert_resource(&iomem_resource, res);
+		res++;
+	}
+}
+
+
arch/x86/kernel/e820_32.c +0 -192

198 lines not on this page · raw message

arch/x86/kernel/e820_64.c +0 -24
Index: linux-2.6/arch/x86/kernel/e820_64.c
===================================================================
@@ -41,30 +41,6 @@ unsigned long end_pfn;
  */
 unsigned long max_pfn_mapped;
 
-/*
- * Mark e820 reserved areas as busy for the resource manager.
- */
-void __init e820_reserve_resources(void)
-{
-	int i;
-	struct resource *res;
-
-	res = alloc_bootmem_low(sizeof(struct resource) * e820.nr_map);
-	for (i = 0; i < e820.nr_map; i++) {
-		switch (e820.map[i].type) {
-		case E820_RAM:	res->name = "System RAM"; break;
-		case E820_ACPI:	res->name = "ACPI Tables"; break;
-		case E820_NVS:	res->name = "ACPI Non-volatile Storage"; break;
-		default:	res->name = "reserved";
-		}
-		res->start = e820.map[i].addr;
-		res->end = res->start + e820.map[i].size - 1;
-		res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-		insert_resource(&iomem_resource, res);
-		res++;
-	}
-}
-
 static void early_panic(char *msg)
 {
 	early_printk(msg);
arch/x86/kernel/setup_32.c +174 -32

251 lines not on this page · raw message

include/asm-x86/e820.h +1 -0
Index: linux-2.6/include/asm-x86/e820.h
===================================================================
@@ -98,6 +98,7 @@ extern void e820_register_active_regions
 					 unsigned long end_pfn);
 extern u64 e820_hole_size(u64 start, u64 end);
 extern void finish_e820_parsing(void);
+extern void e820_reserve_resources(void);
 
 #endif /* __ASSEMBLY__ */
 
include/asm-x86/e820_32.h +0 -4
Index: linux-2.6/include/asm-x86/e820_32.h
===================================================================
@@ -20,9 +20,5 @@
 
 extern void setup_memory_map(void);
 
-extern void init_iomem_resources(struct resource *code_resource,
-				 struct resource *data_resource,
-				 struct resource *bss_resource);
-
 #endif/*!__ASSEMBLY__*/
 #endif/*__E820_HEADER*/
include/asm-x86/e820_64.h +0 -1
Index: linux-2.6/include/asm-x86/e820_64.h
===================================================================
@@ -16,7 +16,6 @@
 #ifndef __ASSEMBLY__
 extern void setup_memory_region(void);
 extern void contig_e820_setup(void);
-extern void e820_reserve_resources(void);
 extern int e820_any_non_reserved(unsigned long start, unsigned long end);
 extern int is_memory_any_valid(unsigned long start, unsigned long end);
 extern int e820_all_non_reserved(unsigned long start, unsigned long end);
author
#1 lore raw

PATCH 1/1 x86: merge setup_memory_map with e820

and kill e820_32/64.c and e820_32/64.h

arch/x86/mm/init_64.c +12 -0
Index: linux-2.6/arch/x86/mm/init_64.c
===================================================================
@@ -48,6 +48,18 @@
 #include <asm/numa.h>
 #include <asm/cacheflush.h>
 
+/*
+ * PFN of last memory page.
+ */
+unsigned long end_pfn;
+
+/*
+ * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries.
+ * The direct mapping extends to max_pfn_mapped, so that we can directly access
+ * apertures, ACPI and other tables without having to play with fixmaps.
+ */
+unsigned long max_pfn_mapped;
+
 static unsigned long dma_reserve __initdata;
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
arch/x86/kernel/setup_64.c +1 -7
Index: linux-2.6/arch/x86/kernel/setup_64.c
===================================================================
@@ -281,12 +281,6 @@ static inline void __init reserve_crashk
 {}
 #endif
 
-/* Overridden in paravirt.c if CONFIG_PARAVIRT */
-void __attribute__((weak)) __init memory_setup(void)
-{
-       machine_specific_memory_setup();
-}
-
 /* Current gdt points %fs at the "master" per-cpu area: after this,
  * it's on the real one. */
 void switch_to_new_gdt(void)
@@ -330,7 +324,7 @@ void __init setup_arch(char **cmdline_p)
 
 	ARCH_SETUP
 
-	memory_setup();
+	setup_memory_map();
 	copy_edd();
 
 	if (!boot_params.hdr.root_flags)
arch/x86/kernel/e820_64.c deleted +0 -92

92 lines not on this page · raw message

arch/x86/kernel/e820_32.c deleted +0 -29
Index: linux-2.6/arch/x86/kernel/e820_32.c
===================================================================
@@ -1,29 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/bootmem.h>
-#include <linux/ioport.h>
-#include <linux/string.h>
-#include <linux/kexec.h>
-#include <linux/module.h>
-#include <linux/mm.h>
-#include <linux/pfn.h>
-#include <linux/uaccess.h>
-
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <asm/e820.h>
-#include <asm/setup.h>
-
-/* Overridden in paravirt.c if CONFIG_PARAVIRT */
-char * __init __attribute__((weak)) memory_setup(void)
-{
-	return machine_specific_memory_setup();
-}
-
-void __init setup_memory_map(void)
-{
-	printk(KERN_INFO "BIOS-provided physical RAM map:\n");
-	e820_print_map(memory_setup());
-}
-
arch/x86/kernel/e820.c +72 -0

76 lines not on this page · raw message

include/asm-x86/e820_32.h deleted +0 -24
Index: linux-2.6/include/asm-x86/e820_32.h
===================================================================
@@ -1,24 +0,0 @@
-/*
- * structures and definitions for the int 15, ax=e820 memory map
- * scheme.
- *
- * In a nutshell, arch/i386/boot/setup.S populates a scratch table
- * in the empty_zero_block that contains a list of usable address/size
- * duples.   In arch/i386/kernel/setup.c, this information is
- * transferred into the e820map, and in arch/i386/mm/init.c, that
- * new information is used to mark pages reserved or not.
- *
- */
-#ifndef __E820_HEADER
-#define __E820_HEADER
-
-#include <linux/ioport.h>
-
-#define HIGH_MEMORY	(1024*1024)
-
-#ifndef __ASSEMBLY__
-
-extern void setup_memory_map(void);
-
-#endif/*!__ASSEMBLY__*/
-#endif/*__E820_HEADER*/
include/asm-x86/e820_64.h deleted +0 -26
Index: linux-2.6/include/asm-x86/e820_64.h
===================================================================
@@ -1,26 +0,0 @@
-/*
- * structures and definitions for the int 15, ax=e820 memory map
- * scheme.
- *
- * In a nutshell, setup.S populates a scratch table in the
- * empty_zero_block that contains a list of usable address/size
- * duples.  setup.c, this information is transferred into the e820map,
- * and in init.c/numa.c, that new information is used to mark pages
- * reserved or not.
- */
-#ifndef __E820_HEADER
-#define __E820_HEADER
-
-#include <linux/ioport.h>
-
-#ifndef __ASSEMBLY__
-extern void setup_memory_region(void);
-extern void contig_e820_setup(void);
-extern int e820_any_non_reserved(unsigned long start, unsigned long end);
-extern int is_memory_any_valid(unsigned long start, unsigned long end);
-extern int e820_all_non_reserved(unsigned long start, unsigned long end);
-extern int is_memory_all_valid(unsigned long start, unsigned long end);
-
-#endif/*!__ASSEMBLY__*/
-
-#endif/*__E820_HEADER*/
include/asm-x86/e820.h +6 -3
Index: linux-2.6/include/asm-x86/e820.h
===================================================================
@@ -99,6 +99,9 @@ extern void e820_register_active_regions
 extern u64 e820_hole_size(u64 start, u64 end);
 extern void finish_e820_parsing(void);
 extern void e820_reserve_resources(void);
+extern void setup_memory_map(void);
+extern char *machine_specific_memory_setup(void);
+extern char *memory_setup(void);
 
 #endif /* __ASSEMBLY__ */
 
@@ -109,10 +112,10 @@ extern void e820_reserve_resources(void)
 #define BIOS_END		0x00100000
 
 #ifdef __KERNEL__
+#include <linux/ioport.h>
+
 #ifdef CONFIG_X86_32
-# include "e820_32.h"
-#else
-# include "e820_64.h"
+#define HIGH_MEMORY	(1024*1024)
 #endif
 #endif /* __KERNEL__ */
 
arch/x86/mach-default/setup.c +0 -47

50 lines not on this page · raw message

include/asm-x86/setup.h +0 -5
Index: linux-2.6/include/asm-x86/setup.h
===================================================================
@@ -8,7 +8,6 @@
 /* Interrupt control for vSMPowered x86_64 systems */
 void vsmp_init(void);
 
-char *machine_specific_memory_setup(void);
 #ifndef CONFIG_PARAVIRT
 #define paravirt_post_allocator_init()	do {} while (0)
 #endif
@@ -50,10 +49,6 @@ extern struct boot_params boot_params;
  */
 #define LOWMEMSIZE()	(0x9f000)
 
-char * __init machine_specific_memory_setup(void);
-char *memory_setup(void);
-
-
 void __init i386_start_kernel(void);
 
 extern unsigned long init_pg_tables_start;
arch/x86/kernel/Makefile +1 -1
Index: linux-2.6/arch/x86/kernel/Makefile
===================================================================
@@ -30,7 +30,7 @@ obj-y			+= setup_$(BITS).o i8259.o irqin
 obj-$(CONFIG_X86_32)	+= sys_i386_32.o i386_ksyms_32.o
 obj-$(CONFIG_X86_64)	+= sys_x86_64.o x8664_ksyms_64.o
 obj-$(CONFIG_X86_64)	+= syscall_64.o vsyscall_64.o setup64.o
-obj-y			+= bootflag.o e820_$(BITS).o e820.o
+obj-y			+= bootflag.o e820.o
 obj-y			+= pci-dma.o quirks.o i8237.o topology.o kdebugfs.o
 obj-y			+= alternative.o i8253.o pci-nommu.o
 obj-y			+= tsc_$(BITS).o io_delay.o rtc.o
#2 lore raw

Re: [PATCH] x86: merge setup_memory_map with e820

Quoted 202 lines · Yinghai Lu

and kill e820_32/64.c and e820_32/64.h

Index: linux-2.6/arch/x86/mm/init_64.c
===================================================================

arch/x86/mm/init_64.c +12 -0
@@ -48,6 +48,18 @@
 #include <asm/numa.h>
 #include <asm/cacheflush.h>
 
+/*
+ * PFN of last memory page.
+ */
+unsigned long end_pfn;
+
+/*
+ * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries.
+ * The direct mapping extends to max_pfn_mapped, so that we can directly access
+ * apertures, ACPI and other tables without having to play with fixmaps.
+ */
+unsigned long max_pfn_mapped;
+
 static unsigned long dma_reserve __initdata;
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);

Index: linux-2.6/arch/x86/kernel/setup_64.c
===================================================================

arch/x86/kernel/setup_64.c +1 -7
@@ -281,12 +281,6 @@ static inline void __init reserve_crashk
 {}
 #endif
 
-/* Overridden in paravirt.c if CONFIG_PARAVIRT */
-void __attribute__((weak)) __init memory_setup(void)
-{
-       machine_specific_memory_setup();
-}
-
 /* Current gdt points %fs at the "master" per-cpu area: after this,
 * it's on the real one. */
 void switch_to_new_gdt(void)
@@ -330,7 +324,7 @@ void __init setup_arch(char **cmdline_p)
 
       ARCH_SETUP
 
-       memory_setup();
+       setup_memory_map();
       copy_edd();
 
       if (!boot_params.hdr.root_flags)

Index: linux-2.6/arch/x86/kernel/e820_64.c
===================================================================

arch/x86/kernel/e820_64.c deleted +0 -92
@@ -1,92 +0,0 @@
-/*
- * Handle the memory map.
- * The functions here do the job until bootmem takes over.
- *
- *  Getting sanitize_e820_map() in sync with i386 version by applying change:
- *  -  Provisions for empty E820 memory regions (reported by certain BIOSes).
- *     Alex Achenbach <[email protected]>, December 2002.
- *  Venkatesh Pallipadi <[email protected]>
- *
- */
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/bootmem.h>
-#include <linux/ioport.h>
-#include <linux/string.h>
-#include <linux/kexec.h>
-#include <linux/module.h>
-#include <linux/mm.h>
-#include <linux/pfn.h>
-#include <linux/pci.h>
-
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <asm/e820.h>
-#include <asm/proto.h>
-#include <asm/setup.h>
-#include <asm/sections.h>
-#include <asm/kdebug.h>
-#include <asm/trampoline.h>
-
-/*
- * PFN of last memory page.
- */
-unsigned long end_pfn;
-
-/*
- * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries.
- * The direct mapping extends to max_pfn_mapped, so that we can directly access
- * apertures, ACPI and other tables without having to play with fixmaps.
- */
-unsigned long max_pfn_mapped;
-
-static void early_panic(char *msg)
-{
-       early_printk(msg);
-       panic(msg);
-}
-
-/* We're not void only for x86 32-bit compat */
-char *__init machine_specific_memory_setup(void)
-{
-       char *who = "BIOS-e820";
-       int new_nr;
-       /*
-        * Try to copy the BIOS-supplied E820-map.
-        *
-        * Otherwise fake a memory map; one section from 0k->640k,
-        * the next section from 1mb->appropriate_mem_k
-        */
-       new_nr = boot_params.e820_entries;
-       sanitize_e820_map(boot_params.e820_map,
-                       ARRAY_SIZE(boot_params.e820_map),
-                       &new_nr);
-       boot_params.e820_entries = new_nr;
-       if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0)
-               early_panic("Cannot find a valid memory map");
-       printk(KERN_INFO "BIOS-provided physical RAM map:\n");
-       e820_print_map(who);
-
-       /* In case someone cares... */
-       return who;
-}
-
-int __init arch_get_ram_range(int slot, u64 *addr, u64 *size)
-{
-       int i;
-
-       if (slot < 0 || slot >= e820.nr_map)
-               return -1;
-       for (i = slot; i < e820.nr_map; i++) {
-               if (e820.map[i].type != E820_RAM)
-                       continue;
-               break;
-       }
-       if (i == e820.nr_map || e820.map[i].addr > (max_pfn << PAGE_SHIFT))
-               return -1;
-       *addr = e820.map[i].addr;
-       *size = min_t(u64, e820.map[i].size + e820.map[i].addr,
-               max_pfn << PAGE_SHIFT) - *addr;
-       return i + 1;
-}

Index: linux-2.6/arch/x86/kernel/e820_32.c
===================================================================

arch/x86/kernel/e820_32.c deleted +0 -29
@@ -1,29 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/bootmem.h>
-#include <linux/ioport.h>
-#include <linux/string.h>
-#include <linux/kexec.h>
-#include <linux/module.h>
-#include <linux/mm.h>
-#include <linux/pfn.h>
-#include <linux/uaccess.h>
-
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <asm/e820.h>
-#include <asm/setup.h>
-
-/* Overridden in paravirt.c if CONFIG_PARAVIRT */
-char * __init __attribute__((weak)) memory_setup(void)
-{
-       return machine_specific_memory_setup();
-}
-
-void __init setup_memory_map(void)
-{
-       printk(KERN_INFO "BIOS-provided physical RAM map:\n");
-       e820_print_map(memory_setup());
-}
-

Index: linux-2.6/arch/x86/kernel/e820.c
===================================================================

arch/x86/kernel/e820.c +9 -0
@@ -996,4 +996,76 @@ void __init e820_reserve_resources(void)
       }
 }
 
+char *__init __attribute__((weak)) machine_specific_memory_setup(void)
+{
+       char *who = "BIOS-e820";
+       int new_nr;
+       /*
+        * Try to copy the BIOS-supplied E820-map.
+        *
+        * Otherwise fake a memory map; one section from 0k->640k,
+        * the next section from 1mb->appropriate_mem_k

arch/x86/kernel/e820.c void __init e820_reserve_resources(void) · line 1017

Quoted 10 lines
arch/x86/kernel/e820.c +10 -0
+        */
+       new_nr = boot_params.e820_entries;
+       sanitize_e820_map(boot_params.e820_map,
+                       ARRAY_SIZE(boot_params.e820_map),
+                       &new_nr);
+       boot_params.e820_entries = new_nr;
+       if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0) {
+#ifdef CONFIG_X86_64
+               early_panic("Cannot find a valid memory map");
+#else

Can't this be made dependant on HIGHMEM instead of X86_64? It seems high-memory dependant anyway. Also, are you sure
this code that maps into himem would work with HIGHMEM disabled anyway?

Quoted 239 lines
arch/x86/kernel/e820.c +53 -0
+               unsigned long mem_size;
 
+               /* compare results from other methods and take the greater */
+               if (boot_params.alt_mem_k
+                   < boot_params.screen_info.ext_mem_k) {
+                       mem_size = boot_params.screen_info.ext_mem_k;
+                       who = "BIOS-88";
+               } else {
+                       mem_size = boot_params.alt_mem_k;
+                       who = "BIOS-e801";
+               }
+
+               e820.nr_map = 0;
+               e820_add_region(0, LOWMEMSIZE(), E820_RAM);
+               e820_add_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
+#endif
+       }
+
+       /* In case someone cares... */
+       return who;
+}
+
+/* Overridden in paravirt.c if CONFIG_PARAVIRT */
+char * __init __attribute__((weak)) memory_setup(void)
+{
+       return machine_specific_memory_setup();
+}
+
+void __init setup_memory_map(void)
+{
+       printk(KERN_INFO "BIOS-provided physical RAM map:\n");
+       e820_print_map(memory_setup());
+}
+
+#ifdef CONFIG_X86_64
+int __init arch_get_ram_range(int slot, u64 *addr, u64 *size)
+{
+       int i;
+
+       if (slot < 0 || slot >= e820.nr_map)
+               return -1;
+       for (i = slot; i < e820.nr_map; i++) {
+               if (e820.map[i].type != E820_RAM)
+                       continue;
+               break;
+       }
+       if (i == e820.nr_map || e820.map[i].addr > (max_pfn << PAGE_SHIFT))
+               return -1;
+       *addr = e820.map[i].addr;
+       *size = min_t(u64, e820.map[i].size + e820.map[i].addr,
+               max_pfn << PAGE_SHIFT) - *addr;
+       return i + 1;
+}
+#endif

Index: linux-2.6/include/asm-x86/e820_32.h
===================================================================

include/asm-x86/e820_32.h deleted +0 -24
@@ -1,24 +0,0 @@
-/*
- * structures and definitions for the int 15, ax=e820 memory map
- * scheme.
- *
- * In a nutshell, arch/i386/boot/setup.S populates a scratch table
- * in the empty_zero_block that contains a list of usable address/size
- * duples.   In arch/i386/kernel/setup.c, this information is
- * transferred into the e820map, and in arch/i386/mm/init.c, that
- * new information is used to mark pages reserved or not.
- *
- */
-#ifndef __E820_HEADER
-#define __E820_HEADER
-
-#include <linux/ioport.h>
-
-#define HIGH_MEMORY    (1024*1024)
-
-#ifndef __ASSEMBLY__
-
-extern void setup_memory_map(void);
-
-#endif/*!__ASSEMBLY__*/
-#endif/*__E820_HEADER*/

Index: linux-2.6/include/asm-x86/e820_64.h
===================================================================

include/asm-x86/e820_64.h deleted +0 -26
@@ -1,26 +0,0 @@
-/*
- * structures and definitions for the int 15, ax=e820 memory map
- * scheme.
- *
- * In a nutshell, setup.S populates a scratch table in the
- * empty_zero_block that contains a list of usable address/size
- * duples.  setup.c, this information is transferred into the e820map,
- * and in init.c/numa.c, that new information is used to mark pages
- * reserved or not.
- */
-#ifndef __E820_HEADER
-#define __E820_HEADER
-
-#include <linux/ioport.h>
-
-#ifndef __ASSEMBLY__
-extern void setup_memory_region(void);
-extern void contig_e820_setup(void);
-extern int e820_any_non_reserved(unsigned long start, unsigned long end);
-extern int is_memory_any_valid(unsigned long start, unsigned long end);
-extern int e820_all_non_reserved(unsigned long start, unsigned long end);
-extern int is_memory_all_valid(unsigned long start, unsigned long end);
-
-#endif/*!__ASSEMBLY__*/
-
-#endif/*__E820_HEADER*/

Index: linux-2.6/include/asm-x86/e820.h
===================================================================

include/asm-x86/e820.h +6 -3
@@ -99,6 +99,9 @@ extern void e820_register_active_regions
 extern u64 e820_hole_size(u64 start, u64 end);
 extern void finish_e820_parsing(void);
 extern void e820_reserve_resources(void);
+extern void setup_memory_map(void);
+extern char *machine_specific_memory_setup(void);
+extern char *memory_setup(void);
 
 #endif /* __ASSEMBLY__ */
 
@@ -109,10 +112,10 @@ extern void e820_reserve_resources(void)
 #define BIOS_END               0x00100000
 
 #ifdef __KERNEL__
+#include <linux/ioport.h>
+
 #ifdef CONFIG_X86_32
-# include "e820_32.h"
-#else
-# include "e820_64.h"
+#define HIGH_MEMORY    (1024*1024)
 #endif
 #endif /* __KERNEL__ */
 

Index: linux-2.6/arch/x86/mach-default/setup.c
===================================================================

arch/x86/mach-default/setup.c +0 -47
@@ -142,50 +142,3 @@ static int __init print_ipi_mode(void)
 
 late_initcall(print_ipi_mode);
 
-/**
- * machine_specific_memory_setup - Hook for machine specific memory setup.
- *
- * Description:
- *     This is included late in kernel/setup.c so that it can make
- *     use of all of the static functions.
- **/
-
-char * __init machine_specific_memory_setup(void)
-{
-       char *who;
-       int new_nr;
-
-
-       who = "BIOS-e820";
-
-       /*
-        * Try to copy the BIOS-supplied E820-map.
-        *
-        * Otherwise fake a memory map; one section from 0k->640k,
-        * the next section from 1mb->appropriate_mem_k
-        */
-       new_nr = boot_params.e820_entries;
-       sanitize_e820_map(boot_params.e820_map,
-                       ARRAY_SIZE(boot_params.e820_map),
-                       &new_nr);
-       boot_params.e820_entries = new_nr;
-       if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries)
-           < 0) {
-               unsigned long mem_size;
-
-               /* compare results from other methods and take the greater */
-               if (boot_params.alt_mem_k
-                   < boot_params.screen_info.ext_mem_k) {
-                       mem_size = boot_params.screen_info.ext_mem_k;
-                       who = "BIOS-88";
-               } else {
-                       mem_size = boot_params.alt_mem_k;
-                       who = "BIOS-e801";
-               }
-
-               e820.nr_map = 0;
-               e820_add_region(0, LOWMEMSIZE(), E820_RAM);
-               e820_add_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
-       }
-       return who;
-}

Index: linux-2.6/include/asm-x86/setup.h
===================================================================

include/asm-x86/setup.h +0 -5
@@ -8,7 +8,6 @@
 /* Interrupt control for vSMPowered x86_64 systems */
 void vsmp_init(void);
 
-char *machine_specific_memory_setup(void);
 #ifndef CONFIG_PARAVIRT
 #define paravirt_post_allocator_init() do {} while (0)
 #endif
@@ -50,10 +49,6 @@ extern struct boot_params boot_params;
 */
 #define LOWMEMSIZE()   (0x9f000)
 
-char * __init machine_specific_memory_setup(void);
-char *memory_setup(void);
-
-
 void __init i386_start_kernel(void);
 
 extern unsigned long init_pg_tables_start;

Index: linux-2.6/arch/x86/kernel/Makefile
===================================================================

arch/x86/kernel/Makefile +1 -2
@@ -30,7 +30,7 @@ obj-y                 += setup_$(BITS).o i8259.o irqin
 obj-$(CONFIG_X86_32)   += sys_i386_32.o i386_ksyms_32.o
 obj-$(CONFIG_X86_64)   += sys_x86_64.o x8664_ksyms_64.o
 obj-$(CONFIG_X86_64)   += syscall_64.o vsyscall_64.o setup64.o
-obj-y                  += bootflag.o e820_$(BITS).o e820.o
+obj-y                  += bootflag.o e820.o
 obj-y                  += pci-dma.o quirks.o i8237.o topology.o kdebugfs.o
 obj-y                  += alternative.o i8253.o pci-nommu.o
 obj-y                  += tsc_$(BITS).o io_delay.o rtc.o
--

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Signature · 5 lines
Glauber Costa.
"Free as in Freedom"
http://glommer.net

"The less confident you are, the more serious you have to act."
#3 lore raw

Re: [PATCH] x86: merge setup_memory_map with e820

Quoted 10 lines · Glauber Costa

arch/x86/kernel/e820.c void __init e820_reserve_resources(void) · line 1017

Quoted 5 lines
arch/x86/kernel/e820.c +5 -0
+       boot_params.e820_entries = new_nr;
+       if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0) {
+#ifdef CONFIG_X86_64
+               early_panic("Cannot find a valid memory map");
+#else

Can't this be made dependant on HIGHMEM instead of X86_64? It seems high-memory dependant anyway. Also, are you sure
this code that maps into himem would work with HIGHMEM disabled anyway?

Uhm... x86-64 and HIGHMEM are mutually exclusive.

Either way, it shouldn't be dependent on anything; there is no reason why the #else clause can't be applied to both.

-hpa

author
#4 lore raw

Re: [PATCH] x86: merge setup_memory_map with e820

Quoted 12 lines · H. Peter Anvin
Quoted 11 lines · Glauber Costa

arch/x86/kernel/e820.c void __init e820_reserve_resources(void) · line 1017

Quoted 7 lines
(quoted diff) +2 -0
+       boot_params.e820_entries = new_nr;
+       if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries)

< 0) {

arch/x86/kernel/e820.c +3 -0
+#ifdef CONFIG_X86_64
+               early_panic("Cannot find a valid memory map");
+#else

Can't this be made dependant on HIGHMEM instead of X86_64? It seems high-memory dependant anyway. Also, are you sure
this code that maps into himem would work with HIGHMEM disabled anyway?

that is behavoir before merge.

Quoted 6 lines
Quoted 1 line

Uhm... x86-64 and HIGHMEM are mutually exclusive.

Either way, it shouldn't be dependent on anything; there is no reason why the #else clause can't be applied to both.

remove the early_panic?

YH

#5 lore raw

Re: [PATCH] x86: merge setup_memory_map with e820

Quoted 18 lines · Yinghai Lu
Quoted 12 lines · H. Peter Anvin
Quoted 11 lines · Glauber Costa

arch/x86/kernel/e820.c void __init e820_reserve_resources(void) · line 1017

Quoted 7 lines
(quoted diff) +2 -0
+       boot_params.e820_entries = new_nr;
+       if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries)

< 0) {

arch/x86/kernel/e820.c +3 -0
+#ifdef CONFIG_X86_64
+               early_panic("Cannot find a valid memory map");
+#else

Can't this be made dependant on HIGHMEM instead of X86_64? It seems high-memory dependant anyway. Also, are you sure
this code that maps into himem would work with HIGHMEM disabled anyway?

that is behavoir before merge.

Quoted 2 lines
Quoted 1 line
Quoted 6 lines
Quoted 4 lines

Uhm... x86-64 and HIGHMEM are mutually exclusive.

Either way, it shouldn't be dependent on anything; there is no reason why the #else clause can't be applied to both.

remove the early_panic?

If this can be done, I'm for it.
However, it would be better to leave this patch as is, and throw in another one that just address that, for bisectability purposes.

Quoted 2 lines

YH

Signature · 5 lines
Glauber Costa.
"Free as in Freedom"
http://glommer.net

"The less confident you are, the more serious you have to act."
#6 lore raw

Re: [PATCH] x86: merge setup_memory_map with e820

In reply to Yinghai Lu
Quoted 10 lines · Yinghai Lu

that is behavoir before merge.

Quoted 4 lines

Uhm... x86-64 and HIGHMEM are mutually exclusive.

Either way, it shouldn't be dependent on anything; there is no reason why the #else clause can't be applied to both.

remove the early_panic?

Yes, remove the early_panic(). Andi didn't want to support the non-e820 modes in x86-64, but if the code is unified there is no reason not to.

-hpa

author
#7 lore raw

Re: [PATCH] x86: merge setup_memory_map with e820

Quoted 6 lines · H. Peter Anvin
Quoted 5 lines · Yinghai Lu

that is behavoir before merge.

Quoted 2 lines

Uhm... x86-64 and HIGHMEM are mutually exclusive.

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

Either way, it shouldn't be dependent on anything; there is no reason why the #else clause can't be applied to both.

remove the early_panic?

Yes, remove the early_panic(). Andi didn't want to support the non-e820 modes in x86-64, but if the code is unified there is no reason not to.

OK, after Ingo put three patch in the tip, I will submit one to remove early_panic.

YH

#8 lore raw

Re: [PATCH] x86: merge setup_memory_map with e820

Quoted 4 lines · Yinghai Lu

OK, after Ingo put three patch in the tip, I will submit one to remove early_panic.

I'll do it after lunch if Ingo or Thomas don't beat me to it.

-hpa

author
#10 lore raw

PATCH 1/1 x86: cleanup machine_specific_memory_setup

In reply to Yinghai Lu

1. let 64bit support 88 and e801 too
2. introduce default_machine_specific_memory_setup, and reuse it for voyager

---
 arch/x86/kernel/e820.c        |   13 +++++++------
 arch/x86/mach-voyager/setup.c |   32 +-------------------------------
 include/asm-x86/e820.h        |    1 +
 3 files changed, 9 insertions(+), 37 deletions(-)
arch/x86/kernel/e820.c +7 -6
Index: linux-2.6/arch/x86/kernel/e820.c
===================================================================
@@ -1029,7 +1029,7 @@ void __init e820_reserve_resources(void)
 	}
 }
 
-char *__init __attribute__((weak)) machine_specific_memory_setup(void)
+char *__init default_machine_specific_memory_setup(void)
 {
 	char *who = "BIOS-e820";
 	int new_nr;
@@ -1045,10 +1045,7 @@ char *__init __attribute__((weak)) machi
 			&new_nr);
 	boot_params.e820_entries = new_nr;
 	if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0) {
-#ifdef CONFIG_X86_64
-		early_panic("Cannot find a valid memory map");
-#else
-		unsigned long mem_size;
+		u64 mem_size;
 
 		/* compare results from other methods and take the greater */
 		if (boot_params.alt_mem_k
@@ -1063,13 +1060,17 @@ char *__init __attribute__((weak)) machi
 		e820.nr_map = 0;
 		e820_add_region(0, LOWMEMSIZE(), E820_RAM);
 		e820_add_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
-#endif
 	}
 
 	/* In case someone cares... */
 	return who;
 }
 
+char *__init __attribute__((weak)) machine_specific_memory_setup(void)
+{
+	return default_machine_specific_memory_setup();
+}
+
 /* Overridden in paravirt.c if CONFIG_PARAVIRT */
 char * __init __attribute__((weak)) memory_setup(void)
 {
arch/x86/mach-voyager/setup.c +1 -31
Index: linux-2.6/arch/x86/mach-voyager/setup.c
===================================================================
@@ -104,35 +104,5 @@ char *__init machine_specific_memory_set
 		return who;
 	}
 
-	who = "BIOS-e820";
-
-	/*
-	 * Try to copy the BIOS-supplied E820-map.
-	 *
-	 * Otherwise fake a memory map; one section from 0k->640k,
-	 * the next section from 1mb->appropriate_mem_k
-	 */
-	new_nr = boot_params.e820_entries;
-	sanitize_e820_map(boot_params.e820_map,
-			ARRAY_SIZE(boot_params.e820_map),
-			&new_nr);
-	boot_params.e820_entries = new_nr;
-	if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries)
-	    < 0) {
-		unsigned long mem_size;
-
-		/* compare results from other methods and take the greater */
-		if (boot_params.alt_mem_k < boot_params.screen_info.ext_mem_k) {
-			mem_size = boot_params.screen_info.ext_mem_k;
-			who = "BIOS-88";
-		} else {
-			mem_size = boot_params.alt_mem_k;
-			who = "BIOS-e801";
-		}
-
-		e820.nr_map = 0;
-		e820_add_region(0, LOWMEMSIZE(), E820_RAM);
-		e820_add_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
-	}
-	return who;
+	return default_machine_specific_memory_setup();
 }
include/asm-x86/e820.h +1 -0
Index: linux-2.6/include/asm-x86/e820.h
===================================================================
@@ -102,6 +102,7 @@ extern u64 e820_hole_size(u64 start, u64
 extern void finish_e820_parsing(void);
 extern void e820_reserve_resources(void);
 extern void setup_memory_map(void);
+extern char *default_machine_specific_memory_setup(void);
 extern char *machine_specific_memory_setup(void);
 extern char *memory_setup(void);
author
#11 lore raw

PATCH 1/1 x86: cleanup machine_specific_memory_setup v2

1. let 64bit support 88 and e801 too
2. introduce default_machine_specific_memory_setup, and reuse it for voyager

v2: fix 64 bit compiling

---
 arch/x86/kernel/e820.c        |   13 +++++++------
 arch/x86/mach-voyager/setup.c |   32 +-------------------------------
 include/asm-x86/e820.h        |    3 +--
 include/asm-x86/setup.h       |    3 ++-
 4 files changed, 11 insertions(+), 40 deletions(-)
arch/x86/kernel/e820.c +7 -6
Index: linux-2.6/arch/x86/kernel/e820.c
===================================================================
@@ -1029,7 +1029,7 @@ void __init e820_reserve_resources(void)
 	}
 }
 
-char *__init __attribute__((weak)) machine_specific_memory_setup(void)
+char *__init default_machine_specific_memory_setup(void)
 {
 	char *who = "BIOS-e820";
 	int new_nr;
@@ -1045,10 +1045,7 @@ char *__init __attribute__((weak)) machi
 			&new_nr);
 	boot_params.e820_entries = new_nr;
 	if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0) {
-#ifdef CONFIG_X86_64
-		early_panic("Cannot find a valid memory map");
-#else
-		unsigned long mem_size;
+		u64 mem_size;
 
 		/* compare results from other methods and take the greater */
 		if (boot_params.alt_mem_k
@@ -1063,13 +1060,17 @@ char *__init __attribute__((weak)) machi
 		e820.nr_map = 0;
 		e820_add_region(0, LOWMEMSIZE(), E820_RAM);
 		e820_add_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
-#endif
 	}
 
 	/* In case someone cares... */
 	return who;
 }
 
+char *__init __attribute__((weak)) machine_specific_memory_setup(void)
+{
+	return default_machine_specific_memory_setup();
+}
+
 /* Overridden in paravirt.c if CONFIG_PARAVIRT */
 char * __init __attribute__((weak)) memory_setup(void)
 {
arch/x86/mach-voyager/setup.c +1 -31
Index: linux-2.6/arch/x86/mach-voyager/setup.c
===================================================================
@@ -104,35 +104,5 @@ char *__init machine_specific_memory_set
 		return who;
 	}
 
-	who = "BIOS-e820";
-
-	/*
-	 * Try to copy the BIOS-supplied E820-map.
-	 *
-	 * Otherwise fake a memory map; one section from 0k->640k,
-	 * the next section from 1mb->appropriate_mem_k
-	 */
-	new_nr = boot_params.e820_entries;
-	sanitize_e820_map(boot_params.e820_map,
-			ARRAY_SIZE(boot_params.e820_map),
-			&new_nr);
-	boot_params.e820_entries = new_nr;
-	if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries)
-	    < 0) {
-		unsigned long mem_size;
-
-		/* compare results from other methods and take the greater */
-		if (boot_params.alt_mem_k < boot_params.screen_info.ext_mem_k) {
-			mem_size = boot_params.screen_info.ext_mem_k;
-			who = "BIOS-88";
-		} else {
-			mem_size = boot_params.alt_mem_k;
-			who = "BIOS-e801";
-		}
-
-		e820.nr_map = 0;
-		e820_add_region(0, LOWMEMSIZE(), E820_RAM);
-		e820_add_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
-	}
-	return who;
+	return default_machine_specific_memory_setup();
 }
include/asm-x86/e820.h +1 -2
Index: linux-2.6/include/asm-x86/e820.h
===================================================================
@@ -102,6 +102,7 @@ extern u64 e820_hole_size(u64 start, u64
 extern void finish_e820_parsing(void);
 extern void e820_reserve_resources(void);
 extern void setup_memory_map(void);
+extern char *default_machine_specific_memory_setup(void);
 extern char *machine_specific_memory_setup(void);
 extern char *memory_setup(void);
 
@@ -116,9 +117,7 @@ extern char *memory_setup(void);
 #ifdef __KERNEL__
 #include <linux/ioport.h>
 
-#ifdef CONFIG_X86_32
 #define HIGH_MEMORY	(1024*1024)
-#endif
 #endif /* __KERNEL__ */
 
 #endif  /* __ASM_E820_H */
include/asm-x86/setup.h +2 -1
Index: linux-2.6/include/asm-x86/setup.h
===================================================================
@@ -42,13 +42,14 @@ void vsmp_init(void);
  */
 extern struct boot_params boot_params;
 
-#ifdef __i386__
 /*
  * Do NOT EVER look at the BIOS memory size location.
  * It does not work on many machines.
  */
 #define LOWMEMSIZE()	(0x9f000)
 
+#ifdef __i386__
+
 void __init i386_start_kernel(void);
 
 extern unsigned long init_pg_tables_start;
Applied
#12 lore raw

Re: [PATCH] x86: cleanup machine_specific_memory_setup v2

Quoted 5 lines · Yinghai Lu

1. let 64bit support 88 and e801 too
2. introduce default_machine_specific_memory_setup, and reuse it for voyager

v2: fix 64 bit compiling

applied to tip/x86/mpparse - thanks Yinghai.

Ingo