|
@@ -413,6 +413,41 @@ void create_section_mapping(unsigned long start, unsigned long end)
|
|
|
}
|
|
|
#endif /* CONFIG_MEMORY_HOTPLUG */
|
|
|
|
|
|
+static inline void make_bl(unsigned int *insn_addr, void *func)
|
|
|
+{
|
|
|
+ unsigned long funcp = *((unsigned long *)func);
|
|
|
+ int offset = funcp - (unsigned long)insn_addr;
|
|
|
+
|
|
|
+ *insn_addr = (unsigned int)(0x48000001 | (offset & 0x03fffffc));
|
|
|
+ flush_icache_range((unsigned long)insn_addr, 4+
|
|
|
+ (unsigned long)insn_addr);
|
|
|
+}
|
|
|
+
|
|
|
+static void __init htab_finish_init(void)
|
|
|
+{
|
|
|
+ extern unsigned int *htab_call_hpte_insert1;
|
|
|
+ extern unsigned int *htab_call_hpte_insert2;
|
|
|
+ extern unsigned int *htab_call_hpte_remove;
|
|
|
+ extern unsigned int *htab_call_hpte_updatepp;
|
|
|
+
|
|
|
+#ifdef CONFIG_PPC_64K_PAGES
|
|
|
+ extern unsigned int *ht64_call_hpte_insert1;
|
|
|
+ extern unsigned int *ht64_call_hpte_insert2;
|
|
|
+ extern unsigned int *ht64_call_hpte_remove;
|
|
|
+ extern unsigned int *ht64_call_hpte_updatepp;
|
|
|
+
|
|
|
+ make_bl(ht64_call_hpte_insert1, ppc_md.hpte_insert);
|
|
|
+ make_bl(ht64_call_hpte_insert2, ppc_md.hpte_insert);
|
|
|
+ make_bl(ht64_call_hpte_remove, ppc_md.hpte_remove);
|
|
|
+ make_bl(ht64_call_hpte_updatepp, ppc_md.hpte_updatepp);
|
|
|
+#endif /* CONFIG_PPC_64K_PAGES */
|
|
|
+
|
|
|
+ make_bl(htab_call_hpte_insert1, ppc_md.hpte_insert);
|
|
|
+ make_bl(htab_call_hpte_insert2, ppc_md.hpte_insert);
|
|
|
+ make_bl(htab_call_hpte_remove, ppc_md.hpte_remove);
|
|
|
+ make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp);
|
|
|
+}
|
|
|
+
|
|
|
void __init htab_initialize(void)
|
|
|
{
|
|
|
unsigned long table;
|
|
@@ -525,6 +560,8 @@ void __init htab_initialize(void)
|
|
|
mmu_linear_psize));
|
|
|
}
|
|
|
|
|
|
+ htab_finish_init();
|
|
|
+
|
|
|
DBG(" <- htab_initialize()\n");
|
|
|
}
|
|
|
#undef KB
|
|
@@ -787,16 +824,6 @@ void flush_hash_range(unsigned long number, int local)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static inline void make_bl(unsigned int *insn_addr, void *func)
|
|
|
-{
|
|
|
- unsigned long funcp = *((unsigned long *)func);
|
|
|
- int offset = funcp - (unsigned long)insn_addr;
|
|
|
-
|
|
|
- *insn_addr = (unsigned int)(0x48000001 | (offset & 0x03fffffc));
|
|
|
- flush_icache_range((unsigned long)insn_addr, 4+
|
|
|
- (unsigned long)insn_addr);
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* low_hash_fault is called when we the low level hash code failed
|
|
|
* to instert a PTE due to an hypervisor error
|
|
@@ -815,28 +842,3 @@ void low_hash_fault(struct pt_regs *regs, unsigned long address)
|
|
|
}
|
|
|
bad_page_fault(regs, address, SIGBUS);
|
|
|
}
|
|
|
-
|
|
|
-void __init htab_finish_init(void)
|
|
|
-{
|
|
|
- extern unsigned int *htab_call_hpte_insert1;
|
|
|
- extern unsigned int *htab_call_hpte_insert2;
|
|
|
- extern unsigned int *htab_call_hpte_remove;
|
|
|
- extern unsigned int *htab_call_hpte_updatepp;
|
|
|
-
|
|
|
-#ifdef CONFIG_PPC_64K_PAGES
|
|
|
- extern unsigned int *ht64_call_hpte_insert1;
|
|
|
- extern unsigned int *ht64_call_hpte_insert2;
|
|
|
- extern unsigned int *ht64_call_hpte_remove;
|
|
|
- extern unsigned int *ht64_call_hpte_updatepp;
|
|
|
-
|
|
|
- make_bl(ht64_call_hpte_insert1, ppc_md.hpte_insert);
|
|
|
- make_bl(ht64_call_hpte_insert2, ppc_md.hpte_insert);
|
|
|
- make_bl(ht64_call_hpte_remove, ppc_md.hpte_remove);
|
|
|
- make_bl(ht64_call_hpte_updatepp, ppc_md.hpte_updatepp);
|
|
|
-#endif /* CONFIG_PPC_64K_PAGES */
|
|
|
-
|
|
|
- make_bl(htab_call_hpte_insert1, ppc_md.hpte_insert);
|
|
|
- make_bl(htab_call_hpte_insert2, ppc_md.hpte_insert);
|
|
|
- make_bl(htab_call_hpte_remove, ppc_md.hpte_remove);
|
|
|
- make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp);
|
|
|
-}
|