This commit adds support for per-prog btf_custom_path. This is necessary
for testing CO-RE relocations on non-vmlinux types using test_loader
infrastructure.

Signed-off-by: Daniel Xu <d...@dxuuu.xyz>
---
 tools/testing/selftests/bpf/progs/bpf_misc.h | 1 +
 tools/testing/selftests/bpf/test_loader.c    | 7 +++++++
 2 files changed, 8 insertions(+)

diff --git a/tools/testing/selftests/bpf/progs/bpf_misc.h 
b/tools/testing/selftests/bpf/progs/bpf_misc.h
index 799fff4995d8..2fd59970c43a 100644
--- a/tools/testing/selftests/bpf/progs/bpf_misc.h
+++ b/tools/testing/selftests/bpf/progs/bpf_misc.h
@@ -71,6 +71,7 @@
 #define __retval_unpriv(val)   
__attribute__((btf_decl_tag("comment:test_retval_unpriv="#val)))
 #define __auxiliary            
__attribute__((btf_decl_tag("comment:test_auxiliary")))
 #define __auxiliary_unpriv     
__attribute__((btf_decl_tag("comment:test_auxiliary_unpriv")))
+#define __btf_path(path)       
__attribute__((btf_decl_tag("comment:test_btf_path=" path)))
 
 /* Convenience macro for use with 'asm volatile' blocks */
 #define __naked __attribute__((naked))
diff --git a/tools/testing/selftests/bpf/test_loader.c 
b/tools/testing/selftests/bpf/test_loader.c
index a350ecdfba4a..74ceb7877ae2 100644
--- a/tools/testing/selftests/bpf/test_loader.c
+++ b/tools/testing/selftests/bpf/test_loader.c
@@ -27,6 +27,7 @@
 #define TEST_TAG_RETVAL_PFX_UNPRIV "comment:test_retval_unpriv="
 #define TEST_TAG_AUXILIARY "comment:test_auxiliary"
 #define TEST_TAG_AUXILIARY_UNPRIV "comment:test_auxiliary_unpriv"
+#define TEST_BTF_PATH "comment:test_btf_path="
 
 /* Warning: duplicated in bpf_misc.h */
 #define POINTER_VALUE  0xcafe4all
@@ -58,6 +59,7 @@ struct test_spec {
        const char *prog_name;
        struct test_subspec priv;
        struct test_subspec unpriv;
+       const char *btf_custom_path;
        int log_level;
        int prog_flags;
        int mode_mask;
@@ -288,6 +290,8 @@ static int parse_test_spec(struct test_loader *tester,
                                        goto cleanup;
                                update_flags(&spec->prog_flags, flags, clear);
                        }
+               } else if (str_has_pfx(s, TEST_BTF_PATH)) {
+                       spec->btf_custom_path = s + sizeof(TEST_BTF_PATH) - 1;
                }
        }
 
@@ -578,6 +582,9 @@ void run_subtest(struct test_loader *tester,
                }
        }
 
+       /* Implicitly reset to NULL if next test case doesn't specify */
+       open_opts->btf_custom_path = spec->btf_custom_path;
+
        tobj = bpf_object__open_mem(obj_bytes, obj_byte_cnt, open_opts);
        if (!ASSERT_OK_PTR(tobj, "obj_open_mem")) /* shouldn't happen */
                goto subtest_cleanup;
-- 
2.42.1


Reply via email to