diff options
Diffstat (limited to 'arch/powerpc/mm/hash_utils_64.c')
-rw-r--r-- | arch/powerpc/mm/hash_utils_64.c | 72 |
1 files changed, 37 insertions, 35 deletions
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index d03fd2b4445e..9cefe6a7aeb1 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -413,6 +413,41 @@ void create_section_mapping(unsigned long start, unsigned long end) | |||
413 | } | 413 | } |
414 | #endif /* CONFIG_MEMORY_HOTPLUG */ | 414 | #endif /* CONFIG_MEMORY_HOTPLUG */ |
415 | 415 | ||
416 | static inline void make_bl(unsigned int *insn_addr, void *func) | ||
417 | { | ||
418 | unsigned long funcp = *((unsigned long *)func); | ||
419 | int offset = funcp - (unsigned long)insn_addr; | ||
420 | |||
421 | *insn_addr = (unsigned int)(0x48000001 | (offset & 0x03fffffc)); | ||
422 | flush_icache_range((unsigned long)insn_addr, 4+ | ||
423 | (unsigned long)insn_addr); | ||
424 | } | ||
425 | |||
426 | static void __init htab_finish_init(void) | ||
427 | { | ||
428 | extern unsigned int *htab_call_hpte_insert1; | ||
429 | extern unsigned int *htab_call_hpte_insert2; | ||
430 | extern unsigned int *htab_call_hpte_remove; | ||
431 | extern unsigned int *htab_call_hpte_updatepp; | ||
432 | |||
433 | #ifdef CONFIG_PPC_64K_PAGES | ||
434 | extern unsigned int *ht64_call_hpte_insert1; | ||
435 | extern unsigned int *ht64_call_hpte_insert2; | ||
436 | extern unsigned int *ht64_call_hpte_remove; | ||
437 | extern unsigned int *ht64_call_hpte_updatepp; | ||
438 | |||
439 | make_bl(ht64_call_hpte_insert1, ppc_md.hpte_insert); | ||
440 | make_bl(ht64_call_hpte_insert2, ppc_md.hpte_insert); | ||
441 | make_bl(ht64_call_hpte_remove, ppc_md.hpte_remove); | ||
442 | make_bl(ht64_call_hpte_updatepp, ppc_md.hpte_updatepp); | ||
443 | #endif /* CONFIG_PPC_64K_PAGES */ | ||
444 | |||
445 | make_bl(htab_call_hpte_insert1, ppc_md.hpte_insert); | ||
446 | make_bl(htab_call_hpte_insert2, ppc_md.hpte_insert); | ||
447 | make_bl(htab_call_hpte_remove, ppc_md.hpte_remove); | ||
448 | make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp); | ||
449 | } | ||
450 | |||
416 | void __init htab_initialize(void) | 451 | void __init htab_initialize(void) |
417 | { | 452 | { |
418 | unsigned long table; | 453 | unsigned long table; |
@@ -525,6 +560,8 @@ void __init htab_initialize(void) | |||
525 | mmu_linear_psize)); | 560 | mmu_linear_psize)); |
526 | } | 561 | } |
527 | 562 | ||
563 | htab_finish_init(); | ||
564 | |||
528 | DBG(" <- htab_initialize()\n"); | 565 | DBG(" <- htab_initialize()\n"); |
529 | } | 566 | } |
530 | #undef KB | 567 | #undef KB |
@@ -787,16 +824,6 @@ void flush_hash_range(unsigned long number, int local) | |||
787 | } | 824 | } |
788 | } | 825 | } |
789 | 826 | ||
790 | static inline void make_bl(unsigned int *insn_addr, void *func) | ||
791 | { | ||
792 | unsigned long funcp = *((unsigned long *)func); | ||
793 | int offset = funcp - (unsigned long)insn_addr; | ||
794 | |||
795 | *insn_addr = (unsigned int)(0x48000001 | (offset & 0x03fffffc)); | ||
796 | flush_icache_range((unsigned long)insn_addr, 4+ | ||
797 | (unsigned long)insn_addr); | ||
798 | } | ||
799 | |||
800 | /* | 827 | /* |
801 | * low_hash_fault is called when we the low level hash code failed | 828 | * low_hash_fault is called when we the low level hash code failed |
802 | * to instert a PTE due to an hypervisor error | 829 | * to instert a PTE due to an hypervisor error |
@@ -815,28 +842,3 @@ void low_hash_fault(struct pt_regs *regs, unsigned long address) | |||
815 | } | 842 | } |
816 | bad_page_fault(regs, address, SIGBUS); | 843 | bad_page_fault(regs, address, SIGBUS); |
817 | } | 844 | } |
818 | |||
819 | void __init htab_finish_init(void) | ||
820 | { | ||
821 | extern unsigned int *htab_call_hpte_insert1; | ||
822 | extern unsigned int *htab_call_hpte_insert2; | ||
823 | extern unsigned int *htab_call_hpte_remove; | ||
824 | extern unsigned int *htab_call_hpte_updatepp; | ||
825 | |||
826 | #ifdef CONFIG_PPC_64K_PAGES | ||
827 | extern unsigned int *ht64_call_hpte_insert1; | ||
828 | extern unsigned int *ht64_call_hpte_insert2; | ||
829 | extern unsigned int *ht64_call_hpte_remove; | ||
830 | extern unsigned int *ht64_call_hpte_updatepp; | ||
831 | |||
832 | make_bl(ht64_call_hpte_insert1, ppc_md.hpte_insert); | ||
833 | make_bl(ht64_call_hpte_insert2, ppc_md.hpte_insert); | ||
834 | make_bl(ht64_call_hpte_remove, ppc_md.hpte_remove); | ||
835 | make_bl(ht64_call_hpte_updatepp, ppc_md.hpte_updatepp); | ||
836 | #endif /* CONFIG_PPC_64K_PAGES */ | ||
837 | |||
838 | make_bl(htab_call_hpte_insert1, ppc_md.hpte_insert); | ||
839 | make_bl(htab_call_hpte_insert2, ppc_md.hpte_insert); | ||
840 | make_bl(htab_call_hpte_remove, ppc_md.hpte_remove); | ||
841 | make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp); | ||
842 | } | ||