Commit Graph

1 Commits

Author SHA1 Message Date
Artem Savkov bcb8067697 selftests/bpf: Disassembler tests for verifier.c:convert_ctx_access()
Bugzilla: https://bugzilla.redhat.com/2221599

commit 71cf4d027ad53a1e2847191ac14e50132d35a6a7
Author: Eduard Zingerman <eddyz87@gmail.com>
Date:   Sat Mar 4 03:12:47 2023 +0200

    selftests/bpf: Disassembler tests for verifier.c:convert_ctx_access()
    
    Function verifier.c:convert_ctx_access() applies some rewrites to BPF
    instructions that read or write BPF program context. This commit adds
    machinery to allow test cases that inspect BPF program after these
    rewrites are applied.
    
    An example of a test case:
    
      {
            // Shorthand for field offset and size specification
    	N(CGROUP_SOCKOPT, struct bpf_sockopt, retval),
    
            // Pattern generated for field read
    	.read  = "$dst = *(u64 *)($ctx + bpf_sockopt_kern::current_task);"
    		 "$dst = *(u64 *)($dst + task_struct::bpf_ctx);"
    		 "$dst = *(u32 *)($dst + bpf_cg_run_ctx::retval);",
    
            // Pattern generated for field write
    	.write = "*(u64 *)($ctx + bpf_sockopt_kern::tmp_reg) = r9;"
    		 "r9 = *(u64 *)($ctx + bpf_sockopt_kern::current_task);"
    		 "r9 = *(u64 *)(r9 + task_struct::bpf_ctx);"
    		 "*(u32 *)(r9 + bpf_cg_run_ctx::retval) = $src;"
    		 "r9 = *(u64 *)($ctx + bpf_sockopt_kern::tmp_reg);" ,
      },
    
    For each test case, up to three programs are created:
    - One that uses BPF_LDX_MEM to read the context field.
    - One that uses BPF_STX_MEM to write to the context field.
    - One that uses BPF_ST_MEM to write to the context field.
    
    The disassembly of each program is compared with the pattern specified
    in the test case.
    
    Kernel code for disassembly is reused (as is in the bpftool).
    To keep Makefile changes to the minimum, symbolic links to
    `kernel/bpf/disasm.c` and `kernel/bpf/disasm.h ` are added.
    
    Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
    Link: https://lore.kernel.org/r/20230304011247.566040-4-eddyz87@gmail.com
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2023-09-22 09:12:11 +02:00