Subject: [PATCH] x86: Move early_trap_pf_init down after init_mem_mapping

With #PF handler help, we can set mem mapping from blank in init_level4_pgt

but we need to keep that handler alive until init_mem_mapping and don't

let early_trap_init to trash that early #PF handler.

So split early_trap_pf_init out and move it down.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>

---
 arch/x86/include/asm/processor.h |    3 ++-
 arch/x86/kernel/setup.c          |    4 +++-
 arch/x86/kernel/traps.c          |    8 ++++++--
 3 files changed, 11 insertions(+), 4 deletions(-)

Index: linux-2.6/arch/x86/kernel/setup.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/setup.c
+++ linux-2.6/arch/x86/kernel/setup.c
@@ -685,7 +685,7 @@ void __init setup_arch(char **cmdline_p)
 	 */
 	olpc_ofw_detect();
 
-	early_trap_init();
+	early_trap_db_bp_init();
 	early_cpu_init();
 	early_ioremap_init();
 
@@ -917,6 +917,8 @@ void __init setup_arch(char **cmdline_p)
 
 	init_mem_mapping();
 
+	early_trap_pf_init();
+
 	setup_real_mode();
 
 	memblock.current_limit = get_max_mapped();
Index: linux-2.6/arch/x86/include/asm/processor.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/processor.h
+++ linux-2.6/arch/x86/include/asm/processor.h
@@ -730,7 +730,8 @@ enum idle_boot_override {IDLE_NO_OVERRID
 extern void enable_sep_cpu(void);
 extern int sysenter_setup(void);
 
-extern void early_trap_init(void);
+extern void early_trap_db_bp_init(void);
+extern void early_trap_pf_init(void);
 
 /* Defined in head.S */
 extern struct desc_ptr		early_gdt_descr;
Index: linux-2.6/arch/x86/kernel/traps.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/traps.c
+++ linux-2.6/arch/x86/kernel/traps.c
@@ -689,15 +689,19 @@ dotraplinkage void do_iret_error(struct
 #endif
 
 /* Set of traps needed for early debugging. */
-void __init early_trap_init(void)
+void __init early_trap_db_bp_init(void)
 {
 	set_intr_gate_ist(X86_TRAP_DB, &debug, DEBUG_STACK);
 	/* int3 can be called from all */
 	set_system_intr_gate_ist(X86_TRAP_BP, &int3, DEBUG_STACK);
-	set_intr_gate(X86_TRAP_PF, &page_fault);
 	load_idt(&idt_descr);
 }
 
+void __init early_trap_pf_init(void)
+{
+	set_intr_gate(X86_TRAP_PF, &page_fault);
+}
+
 void __init trap_init(void)
 {
 	int i;
