@@ -19,12 +19,20 @@ void arch_jump_label_transform(struct jump_entry *entry,
if (type == JUMP_LABEL_JMP) {
s32 off = (s32)entry->target - (s32)entry->code;
+ BUG_ON(off & 3);
+
#ifdef CONFIG_SPARC64
- /* ba,pt %xcc, . + (off << 2) */
- val = 0x10680000 | ((u32) off >> 2);
+ /* WDISP19 - target is . + (immed << 2) */
+ BUG_ON(off > 0xfffff);
+ BUG_ON(off < -0x100000);
+ /* ba,pt %xcc, . + off */
+ val = 0x10680000 | (((u32) off >> 2) & 0x7ffff);
#else
- /* ba . + (off << 2) */
- val = 0x10800000 | ((u32) off >> 2);
+ /* WDISP22 - target is . + (immed << 2) */
+ BUG_ON(off > 0x7fffff);
+ BUG_ON(off < -0x800000);
+ /* ba . + off */
+ val = 0x10800000 | (((u32) off >> 2) & 0x3fffff);
#endif
} else {
val = 0x01000000;