]> Pileus Git - ~andy/linux/blobdiff - arch/powerpc/lib/code-patching.c
powerpc: Make create_branch() return errors if the branch target is too large
[~andy/linux] / arch / powerpc / lib / code-patching.c
index 638dde313cbc1cf953b18b2fcbf25f9820bcf132..430f4c15d7862f13bda92ef823b985781062304f 100644 (file)
@@ -26,12 +26,18 @@ unsigned int create_branch(const unsigned int *addr,
                           unsigned long target, int flags)
 {
        unsigned int instruction;
+       long offset;
 
+       offset = target;
        if (! (flags & BRANCH_ABSOLUTE))
-               target = target - (unsigned long)addr;
+               offset = offset - (unsigned long)addr;
+
+       /* Check we can represent the target in the instruction format */
+       if (offset < -0x2000000 || offset > 0x1fffffc || offset & 0x3)
+               return 0;
 
        /* Mask out the flags and target, so they don't step on each other. */
-       instruction = 0x48000000 | (flags & 0x3) | (target & 0x03FFFFFC);
+       instruction = 0x48000000 | (flags & 0x3) | (offset & 0x03FFFFFC);
 
        return instruction;
 }