x86: Merge e820_32/64 V2
cover x86: Merge e820_32/64 V2
V1->V2:
- Harmonize calling conventions betwen 32 and 64 bit. Use u64 if 32 bit uses unsigned long long or u64.
The following patchset merges the 32 and 64 bit of e820 header files into one.
First just move the stuff into a single file and then gradually extract common code.
Patch against Linus' git tree of today.
PATCH 1/4 x86: e820.h unification
The first patch simply puts both 32 and 64 bit headers into one header file. The #ifdef sequence at the top is shared.
--- include/asm-x86/e820.h | 103 +++++++++++++++++++++++++++++++++++++++++++++- include/asm-x86/e820_32.h | 50 ---------------------- include/asm-x86/e820_64.h | 56 ------------------------- 3 files changed, 101 insertions(+), 108 deletions(-)
include/asm-x86/e820.h +101 -2
@@ -30,9 +30,108 @@ struct e820map {#ifdef __KERNEL__#ifdef CONFIG_X86_32 -# include "e820_32.h" +/* +* 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. +* +*/ +#include <linux/ioport.h> + +#define HIGH_MEMORY (1024*1024) + +#ifndef __ASSEMBLY__ + +extern void setup_memory_map (void ); +extern void finish_e820_parsing (void ); + +extern struct e820map e820; +extern void update_e820 (void ); + +extern int e820_all_mapped (unsigned long start,unsigned long end, +unsigned type); +extern int e820_any_mapped (u64 start,u64 end,unsigned type); +extern void propagate_e820_map (void ); +extern void register_bootmem_low_pages (unsigned long max_low_pfn); +extern void add_memory_region (unsigned long long start, +unsigned long long size,int type); +extern u64 update_memory_range (u64 start,u64 size,unsigned old_type, +unsigned new_type); +extern void e820_register_memory (void ); +extern void limit_regions (unsigned long long size); +extern void print_memory_map (char *who); +extern void init_iomem_resources (struct resource *code_resource, +struct resource *data_resource, +struct resource *bss_resource); + +#if defined(CONFIG_PM ) && defined(CONFIG_HIBERNATION ) +extern void e820_mark_nosave_regions (void );#else -# include "e820_64.h" +static inline void e820_mark_nosave_regions (void ) +{ +} +#endif + + +#endif /*!__ASSEMBLY__*/ +#else /* X86_32 */ +/* +* 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. +*/ +#include <linux/ioport.h> + +#ifndef __ASSEMBLY__ +extern unsigned long find_e820_area (unsigned long start,unsigned long end, +unsigned long size,unsigned long align); +extern unsigned long find_e820_area_size (unsigned long start, +unsigned long *sizep, +unsigned long align); +extern void add_memory_region (unsigned long start,unsigned long size, +int type); +extern u64 update_memory_range (u64 start,u64 size,unsigned old_type, +unsigned new_type); +extern void setup_memory_region (void ); +extern void contig_e820_setup (void ); +extern unsigned long e820_end_of_ram (void ); +extern void e820_reserve_resources (void ); +extern void e820_mark_nosave_regions (void ); +extern int e820_any_mapped (unsigned long start,unsigned long end, +unsigned type); +extern int e820_all_mapped (unsigned long start,unsigned long end, +unsigned type); +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); +extern unsigned long e820_hole_size (unsigned long start,unsigned long end); + +extern void e820_setup_gap (void ); +extern void e820_register_active_regions (int nid,unsigned long start_pfn, +unsigned long end_pfn); + +extern void finish_e820_parsing (void ); + +extern struct e820map e820; +extern void update_e820 (void ); + +extern void reserve_early (unsigned long start,unsigned long end,char *name); +extern void free_early (unsigned long start,unsigned long end); +extern void early_res_to_bootmem (unsigned long start,unsigned long end); + +#endif /*!__ASSEMBLY__*/ +#endif #endif /* __KERNEL__ */
include/asm-x86/e820_32.h deleted +0 -50
50 lines not on this page · raw message
include/asm-x86/e820_64.h deleted +0 -56
56 lines not on this page · raw message
PATCH 2/4 x86: e820 unification: Extract shared comments
In reply to Christoph LameterThe comments are basically the same. Take the 64 bit version as the common comments.
--- include/asm-x86/e820.h | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-)
include/asm-x86/e820.h +7 -19
@@ -29,20 +29,20 @@ struct e820map {#define BIOS_END 0x00100000#ifdef __KERNEL__ -#ifdef CONFIG_X86_32 +/* * 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. -* +* 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. */ #include <linux/ioport.h> +#ifdef CONFIG_X86_32 #define HIGH_MEMORY (1024*1024)#ifndef __ASSEMBLY__
@@ -80,18 +80,6 @@ static inline void e820_mark_nosave_regi#endif /*!__ASSEMBLY__*/ #else /* X86_32 */ -/* -* 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. -*/ -#include <linux/ioport.h> -#ifndef __ASSEMBLY__extern unsigned long find_e820_area (unsigned long start,unsigned long end,unsigned long size,unsigned long align);
PATCH 3/4 x86: e820 unification: Common #ifdef __ASSEMBLY
In reply to Christoph LameterBoth include files use #ifdef __ASSEMBLY__ which can be moved outside of the #ifdef CONFIG_X86_32.
--- include/asm-x86/e820.h | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
include/asm-x86/e820.h +3 -7
@@ -42,11 +42,11 @@ struct e820map {*/ #include <linux/ioport.h> +#ifndef __ASSEMBLY__ +#ifdef CONFIG_X86_32 #define HIGH_MEMORY (1024*1024) -#ifndef __ASSEMBLY__ -extern void setup_memory_map (void );extern void finish_e820_parsing (void );
@@ -77,10 +77,7 @@ static inline void e820_mark_nosave_regi }#endif - -#endif /*!__ASSEMBLY__*/ #else /* X86_32 */ -#ifndef __ASSEMBLY__extern unsigned long find_e820_area (unsigned long start,unsigned long end,unsigned long size,unsigned long align); extern unsigned long find_e820_area_size(unsigned long start,
@@ -118,9 +115,8 @@ extern void reserve_early(unsigned longextern void free_early (unsigned long start,unsigned long end);extern void early_res_to_bootmem (unsigned long start,unsigned long end); +#endif /* X86_32 */ #endif /*!__ASSEMBLY__*/ - -#endif #endif /* __KERNEL__ */ #endif /* __ASM_E820_H */
PATCH 4/4 x86: e820 unification: Extract common functions
In reply to Christoph LameterExtract the common functions to the common area.
The parameters of e820_any_mapped vary between 32 and 64 bit. Convert them to u64 so that they match.
Same issue is there fore add_memory_region. 32 bit uses unsigned long long there. Convert both platforms to use u64.
--- arch/x86/kernel/e820_32.c | 3 -- arch/x86/kernel/e820_64.c | 4 +-- include/asm-x86/e820.h | 47 +++++++++++++++------------------------------- 3 files changed, 19 insertions(+), 35 deletions(-)
include/asm-x86/e820.h +16 -31
@@ -44,30 +44,15 @@ struct e820map {#ifndef __ASSEMBLY__ -#ifdef CONFIG_X86_32 -#define HIGH_MEMORY (1024*1024) - -extern void setup_memory_map (void );extern void finish_e820_parsing (void ); -extern struct e820map e820;extern void update_e820 (void ); -extern int e820_all_mapped (unsigned long start,unsigned long end,unsigned type);extern int e820_any_mapped (u64 start,u64 end,unsigned type); -extern void propagate_e820_map (void ); -extern void register_bootmem_low_pages (unsigned long max_low_pfn); -extern void add_memory_region (unsigned long long start, -unsigned long long size,int type); -extern u64 update_memory_range (u64 start,u64 size,unsigned old_type, +extern void add_memory_region (u64 start,u64 size,int type); +extern void update_memory_range (u64 start,u64 size,unsigned old_type,unsigned new_type); -extern void e820_register_memory (void ); -extern void limit_regions (unsigned long long size); -extern void print_memory_map (char *who); -extern void init_iomem_resources (struct resource *code_resource, -struct resource *data_resource, -struct resource *bss_resource);#if defined(CONFIG_PM ) && defined(CONFIG_HIBERNATION )extern void e820_mark_nosave_regions (void );
@@ -77,25 +62,30 @@ static inline void e820_mark_nosave_regi }#endif +#ifdef CONFIG_X86_32 +#define HIGH_MEMORY (1024*1024) + +extern void setup_memory_map (void ); + +extern void propagate_e820_map (void ); +extern void register_bootmem_low_pages (unsigned long max_low_pfn); +extern void e820_register_memory (void ); +extern void limit_regions (unsigned long long size); +extern void print_memory_map (char *who); +extern void init_iomem_resources (struct resource *code_resource, +struct resource *data_resource, +struct resource *bss_resource); +#else /* X86_32 */ extern unsigned long find_e820_area (unsigned long start,unsigned long end,unsigned long size,unsigned long align);extern unsigned long find_e820_area_size (unsigned long start,unsigned long *sizep,unsigned long align); -extern void add_memory_region (unsigned long start,unsigned long size, -int type); -extern u64 update_memory_range (u64 start,u64 size,unsigned old_type, -unsigned new_type);extern void setup_memory_region (void );extern void contig_e820_setup (void );extern unsigned long e820_end_of_ram (void );extern void e820_reserve_resources (void ); -extern void e820_mark_nosave_regions (void ); -extern int e820_any_mapped (unsigned long start,unsigned long end, -unsigned type); -extern int e820_all_mapped (unsigned long start,unsigned long end, -unsigned type);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);
@@ -106,11 +96,6 @@ extern void e820_setup_gap(void);extern void e820_register_active_regions (int nid,unsigned long start_pfn,unsigned long end_pfn); -extern void finish_e820_parsing (void ); - -extern struct e820map e820; -extern void update_e820 (void ); -extern void reserve_early (unsigned long start,unsigned long end,char *name);extern void free_early (unsigned long start,unsigned long end);extern void early_res_to_bootmem (unsigned long start,unsigned long end);
arch/x86/kernel/e820_64.c +2 -2
@@ -181,7 +181,7 @@ again:* with type. */ int -e820_any_mapped (unsigned long start,unsigned long end,unsigned type) +e820_any_mapped (u64 start,u64 end,unsigned type) {int i;
@@ -437,7 +437,7 @@ e820_register_active_regions(int nid, un/* * Add a memory region to the kernel e820 map. */ -void __init add_memory_region (unsigned long start,unsigned long size,int type) +void __init add_memory_region (u64 start,u64 size,int type) {int x = e820.nr_map;
arch/x86/kernel/e820_32.c +1 -2
@@ -255,8 +255,7 @@ void __init e820_mark_nosave_regions(voi }#endif -void __init add_memory_region (unsigned long long start, -unsigned long long size,int type) +void __init add_memory_region (u64 start,u64 size,int type) {int x;