x86: move e820_resource_resources to e820.c
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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -99,6 +99,9 @@ extern void e820_register_active_regionsextern 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
@@ -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
@@ -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
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
Signed-off-by Yinghai Lu <[email protected]>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_regionsextern 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."
H. Peter Anvin
reviewerRe: [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
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
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."
H. Peter Anvin
reviewerRe: [PATCH] x86: merge setup_memory_map with e820
In reply to Yinghai LuQuoted 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
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
H. Peter Anvin
reviewerRe: [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
Re: [PATCH] x86: merge setup_memory_map with e820
In reply to Yinghai LuQuoted 1 line · Yinghai Lu
and kill e820_32/64.c and e820_32/64.h
whee - applied :-)
Ingo
PATCH 1/1 x86: cleanup machine_specific_memory_setup
In reply to Yinghai Lu1. 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
@@ -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
@@ -104,35 +104,5 @@ char *__init machine_specific_memory_setreturn 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
@@ -102,6 +102,7 @@ extern u64 e820_hole_size(u64 start, u64extern 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 );
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
@@ -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
@@ -104,35 +104,5 @@ char *__init machine_specific_memory_setreturn 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
@@ -102,6 +102,7 @@ extern u64 e820_hole_size(u64 start, u64extern 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
@@ -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;
Ingo Molnar
AppliedRe: [PATCH] x86: cleanup machine_specific_memory_setup v2
Quoted 5 lines · Yinghai Lu
1. let 64bit support 88 and e801 too
2. introducedefault_machine_specific_memory_setup, and reuse it for voyagerv2: fix 64 bit compiling
applied to tip/x86/mpparse - thanks Yinghai.
Ingo