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

powerpc: Handle new ELFv2 module relocations



The new ELF ABI tends to use R_PPC64_REL16_LO and R_PPC64_REL16_HA
relocations (PC-relative), so implement them.

Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 4edebbea
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -295,8 +295,13 @@ do { \
#define R_PPC64_TLSLD		108
#define R_PPC64_TOCSAVE		109

#define R_PPC64_REL16		249
#define R_PPC64_REL16_LO	250
#define R_PPC64_REL16_HI	251
#define R_PPC64_REL16_HA	252

/* Keep this the last entry.  */
#define R_PPC64_NUM		110
#define R_PPC64_NUM		253

/* There's actually a third entry here, but it's unused */
struct ppc64_opd_entry
+17 −0
Original line number Diff line number Diff line
@@ -491,6 +491,23 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
			 */
			break;

		case R_PPC64_REL16_HA:
			/* Subtract location pointer */
			value -= (unsigned long)location;
			value = ((value + 0x8000) >> 16);
			*((uint16_t *) location)
				= (*((uint16_t *) location) & ~0xffff)
				| (value & 0xffff);
			break;

		case R_PPC64_REL16_LO:
			/* Subtract location pointer */
			value -= (unsigned long)location;
			*((uint16_t *) location)
				= (*((uint16_t *) location) & ~0xffff)
				| (value & 0xffff);
			break;

		default:
			printk("%s: Unknown ADD relocation: %lu\n",
			       me->name,