Message ID | 20250318143318.656785-6-aspsk@isovalent.com (mailing list archive) |
---|---|
State | RFC |
Delegated to: | BPF |
Headers | show |
Series | instruction sets and static keys | expand |
Context | Check | Description |
---|---|---|
bpf/vmtest-bpf-next-VM_Test-0 | success | Logs for Lint |
bpf/vmtest-bpf-next-VM_Test-1 | success | Logs for ShellCheck |
bpf/vmtest-bpf-next-VM_Test-2 | success | Logs for Unittests |
bpf/vmtest-bpf-next-VM_Test-3 | success | Logs for Validate matrix.py |
bpf/vmtest-bpf-next-PR | fail | PR summary |
bpf/vmtest-bpf-next-VM_Test-6 | success | Logs for aarch64-gcc / build-release |
bpf/vmtest-bpf-next-VM_Test-7 | success | Logs for aarch64-gcc / veristat-kernel |
bpf/vmtest-bpf-next-VM_Test-8 | success | Logs for aarch64-gcc / veristat-meta |
bpf/vmtest-bpf-next-VM_Test-9 | success | Logs for s390x-gcc / GCC BPF |
bpf/vmtest-bpf-next-VM_Test-10 | fail | Logs for s390x-gcc / build / build for s390x with gcc |
bpf/vmtest-bpf-next-VM_Test-11 | success | Logs for s390x-gcc / build-release |
bpf/vmtest-bpf-next-VM_Test-12 | success | Logs for s390x-gcc / veristat-kernel |
bpf/vmtest-bpf-next-VM_Test-5 | fail | Logs for aarch64-gcc / build / build for aarch64 with gcc |
bpf/vmtest-bpf-next-VM_Test-13 | success | Logs for s390x-gcc / veristat-meta |
bpf/vmtest-bpf-next-VM_Test-4 | success | Logs for aarch64-gcc / GCC BPF |
bpf/vmtest-bpf-next-VM_Test-14 | success | Logs for set-matrix |
bpf/vmtest-bpf-next-VM_Test-15 | success | Logs for test |
bpf/vmtest-bpf-next-VM_Test-16 | success | Logs for test |
bpf/vmtest-bpf-next-VM_Test-17 | success | Logs for test |
bpf/vmtest-bpf-next-VM_Test-18 | success | Logs for test |
bpf/vmtest-bpf-next-VM_Test-19 | success | Logs for test |
bpf/vmtest-bpf-next-VM_Test-20 | success | Logs for x86_64-gcc / GCC BPF |
bpf/vmtest-bpf-next-VM_Test-21 | fail | Logs for x86_64-gcc / build / build for x86_64 with gcc |
bpf/vmtest-bpf-next-VM_Test-22 | success | Logs for x86_64-gcc / build-release |
bpf/vmtest-bpf-next-VM_Test-23 | success | Logs for x86_64-gcc / veristat-kernel |
bpf/vmtest-bpf-next-VM_Test-24 | success | Logs for x86_64-gcc / veristat-meta |
bpf/vmtest-bpf-next-VM_Test-25 | success | Logs for x86_64-llvm-17 / GCC BPF |
bpf/vmtest-bpf-next-VM_Test-26 | fail | Logs for x86_64-llvm-17 / build / build for x86_64 with llvm-17 |
bpf/vmtest-bpf-next-VM_Test-27 | fail | Logs for x86_64-llvm-17 / build-release / build for x86_64 with llvm-17-O2 |
bpf/vmtest-bpf-next-VM_Test-28 | success | Logs for x86_64-llvm-17 / veristat-kernel |
bpf/vmtest-bpf-next-VM_Test-29 | success | Logs for x86_64-llvm-17 / veristat-meta |
bpf/vmtest-bpf-next-VM_Test-30 | success | Logs for x86_64-llvm-18 / GCC BPF |
bpf/vmtest-bpf-next-VM_Test-31 | fail | Logs for x86_64-llvm-18 / build / build for x86_64 with llvm-18 |
bpf/vmtest-bpf-next-VM_Test-32 | fail | Logs for x86_64-llvm-18 / build-release / build for x86_64 with llvm-18-O2 |
bpf/vmtest-bpf-next-VM_Test-33 | success | Logs for x86_64-llvm-18 / veristat-kernel |
bpf/vmtest-bpf-next-VM_Test-34 | success | Logs for x86_64-llvm-18 / veristat-meta |
diff --git a/kernel/bpf/disasm.c b/kernel/bpf/disasm.c index 20883c6b1546..fd6e0e85412a 100644 --- a/kernel/bpf/disasm.c +++ b/kernel/bpf/disasm.c @@ -183,6 +183,30 @@ static inline bool is_mov_percpu_addr(const struct bpf_insn *insn) return insn->code == (BPF_ALU64 | BPF_MOV | BPF_X) && insn->off == BPF_ADDR_PERCPU; } +static void print_bpf_ja_insn(bpf_insn_print_t verbose, + void *private_data, + const struct bpf_insn *insn) +{ + bool jmp32 = insn->code == (BPF_JMP32 | BPF_JA); + int off = jmp32 ? insn->imm : insn->off; + const char *suffix = jmp32 ? "l" : ""; + char op[16]; + + switch (insn->src_reg & BPF_STATIC_BRANCH_MASK) { + case BPF_STATIC_BRANCH_JA: + snprintf(op, sizeof(op), "goto%s_or_nop", suffix); + break; + case BPF_STATIC_BRANCH_JA | BPF_STATIC_BRANCH_NOP: + snprintf(op, sizeof(op), "nop_or_goto%s", suffix); + break; + default: + snprintf(op, sizeof(op), "goto%s", suffix); + break; + } + + verbose(private_data, "(%02x) %s pc%+d\n", insn->code, op, off); +} + void print_bpf_insn(const struct bpf_insn_cbs *cbs, const struct bpf_insn *insn, bool allow_ptr_leaks) @@ -355,16 +379,13 @@ void print_bpf_insn(const struct bpf_insn_cbs *cbs, tmp, sizeof(tmp)), insn->imm); } - } else if (insn->code == (BPF_JMP | BPF_JA)) { - verbose(cbs->private_data, "(%02x) goto pc%+d\n", - insn->code, insn->off); + } else if (insn->code == (BPF_JMP | BPF_JA) || + insn->code == (BPF_JMP32 | BPF_JA)) { + print_bpf_ja_insn(verbose, cbs->private_data, insn); } else if (insn->code == (BPF_JMP | BPF_JCOND) && insn->src_reg == BPF_MAY_GOTO) { verbose(cbs->private_data, "(%02x) may_goto pc%+d\n", insn->code, insn->off); - } else if (insn->code == (BPF_JMP32 | BPF_JA)) { - verbose(cbs->private_data, "(%02x) gotol pc%+d\n", - insn->code, insn->imm); } else if (insn->code == (BPF_JMP | BPF_EXIT)) { verbose(cbs->private_data, "(%02x) exit\n", insn->code); } else if (BPF_SRC(insn->code) == BPF_X) {
Add asm support for new JA* instructions so kernel verifier and bpftool xlated insn dumps can have proper asm syntax. Signed-off-by: Anton Protopopov <aspsk@isovalent.com> --- kernel/bpf/disasm.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-)