* [patch 1/6] x86: Unify current.h
2008-05-10 2:09 [patch 0/6] x86: Unification patches etc Christoph Lameter
@ 2008-05-10 2:09 ` Christoph Lameter
2008-05-13 12:28 ` Ingo Molnar
2008-05-10 2:09 ` [patch 2/6] x86: e820.h unification Christoph Lameter
` (4 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Christoph Lameter @ 2008-05-10 2:09 UTC (permalink / raw)
To: Ingo Molnar; +Cc: linux-kernel, travis
[-- Attachment #1: x86_unify_current_h --]
[-- Type: text/plain, Size: 2995 bytes --]
Simply stitch these together. There are just two definitions that are shared
but the file is resonably small and putting these things together shows that
further unifications requires a unification of the per cpu / pda handling
between both arches.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
---
include/asm-x86/current.h | 42 ++++++++++++++++++++++++++++++++++++++----
include/asm-x86/current_32.h | 17 -----------------
include/asm-x86/current_64.h | 27 ---------------------------
3 files changed, 38 insertions(+), 48 deletions(-)
Index: linux-2.6/include/asm-x86/current.h
===================================================================
--- linux-2.6.orig/include/asm-x86/current.h 2008-05-07 16:33:51.126164691 -0700
+++ linux-2.6/include/asm-x86/current.h 2008-05-09 18:28:05.666268549 -0700
@@ -1,5 +1,39 @@
+#ifndef _X86_CURRENT_H
+#define _X86_CURRENT_H
+
#ifdef CONFIG_X86_32
-# include "current_32.h"
-#else
-# include "current_64.h"
-#endif
+#include <linux/compiler.h>
+#include <asm/percpu.h>
+
+struct task_struct;
+
+DECLARE_PER_CPU(struct task_struct *, current_task);
+static __always_inline struct task_struct *get_current(void)
+{
+ return x86_read_percpu(current_task);
+}
+
+#else /* X86_32 */
+
+#ifndef __ASSEMBLY__
+#include <asm/pda.h>
+
+struct task_struct;
+
+static __always_inline struct task_struct *get_current(void)
+{
+ return read_pda(pcurrent);
+}
+
+#else /* __ASSEMBLY__ */
+
+#include <asm/asm-offsets.h>
+#define GET_CURRENT(reg) movq %gs:(pda_pcurrent),reg
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* X86_32 */
+
+#define current get_current()
+
+#endif /* X86_CURRENT_H */
Index: linux-2.6/include/asm-x86/current_32.h
===================================================================
--- linux-2.6.orig/include/asm-x86/current_32.h 2008-05-07 16:33:51.130164801 -0700
+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
@@ -1,17 +0,0 @@
-#ifndef _I386_CURRENT_H
-#define _I386_CURRENT_H
-
-#include <linux/compiler.h>
-#include <asm/percpu.h>
-
-struct task_struct;
-
-DECLARE_PER_CPU(struct task_struct *, current_task);
-static __always_inline struct task_struct *get_current(void)
-{
- return x86_read_percpu(current_task);
-}
-
-#define current get_current()
-
-#endif /* !(_I386_CURRENT_H) */
Index: linux-2.6/include/asm-x86/current_64.h
===================================================================
--- linux-2.6.orig/include/asm-x86/current_64.h 2008-05-07 16:33:51.138164773 -0700
+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
@@ -1,27 +0,0 @@
-#ifndef _X86_64_CURRENT_H
-#define _X86_64_CURRENT_H
-
-#if !defined(__ASSEMBLY__)
-struct task_struct;
-
-#include <asm/pda.h>
-
-static inline struct task_struct *get_current(void)
-{
- struct task_struct *t = read_pda(pcurrent);
- return t;
-}
-
-#define current get_current()
-
-#else
-
-#ifndef ASM_OFFSET_H
-#include <asm/asm-offsets.h>
-#endif
-
-#define GET_CURRENT(reg) movq %gs:(pda_pcurrent),reg
-
-#endif
-
-#endif /* !(_X86_64_CURRENT_H) */
--
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [patch 1/6] x86: Unify current.h
2008-05-10 2:09 ` [patch 1/6] x86: Unify current.h Christoph Lameter
@ 2008-05-13 12:28 ` Ingo Molnar
0 siblings, 0 replies; 12+ messages in thread
From: Ingo Molnar @ 2008-05-13 12:28 UTC (permalink / raw)
To: Christoph Lameter; +Cc: linux-kernel, travis, Thomas Gleixner, H. Peter Anvin
* Christoph Lameter <clameter@sgi.com> wrote:
> Simply stitch these together. There are just two definitions that are
> shared but the file is resonably small and putting these things
> together shows that further unifications requires a unification of the
> per cpu / pda handling between both arches.
applied, thanks.
Ingo
^ permalink raw reply [flat|nested] 12+ messages in thread
* [patch 2/6] x86: e820.h unification
2008-05-10 2:09 [patch 0/6] x86: Unification patches etc Christoph Lameter
2008-05-10 2:09 ` [patch 1/6] x86: Unify current.h Christoph Lameter
@ 2008-05-10 2:09 ` Christoph Lameter
2008-05-10 2:09 ` [patch 3/6] x86: e820 unification: Extract shared comments Christoph Lameter
` (3 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: Christoph Lameter @ 2008-05-10 2:09 UTC (permalink / raw)
To: Ingo Molnar; +Cc: linux-kernel, travis
[-- Attachment #1: x86_unify_e820_h_merge --]
[-- Type: text/plain, Size: 8926 bytes --]
The first patch simply puts both 32 and 64 bit headers into one header file.
The #ifdef sequence at the top is shared.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
---
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(-)
Index: linux-2.6/include/asm-x86/e820.h
===================================================================
--- linux-2.6.orig/include/asm-x86/e820.h 2008-05-06 11:44:15.000000000 -0700
+++ linux-2.6/include/asm-x86/e820.h 2008-05-06 11:46:45.000000000 -0700
@@ -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__ */
Index: linux-2.6/include/asm-x86/e820_32.h
===================================================================
--- linux-2.6.orig/include/asm-x86/e820_32.h 2008-05-06 11:44:15.000000000 -0700
+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
@@ -1,50 +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 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 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);
-#else
-static inline void e820_mark_nosave_regions(void)
-{
-}
-#endif
-
-
-#endif/*!__ASSEMBLY__*/
-#endif/*__E820_HEADER*/
Index: linux-2.6/include/asm-x86/e820_64.h
===================================================================
--- linux-2.6.orig/include/asm-x86/e820_64.h 2008-05-06 11:44:15.000000000 -0700
+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
@@ -1,56 +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 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 void 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/*__E820_HEADER*/
--
^ permalink raw reply [flat|nested] 12+ messages in thread* [patch 3/6] x86: e820 unification: Extract shared comments
2008-05-10 2:09 [patch 0/6] x86: Unification patches etc Christoph Lameter
2008-05-10 2:09 ` [patch 1/6] x86: Unify current.h Christoph Lameter
2008-05-10 2:09 ` [patch 2/6] x86: e820.h unification Christoph Lameter
@ 2008-05-10 2:09 ` Christoph Lameter
2008-05-10 2:09 ` [patch 4/6] x86: e820 unification: Common #ifdef __ASSEMBLY Christoph Lameter
` (2 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: Christoph Lameter @ 2008-05-10 2:09 UTC (permalink / raw)
To: Ingo Molnar; +Cc: linux-kernel, travis
[-- Attachment #1: x86_unify_e820_h_comments --]
[-- Type: text/plain, Size: 2101 bytes --]
The introductory comments are basically the same. Take the 64 bit version.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
---
include/asm-x86/e820.h | 26 +++++++-------------------
1 file changed, 7 insertions(+), 19 deletions(-)
Index: linux-2.6/include/asm-x86/e820.h
===================================================================
--- linux-2.6.orig/include/asm-x86/e820.h 2008-05-06 11:46:45.000000000 -0700
+++ linux-2.6/include/asm-x86/e820.h 2008-05-06 11:48:09.000000000 -0700
@@ -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);
--
^ permalink raw reply [flat|nested] 12+ messages in thread* [patch 4/6] x86: e820 unification: Common #ifdef __ASSEMBLY
2008-05-10 2:09 [patch 0/6] x86: Unification patches etc Christoph Lameter
` (2 preceding siblings ...)
2008-05-10 2:09 ` [patch 3/6] x86: e820 unification: Extract shared comments Christoph Lameter
@ 2008-05-10 2:09 ` Christoph Lameter
2008-05-10 2:09 ` [patch 5/6] x86: e820 unification: Extract common functions Christoph Lameter
2008-05-10 2:09 ` [patch 6/6] x86: Add checks for virtual addresses in __phys_addr() Christoph Lameter
5 siblings, 0 replies; 12+ messages in thread
From: Christoph Lameter @ 2008-05-10 2:09 UTC (permalink / raw)
To: Ingo Molnar; +Cc: linux-kernel, travis
[-- Attachment #1: x86_unify_e820_h_ifdef --]
[-- Type: text/plain, Size: 1415 bytes --]
Both include files use #ifdef __ASSEMBLY__ which can be moved outside
of the #ifdef CONFIG_X86_32.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
---
include/asm-x86/e820.h | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
Index: linux-2.6/include/asm-x86/e820.h
===================================================================
--- linux-2.6.orig/include/asm-x86/e820.h 2008-05-06 11:48:09.000000000 -0700
+++ linux-2.6/include/asm-x86/e820.h 2008-05-06 11:50:53.000000000 -0700
@@ -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 long
extern 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 */
--
^ permalink raw reply [flat|nested] 12+ messages in thread* [patch 5/6] x86: e820 unification: Extract common functions
2008-05-10 2:09 [patch 0/6] x86: Unification patches etc Christoph Lameter
` (3 preceding siblings ...)
2008-05-10 2:09 ` [patch 4/6] x86: e820 unification: Common #ifdef __ASSEMBLY Christoph Lameter
@ 2008-05-10 2:09 ` Christoph Lameter
2008-05-10 2:09 ` [patch 6/6] x86: Add checks for virtual addresses in __phys_addr() Christoph Lameter
5 siblings, 0 replies; 12+ messages in thread
From: Christoph Lameter @ 2008-05-10 2:09 UTC (permalink / raw)
To: Ingo Molnar; +Cc: linux-kernel, travis
[-- Attachment #1: x86_unify_e820_h_common_functions --]
[-- Type: text/plain, Size: 5581 bytes --]
Extract 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 for add_memory_region(). 32 bit uses unsigned long long
there. Convert both platforms to use u64.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
---
arch/x86/kernel/e820_32.c | 3 --
arch/x86/kernel/e820_64.c | 4 +--
include/asm-x86/e820.h | 50 ++++++++++++++++------------------------------
3 files changed, 21 insertions(+), 36 deletions(-)
Index: linux-2.6/include/asm-x86/e820.h
===================================================================
--- linux-2.6.orig/include/asm-x86/e820.h 2008-05-09 16:05:13.000000000 -0700
+++ linux-2.6/include/asm-x86/e820.h 2008-05-09 16:05:23.000000000 -0700
@@ -44,32 +44,18 @@ 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)
+#if defined(CONFIG_X86_64) || \
+ (defined(CONFIG_PM) && defined(CONFIG_HIBERNATION))
extern void e820_mark_nosave_regions(void);
#else
static inline void e820_mark_nosave_regions(void)
@@ -77,25 +63,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 +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);
Index: linux-2.6/arch/x86/kernel/e820_64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/e820_64.c 2008-05-09 16:05:13.000000000 -0700
+++ linux-2.6/arch/x86/kernel/e820_64.c 2008-05-09 16:05:19.000000000 -0700
@@ -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;
Index: linux-2.6/arch/x86/kernel/e820_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/e820_32.c 2008-05-09 16:05:13.000000000 -0700
+++ linux-2.6/arch/x86/kernel/e820_32.c 2008-05-09 16:05:19.000000000 -0700
@@ -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;
--
^ permalink raw reply [flat|nested] 12+ messages in thread* [patch 6/6] x86: Add checks for virtual addresses in __phys_addr()
2008-05-10 2:09 [patch 0/6] x86: Unification patches etc Christoph Lameter
` (4 preceding siblings ...)
2008-05-10 2:09 ` [patch 5/6] x86: e820 unification: Extract common functions Christoph Lameter
@ 2008-05-10 2:09 ` Christoph Lameter
2008-05-10 2:23 ` Sam Ravnborg
5 siblings, 1 reply; 12+ messages in thread
From: Christoph Lameter @ 2008-05-10 2:09 UTC (permalink / raw)
To: Ingo Molnar; +Cc: linux-kernel, travis
[-- Attachment #1: vcp_check_virtual_addresses --]
[-- Type: text/plain, Size: 1831 bytes --]
Add checks to insure that virtual addresses are not used in invalid contexts.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
---
arch/x86/mm/ioremap.c | 15 +++++++--------
include/asm-x86/page_32.h | 7 ++++++-
2 files changed, 13 insertions(+), 9 deletions(-)
Index: linux-2.6/arch/x86/mm/ioremap.c
===================================================================
--- linux-2.6.orig/arch/x86/mm/ioremap.c 2008-05-07 16:27:09.792659191 -0700
+++ linux-2.6/arch/x86/mm/ioremap.c 2008-05-07 19:46:34.733509101 -0700
@@ -21,29 +21,28 @@
#include <asm/pgalloc.h>
#include <asm/pat.h>
-#ifdef CONFIG_X86_64
+#if defined(CONFIG_DEBUG_VM) || defined(CONFIG_X86_64)
unsigned long __phys_addr(unsigned long x)
{
+ VM_BUG_ON(is_vmalloc_addr((void *)x));
+#ifdef CONFIG_X86_64
if (x >= __START_KERNEL_map)
return x - __START_KERNEL_map + phys_base;
+#endif
return x - PAGE_OFFSET;
}
EXPORT_SYMBOL(__phys_addr);
+#endif
static inline int phys_addr_valid(unsigned long addr)
{
+#ifdef CONFIG_X86_64
return addr < (1UL << boot_cpu_data.x86_phys_bits);
-}
-
#else
-
-static inline int phys_addr_valid(unsigned long addr)
-{
return 1;
-}
-
#endif
+}
int page_is_ram(unsigned long pagenr)
{
Index: linux-2.6/include/asm-x86/page_32.h
===================================================================
--- linux-2.6.orig/include/asm-x86/page_32.h 2008-05-07 16:27:12.191419001 -0700
+++ linux-2.6/include/asm-x86/page_32.h 2008-05-07 19:30:46.444980299 -0700
@@ -64,7 +64,12 @@ typedef struct page *pgtable_t;
#endif
#ifndef __ASSEMBLY__
-#define __phys_addr(x) ((x) - PAGE_OFFSET)
+#ifdef CONFIG_DEBUG_VM
+unsigned long __phys_addr(unsigned long x)
+#else
+#define __phys_addr(x) ((x) - PAGE_OFFSET)
+#endif
+
#define __phys_reloc_hide(x) RELOC_HIDE((x), 0)
#ifdef CONFIG_FLATMEM
--
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [patch 6/6] x86: Add checks for virtual addresses in __phys_addr()
2008-05-10 2:09 ` [patch 6/6] x86: Add checks for virtual addresses in __phys_addr() Christoph Lameter
@ 2008-05-10 2:23 ` Sam Ravnborg
2008-05-10 2:33 ` Christoph Lameter
0 siblings, 1 reply; 12+ messages in thread
From: Sam Ravnborg @ 2008-05-10 2:23 UTC (permalink / raw)
To: Christoph Lameter; +Cc: Ingo Molnar, linux-kernel, travis
On Fri, May 09, 2008 at 07:09:53PM -0700, Christoph Lameter wrote:
> Add checks to insure that virtual addresses are not used in invalid contexts.
>
> Signed-off-by: Christoph Lameter <clameter@sgi.com>
>
> ---
> arch/x86/mm/ioremap.c | 15 +++++++--------
> include/asm-x86/page_32.h | 7 ++++++-
> 2 files changed, 13 insertions(+), 9 deletions(-)
>
> Index: linux-2.6/arch/x86/mm/ioremap.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/mm/ioremap.c 2008-05-07 16:27:09.792659191 -0700
> +++ linux-2.6/arch/x86/mm/ioremap.c 2008-05-07 19:46:34.733509101 -0700
> @@ -21,29 +21,28 @@
> #include <asm/pgalloc.h>
> #include <asm/pat.h>
>
> -#ifdef CONFIG_X86_64
>
> +#if defined(CONFIG_DEBUG_VM) || defined(CONFIG_X86_64)
> unsigned long __phys_addr(unsigned long x)
> {
> + VM_BUG_ON(is_vmalloc_addr((void *)x));
> +#ifdef CONFIG_X86_64
> if (x >= __START_KERNEL_map)
> return x - __START_KERNEL_map + phys_base;
> +#endif
> return x - PAGE_OFFSET;
> }
> EXPORT_SYMBOL(__phys_addr);
> +#endif
>
> static inline int phys_addr_valid(unsigned long addr)
> {
> +#ifdef CONFIG_X86_64
> return addr < (1UL << boot_cpu_data.x86_phys_bits);
> -}
> -
> #else
> -
> -static inline int phys_addr_valid(unsigned long addr)
> -{
> return 1;
> -}
> -
> #endif
> +}
>
> int page_is_ram(unsigned long pagenr)
> {
> Index: linux-2.6/include/asm-x86/page_32.h
> ===================================================================
> --- linux-2.6.orig/include/asm-x86/page_32.h 2008-05-07 16:27:12.191419001 -0700
> +++ linux-2.6/include/asm-x86/page_32.h 2008-05-07 19:30:46.444980299 -0700
> @@ -64,7 +64,12 @@ typedef struct page *pgtable_t;
> #endif
>
> #ifndef __ASSEMBLY__
> -#define __phys_addr(x) ((x) - PAGE_OFFSET)
> +#ifdef CONFIG_DEBUG_VM
> +unsigned long __phys_addr(unsigned long x)
Should this have read:
> +extern unsigned long __phys_addr(unsigned long x);
?
Looks like a prototype with a missing ';'.
And x86 uses extern for prototypes in .h files (most of the time).
Sam
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [patch 6/6] x86: Add checks for virtual addresses in __phys_addr()
2008-05-10 2:23 ` Sam Ravnborg
@ 2008-05-10 2:33 ` Christoph Lameter
2008-05-10 3:07 ` Christoph Lameter
0 siblings, 1 reply; 12+ messages in thread
From: Christoph Lameter @ 2008-05-10 2:33 UTC (permalink / raw)
To: Sam Ravnborg; +Cc: Ingo Molnar, linux-kernel, travis
On Sat, 10 May 2008, Sam Ravnborg wrote:
> Should this have read:
> > +extern unsigned long __phys_addr(unsigned long x);
> ?
>
> Looks like a prototype with a missing ';'.
> And x86 uses extern for prototypes in .h files (most of the time).
>
Right. And this means that I did not test a 32 bit config with
CONFIG_VM_DEBUG on this one. The run of the mill stuff did not do it.
Sigh.
This patch fixes the compile:
---
include/asm-x86/page_32.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: linux-2.6/include/asm-x86/page_32.h
===================================================================
--- linux-2.6.orig/include/asm-x86/page_32.h 2008-05-09 19:32:47.000000000 -0700
+++ linux-2.6/include/asm-x86/page_32.h 2008-05-09 19:32:55.000000000 -0700
@@ -65,7 +65,7 @@ typedef struct page *pgtable_t;
#ifndef __ASSEMBLY__
#ifdef CONFIG_DEBUG_VM
-unsigned long __phys_addr(unsigned long x)
+extern unsigned long __phys_addr(unsigned long x);
#else
#define __phys_addr(x) ((x) - PAGE_OFFSET)
#endif
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [patch 6/6] x86: Add checks for virtual addresses in __phys_addr()
2008-05-10 2:33 ` Christoph Lameter
@ 2008-05-10 3:07 ` Christoph Lameter
2008-05-13 12:27 ` Ingo Molnar
0 siblings, 1 reply; 12+ messages in thread
From: Christoph Lameter @ 2008-05-10 3:07 UTC (permalink / raw)
To: Sam Ravnborg; +Cc: Ingo Molnar, linux-kernel, travis
We also need to address this issue with __pa expected to be a constant in
32 bit code. Sigh.
---
arch/x86/kernel/doublefault_32.c | 2 +-
include/asm-x86/page_32.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
Index: linux-2.6/include/asm-x86/page_32.h
===================================================================
--- linux-2.6.orig/include/asm-x86/page_32.h 2008-05-09 19:32:47.000000000 -0700
+++ linux-2.6/include/asm-x86/page_32.h 2008-05-09 19:32:55.000000000 -0700
@@ -65,7 +65,7 @@ typedef struct page *pgtable_t;
#ifndef __ASSEMBLY__
#ifdef CONFIG_DEBUG_VM
-unsigned long __phys_addr(unsigned long x)
+extern unsigned long __phys_addr(unsigned long x);
#else
#define __phys_addr(x) ((x) - PAGE_OFFSET)
#endif
Index: linux-2.6/arch/x86/kernel/doublefault_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/doublefault_32.c 2008-05-09 19:40:08.000000000 -0700
+++ linux-2.6/arch/x86/kernel/doublefault_32.c 2008-05-09 19:40:45.000000000 -0700
@@ -66,6 +66,6 @@ struct tss_struct doublefault_tss __cach
.ds = __USER_DS,
.fs = __KERNEL_PERCPU,
- .__cr3 = __pa(swapper_pg_dir)
+ .__cr3 = (unsigned long)swapper_pg_dir - PAGE_OFFSET
}
};
^ permalink raw reply [flat|nested] 12+ messages in thread