mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-18 18:43:59 +08:00
sparc: Handle negative offsets in arch_jump_label_transform
Additionally, if the offset will overflow the immediate for a ba,pt instruction, fall back on a standard ba to get an extra 3 bits. Signed-off-by: James Clarke <jrtc27@jrtc27.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b429ae4d5b
commit
9d9fa23020
@ -13,19 +13,30 @@
|
||||
void arch_jump_label_transform(struct jump_entry *entry,
|
||||
enum jump_label_type type)
|
||||
{
|
||||
u32 val;
|
||||
u32 *insn = (u32 *) (unsigned long) entry->code;
|
||||
u32 val;
|
||||
|
||||
if (type == JUMP_LABEL_JMP) {
|
||||
s32 off = (s32)entry->target - (s32)entry->code;
|
||||
bool use_v9_branch = false;
|
||||
|
||||
BUG_ON(off & 3);
|
||||
|
||||
#ifdef CONFIG_SPARC64
|
||||
/* ba,pt %xcc, . + (off << 2) */
|
||||
val = 0x10680000 | ((u32) off >> 2);
|
||||
#else
|
||||
/* ba . + (off << 2) */
|
||||
val = 0x10800000 | ((u32) off >> 2);
|
||||
if (off <= 0xfffff && off >= -0x100000)
|
||||
use_v9_branch = true;
|
||||
#endif
|
||||
if (use_v9_branch) {
|
||||
/* WDISP19 - target is . + immed << 2 */
|
||||
/* ba,pt %xcc, . + off */
|
||||
val = 0x10680000 | (((u32) off >> 2) & 0x7ffff);
|
||||
} else {
|
||||
/* WDISP22 - target is . + immed << 2 */
|
||||
BUG_ON(off > 0x7fffff);
|
||||
BUG_ON(off < -0x800000);
|
||||
/* ba . + off */
|
||||
val = 0x10800000 | (((u32) off >> 2) & 0x3fffff);
|
||||
}
|
||||
} else {
|
||||
val = 0x01000000;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user