Page MenuHomeFreeBSD

D17392.id67106.diff
No OneTemporary

D17392.id67106.diff

Index: head/sys/arm64/arm64/elf_machdep.c
===================================================================
--- head/sys/arm64/arm64/elf_machdep.c
+++ head/sys/arm64/arm64/elf_machdep.c
@@ -125,6 +125,23 @@
}
static int
+reloc_instr_imm(Elf32_Addr *where, Elf_Addr val, u_int msb, u_int lsb)
+{
+
+ /* Check bounds: upper bits must be all ones or all zeros. */
+ if ((uint64_t)((int64_t)val >> (msb + 1)) + 1 > 1)
+ return (-1);
+ val >>= lsb;
+ val &= (1 << (msb - lsb + 1)) - 1;
+ *where |= (Elf32_Addr)val;
+ return (0);
+}
+
+/*
+ * Process a relocation. Support for some static relocations is required
+ * in order for the -zifunc-noplt optimization to work.
+ */
+static int
elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
int type, int local, elf_lookup_fn lookup)
{
@@ -159,10 +176,33 @@
return (0);
}
+ error = 0;
switch (rtype) {
case R_AARCH64_NONE:
case R_AARCH64_RELATIVE:
break;
+ case R_AARCH64_TSTBR14:
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
+ return (-1);
+ error = reloc_instr_imm((Elf32_Addr *)where,
+ addr + addend - (Elf_Addr)where, 15, 2);
+ break;
+ case R_AARCH64_CONDBR19:
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
+ return (-1);
+ error = reloc_instr_imm((Elf32_Addr *)where,
+ addr + addend - (Elf_Addr)where, 20, 2);
+ break;
+ case R_AARCH64_JUMP26:
+ case R_AARCH64_CALL26:
+ error = lookup(lf, symidx, 1, &addr);
+ if (error != 0)
+ return (-1);
+ error = reloc_instr_imm((Elf32_Addr *)where,
+ addr + addend - (Elf_Addr)where, 27, 2);
+ break;
case R_AARCH64_ABS64:
case R_AARCH64_GLOB_DAT:
case R_AARCH64_JUMP_SLOT:
@@ -181,7 +221,7 @@
printf("kldload: unexpected relocation type %d\n", rtype);
return (-1);
}
- return (0);
+ return (error);
}
int

File Metadata

Mime Type
text/plain
Expires
Fri, Jan 16, 11:12 AM (11 h, 11 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27660214
Default Alt Text
D17392.id67106.diff (1 KB)

Event Timeline