~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/bpf/disasm_helpers.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
  2 
  3 #include <bpf/bpf.h>
  4 #include "disasm.h"
  5 
  6 struct print_insn_context {
  7         char scratch[16];
  8         char *buf;
  9         size_t sz;
 10 };
 11 
 12 static void print_insn_cb(void *private_data, const char *fmt, ...)
 13 {
 14         struct print_insn_context *ctx = private_data;
 15         va_list args;
 16 
 17         va_start(args, fmt);
 18         vsnprintf(ctx->buf, ctx->sz, fmt, args);
 19         va_end(args);
 20 }
 21 
 22 static const char *print_call_cb(void *private_data, const struct bpf_insn *insn)
 23 {
 24         struct print_insn_context *ctx = private_data;
 25 
 26         /* For pseudo calls verifier.c:jit_subprogs() hides original
 27          * imm to insn->off and changes insn->imm to be an index of
 28          * the subprog instead.
 29          */
 30         if (insn->src_reg == BPF_PSEUDO_CALL) {
 31                 snprintf(ctx->scratch, sizeof(ctx->scratch), "%+d", insn->off);
 32                 return ctx->scratch;
 33         }
 34 
 35         return NULL;
 36 }
 37 
 38 struct bpf_insn *disasm_insn(struct bpf_insn *insn, char *buf, size_t buf_sz)
 39 {
 40         struct print_insn_context ctx = {
 41                 .buf = buf,
 42                 .sz = buf_sz,
 43         };
 44         struct bpf_insn_cbs cbs = {
 45                 .cb_print       = print_insn_cb,
 46                 .cb_call        = print_call_cb,
 47                 .private_data   = &ctx,
 48         };
 49         char *tmp, *pfx_end, *sfx_start;
 50         bool double_insn;
 51         int len;
 52 
 53         print_bpf_insn(&cbs, insn, true);
 54         /* We share code with kernel BPF disassembler, it adds '(FF) ' prefix
 55          * for each instruction (FF stands for instruction `code` byte).
 56          * Remove the prefix inplace, and also simplify call instructions.
 57          * E.g.: "(85) call foo#10" -> "call foo".
 58          * Also remove newline in the end (the 'max(strlen(buf) - 1, 0)' thing).
 59          */
 60         pfx_end = buf + 5;
 61         sfx_start = buf + max((int)strlen(buf) - 1, 0);
 62         if (strncmp(pfx_end, "call ", 5) == 0 && (tmp = strrchr(buf, '#')))
 63                 sfx_start = tmp;
 64         len = sfx_start - pfx_end;
 65         memmove(buf, pfx_end, len);
 66         buf[len] = 0;
 67         double_insn = insn->code == (BPF_LD | BPF_IMM | BPF_DW);
 68         return insn + (double_insn ? 2 : 1);
 69 }
 70 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php