Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2fae548 authored by Rusty Russell's avatar Rusty Russell Committed by Anton Blanchard
Browse files

powerpc: modules: change r2 save/restore offset for ELFv2 ABI.



ELFv2 uses a different stack offset (24 vs 40) to save r2.

Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 5b12c5c6
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -41,6 +41,12 @@
#define DEBUGP(fmt , ...)
#endif

#if defined(_CALL_ELF) && _CALL_ELF == 2
#define R2_STACK_OFFSET 24
#else
#define R2_STACK_OFFSET 40
#endif

/* Like PPC32, we need little trampolines to do > 24-bit jumps (into
   the kernel itself).  But on PPC64, these need to be used for every
   jump, actually, to reset r2 (TOC+0x8000). */
@@ -64,7 +70,7 @@ static struct ppc64_stub_entry ppc64_stub =
	0x3d820000,			/* addis   r12,r2, <high> */
	0x398c0000,			/* addi    r12,r12, <low> */
	/* Save current r2 value in magic place on the stack. */
	0xf8410028, /* std     r2,40(r1) */
	0xf8410000|R2_STACK_OFFSET,	/* std     r2,R2_STACK_OFFSET(r1) */
	0xe96c0020,			/* ld      r11,32(r12) */
	0xe84c0028,			/* ld      r2,40(r12) */
	0x7d6903a6,			/* mtctr   r11 */
@@ -338,7 +344,8 @@ static int restore_r2(u32 *instruction, struct module *me)
		       me->name, *instruction);
		return 0;
	}
	*instruction = 0xe8410028;	/* ld r2,40(r1) */
	/* ld r2,R2_STACK_OFFSET(r1) */
	*instruction = 0xe8410000 | R2_STACK_OFFSET;
	return 1;
}