[PATCH 2/6] Allow create_branch() to return errors

Michael Ellerman michael at ellerman.id.au
Thu Jun 5 13:48:02 EST 2008


On Thu, 2008-05-29 at 16:20 +1000, Michael Ellerman wrote:
> Currently create_branch() creates a branch instruction for you, and patches
> it into the call site. In some circumstances it would be nice to be able to
> create the instruction and patch it later, and also some code might want
> to check for errors in the branch creation before doing the patching. A
> future patch will change create_branch() to check for errors.
> 
> For callers that don't care, replace create_branch() with patch_branch(),
> which just creates the branch and patches it directly.
> 
> Signed-off-by: Michael Ellerman <michael at ellerman.id.au>
> ---
>  arch/powerpc/kernel/crash_dump.c          |    4 ++--
>  arch/powerpc/lib/code-patching.c          |   11 ++++++++---
>  arch/powerpc/platforms/86xx/mpc86xx_smp.c |    2 +-
>  arch/powerpc/platforms/powermac/smp.c     |    2 +-
>  include/asm-powerpc/code-patching.h       |    5 +++--
>  5 files changed, 15 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/crash_dump.c b/arch/powerpc/kernel/crash_dump.c
> index 35b9a66..ee2dac5 100644
> --- a/arch/powerpc/kernel/crash_dump.c
> +++ b/arch/powerpc/kernel/crash_dump.c
> @@ -42,8 +42,8 @@ static void __init create_trampoline(unsigned long addr)
>  	 * branch to "addr" we jump to ("addr" + 32 MB). Although it requires
>  	 * two instructions it doesn't require any registers.
>  	 */
> -	create_instruction(addr, 0x60000000); /* nop */
> -	create_branch(addr + 4, addr + PHYSICAL_START, 0);
> +	patch_instruction(addr, 0x60000000); /* nop */
> +	patch_branch(addr + 4, addr + PHYSICAL_START, 0);
>  }
>  
>  void __init setup_kdump_trampoline(void)
> diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c
> index 7afae88..1391981 100644
> --- a/arch/powerpc/lib/code-patching.c
> +++ b/arch/powerpc/lib/code-patching.c
> @@ -11,7 +11,7 @@
>  #include <asm/code-patching.h>
>  
> 
> -void create_instruction(unsigned long addr, unsigned int instr)
> +void patch_instruction(unsigned long addr, unsigned int instr)
>  {
>  	unsigned int *p;
>  	p  = (unsigned int *)addr;

Reviewing my own patches again .. this should take an unsigned int *
instead of an unsigned long.

I'll repost sometime.

cheers

-- 
Michael Ellerman
OzLabs, IBM Australia Development Lab

wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)

We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20080605/24ff70e2/attachment.pgp>


More information about the Linuxppc-dev mailing list