* [PATCH] BPF relocations refactoring
@ 2023-03-02 11:25 Cupertino Miranda
2023-03-02 11:25 ` [PATCH] BPF relocations review / refactoring Cupertino Miranda
0 siblings, 1 reply; 5+ messages in thread
From: Cupertino Miranda @ 2023-03-02 11:25 UTC (permalink / raw)
To: binutils; +Cc: jose.marchesi, elena.zannoni, cupertino.miranda
Good morning
This is a review work to bpf relocations.
- non-essential relocations were removed.
- renamed the remaning to match llvm and linux kernel.
Looking forward to your review.
Best regards,
Cupertino
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH] BPF relocations review / refactoring
2023-03-02 11:25 [PATCH] BPF relocations refactoring Cupertino Miranda
@ 2023-03-02 11:25 ` Cupertino Miranda
2023-03-15 16:39 ` Jose E. Marchesi
0 siblings, 1 reply; 5+ messages in thread
From: Cupertino Miranda @ 2023-03-02 11:25 UTC (permalink / raw)
To: binutils; +Cc: jose.marchesi, elena.zannoni, cupertino.miranda
- Removed not needed relocations.
- Renamed relocations to match llvm and linux kernel.
Relocation changes:
R_BPF_INSN_64 => R_BPF_64_64
R_BPF_INSN_DISP32 => R_BPF_64_32
R_BPF_DATA_32 => R_BPF_64_ABS32
R_BPF_DATA_64 => R_BPF_64_ABS64
ChangeLog:
* bfd/bpf-reloc.def: Created file with BPF_HOWTO macro entries.
* bfd/reloc.c: Removed non needed relocations.
* bfd/bfd-in2.h: regenerated.
* bfd/libbfd.h: regenerated.
* bfd/elf64-bpf.c: Changed relocations.
* include/elf/bpf.h: Adapted relocation values/names.
* gas/config/tc-bpf.c: Changed relocation mapping.
---
bfd/bfd-in2.h | 3 -
bfd/bpf-reloc.def | 74 +++++++++++
bfd/elf64-bpf.c | 314 +++++++-------------------------------------
bfd/libbfd.h | 3 -
bfd/reloc.c | 6 -
gas/config/tc-bpf.c | 7 -
include/elf/bpf.h | 22 ++--
7 files changed, 129 insertions(+), 300 deletions(-)
create mode 100644 bfd/bpf-reloc.def
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 7c5953442aa..b60ff960f08 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -6079,9 +6079,6 @@ assembler and not (currently) written to any object files. */
/* Linux eBPF relocations. */
BFD_RELOC_BPF_64,
- BFD_RELOC_BPF_32,
- BFD_RELOC_BPF_16,
- BFD_RELOC_BPF_DISP16,
BFD_RELOC_BPF_DISP32,
/* Adapteva EPIPHANY - 8 bit signed pc-relative displacement */
diff --git a/bfd/bpf-reloc.def b/bfd/bpf-reloc.def
new file mode 100644
index 00000000000..b1be2eb66f6
--- /dev/null
+++ b/bfd/bpf-reloc.def
@@ -0,0 +1,74 @@
+ /* This reloc does nothing. */
+ BPF_HOWTO (R_BPF_NONE, /* type */
+ 0, /* rightshift */
+ 0, /* size */
+ 0, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ bpf_elf_generic_reloc, /* special_function */
+ "R_BPF_NONE", /* name */
+ false, /* partial_inplace */
+ 0, /* src_mask */
+ 0, /* dst_mask */
+ false) /* pcrel_offset */
+
+ /* 64-immediate in LDDW instruction. */
+ BPF_HOWTO (R_BPF_64_64, /* type */
+ 0, /* rightshift */
+ 8, /* size */
+ 64, /* bitsize */
+ false, /* pc_relative */
+ 32, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ bpf_elf_generic_reloc, /* special_function */
+ "R_BPF_64_64", /* name */
+ true, /* partial_inplace */
+ MINUS_ONE, /* src_mask */
+ MINUS_ONE, /* dst_mask */
+ true) /* pcrel_offset */
+
+ /* 32-bit data. */
+ BPF_HOWTO (R_BPF_64_ABS32, /* type */
+ 0, /* rightshift */
+ 4, /* size */
+ 32, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ bpf_elf_generic_reloc, /* special_function */
+ "R_BPF_64_ABS32", /* name */
+ false, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ true) /* pcrel_offset */
+
+ /* 64-bit data. */
+ BPF_HOWTO (R_BPF_64_ABS64, /* type */
+ 0, /* rightshift */
+ 8, /* size */
+ 64, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ bpf_elf_generic_reloc, /* special_function */
+ "R_BPF_64_ABS64", /* name */
+ false, /* partial_inplace */
+ 0, /* src_mask */
+ MINUS_ONE, /* dst_mask */
+ true) /* pcrel_offset */
+
+ /* 32-bit PC-relative address in call instructions. */
+ BPF_HOWTO (R_BPF_64_32, /* type */
+ 0, /* rightshift */
+ 4, /* size */
+ 32, /* bitsize */
+ true, /* pc_relative */
+ 32, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ bpf_elf_generic_reloc, /* special_function */
+ "R_BPF_64_32", /* name */
+ true, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ true) /* pcrel_offset */
diff --git a/bfd/elf64-bpf.c b/bfd/elf64-bpf.c
index 4f9949b515b..ef34d62df01 100644
--- a/bfd/elf64-bpf.c
+++ b/bfd/elf64-bpf.c
@@ -34,214 +34,40 @@
static bfd_reloc_status_type bpf_elf_generic_reloc
(bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
+#undef BPF_HOWTO
+#define BPF_HOWTO(type, right, size, bits, pcrel, left, ovf, func, name, \
+ inplace, src_mask, dst_mask, pcrel_off) \
+ type##_IDX,
+enum bpf_reloc_index {
+ R_BPF_INVALID_IDX = -1,
+#include "bpf-reloc.def"
+ R_BPF_SIZE
+};
+#undef BPF_HOWTO
+
/* Relocation tables. */
+#define BPF_HOWTO(...) HOWTO(__VA_ARGS__),
static reloc_howto_type bpf_elf_howto_table [] =
{
- /* This reloc does nothing. */
- HOWTO (R_BPF_NONE, /* type */
- 0, /* rightshift */
- 0, /* size */
- 0, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_dont, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_NONE", /* name */
- false, /* partial_inplace */
- 0, /* src_mask */
- 0, /* dst_mask */
- false), /* pcrel_offset */
-
- /* 64-immediate in LDDW instruction. */
- HOWTO (R_BPF_INSN_64, /* type */
- 0, /* rightshift */
- 8, /* size */
- 64, /* bitsize */
- false, /* pc_relative */
- 32, /* bitpos */
- complain_overflow_signed, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_INSN_64", /* name */
- true, /* partial_inplace */
- MINUS_ONE, /* src_mask */
- MINUS_ONE, /* dst_mask */
- true), /* pcrel_offset */
-
- /* 32-immediate in many instructions. */
- HOWTO (R_BPF_INSN_32, /* type */
- 0, /* rightshift */
- 4, /* size */
- 32, /* bitsize */
- false, /* pc_relative */
- 32, /* bitpos */
- complain_overflow_signed, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_INSN_32", /* name */
- true, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
- true), /* pcrel_offset */
-
- /* 16-bit offsets in instructions. */
- HOWTO (R_BPF_INSN_16, /* type */
- 0, /* rightshift */
- 2, /* size */
- 16, /* bitsize */
- false, /* pc_relative */
- 16, /* bitpos */
- complain_overflow_signed, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_INSN_16", /* name */
- true, /* partial_inplace */
- 0x0000ffff, /* src_mask */
- 0x0000ffff, /* dst_mask */
- true), /* pcrel_offset */
-
- /* 16-bit PC-relative address in jump instructions. */
- HOWTO (R_BPF_INSN_DISP16, /* type */
- 0, /* rightshift */
- 2, /* size */
- 16, /* bitsize */
- true, /* pc_relative */
- 16, /* bitpos */
- complain_overflow_signed, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_INSN_DISP16", /* name */
- true, /* partial_inplace */
- 0xffff, /* src_mask */
- 0xffff, /* dst_mask */
- true), /* pcrel_offset */
-
- HOWTO (R_BPF_DATA_8_PCREL,
- 0, /* rightshift */
- 1, /* size */
- 8, /* bitsize */
- true, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_signed, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_8_PCREL", /* name */
- true, /* partial_inplace */
- 0xff, /* src_mask */
- 0xff, /* dst_mask */
- true), /* pcrel_offset */
-
- HOWTO (R_BPF_DATA_16_PCREL,
- 0, /* rightshift */
- 2, /* size */
- 16, /* bitsize */
- true, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_signed, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_16_PCREL", /* name */
- false, /* partial_inplace */
- 0xffff, /* src_mask */
- 0xffff, /* dst_mask */
- true), /* pcrel_offset */
-
- HOWTO (R_BPF_DATA_32_PCREL,
- 0, /* rightshift */
- 4, /* size */
- 32, /* bitsize */
- true, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_signed, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_32_PCREL", /* name */
- false, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
- true), /* pcrel_offset */
-
- HOWTO (R_BPF_DATA_8,
- 0, /* rightshift */
- 1, /* size */
- 8, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_unsigned, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_DATA_8", /* name */
- true, /* partial_inplace */
- 0xff, /* src_mask */
- 0xff, /* dst_mask */
- false), /* pcrel_offset */
-
- HOWTO (R_BPF_DATA_16,
- 0, /* rightshift */
- 2, /* size */
- 16, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_unsigned, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_DATA_16", /* name */
- false, /* partial_inplace */
- 0xffff, /* src_mask */
- 0xffff, /* dst_mask */
- false), /* pcrel_offset */
-
- /* 32-bit PC-relative address in call instructions. */
- HOWTO (R_BPF_INSN_DISP32, /* type */
- 0, /* rightshift */
- 4, /* size */
- 32, /* bitsize */
- true, /* pc_relative */
- 32, /* bitpos */
- complain_overflow_signed, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_INSN_DISP32", /* name */
- true, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
- true), /* pcrel_offset */
-
- /* 32-bit data. */
- HOWTO (R_BPF_DATA_32, /* type */
- 0, /* rightshift */
- 4, /* size */
- 32, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_bitfield, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_DATA_32", /* name */
- false, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
- true), /* pcrel_offset */
-
- /* 64-bit data. */
- HOWTO (R_BPF_DATA_64, /* type */
- 0, /* rightshift */
- 8, /* size */
- 64, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_bitfield, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_DATA_64", /* name */
- false, /* partial_inplace */
- 0, /* src_mask */
- MINUS_ONE, /* dst_mask */
- true), /* pcrel_offset */
-
- HOWTO (R_BPF_DATA_64_PCREL,
- 0, /* rightshift */
- 8, /* size */
- 64, /* bitsize */
- true, /* pc_relative */
- 0, /* bitpos */
- complain_overflow_signed, /* complain_on_overflow */
- bpf_elf_generic_reloc, /* special_function */
- "R_BPF_64_PCREL", /* name */
- false, /* partial_inplace */
- MINUS_ONE, /* src_mask */
- MINUS_ONE, /* dst_mask */
- true), /* pcrel_offset */
+ #include "bpf-reloc.def"
};
#undef AHOW
+#undef BPF_HOWTO
+
+#define BPF_HOWTO(type, right, size, bits, pcrel, left, ovf, func, name, \
+ inplace, src_mask, dst_mask, pcrel_off) \
+ case type: { return type##_IDX; }
+static enum bpf_reloc_index
+bpf_index_for_rtype(unsigned int r_type)
+{
+ switch(r_type) {
+#include "bpf-reloc.def"
+ default:
+ /* Unreachable code. */
+ BFD_ASSERT(0);
+ return -1;
+ };
+}
/* Map BFD reloc types to bpf ELF reloc types. */
@@ -249,44 +75,20 @@ static reloc_howto_type *
bpf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
bfd_reloc_code_real_type code)
{
- /* Note that the bpf_elf_howto_table is indexed by the R_ constants.
- Thus, the order that the howto records appear in the table *must*
- match the order of the relocation types defined in
- include/elf/bpf.h. */
-
switch (code)
{
case BFD_RELOC_NONE:
- return &bpf_elf_howto_table[ (int) R_BPF_NONE];
-
- case BFD_RELOC_8_PCREL:
- return &bpf_elf_howto_table[ (int) R_BPF_DATA_8_PCREL];
- case BFD_RELOC_16_PCREL:
- return &bpf_elf_howto_table[ (int) R_BPF_DATA_16_PCREL];
- case BFD_RELOC_32_PCREL:
- return &bpf_elf_howto_table[ (int) R_BPF_DATA_32_PCREL];
- case BFD_RELOC_64_PCREL:
- return &bpf_elf_howto_table[ (int) R_BPF_DATA_64_PCREL];
-
- case BFD_RELOC_8:
- return &bpf_elf_howto_table[ (int) R_BPF_DATA_8];
- case BFD_RELOC_16:
- return &bpf_elf_howto_table[ (int) R_BPF_DATA_16];
+ return &bpf_elf_howto_table[ (int) R_BPF_NONE_IDX];
+
case BFD_RELOC_32:
- return &bpf_elf_howto_table[ (int) R_BPF_DATA_32];
+ return &bpf_elf_howto_table[ (int) R_BPF_64_ABS32_IDX];
case BFD_RELOC_64:
- return &bpf_elf_howto_table[ (int) R_BPF_DATA_64];
+ return &bpf_elf_howto_table[ (int) R_BPF_64_ABS64_IDX];
case BFD_RELOC_BPF_64:
- return &bpf_elf_howto_table[ (int) R_BPF_INSN_64];
- case BFD_RELOC_BPF_32:
- return &bpf_elf_howto_table[ (int) R_BPF_INSN_32];
- case BFD_RELOC_BPF_16:
- return &bpf_elf_howto_table[ (int) R_BPF_INSN_16];
- case BFD_RELOC_BPF_DISP16:
- return &bpf_elf_howto_table[ (int) R_BPF_INSN_DISP16];
+ return &bpf_elf_howto_table[ (int) R_BPF_64_64_IDX];
case BFD_RELOC_BPF_DISP32:
- return &bpf_elf_howto_table[ (int) R_BPF_INSN_DISP32];
+ return &bpf_elf_howto_table[ (int) R_BPF_64_32_IDX];
default:
/* Pacify gcc -Wall. */
@@ -302,7 +104,7 @@ bpf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
{
unsigned int i;
- for (i = 0; i < ARRAY_SIZE (bpf_elf_howto_table); i++)
+ for (i = 0; i < R_BPF_SIZE; i++)
if (bpf_elf_howto_table[i].name != NULL
&& strcasecmp (bpf_elf_howto_table[i].name, r_name) == 0)
return &bpf_elf_howto_table[i];
@@ -317,9 +119,11 @@ bpf_info_to_howto (bfd *abfd, arelent *bfd_reloc,
Elf_Internal_Rela *elf_reloc)
{
unsigned int r_type;
-
+ unsigned int i;
r_type = ELF64_R_TYPE (elf_reloc->r_info);
- if (r_type >= (unsigned int) R_BPF_max)
+
+ i = bpf_index_for_rtype(r_type);
+ if (i == (unsigned int) -1)
{
/* xgettext:c-format */
_bfd_error_handler (_("%pB: unsupported relocation type %#x"),
@@ -328,7 +132,7 @@ bpf_info_to_howto (bfd *abfd, arelent *bfd_reloc,
return false;
}
- bfd_reloc->howto = &bpf_elf_howto_table [r_type];
+ bfd_reloc->howto = &bpf_elf_howto_table [i];
return true;
}
@@ -438,8 +242,7 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
switch (howto->type)
{
- case R_BPF_INSN_DISP16:
- case R_BPF_INSN_DISP32:
+ case R_BPF_64_32:
{
/* Make the relocation PC-relative, and change its unit to
64-bit words. Note we need *signed* arithmetic
@@ -465,10 +268,8 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
r = bfd_reloc_ok;
break;
}
- case R_BPF_DATA_8:
- case R_BPF_DATA_16:
- case R_BPF_DATA_32:
- case R_BPF_DATA_64:
+ case R_BPF_64_ABS64:
+ case R_BPF_64_ABS32:
{
addend = bfd_get (howto->bitsize, input_bfd, where);
relocation += addend;
@@ -477,28 +278,7 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
r = bfd_reloc_ok;
break;
}
- case R_BPF_INSN_16:
- {
-
- addend = bfd_get_16 (input_bfd, where + 2);
- relocation += addend;
- bfd_put_16 (input_bfd, relocation, where + 2);
-
- r = bfd_reloc_ok;
- break;
- }
- case R_BPF_INSN_32:
- {
- /* Write relocated value */
-
- addend = bfd_get_32 (input_bfd, where + 4);
- relocation += addend;
- bfd_put_32 (input_bfd, relocation, where + 4);
-
- r = bfd_reloc_ok;
- break;
- }
- case R_BPF_INSN_64:
+ case R_BPF_64_64:
{
/*
LDDW instructions are 128 bits long, with a 64-bit immediate.
@@ -610,7 +390,7 @@ bpf_elf_generic_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
/* Sanity check that the address is in range. */
bfd_size_type end = bfd_get_section_limit_octets (abfd, input_section);
bfd_size_type reloc_size;
- if (reloc_entry->howto->type == R_BPF_INSN_64)
+ if (reloc_entry->howto->type == R_BPF_64_64)
reloc_size = 16;
else
reloc_size = (reloc_entry->howto->bitsize
@@ -642,7 +422,7 @@ bpf_elf_generic_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
return status;
/* Now finally install the relocation. */
- if (reloc_entry->howto->type == R_BPF_INSN_64)
+ if (reloc_entry->howto->type == R_BPF_64_64)
{
/* lddw is a 128-bit (!) instruction that allows loading a 64-bit
immediate into a register. the immediate is split in half, with the
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index e75935133ac..fa6f2d71b60 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -3340,9 +3340,6 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD",
"BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD",
"BFD_RELOC_BPF_64",
- "BFD_RELOC_BPF_32",
- "BFD_RELOC_BPF_16",
- "BFD_RELOC_BPF_DISP16",
"BFD_RELOC_BPF_DISP32",
"BFD_RELOC_EPIPHANY_SIMM8",
"BFD_RELOC_EPIPHANY_SIMM24",
diff --git a/bfd/reloc.c b/bfd/reloc.c
index 346dd7638db..16540632613 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -7749,12 +7749,6 @@ ENUMDOC
ENUM
BFD_RELOC_BPF_64
-ENUMX
- BFD_RELOC_BPF_32
-ENUMX
- BFD_RELOC_BPF_16
-ENUMX
- BFD_RELOC_BPF_DISP16
ENUMX
BFD_RELOC_BPF_DISP32
ENUMDOC
diff --git a/gas/config/tc-bpf.c b/gas/config/tc-bpf.c
index aa701584470..1f8b0cc2ede 100644
--- a/gas/config/tc-bpf.c
+++ b/gas/config/tc-bpf.c
@@ -274,15 +274,8 @@ md_cgen_lookup_reloc (const CGEN_INSN *insn ATTRIBUTE_UNUSED,
{
switch (operand->type)
{
- case BPF_OPERAND_OFFSET16:
- return BFD_RELOC_BPF_16;
- case BPF_OPERAND_IMM32:
- return BFD_RELOC_BPF_32;
case BPF_OPERAND_IMM64:
return BFD_RELOC_BPF_64;
- case BPF_OPERAND_DISP16:
- fixP->fx_pcrel = 1;
- return BFD_RELOC_BPF_DISP16;
case BPF_OPERAND_DISP32:
fixP->fx_pcrel = 1;
return BFD_RELOC_BPF_DISP32;
diff --git a/include/elf/bpf.h b/include/elf/bpf.h
index e52f481b2be..fb1936010bf 100644
--- a/include/elf/bpf.h
+++ b/include/elf/bpf.h
@@ -26,20 +26,14 @@
/* Relocations. */
START_RELOC_NUMBERS (elf_bpf_reloc_type)
- RELOC_NUMBER (R_BPF_NONE, 0)
- RELOC_NUMBER (R_BPF_INSN_64, 1)
- RELOC_NUMBER (R_BPF_INSN_32, 2)
- RELOC_NUMBER (R_BPF_INSN_16, 3)
- RELOC_NUMBER (R_BPF_INSN_DISP16, 4)
- RELOC_NUMBER (R_BPF_DATA_8_PCREL, 5)
- RELOC_NUMBER (R_BPF_DATA_16_PCREL, 6)
- RELOC_NUMBER (R_BPF_DATA_32_PCREL, 7)
- RELOC_NUMBER (R_BPF_DATA_8, 8)
- RELOC_NUMBER (R_BPF_DATA_16, 9)
- RELOC_NUMBER (R_BPF_INSN_DISP32, 10)
- RELOC_NUMBER (R_BPF_DATA_32, 11)
- RELOC_NUMBER (R_BPF_DATA_64, 12)
- RELOC_NUMBER (R_BPF_DATA_64_PCREL, 13)
+ RELOC_NUMBER (R_BPF_NONE, 0)
+ RELOC_NUMBER (R_BPF_64_64, 1)
+ RELOC_NUMBER (R_BPF_64_ABS64, 2)
+ RELOC_NUMBER (R_BPF_64_ABS32, 3)
+/* R_BPF_64_NODYLD32 is not used by GNU tools.
+ * It is kept in this file to remind that the value is already taken. */
+ RELOC_NUMBER (R_BPF_64_NODYLD32, 4)
+ RELOC_NUMBER (R_BPF_64_32, 10)
END_RELOC_NUMBERS (R_BPF_max)
#endif /* _ELF_BPF_H */
--
2.30.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] BPF relocations review / refactoring
2023-03-02 11:25 ` [PATCH] BPF relocations review / refactoring Cupertino Miranda
@ 2023-03-15 16:39 ` Jose E. Marchesi
2023-03-15 17:25 ` Cupertino Miranda
0 siblings, 1 reply; 5+ messages in thread
From: Jose E. Marchesi @ 2023-03-15 16:39 UTC (permalink / raw)
To: Cupertino Miranda; +Cc: binutils
Hi Cupertino.
The approach, the switch to the consolidated BPF relocs, and the patch
itself LGTM.
The only comment I have is: will bpf-reloc.def be included in the
binutils distribution tarball? The binutils releases are done by
running the src-release.sh. So we need to make sure the .def file ends
in the tarball...
> - Removed not needed relocations.
> - Renamed relocations to match llvm and linux kernel.
>
> Relocation changes:
> R_BPF_INSN_64 => R_BPF_64_64
> R_BPF_INSN_DISP32 => R_BPF_64_32
> R_BPF_DATA_32 => R_BPF_64_ABS32
> R_BPF_DATA_64 => R_BPF_64_ABS64
>
> ChangeLog:
>
> * bfd/bpf-reloc.def: Created file with BPF_HOWTO macro entries.
> * bfd/reloc.c: Removed non needed relocations.
> * bfd/bfd-in2.h: regenerated.
> * bfd/libbfd.h: regenerated.
> * bfd/elf64-bpf.c: Changed relocations.
> * include/elf/bpf.h: Adapted relocation values/names.
> * gas/config/tc-bpf.c: Changed relocation mapping.
> ---
> bfd/bfd-in2.h | 3 -
> bfd/bpf-reloc.def | 74 +++++++++++
> bfd/elf64-bpf.c | 314 +++++++-------------------------------------
> bfd/libbfd.h | 3 -
> bfd/reloc.c | 6 -
> gas/config/tc-bpf.c | 7 -
> include/elf/bpf.h | 22 ++--
> 7 files changed, 129 insertions(+), 300 deletions(-)
> create mode 100644 bfd/bpf-reloc.def
>
> diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
> index 7c5953442aa..b60ff960f08 100644
> --- a/bfd/bfd-in2.h
> +++ b/bfd/bfd-in2.h
> @@ -6079,9 +6079,6 @@ assembler and not (currently) written to any object files. */
>
> /* Linux eBPF relocations. */
> BFD_RELOC_BPF_64,
> - BFD_RELOC_BPF_32,
> - BFD_RELOC_BPF_16,
> - BFD_RELOC_BPF_DISP16,
> BFD_RELOC_BPF_DISP32,
>
> /* Adapteva EPIPHANY - 8 bit signed pc-relative displacement */
> diff --git a/bfd/bpf-reloc.def b/bfd/bpf-reloc.def
> new file mode 100644
> index 00000000000..b1be2eb66f6
> --- /dev/null
> +++ b/bfd/bpf-reloc.def
> @@ -0,0 +1,74 @@
> + /* This reloc does nothing. */
> + BPF_HOWTO (R_BPF_NONE, /* type */
> + 0, /* rightshift */
> + 0, /* size */
> + 0, /* bitsize */
> + false, /* pc_relative */
> + 0, /* bitpos */
> + complain_overflow_dont, /* complain_on_overflow */
> + bpf_elf_generic_reloc, /* special_function */
> + "R_BPF_NONE", /* name */
> + false, /* partial_inplace */
> + 0, /* src_mask */
> + 0, /* dst_mask */
> + false) /* pcrel_offset */
> +
> + /* 64-immediate in LDDW instruction. */
> + BPF_HOWTO (R_BPF_64_64, /* type */
> + 0, /* rightshift */
> + 8, /* size */
> + 64, /* bitsize */
> + false, /* pc_relative */
> + 32, /* bitpos */
> + complain_overflow_signed, /* complain_on_overflow */
> + bpf_elf_generic_reloc, /* special_function */
> + "R_BPF_64_64", /* name */
> + true, /* partial_inplace */
> + MINUS_ONE, /* src_mask */
> + MINUS_ONE, /* dst_mask */
> + true) /* pcrel_offset */
> +
> + /* 32-bit data. */
> + BPF_HOWTO (R_BPF_64_ABS32, /* type */
> + 0, /* rightshift */
> + 4, /* size */
> + 32, /* bitsize */
> + false, /* pc_relative */
> + 0, /* bitpos */
> + complain_overflow_bitfield, /* complain_on_overflow */
> + bpf_elf_generic_reloc, /* special_function */
> + "R_BPF_64_ABS32", /* name */
> + false, /* partial_inplace */
> + 0xffffffff, /* src_mask */
> + 0xffffffff, /* dst_mask */
> + true) /* pcrel_offset */
> +
> + /* 64-bit data. */
> + BPF_HOWTO (R_BPF_64_ABS64, /* type */
> + 0, /* rightshift */
> + 8, /* size */
> + 64, /* bitsize */
> + false, /* pc_relative */
> + 0, /* bitpos */
> + complain_overflow_bitfield, /* complain_on_overflow */
> + bpf_elf_generic_reloc, /* special_function */
> + "R_BPF_64_ABS64", /* name */
> + false, /* partial_inplace */
> + 0, /* src_mask */
> + MINUS_ONE, /* dst_mask */
> + true) /* pcrel_offset */
> +
> + /* 32-bit PC-relative address in call instructions. */
> + BPF_HOWTO (R_BPF_64_32, /* type */
> + 0, /* rightshift */
> + 4, /* size */
> + 32, /* bitsize */
> + true, /* pc_relative */
> + 32, /* bitpos */
> + complain_overflow_signed, /* complain_on_overflow */
> + bpf_elf_generic_reloc, /* special_function */
> + "R_BPF_64_32", /* name */
> + true, /* partial_inplace */
> + 0xffffffff, /* src_mask */
> + 0xffffffff, /* dst_mask */
> + true) /* pcrel_offset */
> diff --git a/bfd/elf64-bpf.c b/bfd/elf64-bpf.c
> index 4f9949b515b..ef34d62df01 100644
> --- a/bfd/elf64-bpf.c
> +++ b/bfd/elf64-bpf.c
> @@ -34,214 +34,40 @@
> static bfd_reloc_status_type bpf_elf_generic_reloc
> (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
>
> +#undef BPF_HOWTO
> +#define BPF_HOWTO(type, right, size, bits, pcrel, left, ovf, func, name, \
> + inplace, src_mask, dst_mask, pcrel_off) \
> + type##_IDX,
> +enum bpf_reloc_index {
> + R_BPF_INVALID_IDX = -1,
> +#include "bpf-reloc.def"
> + R_BPF_SIZE
> +};
> +#undef BPF_HOWTO
> +
> /* Relocation tables. */
> +#define BPF_HOWTO(...) HOWTO(__VA_ARGS__),
> static reloc_howto_type bpf_elf_howto_table [] =
> {
> - /* This reloc does nothing. */
> - HOWTO (R_BPF_NONE, /* type */
> - 0, /* rightshift */
> - 0, /* size */
> - 0, /* bitsize */
> - false, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_NONE", /* name */
> - false, /* partial_inplace */
> - 0, /* src_mask */
> - 0, /* dst_mask */
> - false), /* pcrel_offset */
> -
> - /* 64-immediate in LDDW instruction. */
> - HOWTO (R_BPF_INSN_64, /* type */
> - 0, /* rightshift */
> - 8, /* size */
> - 64, /* bitsize */
> - false, /* pc_relative */
> - 32, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_INSN_64", /* name */
> - true, /* partial_inplace */
> - MINUS_ONE, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - true), /* pcrel_offset */
> -
> - /* 32-immediate in many instructions. */
> - HOWTO (R_BPF_INSN_32, /* type */
> - 0, /* rightshift */
> - 4, /* size */
> - 32, /* bitsize */
> - false, /* pc_relative */
> - 32, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_INSN_32", /* name */
> - true, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - true), /* pcrel_offset */
> -
> - /* 16-bit offsets in instructions. */
> - HOWTO (R_BPF_INSN_16, /* type */
> - 0, /* rightshift */
> - 2, /* size */
> - 16, /* bitsize */
> - false, /* pc_relative */
> - 16, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_INSN_16", /* name */
> - true, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - true), /* pcrel_offset */
> -
> - /* 16-bit PC-relative address in jump instructions. */
> - HOWTO (R_BPF_INSN_DISP16, /* type */
> - 0, /* rightshift */
> - 2, /* size */
> - 16, /* bitsize */
> - true, /* pc_relative */
> - 16, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_INSN_DISP16", /* name */
> - true, /* partial_inplace */
> - 0xffff, /* src_mask */
> - 0xffff, /* dst_mask */
> - true), /* pcrel_offset */
> -
> - HOWTO (R_BPF_DATA_8_PCREL,
> - 0, /* rightshift */
> - 1, /* size */
> - 8, /* bitsize */
> - true, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_8_PCREL", /* name */
> - true, /* partial_inplace */
> - 0xff, /* src_mask */
> - 0xff, /* dst_mask */
> - true), /* pcrel_offset */
> -
> - HOWTO (R_BPF_DATA_16_PCREL,
> - 0, /* rightshift */
> - 2, /* size */
> - 16, /* bitsize */
> - true, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_16_PCREL", /* name */
> - false, /* partial_inplace */
> - 0xffff, /* src_mask */
> - 0xffff, /* dst_mask */
> - true), /* pcrel_offset */
> -
> - HOWTO (R_BPF_DATA_32_PCREL,
> - 0, /* rightshift */
> - 4, /* size */
> - 32, /* bitsize */
> - true, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_32_PCREL", /* name */
> - false, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - true), /* pcrel_offset */
> -
> - HOWTO (R_BPF_DATA_8,
> - 0, /* rightshift */
> - 1, /* size */
> - 8, /* bitsize */
> - false, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_unsigned, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_DATA_8", /* name */
> - true, /* partial_inplace */
> - 0xff, /* src_mask */
> - 0xff, /* dst_mask */
> - false), /* pcrel_offset */
> -
> - HOWTO (R_BPF_DATA_16,
> - 0, /* rightshift */
> - 2, /* size */
> - 16, /* bitsize */
> - false, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_unsigned, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_DATA_16", /* name */
> - false, /* partial_inplace */
> - 0xffff, /* src_mask */
> - 0xffff, /* dst_mask */
> - false), /* pcrel_offset */
> -
> - /* 32-bit PC-relative address in call instructions. */
> - HOWTO (R_BPF_INSN_DISP32, /* type */
> - 0, /* rightshift */
> - 4, /* size */
> - 32, /* bitsize */
> - true, /* pc_relative */
> - 32, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_INSN_DISP32", /* name */
> - true, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - true), /* pcrel_offset */
> -
> - /* 32-bit data. */
> - HOWTO (R_BPF_DATA_32, /* type */
> - 0, /* rightshift */
> - 4, /* size */
> - 32, /* bitsize */
> - false, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_bitfield, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_DATA_32", /* name */
> - false, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - true), /* pcrel_offset */
> -
> - /* 64-bit data. */
> - HOWTO (R_BPF_DATA_64, /* type */
> - 0, /* rightshift */
> - 8, /* size */
> - 64, /* bitsize */
> - false, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_bitfield, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_DATA_64", /* name */
> - false, /* partial_inplace */
> - 0, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - true), /* pcrel_offset */
> -
> - HOWTO (R_BPF_DATA_64_PCREL,
> - 0, /* rightshift */
> - 8, /* size */
> - 64, /* bitsize */
> - true, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - bpf_elf_generic_reloc, /* special_function */
> - "R_BPF_64_PCREL", /* name */
> - false, /* partial_inplace */
> - MINUS_ONE, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - true), /* pcrel_offset */
> + #include "bpf-reloc.def"
> };
> #undef AHOW
> +#undef BPF_HOWTO
> +
> +#define BPF_HOWTO(type, right, size, bits, pcrel, left, ovf, func, name, \
> + inplace, src_mask, dst_mask, pcrel_off) \
> + case type: { return type##_IDX; }
> +static enum bpf_reloc_index
> +bpf_index_for_rtype(unsigned int r_type)
> +{
> + switch(r_type) {
> +#include "bpf-reloc.def"
> + default:
> + /* Unreachable code. */
> + BFD_ASSERT(0);
> + return -1;
> + };
> +}
>
> /* Map BFD reloc types to bpf ELF reloc types. */
>
> @@ -249,44 +75,20 @@ static reloc_howto_type *
> bpf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
> bfd_reloc_code_real_type code)
> {
> - /* Note that the bpf_elf_howto_table is indexed by the R_ constants.
> - Thus, the order that the howto records appear in the table *must*
> - match the order of the relocation types defined in
> - include/elf/bpf.h. */
> -
> switch (code)
> {
> case BFD_RELOC_NONE:
> - return &bpf_elf_howto_table[ (int) R_BPF_NONE];
> -
> - case BFD_RELOC_8_PCREL:
> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_8_PCREL];
> - case BFD_RELOC_16_PCREL:
> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_16_PCREL];
> - case BFD_RELOC_32_PCREL:
> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_32_PCREL];
> - case BFD_RELOC_64_PCREL:
> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_64_PCREL];
> -
> - case BFD_RELOC_8:
> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_8];
> - case BFD_RELOC_16:
> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_16];
> + return &bpf_elf_howto_table[ (int) R_BPF_NONE_IDX];
> +
> case BFD_RELOC_32:
> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_32];
> + return &bpf_elf_howto_table[ (int) R_BPF_64_ABS32_IDX];
> case BFD_RELOC_64:
> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_64];
> + return &bpf_elf_howto_table[ (int) R_BPF_64_ABS64_IDX];
>
> case BFD_RELOC_BPF_64:
> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_64];
> - case BFD_RELOC_BPF_32:
> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_32];
> - case BFD_RELOC_BPF_16:
> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_16];
> - case BFD_RELOC_BPF_DISP16:
> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_DISP16];
> + return &bpf_elf_howto_table[ (int) R_BPF_64_64_IDX];
> case BFD_RELOC_BPF_DISP32:
> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_DISP32];
> + return &bpf_elf_howto_table[ (int) R_BPF_64_32_IDX];
>
> default:
> /* Pacify gcc -Wall. */
> @@ -302,7 +104,7 @@ bpf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
> {
> unsigned int i;
>
> - for (i = 0; i < ARRAY_SIZE (bpf_elf_howto_table); i++)
> + for (i = 0; i < R_BPF_SIZE; i++)
> if (bpf_elf_howto_table[i].name != NULL
> && strcasecmp (bpf_elf_howto_table[i].name, r_name) == 0)
> return &bpf_elf_howto_table[i];
> @@ -317,9 +119,11 @@ bpf_info_to_howto (bfd *abfd, arelent *bfd_reloc,
> Elf_Internal_Rela *elf_reloc)
> {
> unsigned int r_type;
> -
> + unsigned int i;
> r_type = ELF64_R_TYPE (elf_reloc->r_info);
> - if (r_type >= (unsigned int) R_BPF_max)
> +
> + i = bpf_index_for_rtype(r_type);
> + if (i == (unsigned int) -1)
> {
> /* xgettext:c-format */
> _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
> @@ -328,7 +132,7 @@ bpf_info_to_howto (bfd *abfd, arelent *bfd_reloc,
> return false;
> }
>
> - bfd_reloc->howto = &bpf_elf_howto_table [r_type];
> + bfd_reloc->howto = &bpf_elf_howto_table [i];
> return true;
> }
>
> @@ -438,8 +242,7 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
>
> switch (howto->type)
> {
> - case R_BPF_INSN_DISP16:
> - case R_BPF_INSN_DISP32:
> + case R_BPF_64_32:
> {
> /* Make the relocation PC-relative, and change its unit to
> 64-bit words. Note we need *signed* arithmetic
> @@ -465,10 +268,8 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
> r = bfd_reloc_ok;
> break;
> }
> - case R_BPF_DATA_8:
> - case R_BPF_DATA_16:
> - case R_BPF_DATA_32:
> - case R_BPF_DATA_64:
> + case R_BPF_64_ABS64:
> + case R_BPF_64_ABS32:
> {
> addend = bfd_get (howto->bitsize, input_bfd, where);
> relocation += addend;
> @@ -477,28 +278,7 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
> r = bfd_reloc_ok;
> break;
> }
> - case R_BPF_INSN_16:
> - {
> -
> - addend = bfd_get_16 (input_bfd, where + 2);
> - relocation += addend;
> - bfd_put_16 (input_bfd, relocation, where + 2);
> -
> - r = bfd_reloc_ok;
> - break;
> - }
> - case R_BPF_INSN_32:
> - {
> - /* Write relocated value */
> -
> - addend = bfd_get_32 (input_bfd, where + 4);
> - relocation += addend;
> - bfd_put_32 (input_bfd, relocation, where + 4);
> -
> - r = bfd_reloc_ok;
> - break;
> - }
> - case R_BPF_INSN_64:
> + case R_BPF_64_64:
> {
> /*
> LDDW instructions are 128 bits long, with a 64-bit immediate.
> @@ -610,7 +390,7 @@ bpf_elf_generic_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
> /* Sanity check that the address is in range. */
> bfd_size_type end = bfd_get_section_limit_octets (abfd, input_section);
> bfd_size_type reloc_size;
> - if (reloc_entry->howto->type == R_BPF_INSN_64)
> + if (reloc_entry->howto->type == R_BPF_64_64)
> reloc_size = 16;
> else
> reloc_size = (reloc_entry->howto->bitsize
> @@ -642,7 +422,7 @@ bpf_elf_generic_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
> return status;
>
> /* Now finally install the relocation. */
> - if (reloc_entry->howto->type == R_BPF_INSN_64)
> + if (reloc_entry->howto->type == R_BPF_64_64)
> {
> /* lddw is a 128-bit (!) instruction that allows loading a 64-bit
> immediate into a register. the immediate is split in half, with the
> diff --git a/bfd/libbfd.h b/bfd/libbfd.h
> index e75935133ac..fa6f2d71b60 100644
> --- a/bfd/libbfd.h
> +++ b/bfd/libbfd.h
> @@ -3340,9 +3340,6 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
> "BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD",
> "BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD",
> "BFD_RELOC_BPF_64",
> - "BFD_RELOC_BPF_32",
> - "BFD_RELOC_BPF_16",
> - "BFD_RELOC_BPF_DISP16",
> "BFD_RELOC_BPF_DISP32",
> "BFD_RELOC_EPIPHANY_SIMM8",
> "BFD_RELOC_EPIPHANY_SIMM24",
> diff --git a/bfd/reloc.c b/bfd/reloc.c
> index 346dd7638db..16540632613 100644
> --- a/bfd/reloc.c
> +++ b/bfd/reloc.c
> @@ -7749,12 +7749,6 @@ ENUMDOC
>
> ENUM
> BFD_RELOC_BPF_64
> -ENUMX
> - BFD_RELOC_BPF_32
> -ENUMX
> - BFD_RELOC_BPF_16
> -ENUMX
> - BFD_RELOC_BPF_DISP16
> ENUMX
> BFD_RELOC_BPF_DISP32
> ENUMDOC
> diff --git a/gas/config/tc-bpf.c b/gas/config/tc-bpf.c
> index aa701584470..1f8b0cc2ede 100644
> --- a/gas/config/tc-bpf.c
> +++ b/gas/config/tc-bpf.c
> @@ -274,15 +274,8 @@ md_cgen_lookup_reloc (const CGEN_INSN *insn ATTRIBUTE_UNUSED,
> {
> switch (operand->type)
> {
> - case BPF_OPERAND_OFFSET16:
> - return BFD_RELOC_BPF_16;
> - case BPF_OPERAND_IMM32:
> - return BFD_RELOC_BPF_32;
> case BPF_OPERAND_IMM64:
> return BFD_RELOC_BPF_64;
> - case BPF_OPERAND_DISP16:
> - fixP->fx_pcrel = 1;
> - return BFD_RELOC_BPF_DISP16;
> case BPF_OPERAND_DISP32:
> fixP->fx_pcrel = 1;
> return BFD_RELOC_BPF_DISP32;
> diff --git a/include/elf/bpf.h b/include/elf/bpf.h
> index e52f481b2be..fb1936010bf 100644
> --- a/include/elf/bpf.h
> +++ b/include/elf/bpf.h
> @@ -26,20 +26,14 @@
>
> /* Relocations. */
> START_RELOC_NUMBERS (elf_bpf_reloc_type)
> - RELOC_NUMBER (R_BPF_NONE, 0)
> - RELOC_NUMBER (R_BPF_INSN_64, 1)
> - RELOC_NUMBER (R_BPF_INSN_32, 2)
> - RELOC_NUMBER (R_BPF_INSN_16, 3)
> - RELOC_NUMBER (R_BPF_INSN_DISP16, 4)
> - RELOC_NUMBER (R_BPF_DATA_8_PCREL, 5)
> - RELOC_NUMBER (R_BPF_DATA_16_PCREL, 6)
> - RELOC_NUMBER (R_BPF_DATA_32_PCREL, 7)
> - RELOC_NUMBER (R_BPF_DATA_8, 8)
> - RELOC_NUMBER (R_BPF_DATA_16, 9)
> - RELOC_NUMBER (R_BPF_INSN_DISP32, 10)
> - RELOC_NUMBER (R_BPF_DATA_32, 11)
> - RELOC_NUMBER (R_BPF_DATA_64, 12)
> - RELOC_NUMBER (R_BPF_DATA_64_PCREL, 13)
> + RELOC_NUMBER (R_BPF_NONE, 0)
> + RELOC_NUMBER (R_BPF_64_64, 1)
> + RELOC_NUMBER (R_BPF_64_ABS64, 2)
> + RELOC_NUMBER (R_BPF_64_ABS32, 3)
> +/* R_BPF_64_NODYLD32 is not used by GNU tools.
> + * It is kept in this file to remind that the value is already taken. */
> + RELOC_NUMBER (R_BPF_64_NODYLD32, 4)
> + RELOC_NUMBER (R_BPF_64_32, 10)
> END_RELOC_NUMBERS (R_BPF_max)
>
> #endif /* _ELF_BPF_H */
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] BPF relocations review / refactoring
2023-03-15 16:39 ` Jose E. Marchesi
@ 2023-03-15 17:25 ` Cupertino Miranda
2023-03-15 20:57 ` Jose E. Marchesi
0 siblings, 1 reply; 5+ messages in thread
From: Cupertino Miranda @ 2023-03-15 17:25 UTC (permalink / raw)
To: Jose E. Marchesi; +Cc: binutils
Hi Jose,
Have just run src-release.sh and can confirm that .def is in the release
tarball.
find ./ -name "*.def" | grep bpf
./bfd/bpf-reloc.def
Cupertino
Jose E. Marchesi writes:
> Hi Cupertino.
>
> The approach, the switch to the consolidated BPF relocs, and the patch
> itself LGTM.
>
> The only comment I have is: will bpf-reloc.def be included in the
> binutils distribution tarball? The binutils releases are done by
> running the src-release.sh. So we need to make sure the .def file ends
> in the tarball...
>
>> - Removed not needed relocations.
>> - Renamed relocations to match llvm and linux kernel.
>>
>> Relocation changes:
>> R_BPF_INSN_64 => R_BPF_64_64
>> R_BPF_INSN_DISP32 => R_BPF_64_32
>> R_BPF_DATA_32 => R_BPF_64_ABS32
>> R_BPF_DATA_64 => R_BPF_64_ABS64
>>
>> ChangeLog:
>>
>> * bfd/bpf-reloc.def: Created file with BPF_HOWTO macro entries.
>> * bfd/reloc.c: Removed non needed relocations.
>> * bfd/bfd-in2.h: regenerated.
>> * bfd/libbfd.h: regenerated.
>> * bfd/elf64-bpf.c: Changed relocations.
>> * include/elf/bpf.h: Adapted relocation values/names.
>> * gas/config/tc-bpf.c: Changed relocation mapping.
>> ---
>> bfd/bfd-in2.h | 3 -
>> bfd/bpf-reloc.def | 74 +++++++++++
>> bfd/elf64-bpf.c | 314 +++++++-------------------------------------
>> bfd/libbfd.h | 3 -
>> bfd/reloc.c | 6 -
>> gas/config/tc-bpf.c | 7 -
>> include/elf/bpf.h | 22 ++--
>> 7 files changed, 129 insertions(+), 300 deletions(-)
>> create mode 100644 bfd/bpf-reloc.def
>>
>> diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
>> index 7c5953442aa..b60ff960f08 100644
>> --- a/bfd/bfd-in2.h
>> +++ b/bfd/bfd-in2.h
>> @@ -6079,9 +6079,6 @@ assembler and not (currently) written to any object files. */
>>
>> /* Linux eBPF relocations. */
>> BFD_RELOC_BPF_64,
>> - BFD_RELOC_BPF_32,
>> - BFD_RELOC_BPF_16,
>> - BFD_RELOC_BPF_DISP16,
>> BFD_RELOC_BPF_DISP32,
>>
>> /* Adapteva EPIPHANY - 8 bit signed pc-relative displacement */
>> diff --git a/bfd/bpf-reloc.def b/bfd/bpf-reloc.def
>> new file mode 100644
>> index 00000000000..b1be2eb66f6
>> --- /dev/null
>> +++ b/bfd/bpf-reloc.def
>> @@ -0,0 +1,74 @@
>> + /* This reloc does nothing. */
>> + BPF_HOWTO (R_BPF_NONE, /* type */
>> + 0, /* rightshift */
>> + 0, /* size */
>> + 0, /* bitsize */
>> + false, /* pc_relative */
>> + 0, /* bitpos */
>> + complain_overflow_dont, /* complain_on_overflow */
>> + bpf_elf_generic_reloc, /* special_function */
>> + "R_BPF_NONE", /* name */
>> + false, /* partial_inplace */
>> + 0, /* src_mask */
>> + 0, /* dst_mask */
>> + false) /* pcrel_offset */
>> +
>> + /* 64-immediate in LDDW instruction. */
>> + BPF_HOWTO (R_BPF_64_64, /* type */
>> + 0, /* rightshift */
>> + 8, /* size */
>> + 64, /* bitsize */
>> + false, /* pc_relative */
>> + 32, /* bitpos */
>> + complain_overflow_signed, /* complain_on_overflow */
>> + bpf_elf_generic_reloc, /* special_function */
>> + "R_BPF_64_64", /* name */
>> + true, /* partial_inplace */
>> + MINUS_ONE, /* src_mask */
>> + MINUS_ONE, /* dst_mask */
>> + true) /* pcrel_offset */
>> +
>> + /* 32-bit data. */
>> + BPF_HOWTO (R_BPF_64_ABS32, /* type */
>> + 0, /* rightshift */
>> + 4, /* size */
>> + 32, /* bitsize */
>> + false, /* pc_relative */
>> + 0, /* bitpos */
>> + complain_overflow_bitfield, /* complain_on_overflow */
>> + bpf_elf_generic_reloc, /* special_function */
>> + "R_BPF_64_ABS32", /* name */
>> + false, /* partial_inplace */
>> + 0xffffffff, /* src_mask */
>> + 0xffffffff, /* dst_mask */
>> + true) /* pcrel_offset */
>> +
>> + /* 64-bit data. */
>> + BPF_HOWTO (R_BPF_64_ABS64, /* type */
>> + 0, /* rightshift */
>> + 8, /* size */
>> + 64, /* bitsize */
>> + false, /* pc_relative */
>> + 0, /* bitpos */
>> + complain_overflow_bitfield, /* complain_on_overflow */
>> + bpf_elf_generic_reloc, /* special_function */
>> + "R_BPF_64_ABS64", /* name */
>> + false, /* partial_inplace */
>> + 0, /* src_mask */
>> + MINUS_ONE, /* dst_mask */
>> + true) /* pcrel_offset */
>> +
>> + /* 32-bit PC-relative address in call instructions. */
>> + BPF_HOWTO (R_BPF_64_32, /* type */
>> + 0, /* rightshift */
>> + 4, /* size */
>> + 32, /* bitsize */
>> + true, /* pc_relative */
>> + 32, /* bitpos */
>> + complain_overflow_signed, /* complain_on_overflow */
>> + bpf_elf_generic_reloc, /* special_function */
>> + "R_BPF_64_32", /* name */
>> + true, /* partial_inplace */
>> + 0xffffffff, /* src_mask */
>> + 0xffffffff, /* dst_mask */
>> + true) /* pcrel_offset */
>> diff --git a/bfd/elf64-bpf.c b/bfd/elf64-bpf.c
>> index 4f9949b515b..ef34d62df01 100644
>> --- a/bfd/elf64-bpf.c
>> +++ b/bfd/elf64-bpf.c
>> @@ -34,214 +34,40 @@
>> static bfd_reloc_status_type bpf_elf_generic_reloc
>> (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
>>
>> +#undef BPF_HOWTO
>> +#define BPF_HOWTO(type, right, size, bits, pcrel, left, ovf, func, name, \
>> + inplace, src_mask, dst_mask, pcrel_off) \
>> + type##_IDX,
>> +enum bpf_reloc_index {
>> + R_BPF_INVALID_IDX = -1,
>> +#include "bpf-reloc.def"
>> + R_BPF_SIZE
>> +};
>> +#undef BPF_HOWTO
>> +
>> /* Relocation tables. */
>> +#define BPF_HOWTO(...) HOWTO(__VA_ARGS__),
>> static reloc_howto_type bpf_elf_howto_table [] =
>> {
>> - /* This reloc does nothing. */
>> - HOWTO (R_BPF_NONE, /* type */
>> - 0, /* rightshift */
>> - 0, /* size */
>> - 0, /* bitsize */
>> - false, /* pc_relative */
>> - 0, /* bitpos */
>> - complain_overflow_dont, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_NONE", /* name */
>> - false, /* partial_inplace */
>> - 0, /* src_mask */
>> - 0, /* dst_mask */
>> - false), /* pcrel_offset */
>> -
>> - /* 64-immediate in LDDW instruction. */
>> - HOWTO (R_BPF_INSN_64, /* type */
>> - 0, /* rightshift */
>> - 8, /* size */
>> - 64, /* bitsize */
>> - false, /* pc_relative */
>> - 32, /* bitpos */
>> - complain_overflow_signed, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_INSN_64", /* name */
>> - true, /* partial_inplace */
>> - MINUS_ONE, /* src_mask */
>> - MINUS_ONE, /* dst_mask */
>> - true), /* pcrel_offset */
>> -
>> - /* 32-immediate in many instructions. */
>> - HOWTO (R_BPF_INSN_32, /* type */
>> - 0, /* rightshift */
>> - 4, /* size */
>> - 32, /* bitsize */
>> - false, /* pc_relative */
>> - 32, /* bitpos */
>> - complain_overflow_signed, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_INSN_32", /* name */
>> - true, /* partial_inplace */
>> - 0xffffffff, /* src_mask */
>> - 0xffffffff, /* dst_mask */
>> - true), /* pcrel_offset */
>> -
>> - /* 16-bit offsets in instructions. */
>> - HOWTO (R_BPF_INSN_16, /* type */
>> - 0, /* rightshift */
>> - 2, /* size */
>> - 16, /* bitsize */
>> - false, /* pc_relative */
>> - 16, /* bitpos */
>> - complain_overflow_signed, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_INSN_16", /* name */
>> - true, /* partial_inplace */
>> - 0x0000ffff, /* src_mask */
>> - 0x0000ffff, /* dst_mask */
>> - true), /* pcrel_offset */
>> -
>> - /* 16-bit PC-relative address in jump instructions. */
>> - HOWTO (R_BPF_INSN_DISP16, /* type */
>> - 0, /* rightshift */
>> - 2, /* size */
>> - 16, /* bitsize */
>> - true, /* pc_relative */
>> - 16, /* bitpos */
>> - complain_overflow_signed, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_INSN_DISP16", /* name */
>> - true, /* partial_inplace */
>> - 0xffff, /* src_mask */
>> - 0xffff, /* dst_mask */
>> - true), /* pcrel_offset */
>> -
>> - HOWTO (R_BPF_DATA_8_PCREL,
>> - 0, /* rightshift */
>> - 1, /* size */
>> - 8, /* bitsize */
>> - true, /* pc_relative */
>> - 0, /* bitpos */
>> - complain_overflow_signed, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_8_PCREL", /* name */
>> - true, /* partial_inplace */
>> - 0xff, /* src_mask */
>> - 0xff, /* dst_mask */
>> - true), /* pcrel_offset */
>> -
>> - HOWTO (R_BPF_DATA_16_PCREL,
>> - 0, /* rightshift */
>> - 2, /* size */
>> - 16, /* bitsize */
>> - true, /* pc_relative */
>> - 0, /* bitpos */
>> - complain_overflow_signed, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_16_PCREL", /* name */
>> - false, /* partial_inplace */
>> - 0xffff, /* src_mask */
>> - 0xffff, /* dst_mask */
>> - true), /* pcrel_offset */
>> -
>> - HOWTO (R_BPF_DATA_32_PCREL,
>> - 0, /* rightshift */
>> - 4, /* size */
>> - 32, /* bitsize */
>> - true, /* pc_relative */
>> - 0, /* bitpos */
>> - complain_overflow_signed, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_32_PCREL", /* name */
>> - false, /* partial_inplace */
>> - 0xffffffff, /* src_mask */
>> - 0xffffffff, /* dst_mask */
>> - true), /* pcrel_offset */
>> -
>> - HOWTO (R_BPF_DATA_8,
>> - 0, /* rightshift */
>> - 1, /* size */
>> - 8, /* bitsize */
>> - false, /* pc_relative */
>> - 0, /* bitpos */
>> - complain_overflow_unsigned, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_DATA_8", /* name */
>> - true, /* partial_inplace */
>> - 0xff, /* src_mask */
>> - 0xff, /* dst_mask */
>> - false), /* pcrel_offset */
>> -
>> - HOWTO (R_BPF_DATA_16,
>> - 0, /* rightshift */
>> - 2, /* size */
>> - 16, /* bitsize */
>> - false, /* pc_relative */
>> - 0, /* bitpos */
>> - complain_overflow_unsigned, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_DATA_16", /* name */
>> - false, /* partial_inplace */
>> - 0xffff, /* src_mask */
>> - 0xffff, /* dst_mask */
>> - false), /* pcrel_offset */
>> -
>> - /* 32-bit PC-relative address in call instructions. */
>> - HOWTO (R_BPF_INSN_DISP32, /* type */
>> - 0, /* rightshift */
>> - 4, /* size */
>> - 32, /* bitsize */
>> - true, /* pc_relative */
>> - 32, /* bitpos */
>> - complain_overflow_signed, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_INSN_DISP32", /* name */
>> - true, /* partial_inplace */
>> - 0xffffffff, /* src_mask */
>> - 0xffffffff, /* dst_mask */
>> - true), /* pcrel_offset */
>> -
>> - /* 32-bit data. */
>> - HOWTO (R_BPF_DATA_32, /* type */
>> - 0, /* rightshift */
>> - 4, /* size */
>> - 32, /* bitsize */
>> - false, /* pc_relative */
>> - 0, /* bitpos */
>> - complain_overflow_bitfield, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_DATA_32", /* name */
>> - false, /* partial_inplace */
>> - 0xffffffff, /* src_mask */
>> - 0xffffffff, /* dst_mask */
>> - true), /* pcrel_offset */
>> -
>> - /* 64-bit data. */
>> - HOWTO (R_BPF_DATA_64, /* type */
>> - 0, /* rightshift */
>> - 8, /* size */
>> - 64, /* bitsize */
>> - false, /* pc_relative */
>> - 0, /* bitpos */
>> - complain_overflow_bitfield, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_DATA_64", /* name */
>> - false, /* partial_inplace */
>> - 0, /* src_mask */
>> - MINUS_ONE, /* dst_mask */
>> - true), /* pcrel_offset */
>> -
>> - HOWTO (R_BPF_DATA_64_PCREL,
>> - 0, /* rightshift */
>> - 8, /* size */
>> - 64, /* bitsize */
>> - true, /* pc_relative */
>> - 0, /* bitpos */
>> - complain_overflow_signed, /* complain_on_overflow */
>> - bpf_elf_generic_reloc, /* special_function */
>> - "R_BPF_64_PCREL", /* name */
>> - false, /* partial_inplace */
>> - MINUS_ONE, /* src_mask */
>> - MINUS_ONE, /* dst_mask */
>> - true), /* pcrel_offset */
>> + #include "bpf-reloc.def"
>> };
>> #undef AHOW
>> +#undef BPF_HOWTO
>> +
>> +#define BPF_HOWTO(type, right, size, bits, pcrel, left, ovf, func, name, \
>> + inplace, src_mask, dst_mask, pcrel_off) \
>> + case type: { return type##_IDX; }
>> +static enum bpf_reloc_index
>> +bpf_index_for_rtype(unsigned int r_type)
>> +{
>> + switch(r_type) {
>> +#include "bpf-reloc.def"
>> + default:
>> + /* Unreachable code. */
>> + BFD_ASSERT(0);
>> + return -1;
>> + };
>> +}
>>
>> /* Map BFD reloc types to bpf ELF reloc types. */
>>
>> @@ -249,44 +75,20 @@ static reloc_howto_type *
>> bpf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
>> bfd_reloc_code_real_type code)
>> {
>> - /* Note that the bpf_elf_howto_table is indexed by the R_ constants.
>> - Thus, the order that the howto records appear in the table *must*
>> - match the order of the relocation types defined in
>> - include/elf/bpf.h. */
>> -
>> switch (code)
>> {
>> case BFD_RELOC_NONE:
>> - return &bpf_elf_howto_table[ (int) R_BPF_NONE];
>> -
>> - case BFD_RELOC_8_PCREL:
>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_8_PCREL];
>> - case BFD_RELOC_16_PCREL:
>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_16_PCREL];
>> - case BFD_RELOC_32_PCREL:
>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_32_PCREL];
>> - case BFD_RELOC_64_PCREL:
>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_64_PCREL];
>> -
>> - case BFD_RELOC_8:
>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_8];
>> - case BFD_RELOC_16:
>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_16];
>> + return &bpf_elf_howto_table[ (int) R_BPF_NONE_IDX];
>> +
>> case BFD_RELOC_32:
>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_32];
>> + return &bpf_elf_howto_table[ (int) R_BPF_64_ABS32_IDX];
>> case BFD_RELOC_64:
>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_64];
>> + return &bpf_elf_howto_table[ (int) R_BPF_64_ABS64_IDX];
>>
>> case BFD_RELOC_BPF_64:
>> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_64];
>> - case BFD_RELOC_BPF_32:
>> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_32];
>> - case BFD_RELOC_BPF_16:
>> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_16];
>> - case BFD_RELOC_BPF_DISP16:
>> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_DISP16];
>> + return &bpf_elf_howto_table[ (int) R_BPF_64_64_IDX];
>> case BFD_RELOC_BPF_DISP32:
>> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_DISP32];
>> + return &bpf_elf_howto_table[ (int) R_BPF_64_32_IDX];
>>
>> default:
>> /* Pacify gcc -Wall. */
>> @@ -302,7 +104,7 @@ bpf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
>> {
>> unsigned int i;
>>
>> - for (i = 0; i < ARRAY_SIZE (bpf_elf_howto_table); i++)
>> + for (i = 0; i < R_BPF_SIZE; i++)
>> if (bpf_elf_howto_table[i].name != NULL
>> && strcasecmp (bpf_elf_howto_table[i].name, r_name) == 0)
>> return &bpf_elf_howto_table[i];
>> @@ -317,9 +119,11 @@ bpf_info_to_howto (bfd *abfd, arelent *bfd_reloc,
>> Elf_Internal_Rela *elf_reloc)
>> {
>> unsigned int r_type;
>> -
>> + unsigned int i;
>> r_type = ELF64_R_TYPE (elf_reloc->r_info);
>> - if (r_type >= (unsigned int) R_BPF_max)
>> +
>> + i = bpf_index_for_rtype(r_type);
>> + if (i == (unsigned int) -1)
>> {
>> /* xgettext:c-format */
>> _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
>> @@ -328,7 +132,7 @@ bpf_info_to_howto (bfd *abfd, arelent *bfd_reloc,
>> return false;
>> }
>>
>> - bfd_reloc->howto = &bpf_elf_howto_table [r_type];
>> + bfd_reloc->howto = &bpf_elf_howto_table [i];
>> return true;
>> }
>>
>> @@ -438,8 +242,7 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
>>
>> switch (howto->type)
>> {
>> - case R_BPF_INSN_DISP16:
>> - case R_BPF_INSN_DISP32:
>> + case R_BPF_64_32:
>> {
>> /* Make the relocation PC-relative, and change its unit to
>> 64-bit words. Note we need *signed* arithmetic
>> @@ -465,10 +268,8 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
>> r = bfd_reloc_ok;
>> break;
>> }
>> - case R_BPF_DATA_8:
>> - case R_BPF_DATA_16:
>> - case R_BPF_DATA_32:
>> - case R_BPF_DATA_64:
>> + case R_BPF_64_ABS64:
>> + case R_BPF_64_ABS32:
>> {
>> addend = bfd_get (howto->bitsize, input_bfd, where);
>> relocation += addend;
>> @@ -477,28 +278,7 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
>> r = bfd_reloc_ok;
>> break;
>> }
>> - case R_BPF_INSN_16:
>> - {
>> -
>> - addend = bfd_get_16 (input_bfd, where + 2);
>> - relocation += addend;
>> - bfd_put_16 (input_bfd, relocation, where + 2);
>> -
>> - r = bfd_reloc_ok;
>> - break;
>> - }
>> - case R_BPF_INSN_32:
>> - {
>> - /* Write relocated value */
>> -
>> - addend = bfd_get_32 (input_bfd, where + 4);
>> - relocation += addend;
>> - bfd_put_32 (input_bfd, relocation, where + 4);
>> -
>> - r = bfd_reloc_ok;
>> - break;
>> - }
>> - case R_BPF_INSN_64:
>> + case R_BPF_64_64:
>> {
>> /*
>> LDDW instructions are 128 bits long, with a 64-bit immediate.
>> @@ -610,7 +390,7 @@ bpf_elf_generic_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
>> /* Sanity check that the address is in range. */
>> bfd_size_type end = bfd_get_section_limit_octets (abfd, input_section);
>> bfd_size_type reloc_size;
>> - if (reloc_entry->howto->type == R_BPF_INSN_64)
>> + if (reloc_entry->howto->type == R_BPF_64_64)
>> reloc_size = 16;
>> else
>> reloc_size = (reloc_entry->howto->bitsize
>> @@ -642,7 +422,7 @@ bpf_elf_generic_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
>> return status;
>>
>> /* Now finally install the relocation. */
>> - if (reloc_entry->howto->type == R_BPF_INSN_64)
>> + if (reloc_entry->howto->type == R_BPF_64_64)
>> {
>> /* lddw is a 128-bit (!) instruction that allows loading a 64-bit
>> immediate into a register. the immediate is split in half, with the
>> diff --git a/bfd/libbfd.h b/bfd/libbfd.h
>> index e75935133ac..fa6f2d71b60 100644
>> --- a/bfd/libbfd.h
>> +++ b/bfd/libbfd.h
>> @@ -3340,9 +3340,6 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
>> "BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD",
>> "BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD",
>> "BFD_RELOC_BPF_64",
>> - "BFD_RELOC_BPF_32",
>> - "BFD_RELOC_BPF_16",
>> - "BFD_RELOC_BPF_DISP16",
>> "BFD_RELOC_BPF_DISP32",
>> "BFD_RELOC_EPIPHANY_SIMM8",
>> "BFD_RELOC_EPIPHANY_SIMM24",
>> diff --git a/bfd/reloc.c b/bfd/reloc.c
>> index 346dd7638db..16540632613 100644
>> --- a/bfd/reloc.c
>> +++ b/bfd/reloc.c
>> @@ -7749,12 +7749,6 @@ ENUMDOC
>>
>> ENUM
>> BFD_RELOC_BPF_64
>> -ENUMX
>> - BFD_RELOC_BPF_32
>> -ENUMX
>> - BFD_RELOC_BPF_16
>> -ENUMX
>> - BFD_RELOC_BPF_DISP16
>> ENUMX
>> BFD_RELOC_BPF_DISP32
>> ENUMDOC
>> diff --git a/gas/config/tc-bpf.c b/gas/config/tc-bpf.c
>> index aa701584470..1f8b0cc2ede 100644
>> --- a/gas/config/tc-bpf.c
>> +++ b/gas/config/tc-bpf.c
>> @@ -274,15 +274,8 @@ md_cgen_lookup_reloc (const CGEN_INSN *insn ATTRIBUTE_UNUSED,
>> {
>> switch (operand->type)
>> {
>> - case BPF_OPERAND_OFFSET16:
>> - return BFD_RELOC_BPF_16;
>> - case BPF_OPERAND_IMM32:
>> - return BFD_RELOC_BPF_32;
>> case BPF_OPERAND_IMM64:
>> return BFD_RELOC_BPF_64;
>> - case BPF_OPERAND_DISP16:
>> - fixP->fx_pcrel = 1;
>> - return BFD_RELOC_BPF_DISP16;
>> case BPF_OPERAND_DISP32:
>> fixP->fx_pcrel = 1;
>> return BFD_RELOC_BPF_DISP32;
>> diff --git a/include/elf/bpf.h b/include/elf/bpf.h
>> index e52f481b2be..fb1936010bf 100644
>> --- a/include/elf/bpf.h
>> +++ b/include/elf/bpf.h
>> @@ -26,20 +26,14 @@
>>
>> /* Relocations. */
>> START_RELOC_NUMBERS (elf_bpf_reloc_type)
>> - RELOC_NUMBER (R_BPF_NONE, 0)
>> - RELOC_NUMBER (R_BPF_INSN_64, 1)
>> - RELOC_NUMBER (R_BPF_INSN_32, 2)
>> - RELOC_NUMBER (R_BPF_INSN_16, 3)
>> - RELOC_NUMBER (R_BPF_INSN_DISP16, 4)
>> - RELOC_NUMBER (R_BPF_DATA_8_PCREL, 5)
>> - RELOC_NUMBER (R_BPF_DATA_16_PCREL, 6)
>> - RELOC_NUMBER (R_BPF_DATA_32_PCREL, 7)
>> - RELOC_NUMBER (R_BPF_DATA_8, 8)
>> - RELOC_NUMBER (R_BPF_DATA_16, 9)
>> - RELOC_NUMBER (R_BPF_INSN_DISP32, 10)
>> - RELOC_NUMBER (R_BPF_DATA_32, 11)
>> - RELOC_NUMBER (R_BPF_DATA_64, 12)
>> - RELOC_NUMBER (R_BPF_DATA_64_PCREL, 13)
>> + RELOC_NUMBER (R_BPF_NONE, 0)
>> + RELOC_NUMBER (R_BPF_64_64, 1)
>> + RELOC_NUMBER (R_BPF_64_ABS64, 2)
>> + RELOC_NUMBER (R_BPF_64_ABS32, 3)
>> +/* R_BPF_64_NODYLD32 is not used by GNU tools.
>> + * It is kept in this file to remind that the value is already taken. */
>> + RELOC_NUMBER (R_BPF_64_NODYLD32, 4)
>> + RELOC_NUMBER (R_BPF_64_32, 10)
>> END_RELOC_NUMBERS (R_BPF_max)
>>
>> #endif /* _ELF_BPF_H */
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] BPF relocations review / refactoring
2023-03-15 17:25 ` Cupertino Miranda
@ 2023-03-15 20:57 ` Jose E. Marchesi
0 siblings, 0 replies; 5+ messages in thread
From: Jose E. Marchesi @ 2023-03-15 20:57 UTC (permalink / raw)
To: Cupertino Miranda; +Cc: binutils
> Hi Jose,
>
> Have just run src-release.sh and can confirm that .def is in the release
> tarball.
>
> find ./ -name "*.def" | grep bpf
> ./bfd/bpf-reloc.def
Thanks for checking.
The patch is OK for master.
> Jose E. Marchesi writes:
>
>> Hi Cupertino.
>>
>> The approach, the switch to the consolidated BPF relocs, and the patch
>> itself LGTM.
>>
>> The only comment I have is: will bpf-reloc.def be included in the
>> binutils distribution tarball? The binutils releases are done by
>> running the src-release.sh. So we need to make sure the .def file ends
>> in the tarball...
>>
>>> - Removed not needed relocations.
>>> - Renamed relocations to match llvm and linux kernel.
>>>
>>> Relocation changes:
>>> R_BPF_INSN_64 => R_BPF_64_64
>>> R_BPF_INSN_DISP32 => R_BPF_64_32
>>> R_BPF_DATA_32 => R_BPF_64_ABS32
>>> R_BPF_DATA_64 => R_BPF_64_ABS64
>>>
>>> ChangeLog:
>>>
>>> * bfd/bpf-reloc.def: Created file with BPF_HOWTO macro entries.
>>> * bfd/reloc.c: Removed non needed relocations.
>>> * bfd/bfd-in2.h: regenerated.
>>> * bfd/libbfd.h: regenerated.
>>> * bfd/elf64-bpf.c: Changed relocations.
>>> * include/elf/bpf.h: Adapted relocation values/names.
>>> * gas/config/tc-bpf.c: Changed relocation mapping.
>>> ---
>>> bfd/bfd-in2.h | 3 -
>>> bfd/bpf-reloc.def | 74 +++++++++++
>>> bfd/elf64-bpf.c | 314 +++++++-------------------------------------
>>> bfd/libbfd.h | 3 -
>>> bfd/reloc.c | 6 -
>>> gas/config/tc-bpf.c | 7 -
>>> include/elf/bpf.h | 22 ++--
>>> 7 files changed, 129 insertions(+), 300 deletions(-)
>>> create mode 100644 bfd/bpf-reloc.def
>>>
>>> diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
>>> index 7c5953442aa..b60ff960f08 100644
>>> --- a/bfd/bfd-in2.h
>>> +++ b/bfd/bfd-in2.h
>>> @@ -6079,9 +6079,6 @@ assembler and not (currently) written to any object files. */
>>>
>>> /* Linux eBPF relocations. */
>>> BFD_RELOC_BPF_64,
>>> - BFD_RELOC_BPF_32,
>>> - BFD_RELOC_BPF_16,
>>> - BFD_RELOC_BPF_DISP16,
>>> BFD_RELOC_BPF_DISP32,
>>>
>>> /* Adapteva EPIPHANY - 8 bit signed pc-relative displacement */
>>> diff --git a/bfd/bpf-reloc.def b/bfd/bpf-reloc.def
>>> new file mode 100644
>>> index 00000000000..b1be2eb66f6
>>> --- /dev/null
>>> +++ b/bfd/bpf-reloc.def
>>> @@ -0,0 +1,74 @@
>>> + /* This reloc does nothing. */
>>> + BPF_HOWTO (R_BPF_NONE, /* type */
>>> + 0, /* rightshift */
>>> + 0, /* size */
>>> + 0, /* bitsize */
>>> + false, /* pc_relative */
>>> + 0, /* bitpos */
>>> + complain_overflow_dont, /* complain_on_overflow */
>>> + bpf_elf_generic_reloc, /* special_function */
>>> + "R_BPF_NONE", /* name */
>>> + false, /* partial_inplace */
>>> + 0, /* src_mask */
>>> + 0, /* dst_mask */
>>> + false) /* pcrel_offset */
>>> +
>>> + /* 64-immediate in LDDW instruction. */
>>> + BPF_HOWTO (R_BPF_64_64, /* type */
>>> + 0, /* rightshift */
>>> + 8, /* size */
>>> + 64, /* bitsize */
>>> + false, /* pc_relative */
>>> + 32, /* bitpos */
>>> + complain_overflow_signed, /* complain_on_overflow */
>>> + bpf_elf_generic_reloc, /* special_function */
>>> + "R_BPF_64_64", /* name */
>>> + true, /* partial_inplace */
>>> + MINUS_ONE, /* src_mask */
>>> + MINUS_ONE, /* dst_mask */
>>> + true) /* pcrel_offset */
>>> +
>>> + /* 32-bit data. */
>>> + BPF_HOWTO (R_BPF_64_ABS32, /* type */
>>> + 0, /* rightshift */
>>> + 4, /* size */
>>> + 32, /* bitsize */
>>> + false, /* pc_relative */
>>> + 0, /* bitpos */
>>> + complain_overflow_bitfield, /* complain_on_overflow */
>>> + bpf_elf_generic_reloc, /* special_function */
>>> + "R_BPF_64_ABS32", /* name */
>>> + false, /* partial_inplace */
>>> + 0xffffffff, /* src_mask */
>>> + 0xffffffff, /* dst_mask */
>>> + true) /* pcrel_offset */
>>> +
>>> + /* 64-bit data. */
>>> + BPF_HOWTO (R_BPF_64_ABS64, /* type */
>>> + 0, /* rightshift */
>>> + 8, /* size */
>>> + 64, /* bitsize */
>>> + false, /* pc_relative */
>>> + 0, /* bitpos */
>>> + complain_overflow_bitfield, /* complain_on_overflow */
>>> + bpf_elf_generic_reloc, /* special_function */
>>> + "R_BPF_64_ABS64", /* name */
>>> + false, /* partial_inplace */
>>> + 0, /* src_mask */
>>> + MINUS_ONE, /* dst_mask */
>>> + true) /* pcrel_offset */
>>> +
>>> + /* 32-bit PC-relative address in call instructions. */
>>> + BPF_HOWTO (R_BPF_64_32, /* type */
>>> + 0, /* rightshift */
>>> + 4, /* size */
>>> + 32, /* bitsize */
>>> + true, /* pc_relative */
>>> + 32, /* bitpos */
>>> + complain_overflow_signed, /* complain_on_overflow */
>>> + bpf_elf_generic_reloc, /* special_function */
>>> + "R_BPF_64_32", /* name */
>>> + true, /* partial_inplace */
>>> + 0xffffffff, /* src_mask */
>>> + 0xffffffff, /* dst_mask */
>>> + true) /* pcrel_offset */
>>> diff --git a/bfd/elf64-bpf.c b/bfd/elf64-bpf.c
>>> index 4f9949b515b..ef34d62df01 100644
>>> --- a/bfd/elf64-bpf.c
>>> +++ b/bfd/elf64-bpf.c
>>> @@ -34,214 +34,40 @@
>>> static bfd_reloc_status_type bpf_elf_generic_reloc
>>> (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
>>>
>>> +#undef BPF_HOWTO
>>> +#define BPF_HOWTO(type, right, size, bits, pcrel, left, ovf, func, name, \
>>> + inplace, src_mask, dst_mask, pcrel_off) \
>>> + type##_IDX,
>>> +enum bpf_reloc_index {
>>> + R_BPF_INVALID_IDX = -1,
>>> +#include "bpf-reloc.def"
>>> + R_BPF_SIZE
>>> +};
>>> +#undef BPF_HOWTO
>>> +
>>> /* Relocation tables. */
>>> +#define BPF_HOWTO(...) HOWTO(__VA_ARGS__),
>>> static reloc_howto_type bpf_elf_howto_table [] =
>>> {
>>> - /* This reloc does nothing. */
>>> - HOWTO (R_BPF_NONE, /* type */
>>> - 0, /* rightshift */
>>> - 0, /* size */
>>> - 0, /* bitsize */
>>> - false, /* pc_relative */
>>> - 0, /* bitpos */
>>> - complain_overflow_dont, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_NONE", /* name */
>>> - false, /* partial_inplace */
>>> - 0, /* src_mask */
>>> - 0, /* dst_mask */
>>> - false), /* pcrel_offset */
>>> -
>>> - /* 64-immediate in LDDW instruction. */
>>> - HOWTO (R_BPF_INSN_64, /* type */
>>> - 0, /* rightshift */
>>> - 8, /* size */
>>> - 64, /* bitsize */
>>> - false, /* pc_relative */
>>> - 32, /* bitpos */
>>> - complain_overflow_signed, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_INSN_64", /* name */
>>> - true, /* partial_inplace */
>>> - MINUS_ONE, /* src_mask */
>>> - MINUS_ONE, /* dst_mask */
>>> - true), /* pcrel_offset */
>>> -
>>> - /* 32-immediate in many instructions. */
>>> - HOWTO (R_BPF_INSN_32, /* type */
>>> - 0, /* rightshift */
>>> - 4, /* size */
>>> - 32, /* bitsize */
>>> - false, /* pc_relative */
>>> - 32, /* bitpos */
>>> - complain_overflow_signed, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_INSN_32", /* name */
>>> - true, /* partial_inplace */
>>> - 0xffffffff, /* src_mask */
>>> - 0xffffffff, /* dst_mask */
>>> - true), /* pcrel_offset */
>>> -
>>> - /* 16-bit offsets in instructions. */
>>> - HOWTO (R_BPF_INSN_16, /* type */
>>> - 0, /* rightshift */
>>> - 2, /* size */
>>> - 16, /* bitsize */
>>> - false, /* pc_relative */
>>> - 16, /* bitpos */
>>> - complain_overflow_signed, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_INSN_16", /* name */
>>> - true, /* partial_inplace */
>>> - 0x0000ffff, /* src_mask */
>>> - 0x0000ffff, /* dst_mask */
>>> - true), /* pcrel_offset */
>>> -
>>> - /* 16-bit PC-relative address in jump instructions. */
>>> - HOWTO (R_BPF_INSN_DISP16, /* type */
>>> - 0, /* rightshift */
>>> - 2, /* size */
>>> - 16, /* bitsize */
>>> - true, /* pc_relative */
>>> - 16, /* bitpos */
>>> - complain_overflow_signed, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_INSN_DISP16", /* name */
>>> - true, /* partial_inplace */
>>> - 0xffff, /* src_mask */
>>> - 0xffff, /* dst_mask */
>>> - true), /* pcrel_offset */
>>> -
>>> - HOWTO (R_BPF_DATA_8_PCREL,
>>> - 0, /* rightshift */
>>> - 1, /* size */
>>> - 8, /* bitsize */
>>> - true, /* pc_relative */
>>> - 0, /* bitpos */
>>> - complain_overflow_signed, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_8_PCREL", /* name */
>>> - true, /* partial_inplace */
>>> - 0xff, /* src_mask */
>>> - 0xff, /* dst_mask */
>>> - true), /* pcrel_offset */
>>> -
>>> - HOWTO (R_BPF_DATA_16_PCREL,
>>> - 0, /* rightshift */
>>> - 2, /* size */
>>> - 16, /* bitsize */
>>> - true, /* pc_relative */
>>> - 0, /* bitpos */
>>> - complain_overflow_signed, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_16_PCREL", /* name */
>>> - false, /* partial_inplace */
>>> - 0xffff, /* src_mask */
>>> - 0xffff, /* dst_mask */
>>> - true), /* pcrel_offset */
>>> -
>>> - HOWTO (R_BPF_DATA_32_PCREL,
>>> - 0, /* rightshift */
>>> - 4, /* size */
>>> - 32, /* bitsize */
>>> - true, /* pc_relative */
>>> - 0, /* bitpos */
>>> - complain_overflow_signed, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_32_PCREL", /* name */
>>> - false, /* partial_inplace */
>>> - 0xffffffff, /* src_mask */
>>> - 0xffffffff, /* dst_mask */
>>> - true), /* pcrel_offset */
>>> -
>>> - HOWTO (R_BPF_DATA_8,
>>> - 0, /* rightshift */
>>> - 1, /* size */
>>> - 8, /* bitsize */
>>> - false, /* pc_relative */
>>> - 0, /* bitpos */
>>> - complain_overflow_unsigned, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_DATA_8", /* name */
>>> - true, /* partial_inplace */
>>> - 0xff, /* src_mask */
>>> - 0xff, /* dst_mask */
>>> - false), /* pcrel_offset */
>>> -
>>> - HOWTO (R_BPF_DATA_16,
>>> - 0, /* rightshift */
>>> - 2, /* size */
>>> - 16, /* bitsize */
>>> - false, /* pc_relative */
>>> - 0, /* bitpos */
>>> - complain_overflow_unsigned, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_DATA_16", /* name */
>>> - false, /* partial_inplace */
>>> - 0xffff, /* src_mask */
>>> - 0xffff, /* dst_mask */
>>> - false), /* pcrel_offset */
>>> -
>>> - /* 32-bit PC-relative address in call instructions. */
>>> - HOWTO (R_BPF_INSN_DISP32, /* type */
>>> - 0, /* rightshift */
>>> - 4, /* size */
>>> - 32, /* bitsize */
>>> - true, /* pc_relative */
>>> - 32, /* bitpos */
>>> - complain_overflow_signed, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_INSN_DISP32", /* name */
>>> - true, /* partial_inplace */
>>> - 0xffffffff, /* src_mask */
>>> - 0xffffffff, /* dst_mask */
>>> - true), /* pcrel_offset */
>>> -
>>> - /* 32-bit data. */
>>> - HOWTO (R_BPF_DATA_32, /* type */
>>> - 0, /* rightshift */
>>> - 4, /* size */
>>> - 32, /* bitsize */
>>> - false, /* pc_relative */
>>> - 0, /* bitpos */
>>> - complain_overflow_bitfield, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_DATA_32", /* name */
>>> - false, /* partial_inplace */
>>> - 0xffffffff, /* src_mask */
>>> - 0xffffffff, /* dst_mask */
>>> - true), /* pcrel_offset */
>>> -
>>> - /* 64-bit data. */
>>> - HOWTO (R_BPF_DATA_64, /* type */
>>> - 0, /* rightshift */
>>> - 8, /* size */
>>> - 64, /* bitsize */
>>> - false, /* pc_relative */
>>> - 0, /* bitpos */
>>> - complain_overflow_bitfield, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_DATA_64", /* name */
>>> - false, /* partial_inplace */
>>> - 0, /* src_mask */
>>> - MINUS_ONE, /* dst_mask */
>>> - true), /* pcrel_offset */
>>> -
>>> - HOWTO (R_BPF_DATA_64_PCREL,
>>> - 0, /* rightshift */
>>> - 8, /* size */
>>> - 64, /* bitsize */
>>> - true, /* pc_relative */
>>> - 0, /* bitpos */
>>> - complain_overflow_signed, /* complain_on_overflow */
>>> - bpf_elf_generic_reloc, /* special_function */
>>> - "R_BPF_64_PCREL", /* name */
>>> - false, /* partial_inplace */
>>> - MINUS_ONE, /* src_mask */
>>> - MINUS_ONE, /* dst_mask */
>>> - true), /* pcrel_offset */
>>> + #include "bpf-reloc.def"
>>> };
>>> #undef AHOW
>>> +#undef BPF_HOWTO
>>> +
>>> +#define BPF_HOWTO(type, right, size, bits, pcrel, left, ovf, func, name, \
>>> + inplace, src_mask, dst_mask, pcrel_off) \
>>> + case type: { return type##_IDX; }
>>> +static enum bpf_reloc_index
>>> +bpf_index_for_rtype(unsigned int r_type)
>>> +{
>>> + switch(r_type) {
>>> +#include "bpf-reloc.def"
>>> + default:
>>> + /* Unreachable code. */
>>> + BFD_ASSERT(0);
>>> + return -1;
>>> + };
>>> +}
>>>
>>> /* Map BFD reloc types to bpf ELF reloc types. */
>>>
>>> @@ -249,44 +75,20 @@ static reloc_howto_type *
>>> bpf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
>>> bfd_reloc_code_real_type code)
>>> {
>>> - /* Note that the bpf_elf_howto_table is indexed by the R_ constants.
>>> - Thus, the order that the howto records appear in the table *must*
>>> - match the order of the relocation types defined in
>>> - include/elf/bpf.h. */
>>> -
>>> switch (code)
>>> {
>>> case BFD_RELOC_NONE:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_NONE];
>>> -
>>> - case BFD_RELOC_8_PCREL:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_8_PCREL];
>>> - case BFD_RELOC_16_PCREL:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_16_PCREL];
>>> - case BFD_RELOC_32_PCREL:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_32_PCREL];
>>> - case BFD_RELOC_64_PCREL:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_64_PCREL];
>>> -
>>> - case BFD_RELOC_8:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_8];
>>> - case BFD_RELOC_16:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_16];
>>> + return &bpf_elf_howto_table[ (int) R_BPF_NONE_IDX];
>>> +
>>> case BFD_RELOC_32:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_32];
>>> + return &bpf_elf_howto_table[ (int) R_BPF_64_ABS32_IDX];
>>> case BFD_RELOC_64:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_DATA_64];
>>> + return &bpf_elf_howto_table[ (int) R_BPF_64_ABS64_IDX];
>>>
>>> case BFD_RELOC_BPF_64:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_64];
>>> - case BFD_RELOC_BPF_32:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_32];
>>> - case BFD_RELOC_BPF_16:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_16];
>>> - case BFD_RELOC_BPF_DISP16:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_DISP16];
>>> + return &bpf_elf_howto_table[ (int) R_BPF_64_64_IDX];
>>> case BFD_RELOC_BPF_DISP32:
>>> - return &bpf_elf_howto_table[ (int) R_BPF_INSN_DISP32];
>>> + return &bpf_elf_howto_table[ (int) R_BPF_64_32_IDX];
>>>
>>> default:
>>> /* Pacify gcc -Wall. */
>>> @@ -302,7 +104,7 @@ bpf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
>>> {
>>> unsigned int i;
>>>
>>> - for (i = 0; i < ARRAY_SIZE (bpf_elf_howto_table); i++)
>>> + for (i = 0; i < R_BPF_SIZE; i++)
>>> if (bpf_elf_howto_table[i].name != NULL
>>> && strcasecmp (bpf_elf_howto_table[i].name, r_name) == 0)
>>> return &bpf_elf_howto_table[i];
>>> @@ -317,9 +119,11 @@ bpf_info_to_howto (bfd *abfd, arelent *bfd_reloc,
>>> Elf_Internal_Rela *elf_reloc)
>>> {
>>> unsigned int r_type;
>>> -
>>> + unsigned int i;
>>> r_type = ELF64_R_TYPE (elf_reloc->r_info);
>>> - if (r_type >= (unsigned int) R_BPF_max)
>>> +
>>> + i = bpf_index_for_rtype(r_type);
>>> + if (i == (unsigned int) -1)
>>> {
>>> /* xgettext:c-format */
>>> _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
>>> @@ -328,7 +132,7 @@ bpf_info_to_howto (bfd *abfd, arelent *bfd_reloc,
>>> return false;
>>> }
>>>
>>> - bfd_reloc->howto = &bpf_elf_howto_table [r_type];
>>> + bfd_reloc->howto = &bpf_elf_howto_table [i];
>>> return true;
>>> }
>>>
>>> @@ -438,8 +242,7 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
>>>
>>> switch (howto->type)
>>> {
>>> - case R_BPF_INSN_DISP16:
>>> - case R_BPF_INSN_DISP32:
>>> + case R_BPF_64_32:
>>> {
>>> /* Make the relocation PC-relative, and change its unit to
>>> 64-bit words. Note we need *signed* arithmetic
>>> @@ -465,10 +268,8 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
>>> r = bfd_reloc_ok;
>>> break;
>>> }
>>> - case R_BPF_DATA_8:
>>> - case R_BPF_DATA_16:
>>> - case R_BPF_DATA_32:
>>> - case R_BPF_DATA_64:
>>> + case R_BPF_64_ABS64:
>>> + case R_BPF_64_ABS32:
>>> {
>>> addend = bfd_get (howto->bitsize, input_bfd, where);
>>> relocation += addend;
>>> @@ -477,28 +278,7 @@ bpf_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
>>> r = bfd_reloc_ok;
>>> break;
>>> }
>>> - case R_BPF_INSN_16:
>>> - {
>>> -
>>> - addend = bfd_get_16 (input_bfd, where + 2);
>>> - relocation += addend;
>>> - bfd_put_16 (input_bfd, relocation, where + 2);
>>> -
>>> - r = bfd_reloc_ok;
>>> - break;
>>> - }
>>> - case R_BPF_INSN_32:
>>> - {
>>> - /* Write relocated value */
>>> -
>>> - addend = bfd_get_32 (input_bfd, where + 4);
>>> - relocation += addend;
>>> - bfd_put_32 (input_bfd, relocation, where + 4);
>>> -
>>> - r = bfd_reloc_ok;
>>> - break;
>>> - }
>>> - case R_BPF_INSN_64:
>>> + case R_BPF_64_64:
>>> {
>>> /*
>>> LDDW instructions are 128 bits long, with a 64-bit immediate.
>>> @@ -610,7 +390,7 @@ bpf_elf_generic_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
>>> /* Sanity check that the address is in range. */
>>> bfd_size_type end = bfd_get_section_limit_octets (abfd, input_section);
>>> bfd_size_type reloc_size;
>>> - if (reloc_entry->howto->type == R_BPF_INSN_64)
>>> + if (reloc_entry->howto->type == R_BPF_64_64)
>>> reloc_size = 16;
>>> else
>>> reloc_size = (reloc_entry->howto->bitsize
>>> @@ -642,7 +422,7 @@ bpf_elf_generic_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
>>> return status;
>>>
>>> /* Now finally install the relocation. */
>>> - if (reloc_entry->howto->type == R_BPF_INSN_64)
>>> + if (reloc_entry->howto->type == R_BPF_64_64)
>>> {
>>> /* lddw is a 128-bit (!) instruction that allows loading a 64-bit
>>> immediate into a register. the immediate is split in half, with the
>>> diff --git a/bfd/libbfd.h b/bfd/libbfd.h
>>> index e75935133ac..fa6f2d71b60 100644
>>> --- a/bfd/libbfd.h
>>> +++ b/bfd/libbfd.h
>>> @@ -3340,9 +3340,6 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
>>> "BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD",
>>> "BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD",
>>> "BFD_RELOC_BPF_64",
>>> - "BFD_RELOC_BPF_32",
>>> - "BFD_RELOC_BPF_16",
>>> - "BFD_RELOC_BPF_DISP16",
>>> "BFD_RELOC_BPF_DISP32",
>>> "BFD_RELOC_EPIPHANY_SIMM8",
>>> "BFD_RELOC_EPIPHANY_SIMM24",
>>> diff --git a/bfd/reloc.c b/bfd/reloc.c
>>> index 346dd7638db..16540632613 100644
>>> --- a/bfd/reloc.c
>>> +++ b/bfd/reloc.c
>>> @@ -7749,12 +7749,6 @@ ENUMDOC
>>>
>>> ENUM
>>> BFD_RELOC_BPF_64
>>> -ENUMX
>>> - BFD_RELOC_BPF_32
>>> -ENUMX
>>> - BFD_RELOC_BPF_16
>>> -ENUMX
>>> - BFD_RELOC_BPF_DISP16
>>> ENUMX
>>> BFD_RELOC_BPF_DISP32
>>> ENUMDOC
>>> diff --git a/gas/config/tc-bpf.c b/gas/config/tc-bpf.c
>>> index aa701584470..1f8b0cc2ede 100644
>>> --- a/gas/config/tc-bpf.c
>>> +++ b/gas/config/tc-bpf.c
>>> @@ -274,15 +274,8 @@ md_cgen_lookup_reloc (const CGEN_INSN *insn ATTRIBUTE_UNUSED,
>>> {
>>> switch (operand->type)
>>> {
>>> - case BPF_OPERAND_OFFSET16:
>>> - return BFD_RELOC_BPF_16;
>>> - case BPF_OPERAND_IMM32:
>>> - return BFD_RELOC_BPF_32;
>>> case BPF_OPERAND_IMM64:
>>> return BFD_RELOC_BPF_64;
>>> - case BPF_OPERAND_DISP16:
>>> - fixP->fx_pcrel = 1;
>>> - return BFD_RELOC_BPF_DISP16;
>>> case BPF_OPERAND_DISP32:
>>> fixP->fx_pcrel = 1;
>>> return BFD_RELOC_BPF_DISP32;
>>> diff --git a/include/elf/bpf.h b/include/elf/bpf.h
>>> index e52f481b2be..fb1936010bf 100644
>>> --- a/include/elf/bpf.h
>>> +++ b/include/elf/bpf.h
>>> @@ -26,20 +26,14 @@
>>>
>>> /* Relocations. */
>>> START_RELOC_NUMBERS (elf_bpf_reloc_type)
>>> - RELOC_NUMBER (R_BPF_NONE, 0)
>>> - RELOC_NUMBER (R_BPF_INSN_64, 1)
>>> - RELOC_NUMBER (R_BPF_INSN_32, 2)
>>> - RELOC_NUMBER (R_BPF_INSN_16, 3)
>>> - RELOC_NUMBER (R_BPF_INSN_DISP16, 4)
>>> - RELOC_NUMBER (R_BPF_DATA_8_PCREL, 5)
>>> - RELOC_NUMBER (R_BPF_DATA_16_PCREL, 6)
>>> - RELOC_NUMBER (R_BPF_DATA_32_PCREL, 7)
>>> - RELOC_NUMBER (R_BPF_DATA_8, 8)
>>> - RELOC_NUMBER (R_BPF_DATA_16, 9)
>>> - RELOC_NUMBER (R_BPF_INSN_DISP32, 10)
>>> - RELOC_NUMBER (R_BPF_DATA_32, 11)
>>> - RELOC_NUMBER (R_BPF_DATA_64, 12)
>>> - RELOC_NUMBER (R_BPF_DATA_64_PCREL, 13)
>>> + RELOC_NUMBER (R_BPF_NONE, 0)
>>> + RELOC_NUMBER (R_BPF_64_64, 1)
>>> + RELOC_NUMBER (R_BPF_64_ABS64, 2)
>>> + RELOC_NUMBER (R_BPF_64_ABS32, 3)
>>> +/* R_BPF_64_NODYLD32 is not used by GNU tools.
>>> + * It is kept in this file to remind that the value is already taken. */
>>> + RELOC_NUMBER (R_BPF_64_NODYLD32, 4)
>>> + RELOC_NUMBER (R_BPF_64_32, 10)
>>> END_RELOC_NUMBERS (R_BPF_max)
>>>
>>> #endif /* _ELF_BPF_H */
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-03-15 20:57 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-02 11:25 [PATCH] BPF relocations refactoring Cupertino Miranda
2023-03-02 11:25 ` [PATCH] BPF relocations review / refactoring Cupertino Miranda
2023-03-15 16:39 ` Jose E. Marchesi
2023-03-15 17:25 ` Cupertino Miranda
2023-03-15 20:57 ` Jose E. Marchesi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).