public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [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).