x86: Merge e820_32/64
cover x86: Merge e820_32/64
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 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 | 102 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 2 deletions(-)
include/asm-x86/e820.h +100 -2
@@ -30,9 +30,107 @@ 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 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__ */
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__
@@ -79,18 +79,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 );
@@ -76,10 +76,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,
@@ -117,9 +114,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 unsigned long for 32 bit so that they match.
--- arch/x86/kernel/e820_32.c | 2 +- include/asm-x86/e820.h | 43 +++++++++++++++---------------------------- 2 files changed, 16 insertions(+), 29 deletions(-)
include/asm-x86/e820.h +15 -28
@@ -44,29 +44,17 @@ 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 int e820_any_mapped (unsigned long start,unsigned long end, +unsigned type);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 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 );
@@ -76,25 +64,29 @@ 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 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);
@@ -105,11 +97,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_32.c +1 -1
@@ -645,7 +645,7 @@ void __init limit_regions(unsigned long* with type. */ int -e820_any_mapped (u64 start,u64 end,unsigned type) +e820_any_mapped (unsigned long start,unsigned long end,unsigned type) {int i;for (i =0 ; i < e820.nr_map; i++) {
Re: [patch 4/4] x86: e820 unification: Extract common functions
Quoted 7 lines · Christoph Lameter
Extract the common functions to the common area. The parameters of
e820_any_mappedvary between 32 and 64 bit. Convert them to unsigned long for 32 bit so that they match.
...
arch/x86/kernel/e820_32.c void __init limit_regions(unsigned long · line 651
Quoted 8 lines
arch/x86/kernel/e820_32.c +1
-1@@ -645,7 +645,7 @@ void __init limit_regions(unsigned long* with type. */ int -e820_any_mapped (u64 start,u64 end,unsigned type) +e820_any_mapped (unsigned long start,unsigned long end,unsigned type) {int i;for (i =0 ; i < e820.nr_map; i++) {
This changes the parameters from 64bit to 32bit which looks fishy.
Are you sure the solution that would both match and be correct isn't to change the 64bit one to u64?
cu
Adrian
Signature · 4 lines
"Is there not promise of rain?" Ling Tan asked suddenly out
of the darkness. There had been need of rain for many days.
"Only a promise," Lao Er said.
Pearl S. Buck - Dragon SeedRe: [patch 4/4] x86: e820 unification: Extract common functions
Quoted 8 lines · Adrian Bunk
arch/x86/kernel/e820_32.c void __init limit_regions(unsigned long · line 651
Quoted 6 lines
int
arch/x86/kernel/e820_32.c +1
-1-e820_any_mapped(u64 start, u64 end, unsigned type) +e820_any_mapped(unsigned long start,unsigned long end, unsigned type) {int i;for (i =0 ; i < e820.nr_map; i++) {This changes the parameters from 64bit to 32bit which looks fishy.
good catch! This could lead to bugs on 32-bit that has physical RAM addresses over 4GB.
Quoted 2 lines
Are you sure the solution that would both match and be correct isn't to change the 64bit one to u64?
agreed.
Ingo