[PATCH 0/9] eBPF support for GNU binutils

Jiong Wang jiong.wang@netronome.com
Tue May 21 15:42:00 GMT 2019


CCing BPF kernel community who is defining the ISA and various runtime stuff.

Also two inline comments below about the assembler

> On 20 May 2019, at 17:45, Jose E. Marchesi <jose.marchesi oracle ! com> wrote:
> 
> Hi people!
> 
> This patch series introduces support for eBPF, which is a virtual
> machine that resides in the Linux kernel.  Initially intended for
> user-level packet capture and filtering, eBPF is nowadays generalized
> to serve as a general-purpose infrastructure also for non-networking
> purposes.
> 
> The first patch is preparatory, and adds support to config.guess to
> recognize bpf-*-* triplets.  This will be submitted as a patch to the
> `config' project as soon as this series gets upstreamed.
> 
> The second and third patches add support for an ELF64 based eBPF
> target to BFD, in both little-endian and big-endian vectors.
> 
> The fourth patch adds a CGEN cpu description for eBPF, plus support
> code.  This description covers the full eBPF ISA.  Due to the 64-bit
> instruction fields used in some instructions, we needed to fix a
> bug/limitation in CGEN impacting 32-bit hosts.  The fix is in a patch
> submitted to CGEN last week, that is still waiting for review:
> http://www.sourceware.org/ml/cgen/2019-q2/msg00008.html None of the
> existing CGEN ports in binutils are impacted by that patch: the code
> generated for these remains exactly the same.
> 
> The fifth patch adds opcodes and disassembler support for eBPF, based
> on the CGEN description.
> 
> The sixth patch adds a GAS port, including a testsuite and manual
> updates.  By default the assembler generates objects using the same
> endianness than the host.  This can be overrided by the usual -EB and
> -EB command-line options.
> 
> Support for linking eBPF ELF files with ld/bfd is provided in the
> seventh patch.  A couple of simple tests are included.
> 
> The eighth patch adds support for eBPF to readelf, and makes a little
> adjustment in the `nm' testsuite to not fail in bpf-*-* targets.
> 
> Finally, the last patch adds myself as the maintainer of the BPF
> target.  We are committing to maintain this port.
> 
> Future work on the binutils port:
> * Support for semantic actions in bpf.cpu, and support code for a
>  simulator in sim/.
> * Support for ld.gold.
> 
> Next stop is GCC.  An eBPF backend is on the works.  We plan to
> upstream it before September.
> 
> Regressions tested in all targets.
> Regressions tested with --enable-targets=all
> Tested in 64-bit x86_64 host.
> Tested in 32-bit x86 host.
> 
> Oh, a little note regarding interoperability:
> 
> There is a clang/llvm based toolchain for eBPF.  However, at this
> moment compiled eBPF doesn't have established conventions.  The
> details on what is expected to be in an ELF file containing eBPF is
> determined, in practice, by what the llvm BPF backend supports and
> what the sample bpf_load.c in the Linux kernel source tree expects
> [1].
> 
> Despite using a different syntax for the assembler (the llvm assembler
> uses a C-ish expression-based syntax while the GNU assembler opts for
> a more classic assembly-language syntax) this implementation tries to
> provide inter-operability with clang/llvm generated objects.

I also noticed your implementation doesn’t seem to use the same sub-register
syntax as what LLVM assembler is doing.

  x register for 64-bit, and w register for 32-bit sub-register.

So:
  add r0, r1, r2 means BPF_ALU64 | BPF_ADD | BFF_X
  add w0, w1, w1 means BPF_ALU | BPF_ADD | BPF_X

ASAICT, different register prefix for different register width is also adopted
by quite a few other GNU assembler targets like AArch64, X86_64.

> 
> In particular, the numbers of the relocations used for instruction
> fields are the same.  These are R_BPF_INSN_64 and R_BPF_INSN_DISP32.
> The later is resolved at load-time by bpf_load.c.

I think you missed the latest JMP32 instructions.

  https://github.com/torvalds/linux/blob/master/Documentation/networking/filter.txt#L870


> 
> [1] We expect/hope that the addition of eBPF support to the GNU
>    toolchain will help to mature the domain of compiled eBPF.  We
>    will certainly be working with the kernel people to that effect.
> 
> Salud!
> 
> Jose E. Marchesi (9):
>  config: recognize eBPF triplets
>  include: add elf/bpf.h
>  bfd: add support for eBPF
>  cpu: add eBPF cpu description
>  opcodes: add support for eBPF
>  gas: add support for eBPF
>  ld: add support for eBPF
>  binutils: add support for eBPF
>  binutils: add myself as the maintainer for BPF
> 
> ChangeLog                              |    4 +
> bfd/ChangeLog                          |   20 +
> bfd/Makefile.am                        |    4 +
> bfd/Makefile.in                        |    7 +
> bfd/archures.c                         |    4 +
> bfd/bfd-in2.h                          |    9 +
> bfd/config.bfd                         |    6 +
> bfd/configure                          |   30 +-
> bfd/configure.ac                       |    2 +
> bfd/cpu-bpf.c                          |   41 +
> bfd/elf64-bpf.c                        |  463 +++++++++
> bfd/libbfd.h                           |    5 +
> bfd/reloc.c                            |   13 +
> bfd/targets.c                          |    7 +
> binutils/ChangeLog                     |   13 +
> binutils/MAINTAINERS                   |    1 +
> binutils/readelf.c                     |    8 +
> binutils/testsuite/binutils-all/nm.exp |    3 +-
> config.sub                             |    4 +-
> cpu/ChangeLog                          |    5 +
> cpu/bpf.cpu                            |  647 +++++++++++++
> cpu/bpf.opc                            |  191 ++++
> gas/ChangeLog                          |   45 +
> gas/Makefile.am                        |    2 +
> gas/Makefile.in                        |    6 +
> gas/config/tc-bpf.c                    |  357 +++++++
> gas/config/tc-bpf.h                    |   51 +
> gas/configure                          |   38 +-
> gas/configure.ac                       |    6 +
> gas/configure.tgt                      |    1 +
> gas/doc/Makefile.am                    |    1 +
> gas/doc/Makefile.in                    |    6 +-
> gas/doc/all.texi                       |    1 +
> gas/doc/as.texi                        |   34 +
> gas/doc/c-bpf.texi                     |  364 +++++++
> gas/testsuite/gas/all/gas.exp          |    3 +
> gas/testsuite/gas/all/org-1.l          |    2 +-
> gas/testsuite/gas/all/org-1.s          |    2 +
> gas/testsuite/gas/bpf/alu-be.d         |   59 ++
> gas/testsuite/gas/bpf/alu.d            |   58 ++
> gas/testsuite/gas/bpf/alu.s            |   51 +
> gas/testsuite/gas/bpf/alu32-be.d       |   65 ++
> gas/testsuite/gas/bpf/alu32.d          |   64 ++
> gas/testsuite/gas/bpf/alu32.s          |   57 ++
> gas/testsuite/gas/bpf/atomic-be.d      |   12 +
> gas/testsuite/gas/bpf/atomic.d         |   11 +
> gas/testsuite/gas/bpf/atomic.s         |    5 +
> gas/testsuite/gas/bpf/bpf.exp          |   38 +
> gas/testsuite/gas/bpf/call-be.d        |   19 +
> gas/testsuite/gas/bpf/call.d           |   18 +
> gas/testsuite/gas/bpf/call.s           |   11 +
> gas/testsuite/gas/bpf/exit-be.d        |   11 +
> gas/testsuite/gas/bpf/exit.d           |   10 +
> gas/testsuite/gas/bpf/exit.s           |    2 +
> gas/testsuite/gas/bpf/jump-be.d        |   32 +
> gas/testsuite/gas/bpf/jump.d           |   31 +
> gas/testsuite/gas/bpf/jump.s           |   25 +
> gas/testsuite/gas/bpf/lddw-be.d        |   18 +
> gas/testsuite/gas/bpf/lddw.d           |   17 +
> gas/testsuite/gas/bpf/lddw.s           |    6 +
> gas/testsuite/gas/bpf/mem-be.d         |   30 +
> gas/testsuite/gas/bpf/mem.d            |   29 +
> gas/testsuite/gas/bpf/mem.s            |   24 +
> include/ChangeLog                      |    4 +
> include/elf/bpf.h                      |   45 +
> ld/ChangeLog                           |   15 +
> ld/Makefile.am                         |    2 +
> ld/Makefile.in                         |    4 +
> ld/configure                           |   28 +-
> ld/configure.tgt                       |    1 +
> ld/emulparams/elf64bpf.sh              |   10 +
> ld/testsuite/ld-bpf/bar.s              |    5 +
> ld/testsuite/ld-bpf/baz.s              |    5 +
> ld/testsuite/ld-bpf/bpf.exp            |   29 +
> ld/testsuite/ld-bpf/call-1.d           |   23 +
> ld/testsuite/ld-bpf/foo.s              |    5 +
> ld/testsuite/ld-bpf/jump-1.d           |   23 +
> ld/testsuite/lib/ld-lib.exp            |    1 +
> opcodes/ChangeLog                      |   24 +
> opcodes/Makefile.am                    |   17 +
> opcodes/Makefile.in                    |   23 +
> opcodes/bpf-asm.c                      |  590 ++++++++++++
> opcodes/bpf-desc.c                     | 1638 ++++++++++++++++++++++++++++++++
> opcodes/bpf-desc.h                     |  266 ++++++
> opcodes/bpf-dis.c                      |  624 ++++++++++++
> opcodes/bpf-ibld.c                     |  956 +++++++++++++++++++
> opcodes/bpf-opc.c                      | 1495 +++++++++++++++++++++++++++++
> opcodes/bpf-opc.h                      |  151 +++
> opcodes/configure                      |   19 +-
> opcodes/configure.ac                   |    1 +
> opcodes/disassemble.c                  |   35 +
> opcodes/disassemble.h                  |    1 +
> 92 files changed, 9116 insertions(+), 33 deletions(-)
> create mode 100644 bfd/cpu-bpf.c
> create mode 100644 bfd/elf64-bpf.c
> create mode 100644 cpu/bpf.cpu
> create mode 100644 cpu/bpf.opc
> create mode 100644 gas/config/tc-bpf.c
> create mode 100644 gas/config/tc-bpf.h
> create mode 100644 gas/doc/c-bpf.texi
> create mode 100644 gas/testsuite/gas/bpf/alu-be.d
> create mode 100644 gas/testsuite/gas/bpf/alu.d
> create mode 100644 gas/testsuite/gas/bpf/alu.s
> create mode 100644 gas/testsuite/gas/bpf/alu32-be.d
> create mode 100644 gas/testsuite/gas/bpf/alu32.d
> create mode 100644 gas/testsuite/gas/bpf/alu32.s
> create mode 100644 gas/testsuite/gas/bpf/atomic-be.d
> create mode 100644 gas/testsuite/gas/bpf/atomic.d
> create mode 100644 gas/testsuite/gas/bpf/atomic.s
> create mode 100644 gas/testsuite/gas/bpf/bpf.exp
> create mode 100644 gas/testsuite/gas/bpf/call-be.d
> create mode 100644 gas/testsuite/gas/bpf/call.d
> create mode 100644 gas/testsuite/gas/bpf/call.s
> create mode 100644 gas/testsuite/gas/bpf/exit-be.d
> create mode 100644 gas/testsuite/gas/bpf/exit.d
> create mode 100644 gas/testsuite/gas/bpf/exit.s
> create mode 100644 gas/testsuite/gas/bpf/jump-be.d
> create mode 100644 gas/testsuite/gas/bpf/jump.d
> create mode 100644 gas/testsuite/gas/bpf/jump.s
> create mode 100644 gas/testsuite/gas/bpf/lddw-be.d
> create mode 100644 gas/testsuite/gas/bpf/lddw.d
> create mode 100644 gas/testsuite/gas/bpf/lddw.s
> create mode 100644 gas/testsuite/gas/bpf/mem-be.d
> create mode 100644 gas/testsuite/gas/bpf/mem.d
> create mode 100644 gas/testsuite/gas/bpf/mem.s
> create mode 100644 include/elf/bpf.h
> create mode 100644 ld/emulparams/elf64bpf.sh
> create mode 100644 ld/testsuite/ld-bpf/bar.s
> create mode 100644 ld/testsuite/ld-bpf/baz.s
> create mode 100644 ld/testsuite/ld-bpf/bpf.exp
> create mode 100644 ld/testsuite/ld-bpf/call-1.d
> create mode 100644 ld/testsuite/ld-bpf/foo.s
> create mode 100644 ld/testsuite/ld-bpf/jump-1.d
> create mode 100644 opcodes/bpf-asm.c
> create mode 100644 opcodes/bpf-desc.c
> create mode 100644 opcodes/bpf-desc.h
> create mode 100644 opcodes/bpf-dis.c
> create mode 100644 opcodes/bpf-ibld.c
> create mode 100644 opcodes/bpf-opc.c
> create mode 100644 opcodes/bpf-opc.h
> 
> -- 
> 2.11.0



More information about the Binutils mailing list