mbox series

[bpf-next,v4,0/2] tools/resolve_btfids: fix cross-compilation to non-host endianness

Message ID cover.1707223196.git.vmalik@redhat.com (mailing list archive)
Headers show
Series tools/resolve_btfids: fix cross-compilation to non-host endianness | expand

Message

Viktor Malik Feb. 6, 2024, 12:46 p.m. UTC
The .BTF_ids section is pre-filled with zeroed BTF ID entries during the
build and afterwards patched by resolve_btfids with correct values.
Since resolve_btfids always writes in host-native endianness, it relies
on libelf to do the translation when the target ELF is cross-compiled to
a different endianness (this was introduced in commit 61e8aeda9398
("bpf: Fix libelf endian handling in resolv_btfids")).

Unfortunately, the translation will corrupt the flags fields of SET8
entries because these were written during vmlinux compilation and are in
the correct endianness already. This will lead to numerous selftests
failures such as:

    $ sudo ./test_verifier 502 502
    #502/p sleepable fentry accept FAIL
    Failed to load prog 'Invalid argument'!
    bpf_fentry_test1 is not sleepable
    verification time 34 usec
    stack depth 0
    processed 0 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
    Summary: 0 PASSED, 0 SKIPPED, 1 FAILED

Since it's not possible to instruct libelf to translate just certain
values, let's manually bswap the flags (both global and entry flags) in
resolve_btfids when needed, so that libelf then translates everything
correctly.

The first patch of the series refactors resolve_btfids by using types
from btf_ids.h instead of accessing the BTF ID data using magic offsets.

---
Changes in v4:
- remove unnecessary vars and pointer casts (suggested by Daniel Xu)

Changes in v3:
- add byte swap of global 'flags' field in btf_id_set8 (suggested by
  Jiri Olsa)
- cleaner refactoring of sets_patch (suggested by Jiri Olsa)
- add compile-time assertion that IDs are at the beginning of pairs
  struct in btf_id_set8 (suggested by Daniel Borkmann)

Changes in v2:
- use type defs from btf_ids.h (suggested by Andrii Nakryiko)

Viktor Malik (2):
  tools/resolve_btfids: Refactor set sorting with types from btf_ids.h
  tools/resolve_btfids: fix cross-compilation to non-host endianness

 tools/bpf/resolve_btfids/main.c | 70 ++++++++++++++++++++++++++-------
 tools/include/linux/btf_ids.h   |  9 +++++
 2 files changed, 65 insertions(+), 14 deletions(-)

Comments

Jiri Olsa Feb. 6, 2024, 2:57 p.m. UTC | #1
On Tue, Feb 06, 2024 at 01:46:08PM +0100, Viktor Malik wrote:
> The .BTF_ids section is pre-filled with zeroed BTF ID entries during the
> build and afterwards patched by resolve_btfids with correct values.
> Since resolve_btfids always writes in host-native endianness, it relies
> on libelf to do the translation when the target ELF is cross-compiled to
> a different endianness (this was introduced in commit 61e8aeda9398
> ("bpf: Fix libelf endian handling in resolv_btfids")).
> 
> Unfortunately, the translation will corrupt the flags fields of SET8
> entries because these were written during vmlinux compilation and are in
> the correct endianness already. This will lead to numerous selftests
> failures such as:
> 
>     $ sudo ./test_verifier 502 502
>     #502/p sleepable fentry accept FAIL
>     Failed to load prog 'Invalid argument'!
>     bpf_fentry_test1 is not sleepable
>     verification time 34 usec
>     stack depth 0
>     processed 0 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
>     Summary: 0 PASSED, 0 SKIPPED, 1 FAILED
> 
> Since it's not possible to instruct libelf to translate just certain
> values, let's manually bswap the flags (both global and entry flags) in
> resolve_btfids when needed, so that libelf then translates everything
> correctly.
> 
> The first patch of the series refactors resolve_btfids by using types
> from btf_ids.h instead of accessing the BTF ID data using magic offsets.
> 
> ---
> Changes in v4:
> - remove unnecessary vars and pointer casts (suggested by Daniel Xu)

Acked-by: Jiri Olsa <jolsa@kernel.org>

jirka

> 
> Changes in v3:
> - add byte swap of global 'flags' field in btf_id_set8 (suggested by
>   Jiri Olsa)
> - cleaner refactoring of sets_patch (suggested by Jiri Olsa)
> - add compile-time assertion that IDs are at the beginning of pairs
>   struct in btf_id_set8 (suggested by Daniel Borkmann)
> 
> Changes in v2:
> - use type defs from btf_ids.h (suggested by Andrii Nakryiko)
> 
> Viktor Malik (2):
>   tools/resolve_btfids: Refactor set sorting with types from btf_ids.h
>   tools/resolve_btfids: fix cross-compilation to non-host endianness
> 
>  tools/bpf/resolve_btfids/main.c | 70 ++++++++++++++++++++++++++-------
>  tools/include/linux/btf_ids.h   |  9 +++++
>  2 files changed, 65 insertions(+), 14 deletions(-)
> 
> -- 
> 2.43.0
>
patchwork-bot+netdevbpf@kernel.org Feb. 8, 2024, 12:20 a.m. UTC | #2
Hello:

This series was applied to bpf/bpf-next.git (master)
by Andrii Nakryiko <andrii@kernel.org>:

On Tue,  6 Feb 2024 13:46:08 +0100 you wrote:
> The .BTF_ids section is pre-filled with zeroed BTF ID entries during the
> build and afterwards patched by resolve_btfids with correct values.
> Since resolve_btfids always writes in host-native endianness, it relies
> on libelf to do the translation when the target ELF is cross-compiled to
> a different endianness (this was introduced in commit 61e8aeda9398
> ("bpf: Fix libelf endian handling in resolv_btfids")).
> 
> [...]

Here is the summary with links:
  - [bpf-next,v4,1/2] tools/resolve_btfids: Refactor set sorting with types from btf_ids.h
    https://git.kernel.org/bpf/bpf-next/c/9707ac4fe2f5
  - [bpf-next,v4,2/2] tools/resolve_btfids: fix cross-compilation to non-host endianness
    https://git.kernel.org/bpf/bpf-next/c/903fad439466

You are awesome, thank you!