On Jun 23, 2008, at 8:32 PM, Michael Ellerman wrote:

This commit adds some new routines for patching code, they will be used
in a following commit.

Signed-off-by: Michael Ellerman <[EMAIL PROTECTED]>
---
arch/powerpc/lib/code-patching.c | 107 ++++++++++++++++++++++++++ +++++++++
include/asm-powerpc/code-patching.h |    8 +++
2 files changed, 115 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/ code-patching.c
index 430f4c1..27957c4 100644
--- a/arch/powerpc/lib/code-patching.c
+++ b/arch/powerpc/lib/code-patching.c
@@ -41,3 +41,110 @@ unsigned int create_branch(const unsigned int *addr,

        return instruction;
}
+
+unsigned int create_cond_branch(const unsigned int *addr,
+                               unsigned long target, int flags)
+{

it would be nice to have some idea what flags is suppose to be.

+       unsigned int instruction;
+       long offset;
+
+       offset = target;
+       if (! (flags & BRANCH_ABSOLUTE))
+               offset = offset - (unsigned long)addr;
+
+       /* Check we can represent the target in the instruction format */
+       if (offset < -0x8000 || offset > 0x7FFF || offset & 0x3)
+               return 0;
+
+ /* Mask out the flags and target, so they don't step on each other. */
+       instruction = 0x40000000 | (flags & 0x3FF0003) | (offset & 0xFFFC);
+
+       return instruction;
+}

[snip]

+unsigned int translate_branch(const unsigned int *dest, const unsigned int *src)
+{

I'm not sure I get what this function is trying to do.


+       unsigned long target;
+
+       target = branch_target(src);
+
+       if (instr_is_branch_iform(*src))
+               return create_branch(dest, target, *src);
+       else if (instr_is_branch_bform(*src))
+               return create_cond_branch(dest, target, *src);
+
+       return 0;
+}
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to