2008-06-24 11:32:21 +10:00
# ifndef _ASM_POWERPC_CODE_PATCHING_H
# define _ASM_POWERPC_CODE_PATCHING_H
/*
* Copyright 2008 , Michael Ellerman , IBM Corporation .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
2008-06-24 11:32:28 +10:00
# include <asm/types.h>
2008-07-02 01:16:40 +10:00
# define PPC_NOP_INSTR 0x60000000
# define PPC_LWSYNC_INSTR 0x7c2004ac
2008-06-24 11:32:35 +10:00
2008-06-24 11:32:21 +10:00
/* Flags for create_branch:
* " b " = = create_branch ( addr , target , 0 ) ;
* " ba " = = create_branch ( addr , target , BRANCH_ABSOLUTE ) ;
* " bl " = = create_branch ( addr , target , BRANCH_SET_LINK ) ;
* " bla " = = create_branch ( addr , target , BRANCH_ABSOLUTE | BRANCH_SET_LINK ) ;
*/
# define BRANCH_SET_LINK 0x1
# define BRANCH_ABSOLUTE 0x2
2008-06-24 11:32:22 +10:00
unsigned int create_branch ( const unsigned int * addr ,
unsigned long target , int flags ) ;
2008-06-24 11:32:29 +10:00
unsigned int create_cond_branch ( const unsigned int * addr ,
unsigned long target , int flags ) ;
2008-06-24 11:32:22 +10:00
void patch_branch ( unsigned int * addr , unsigned long target , int flags ) ;
void patch_instruction ( unsigned int * addr , unsigned int instr ) ;
2008-06-24 11:32:21 +10:00
2008-06-24 11:32:29 +10:00
int instr_is_relative_branch ( unsigned int instr ) ;
int instr_is_branch_to_addr ( const unsigned int * instr , unsigned long addr ) ;
unsigned long branch_target ( const unsigned int * instr ) ;
unsigned int translate_branch ( const unsigned int * dest ,
const unsigned int * src ) ;
2008-06-24 11:32:28 +10:00
static inline unsigned long ppc_function_entry ( void * func )
{
# ifdef CONFIG_PPC64
/*
* On PPC64 the function pointer actually points to the function ' s
* descriptor . The first entry in the descriptor is the address
* of the function text .
*/
return ( ( func_descr_t * ) func ) - > entry ;
# else
return ( unsigned long ) func ;
# endif
}
2008-06-24 11:32:21 +10:00
# endif /* _ASM_POWERPC_CODE_PATCHING_H */