bpf.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Yonghong Song <yonghong.song@linux.dev>
To: Eduard Zingerman <eddyz87@gmail.com>,
	Anton Protopopov <a.s.protopopov@gmail.com>
Cc: bpf@vger.kernel.org, Alexei Starovoitov <ast@kernel.org>,
	Andrii Nakryiko <andrii@kernel.org>,
	Anton Protopopov <aspsk@isovalent.com>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Quentin Monnet <qmo@kernel.org>
Subject: Re: [RFC bpf-next 8/9] libbpf: support llvm-generated indirect jumps
Date: Mon, 7 Jul 2025 22:58:06 -0700	[thread overview]
Message-ID: <eb55a14f-0e3e-4bec-9116-abf6aa9111b2@linux.dev> (raw)
In-Reply-To: <25525af2-1dfc-466c-be0c-6c51bab4e605@linux.dev>


On 7/7/25 2:44 PM, Yonghong Song wrote:
>
>
> On 7/7/25 12:07 PM, Eduard Zingerman wrote:
>> On Thu, 2025-07-03 at 11:21 -0700, Eduard Zingerman wrote:
>>
>> [...]
>>
>>>>>>    .jumptables
>>>>>>      <subprog-rel-off-0>
>>>>>>      <subprog-rel-off-1> | <--- jump table #1 symbol:
>>>>>>      <subprog-rel-off-2> |        .size = 2   // number of 
>>>>>> entries in the jump table
>>>>>>      ...                          .value = 1  // offset within 
>>>>>> .jumptables
>>>>>>      <subprog-rel-off-N> ^
>>>>>>                                                   |
>>>>>>    .text                                          |
>>>>>>      ...                                          |
>>>>>>      <insn-N>     <------ relocation referencing -'
>>>>>>      ...                  jump table #1 symbol
>> [...]
>>
>> I think I got it working in:
>> https://github.com/eddyz87/llvm-project/tree/separate-jumptables-section
>>
>> Changes on top of Yonghong's work.
>> An example is in the attachment the gist is:
>>
>> -------------------------------
>>
>> $ clang --target=bpf -c -o jump-table-test.o jump-table-test.c
>> There are 8 section headers, starting at offset 0xaa0:
>>
>> Section Headers:
>>    [Nr] Name              Type            Address Off    Size   ES 
>> Flg Lk Inf Al
>>    ...
>>    [ 4] .jumptables       PROGBITS        0000000000000000 000220 
>> 000260 00      0   0  1
>>    ...
>>
>> Symbol table '.symtab' contains 8 entries:
>>     Num:    Value          Size Type    Bind   Vis       Ndx Name
>>       ...
>>       3: 0000000000000000   256 NOTYPE  LOCAL  DEFAULT     4 .BPF.JT.0.0
>>       4: 0000000000000100   352 NOTYPE  LOCAL  DEFAULT     4 .BPF.JT.0.1
>>       ...
>>
>> $ llvm-objdump --no-show-raw-insn -Sdr jump-table-test.o
>> jump-table-test.o:      file format elf64-bpf
>>
>> Disassembly of section .text:
>>
>> 0000000000000000 <foo>:
>>         ...
>>         6:       r2 <<= 0x3
>>         7:       r1 = 0x0 ll
>>                  0000000000000038:  R_BPF_64_64  .jumptables
>>         9:       r1 += r2
>>        10:       r1 = *(u64 *)(r1 + 0x0)
>>        11:       gotox r1
>>        ...
>>        34:       r2 <<= 0x3
>>        35:       r1 = 0x100 ll
>>                  0000000000000118:  R_BPF_64_64  .jumptables
>>        37:       r1 += r2
>>        38:       r1 = *(u64 *)(r1 + 0x0)
>>        39:       gotox r1
>>        ...
>>
>> -------------------------------
>>
>> The changes only touch BPF backend. Can be simplified a bit if I move
>> MachineFunction::getJTISymbol to TargetLowering in the shared LLVM
>> parts.
>
> Thanks, Eduard. I actually also explored a little bit and came up with
> the below patch:
> https://github.com/yonghong-song/llvm-project/tree/br-jt-v6-seperate-jmptable
> the top commit is the addition on top of 
> https://github.com/llvm/llvm-project/pull/133856.
> I tried to leverage existing llvm infrastructure and it will support 
> ELF/XCOFF/COFF
> and all backends.
>
> Anton, besides Eduard's patch, please also take a look at the above 
> patch.

Sorry, I have not looked at this patch for a while.

I briefly went through the discussions, the github patch Eduard provided seems
the right choice and please ignore my above patch. Also, as discussion
with Alexei and Eduard, a little bit more work is needed in llvm to help verifier.



  reply	other threads:[~2025-07-08  5:58 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-15  8:59 [RFC bpf-next 0/9] BPF indirect jumps Anton Protopopov
2025-06-15  8:59 ` [RFC bpf-next 1/9] bpf: save the start of functions in bpf_prog_aux Anton Protopopov
2025-06-15  8:59 ` [RFC bpf-next 2/9] bpf, x86: add new map type: instructions set Anton Protopopov
2025-06-18  0:57   ` Eduard Zingerman
2025-06-18  2:16     ` Alexei Starovoitov
2025-06-19 18:57       ` Anton Protopopov
2025-06-19 18:55     ` Anton Protopopov
2025-06-19 18:55       ` Eduard Zingerman
2025-06-15  8:59 ` [RFC bpf-next 3/9] selftests/bpf: add selftests for new insn_set map Anton Protopopov
2025-06-18 11:04   ` Eduard Zingerman
2025-06-18 15:16     ` Anton Protopopov
2025-06-15  8:59 ` [RFC bpf-next 4/9] bpf, x86: allow indirect jumps to r8...r15 Anton Protopopov
2025-06-17 19:41   ` Alexei Starovoitov
2025-06-18 14:28     ` Anton Protopopov
2025-06-15  8:59 ` [RFC bpf-next 5/9] bpf, x86: add support for indirect jumps Anton Protopopov
2025-06-18  3:06   ` Alexei Starovoitov
2025-06-19 19:57     ` Anton Protopopov
2025-06-19 19:58     ` Anton Protopopov
2025-06-18 11:03   ` Eduard Zingerman
2025-06-19 20:13     ` Anton Protopopov
2025-06-15  8:59 ` [RFC bpf-next 6/9] bpf: workaround llvm behaviour with " Anton Protopopov
2025-06-18 11:04   ` Eduard Zingerman
2025-06-18 13:59     ` Alexei Starovoitov
2025-06-15  8:59 ` [RFC bpf-next 7/9] bpf: disasm: add support for BPF_JMP|BPF_JA|BPF_X Anton Protopopov
2025-06-15  8:59 ` [RFC bpf-next 8/9] libbpf: support llvm-generated indirect jumps Anton Protopopov
2025-06-18  3:22   ` Alexei Starovoitov
2025-06-18 15:08     ` Anton Protopopov
2025-07-07 23:45       ` Eduard Zingerman
2025-07-07 23:49         ` Alexei Starovoitov
2025-07-08  0:01           ` Eduard Zingerman
2025-07-08  0:12             ` Alexei Starovoitov
2025-07-08  0:18               ` Eduard Zingerman
2025-07-08  0:49                 ` Alexei Starovoitov
2025-07-08  0:51                   ` Eduard Zingerman
2025-07-08 20:59     ` Eduard Zingerman
2025-07-08 21:25       ` Alexei Starovoitov
2025-07-08 21:29         ` Eduard Zingerman
2025-07-09  5:33       ` Anton Protopopov
2025-07-09  5:58         ` Eduard Zingerman
2025-07-09  8:38           ` Eduard Zingerman
2025-07-10  5:11             ` Eduard Zingerman
2025-07-10  6:10               ` Anton Protopopov
2025-07-10  6:13                 ` Eduard Zingerman
2025-06-18 19:49   ` Eduard Zingerman
2025-06-27  2:28     ` Eduard Zingerman
2025-06-27 10:18       ` Anton Protopopov
2025-07-03 18:21         ` Eduard Zingerman
2025-07-03 19:03           ` Anton Protopopov
2025-07-07 19:07           ` Eduard Zingerman
2025-07-07 19:34             ` Anton Protopopov
2025-07-07 21:44             ` Yonghong Song
2025-07-08  5:58               ` Yonghong Song [this message]
2025-07-08  8:30             ` Eduard Zingerman
2025-07-08 10:42               ` Eduard Zingerman
2025-06-15  8:59 ` [RFC bpf-next 9/9] selftests/bpf: add selftests for " Anton Protopopov
2025-06-18  3:24   ` Alexei Starovoitov
2025-06-18 14:49     ` Anton Protopopov
2025-06-18 16:01       ` Alexei Starovoitov
2025-06-18 16:36         ` Anton Protopopov
2025-06-18 16:43           ` Alexei Starovoitov
2025-06-18 20:25             ` Anton Protopopov
2025-06-18 21:59               ` Alexei Starovoitov
2025-06-19  5:05                 ` Anton Protopopov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=eb55a14f-0e3e-4bec-9116-abf6aa9111b2@linux.dev \
    --to=yonghong.song@linux.dev \
    --cc=a.s.protopopov@gmail.com \
    --cc=andrii@kernel.org \
    --cc=aspsk@isovalent.com \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=qmo@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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 NNTP newsgroup(s).