@ -53,6 +53,7 @@
# include <asm/sections.h>
# include <asm/spu.h>
# include <asm/udbg.h>
# include <asm/code-patching.h>
# ifdef DEBUG
# define DBG(fmt...) udbg_printf(fmt)
@ -547,15 +548,7 @@ int remove_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 ) ;
}
# define FUNCTION_TEXT(A) ((*(unsigned long *)(A)))
static void __init htab_finish_init ( void )
{
@ -570,16 +563,33 @@ static void __init htab_finish_init(void)
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 ) ;
patch_branch ( ht64_call_hpte_insert1 ,
FUNCTION_TEXT ( ppc_md . hpte_insert ) ,
BRANCH_SET_LINK ) ;
patch_branch ( ht64_call_hpte_insert2 ,
FUNCTION_TEXT ( ppc_md . hpte_insert ) ,
BRANCH_SET_LINK ) ;
patch_branch ( ht64_call_hpte_remove ,
FUNCTION_TEXT ( ppc_md . hpte_remove ) ,
BRANCH_SET_LINK ) ;
patch_branch ( ht64_call_hpte_updatepp ,
FUNCTION_TEXT ( ppc_md . hpte_updatepp ) ,
BRANCH_SET_LINK ) ;
# endif /* CONFIG_PPC_HAS_HASH_64K */
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 ) ;
patch_branch ( htab_call_hpte_insert1 ,
FUNCTION_TEXT ( ppc_md . hpte_insert ) ,
BRANCH_SET_LINK ) ;
patch_branch ( htab_call_hpte_insert2 ,
FUNCTION_TEXT ( ppc_md . hpte_insert ) ,
BRANCH_SET_LINK ) ;
patch_branch ( htab_call_hpte_remove ,
FUNCTION_TEXT ( ppc_md . hpte_remove ) ,
BRANCH_SET_LINK ) ;
patch_branch ( htab_call_hpte_updatepp ,
FUNCTION_TEXT ( ppc_md . hpte_updatepp ) ,
BRANCH_SET_LINK ) ;
}
static void __init htab_initialize ( void )