On Sun, Jul 24, 2022 at 2:22 PM Jiri Olsa <jolsa@xxxxxxxxxx> wrote: > > Attach like 'kprobe/bpf_fentry_test6+0x5' will fail to attach > when CONFIG_X86_KERNEL_IBT option is enabled because of the > endbr instruction at the function entry. > > We would need to do manual attach with offset calculation based > on the CONFIG_X86_KERNEL_IBT option, which does not seem worth > the effort to me. > > Disabling these test when CONFIG_X86_KERNEL_IBT is enabled. > > Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> > --- > .../bpf/prog_tests/get_func_ip_test.c | 25 +++++++++++++++---- > 1 file changed, 20 insertions(+), 5 deletions(-) > > diff --git a/tools/testing/selftests/bpf/prog_tests/get_func_ip_test.c b/tools/testing/selftests/bpf/prog_tests/get_func_ip_test.c > index 938dbd4d7c2f..cb0b78fb29df 100644 > --- a/tools/testing/selftests/bpf/prog_tests/get_func_ip_test.c > +++ b/tools/testing/selftests/bpf/prog_tests/get_func_ip_test.c > @@ -2,6 +2,24 @@ > #include <test_progs.h> > #include "get_func_ip_test.skel.h" > > +/* assume IBT is enabled when kernel configs are not available */ > +#ifdef HAVE_GENHDR > +# include "autoconf.h" > +#else > +# define CONFIG_X86_KERNEL_IBT 1 > +#endif this autoconf.h business is something I'd rather avoid, it would be great to be able to use libbpf's __kconfig support to detect CONFIG_X86_KERNEL_IBT instead? One way would be to mark test6/test7 as non-auto-loadable (SEC("?...")). Load only test1-tes5, run tests, in one of BPF programs propagate __kconfig CONFIG_X86_KERNEL_IBT to user-space through a global variable. Attach skeleton, trigger everything, remember whether IBT is enabled or not. If it is defined, load skeleton again, but now enable test6 and test7 and manually attach them through bpf_program__attach_kprobe() specifying offset as +5 or +9, depending on IBT. It's certainly a bit more code, but we'll actually test IBT stuff properly. WDYT? > + > +/* test6 and test7 are x86_64 specific because of the instruction > + * offset, disabling it for all other archs > + * > + * CONFIG_X86_KERNEL_IBT adds endbr instruction at function entry, > + * so disabling test6 and test7, because the offset is hardcoded > + * in program section > + */ > +#if !defined(__x86_64__) || defined(CONFIG_X86_KERNEL_IBT) > +#define DISABLE_OFFSET_ATTACH 1 > +#endif > + > void test_get_func_ip_test(void) > { > struct get_func_ip_test *skel = NULL; > @@ -12,10 +30,7 @@ void test_get_func_ip_test(void) > if (!ASSERT_OK_PTR(skel, "get_func_ip_test__open")) > return; > > - /* test6 is x86_64 specifc because of the instruction > - * offset, disabling it for all other archs > - */ > -#ifndef __x86_64__ > +#if defined(DISABLE_OFFSET_ATTACH) > bpf_program__set_autoload(skel->progs.test6, false); > bpf_program__set_autoload(skel->progs.test7, false); > #endif > @@ -43,7 +58,7 @@ void test_get_func_ip_test(void) > ASSERT_EQ(skel->bss->test3_result, 1, "test3_result"); > ASSERT_EQ(skel->bss->test4_result, 1, "test4_result"); > ASSERT_EQ(skel->bss->test5_result, 1, "test5_result"); > -#ifdef __x86_64__ > +#if !defined(DISABLE_OFFSET_ATTACH) > ASSERT_EQ(skel->bss->test6_result, 1, "test6_result"); > ASSERT_EQ(skel->bss->test7_result, 1, "test7_result"); > #endif > -- > 2.35.3 >