selftests/bpf: add BPF_CORE_READ relocatable read macro
Add BPF_CORE_READ macro used in tests to do bpf_core_read(), which automatically captures offset relocation. Signed-off-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
ddc7c30426
commit
2dc26d5a4f
|
@ -504,4 +504,24 @@ struct pt_regs;
|
||||||
(void *)(PT_REGS_FP(ctx) + sizeof(ip))); })
|
(void *)(PT_REGS_FP(ctx) + sizeof(ip))); })
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BPF_CORE_READ abstracts away bpf_probe_read() call and captures offset
|
||||||
|
* relocation for source address using __builtin_preserve_access_index()
|
||||||
|
* built-in, provided by Clang.
|
||||||
|
*
|
||||||
|
* __builtin_preserve_access_index() takes as an argument an expression of
|
||||||
|
* taking an address of a field within struct/union. It makes compiler emit
|
||||||
|
* a relocation, which records BTF type ID describing root struct/union and an
|
||||||
|
* accessor string which describes exact embedded field that was used to take
|
||||||
|
* an address. See detailed description of this relocation format and
|
||||||
|
* semantics in comments to struct bpf_offset_reloc in libbpf_internal.h.
|
||||||
|
*
|
||||||
|
* This relocation allows libbpf to adjust BPF instruction to use correct
|
||||||
|
* actual field offset, based on target kernel BTF type that matches original
|
||||||
|
* (local) BTF, used to record relocation.
|
||||||
|
*/
|
||||||
|
#define BPF_CORE_READ(dst, src) \
|
||||||
|
bpf_probe_read((dst), sizeof(*(src)), \
|
||||||
|
__builtin_preserve_access_index(src))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue