* [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).