2020-08-05 00:01:55 +08:00
|
|
|
|
/* Target-dependent code for BPF.
|
|
|
|
|
|
2024-01-12 23:30:44 +08:00
|
|
|
|
Copyright (C) 2020-2024 Free Software Foundation, Inc.
|
2020-08-05 00:01:55 +08:00
|
|
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
|
|
#include "arch-utils.h"
|
|
|
|
|
#include "dis-asm.h"
|
|
|
|
|
#include "frame.h"
|
|
|
|
|
#include "frame-unwind.h"
|
|
|
|
|
#include "trad-frame.h"
|
|
|
|
|
#include "symtab.h"
|
|
|
|
|
#include "value.h"
|
2024-04-24 03:22:44 +08:00
|
|
|
|
#include "cli/cli-cmds.h"
|
2020-08-05 00:01:55 +08:00
|
|
|
|
#include "breakpoint.h"
|
|
|
|
|
#include "inferior.h"
|
|
|
|
|
#include "regcache.h"
|
|
|
|
|
#include "target.h"
|
|
|
|
|
#include "dwarf2/frame.h"
|
|
|
|
|
#include "osabi.h"
|
|
|
|
|
#include "target-descriptions.h"
|
|
|
|
|
#include "remote.h"
|
2021-11-18 01:13:47 +08:00
|
|
|
|
#include "gdbarch.h"
|
2020-08-05 00:01:55 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* eBPF registers. */
|
|
|
|
|
|
|
|
|
|
enum bpf_regnum
|
|
|
|
|
{
|
|
|
|
|
BPF_R0_REGNUM, /* return value */
|
|
|
|
|
BPF_R1_REGNUM,
|
|
|
|
|
BPF_R2_REGNUM,
|
|
|
|
|
BPF_R3_REGNUM,
|
|
|
|
|
BPF_R4_REGNUM,
|
|
|
|
|
BPF_R5_REGNUM,
|
|
|
|
|
BPF_R6_REGNUM,
|
|
|
|
|
BPF_R7_REGNUM,
|
|
|
|
|
BPF_R8_REGNUM,
|
|
|
|
|
BPF_R9_REGNUM,
|
|
|
|
|
BPF_R10_REGNUM, /* sp */
|
|
|
|
|
BPF_PC_REGNUM,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#define BPF_NUM_REGS (BPF_PC_REGNUM + 1)
|
|
|
|
|
|
|
|
|
|
/* Target-dependent structure in gdbarch. */
|
2022-07-25 19:07:11 +08:00
|
|
|
|
struct bpf_gdbarch_tdep : gdbarch_tdep_base
|
2020-08-05 00:01:55 +08:00
|
|
|
|
{
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Internal debugging facilities. */
|
|
|
|
|
|
|
|
|
|
/* When this is set to non-zero debugging information will be
|
|
|
|
|
printed. */
|
|
|
|
|
|
|
|
|
|
static unsigned int bpf_debug_flag = 0;
|
|
|
|
|
|
|
|
|
|
/* The show callback for 'show debug bpf'. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
show_bpf_debug (struct ui_file *file, int from_tty,
|
gdb, gdbserver, gdbsupport: fix leading space vs tabs issues
Many spots incorrectly use only spaces for indentation (for example,
there are a lot of spots in ada-lang.c). I've always found it awkward
when I needed to edit one of these spots: do I keep the original wrong
indentation, or do I fix it? What if the lines around it are also
wrong, do I fix them too? I probably don't want to fix them in the same
patch, to avoid adding noise to my patch.
So I propose to fix as much as possible once and for all (hopefully).
One typical counter argument for this is that it makes code archeology
more difficult, because git-blame will show this commit as the last
change for these lines. My counter counter argument is: when
git-blaming, you often need to do "blame the file at the parent commit"
anyway, to go past some other refactor that touched the line you are
interested in, but is not the change you are looking for. So you
already need a somewhat efficient way to do this.
Using some interactive tool, rather than plain git-blame, makes this
trivial. For example, I use "tig blame <file>", where going back past
the commit that changed the currently selected line is one keystroke.
It looks like Magit in Emacs does it too (though I've never used it).
Web viewers of Github and Gitlab do it too. My point is that it won't
really make archeology more difficult.
The other typical counter argument is that it will cause conflicts with
existing patches. That's true... but it's a one time cost, and those
are not conflicts that are difficult to resolve. I have also tried "git
rebase --ignore-whitespace", it seems to work well. Although that will
re-introduce the faulty indentation, so one needs to take care of fixing
the indentation in the patch after that (which is easy).
gdb/ChangeLog:
* aarch64-linux-tdep.c: Fix indentation.
* aarch64-ravenscar-thread.c: Fix indentation.
* aarch64-tdep.c: Fix indentation.
* aarch64-tdep.h: Fix indentation.
* ada-lang.c: Fix indentation.
* ada-lang.h: Fix indentation.
* ada-tasks.c: Fix indentation.
* ada-typeprint.c: Fix indentation.
* ada-valprint.c: Fix indentation.
* ada-varobj.c: Fix indentation.
* addrmap.c: Fix indentation.
* addrmap.h: Fix indentation.
* agent.c: Fix indentation.
* aix-thread.c: Fix indentation.
* alpha-bsd-nat.c: Fix indentation.
* alpha-linux-tdep.c: Fix indentation.
* alpha-mdebug-tdep.c: Fix indentation.
* alpha-nbsd-tdep.c: Fix indentation.
* alpha-obsd-tdep.c: Fix indentation.
* alpha-tdep.c: Fix indentation.
* amd64-bsd-nat.c: Fix indentation.
* amd64-darwin-tdep.c: Fix indentation.
* amd64-linux-nat.c: Fix indentation.
* amd64-linux-tdep.c: Fix indentation.
* amd64-nat.c: Fix indentation.
* amd64-obsd-tdep.c: Fix indentation.
* amd64-tdep.c: Fix indentation.
* amd64-windows-tdep.c: Fix indentation.
* annotate.c: Fix indentation.
* arc-tdep.c: Fix indentation.
* arch-utils.c: Fix indentation.
* arch/arm-get-next-pcs.c: Fix indentation.
* arch/arm.c: Fix indentation.
* arm-linux-nat.c: Fix indentation.
* arm-linux-tdep.c: Fix indentation.
* arm-nbsd-tdep.c: Fix indentation.
* arm-pikeos-tdep.c: Fix indentation.
* arm-tdep.c: Fix indentation.
* arm-tdep.h: Fix indentation.
* arm-wince-tdep.c: Fix indentation.
* auto-load.c: Fix indentation.
* auxv.c: Fix indentation.
* avr-tdep.c: Fix indentation.
* ax-gdb.c: Fix indentation.
* ax-general.c: Fix indentation.
* bfin-linux-tdep.c: Fix indentation.
* block.c: Fix indentation.
* block.h: Fix indentation.
* blockframe.c: Fix indentation.
* bpf-tdep.c: Fix indentation.
* break-catch-sig.c: Fix indentation.
* break-catch-syscall.c: Fix indentation.
* break-catch-throw.c: Fix indentation.
* breakpoint.c: Fix indentation.
* breakpoint.h: Fix indentation.
* bsd-uthread.c: Fix indentation.
* btrace.c: Fix indentation.
* build-id.c: Fix indentation.
* buildsym-legacy.h: Fix indentation.
* buildsym.c: Fix indentation.
* c-typeprint.c: Fix indentation.
* c-valprint.c: Fix indentation.
* c-varobj.c: Fix indentation.
* charset.c: Fix indentation.
* cli/cli-cmds.c: Fix indentation.
* cli/cli-decode.c: Fix indentation.
* cli/cli-decode.h: Fix indentation.
* cli/cli-script.c: Fix indentation.
* cli/cli-setshow.c: Fix indentation.
* coff-pe-read.c: Fix indentation.
* coffread.c: Fix indentation.
* compile/compile-cplus-types.c: Fix indentation.
* compile/compile-object-load.c: Fix indentation.
* compile/compile-object-run.c: Fix indentation.
* completer.c: Fix indentation.
* corefile.c: Fix indentation.
* corelow.c: Fix indentation.
* cp-abi.h: Fix indentation.
* cp-namespace.c: Fix indentation.
* cp-support.c: Fix indentation.
* cp-valprint.c: Fix indentation.
* cris-linux-tdep.c: Fix indentation.
* cris-tdep.c: Fix indentation.
* darwin-nat-info.c: Fix indentation.
* darwin-nat.c: Fix indentation.
* darwin-nat.h: Fix indentation.
* dbxread.c: Fix indentation.
* dcache.c: Fix indentation.
* disasm.c: Fix indentation.
* dtrace-probe.c: Fix indentation.
* dwarf2/abbrev.c: Fix indentation.
* dwarf2/attribute.c: Fix indentation.
* dwarf2/expr.c: Fix indentation.
* dwarf2/frame.c: Fix indentation.
* dwarf2/index-cache.c: Fix indentation.
* dwarf2/index-write.c: Fix indentation.
* dwarf2/line-header.c: Fix indentation.
* dwarf2/loc.c: Fix indentation.
* dwarf2/macro.c: Fix indentation.
* dwarf2/read.c: Fix indentation.
* dwarf2/read.h: Fix indentation.
* elfread.c: Fix indentation.
* eval.c: Fix indentation.
* event-top.c: Fix indentation.
* exec.c: Fix indentation.
* exec.h: Fix indentation.
* expprint.c: Fix indentation.
* f-lang.c: Fix indentation.
* f-typeprint.c: Fix indentation.
* f-valprint.c: Fix indentation.
* fbsd-nat.c: Fix indentation.
* fbsd-tdep.c: Fix indentation.
* findvar.c: Fix indentation.
* fork-child.c: Fix indentation.
* frame-unwind.c: Fix indentation.
* frame-unwind.h: Fix indentation.
* frame.c: Fix indentation.
* frv-linux-tdep.c: Fix indentation.
* frv-tdep.c: Fix indentation.
* frv-tdep.h: Fix indentation.
* ft32-tdep.c: Fix indentation.
* gcore.c: Fix indentation.
* gdb_bfd.c: Fix indentation.
* gdbarch.sh: Fix indentation.
* gdbarch.c: Re-generate
* gdbarch.h: Re-generate.
* gdbcore.h: Fix indentation.
* gdbthread.h: Fix indentation.
* gdbtypes.c: Fix indentation.
* gdbtypes.h: Fix indentation.
* glibc-tdep.c: Fix indentation.
* gnu-nat.c: Fix indentation.
* gnu-nat.h: Fix indentation.
* gnu-v2-abi.c: Fix indentation.
* gnu-v3-abi.c: Fix indentation.
* go32-nat.c: Fix indentation.
* guile/guile-internal.h: Fix indentation.
* guile/scm-cmd.c: Fix indentation.
* guile/scm-frame.c: Fix indentation.
* guile/scm-iterator.c: Fix indentation.
* guile/scm-math.c: Fix indentation.
* guile/scm-ports.c: Fix indentation.
* guile/scm-pretty-print.c: Fix indentation.
* guile/scm-value.c: Fix indentation.
* h8300-tdep.c: Fix indentation.
* hppa-linux-nat.c: Fix indentation.
* hppa-linux-tdep.c: Fix indentation.
* hppa-nbsd-nat.c: Fix indentation.
* hppa-nbsd-tdep.c: Fix indentation.
* hppa-obsd-nat.c: Fix indentation.
* hppa-tdep.c: Fix indentation.
* hppa-tdep.h: Fix indentation.
* i386-bsd-nat.c: Fix indentation.
* i386-darwin-nat.c: Fix indentation.
* i386-darwin-tdep.c: Fix indentation.
* i386-dicos-tdep.c: Fix indentation.
* i386-gnu-nat.c: Fix indentation.
* i386-linux-nat.c: Fix indentation.
* i386-linux-tdep.c: Fix indentation.
* i386-nto-tdep.c: Fix indentation.
* i386-obsd-tdep.c: Fix indentation.
* i386-sol2-nat.c: Fix indentation.
* i386-tdep.c: Fix indentation.
* i386-tdep.h: Fix indentation.
* i386-windows-tdep.c: Fix indentation.
* i387-tdep.c: Fix indentation.
* i387-tdep.h: Fix indentation.
* ia64-libunwind-tdep.c: Fix indentation.
* ia64-libunwind-tdep.h: Fix indentation.
* ia64-linux-nat.c: Fix indentation.
* ia64-linux-tdep.c: Fix indentation.
* ia64-tdep.c: Fix indentation.
* ia64-tdep.h: Fix indentation.
* ia64-vms-tdep.c: Fix indentation.
* infcall.c: Fix indentation.
* infcmd.c: Fix indentation.
* inferior.c: Fix indentation.
* infrun.c: Fix indentation.
* iq2000-tdep.c: Fix indentation.
* language.c: Fix indentation.
* linespec.c: Fix indentation.
* linux-fork.c: Fix indentation.
* linux-nat.c: Fix indentation.
* linux-tdep.c: Fix indentation.
* linux-thread-db.c: Fix indentation.
* lm32-tdep.c: Fix indentation.
* m2-lang.c: Fix indentation.
* m2-typeprint.c: Fix indentation.
* m2-valprint.c: Fix indentation.
* m32c-tdep.c: Fix indentation.
* m32r-linux-tdep.c: Fix indentation.
* m32r-tdep.c: Fix indentation.
* m68hc11-tdep.c: Fix indentation.
* m68k-bsd-nat.c: Fix indentation.
* m68k-linux-nat.c: Fix indentation.
* m68k-linux-tdep.c: Fix indentation.
* m68k-tdep.c: Fix indentation.
* machoread.c: Fix indentation.
* macrocmd.c: Fix indentation.
* macroexp.c: Fix indentation.
* macroscope.c: Fix indentation.
* macrotab.c: Fix indentation.
* macrotab.h: Fix indentation.
* main.c: Fix indentation.
* mdebugread.c: Fix indentation.
* mep-tdep.c: Fix indentation.
* mi/mi-cmd-catch.c: Fix indentation.
* mi/mi-cmd-disas.c: Fix indentation.
* mi/mi-cmd-env.c: Fix indentation.
* mi/mi-cmd-stack.c: Fix indentation.
* mi/mi-cmd-var.c: Fix indentation.
* mi/mi-cmds.c: Fix indentation.
* mi/mi-main.c: Fix indentation.
* mi/mi-parse.c: Fix indentation.
* microblaze-tdep.c: Fix indentation.
* minidebug.c: Fix indentation.
* minsyms.c: Fix indentation.
* mips-linux-nat.c: Fix indentation.
* mips-linux-tdep.c: Fix indentation.
* mips-nbsd-tdep.c: Fix indentation.
* mips-tdep.c: Fix indentation.
* mn10300-linux-tdep.c: Fix indentation.
* mn10300-tdep.c: Fix indentation.
* moxie-tdep.c: Fix indentation.
* msp430-tdep.c: Fix indentation.
* namespace.h: Fix indentation.
* nat/fork-inferior.c: Fix indentation.
* nat/gdb_ptrace.h: Fix indentation.
* nat/linux-namespaces.c: Fix indentation.
* nat/linux-osdata.c: Fix indentation.
* nat/netbsd-nat.c: Fix indentation.
* nat/x86-dregs.c: Fix indentation.
* nbsd-nat.c: Fix indentation.
* nbsd-tdep.c: Fix indentation.
* nios2-linux-tdep.c: Fix indentation.
* nios2-tdep.c: Fix indentation.
* nto-procfs.c: Fix indentation.
* nto-tdep.c: Fix indentation.
* objfiles.c: Fix indentation.
* objfiles.h: Fix indentation.
* opencl-lang.c: Fix indentation.
* or1k-tdep.c: Fix indentation.
* osabi.c: Fix indentation.
* osabi.h: Fix indentation.
* osdata.c: Fix indentation.
* p-lang.c: Fix indentation.
* p-typeprint.c: Fix indentation.
* p-valprint.c: Fix indentation.
* parse.c: Fix indentation.
* ppc-linux-nat.c: Fix indentation.
* ppc-linux-tdep.c: Fix indentation.
* ppc-nbsd-nat.c: Fix indentation.
* ppc-nbsd-tdep.c: Fix indentation.
* ppc-obsd-nat.c: Fix indentation.
* ppc-ravenscar-thread.c: Fix indentation.
* ppc-sysv-tdep.c: Fix indentation.
* ppc64-tdep.c: Fix indentation.
* printcmd.c: Fix indentation.
* proc-api.c: Fix indentation.
* producer.c: Fix indentation.
* producer.h: Fix indentation.
* prologue-value.c: Fix indentation.
* prologue-value.h: Fix indentation.
* psymtab.c: Fix indentation.
* python/py-arch.c: Fix indentation.
* python/py-bpevent.c: Fix indentation.
* python/py-event.c: Fix indentation.
* python/py-event.h: Fix indentation.
* python/py-finishbreakpoint.c: Fix indentation.
* python/py-frame.c: Fix indentation.
* python/py-framefilter.c: Fix indentation.
* python/py-inferior.c: Fix indentation.
* python/py-infthread.c: Fix indentation.
* python/py-objfile.c: Fix indentation.
* python/py-prettyprint.c: Fix indentation.
* python/py-registers.c: Fix indentation.
* python/py-signalevent.c: Fix indentation.
* python/py-stopevent.c: Fix indentation.
* python/py-stopevent.h: Fix indentation.
* python/py-threadevent.c: Fix indentation.
* python/py-tui.c: Fix indentation.
* python/py-unwind.c: Fix indentation.
* python/py-value.c: Fix indentation.
* python/py-xmethods.c: Fix indentation.
* python/python-internal.h: Fix indentation.
* python/python.c: Fix indentation.
* ravenscar-thread.c: Fix indentation.
* record-btrace.c: Fix indentation.
* record-full.c: Fix indentation.
* record.c: Fix indentation.
* reggroups.c: Fix indentation.
* regset.h: Fix indentation.
* remote-fileio.c: Fix indentation.
* remote.c: Fix indentation.
* reverse.c: Fix indentation.
* riscv-linux-tdep.c: Fix indentation.
* riscv-ravenscar-thread.c: Fix indentation.
* riscv-tdep.c: Fix indentation.
* rl78-tdep.c: Fix indentation.
* rs6000-aix-tdep.c: Fix indentation.
* rs6000-lynx178-tdep.c: Fix indentation.
* rs6000-nat.c: Fix indentation.
* rs6000-tdep.c: Fix indentation.
* rust-lang.c: Fix indentation.
* rx-tdep.c: Fix indentation.
* s12z-tdep.c: Fix indentation.
* s390-linux-tdep.c: Fix indentation.
* score-tdep.c: Fix indentation.
* ser-base.c: Fix indentation.
* ser-mingw.c: Fix indentation.
* ser-uds.c: Fix indentation.
* ser-unix.c: Fix indentation.
* serial.c: Fix indentation.
* sh-linux-tdep.c: Fix indentation.
* sh-nbsd-tdep.c: Fix indentation.
* sh-tdep.c: Fix indentation.
* skip.c: Fix indentation.
* sol-thread.c: Fix indentation.
* solib-aix.c: Fix indentation.
* solib-darwin.c: Fix indentation.
* solib-frv.c: Fix indentation.
* solib-svr4.c: Fix indentation.
* solib.c: Fix indentation.
* source.c: Fix indentation.
* sparc-linux-tdep.c: Fix indentation.
* sparc-nbsd-tdep.c: Fix indentation.
* sparc-obsd-tdep.c: Fix indentation.
* sparc-ravenscar-thread.c: Fix indentation.
* sparc-tdep.c: Fix indentation.
* sparc64-linux-tdep.c: Fix indentation.
* sparc64-nbsd-tdep.c: Fix indentation.
* sparc64-obsd-tdep.c: Fix indentation.
* sparc64-tdep.c: Fix indentation.
* stabsread.c: Fix indentation.
* stack.c: Fix indentation.
* stap-probe.c: Fix indentation.
* stubs/ia64vms-stub.c: Fix indentation.
* stubs/m32r-stub.c: Fix indentation.
* stubs/m68k-stub.c: Fix indentation.
* stubs/sh-stub.c: Fix indentation.
* stubs/sparc-stub.c: Fix indentation.
* symfile-mem.c: Fix indentation.
* symfile.c: Fix indentation.
* symfile.h: Fix indentation.
* symmisc.c: Fix indentation.
* symtab.c: Fix indentation.
* symtab.h: Fix indentation.
* target-float.c: Fix indentation.
* target.c: Fix indentation.
* target.h: Fix indentation.
* tic6x-tdep.c: Fix indentation.
* tilegx-linux-tdep.c: Fix indentation.
* tilegx-tdep.c: Fix indentation.
* top.c: Fix indentation.
* tracefile-tfile.c: Fix indentation.
* tracepoint.c: Fix indentation.
* tui/tui-disasm.c: Fix indentation.
* tui/tui-io.c: Fix indentation.
* tui/tui-regs.c: Fix indentation.
* tui/tui-stack.c: Fix indentation.
* tui/tui-win.c: Fix indentation.
* tui/tui-winsource.c: Fix indentation.
* tui/tui.c: Fix indentation.
* typeprint.c: Fix indentation.
* ui-out.h: Fix indentation.
* unittests/copy_bitwise-selftests.c: Fix indentation.
* unittests/memory-map-selftests.c: Fix indentation.
* utils.c: Fix indentation.
* v850-tdep.c: Fix indentation.
* valarith.c: Fix indentation.
* valops.c: Fix indentation.
* valprint.c: Fix indentation.
* valprint.h: Fix indentation.
* value.c: Fix indentation.
* value.h: Fix indentation.
* varobj.c: Fix indentation.
* vax-tdep.c: Fix indentation.
* windows-nat.c: Fix indentation.
* windows-tdep.c: Fix indentation.
* xcoffread.c: Fix indentation.
* xml-syscall.c: Fix indentation.
* xml-tdesc.c: Fix indentation.
* xstormy16-tdep.c: Fix indentation.
* xtensa-config.c: Fix indentation.
* xtensa-linux-nat.c: Fix indentation.
* xtensa-linux-tdep.c: Fix indentation.
* xtensa-tdep.c: Fix indentation.
gdbserver/ChangeLog:
* ax.cc: Fix indentation.
* dll.cc: Fix indentation.
* inferiors.h: Fix indentation.
* linux-low.cc: Fix indentation.
* linux-nios2-low.cc: Fix indentation.
* linux-ppc-ipa.cc: Fix indentation.
* linux-ppc-low.cc: Fix indentation.
* linux-x86-low.cc: Fix indentation.
* linux-xtensa-low.cc: Fix indentation.
* regcache.cc: Fix indentation.
* server.cc: Fix indentation.
* tracepoint.cc: Fix indentation.
gdbsupport/ChangeLog:
* common-exceptions.h: Fix indentation.
* event-loop.cc: Fix indentation.
* fileio.cc: Fix indentation.
* filestuff.cc: Fix indentation.
* gdb-dlfcn.cc: Fix indentation.
* gdb_string_view.h: Fix indentation.
* job-control.cc: Fix indentation.
* signals.cc: Fix indentation.
Change-Id: I4bad7ae6be0fbe14168b8ebafb98ffe14964a695
2020-11-02 23:26:14 +08:00
|
|
|
|
struct cmd_list_element *c, const char *value)
|
2020-08-05 00:01:55 +08:00
|
|
|
|
{
|
2022-01-03 02:46:15 +08:00
|
|
|
|
gdb_printf (file, _("Debugging of BPF is %s.\n"), value);
|
2020-08-05 00:01:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* BPF registers. */
|
|
|
|
|
|
|
|
|
|
static const char *bpf_register_names[] =
|
|
|
|
|
{
|
|
|
|
|
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
|
|
|
|
|
"r8", "r9", "r10", "pc"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Return the name of register REGNUM. */
|
|
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
|
bpf_register_name (struct gdbarch *gdbarch, int reg)
|
|
|
|
|
{
|
2023-10-19 10:44:11 +08:00
|
|
|
|
static_assert (ARRAY_SIZE (bpf_register_names) == BPF_NUM_REGS);
|
gdb: final cleanup of various gdbarch_register_name methods
Building on the previous commits, this commit goes through the various
gdbarch_register_name methods and removes all the remaining 'return
NULL' cases, I claim that these either couldn't be hit, or should be
returning the empty string.
In all cases the return of NULL was used if the register number being
passed to gdbarch_register_name was "invalid", i.e. negative, or
greater than the total number of declared registers. I don't believe
either of these cases can occur, and the previous commit asserts that
this is the case. As a result we can simplify the code by removing
these checks. In many cases, where the register names are held in an
array, I was able to add a static assert that the array contains the
correct number of strings, after that, a direct access into the array
is fine.
I don't have any means of testing these changes.
2022-08-31 20:32:59 +08:00
|
|
|
|
return bpf_register_names[reg];
|
2020-08-05 00:01:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Return the GDB type of register REGNUM. */
|
|
|
|
|
|
|
|
|
|
static struct type *
|
|
|
|
|
bpf_register_type (struct gdbarch *gdbarch, int reg)
|
|
|
|
|
{
|
|
|
|
|
if (reg == BPF_R10_REGNUM)
|
|
|
|
|
return builtin_type (gdbarch)->builtin_data_ptr;
|
|
|
|
|
else if (reg == BPF_PC_REGNUM)
|
|
|
|
|
return builtin_type (gdbarch)->builtin_func_ptr;
|
|
|
|
|
return builtin_type (gdbarch)->builtin_int64;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Return the GDB register number corresponding to DWARF's REG. */
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
bpf_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int reg)
|
|
|
|
|
{
|
|
|
|
|
if (reg >= 0 && reg < BPF_NUM_REGS)
|
|
|
|
|
return reg;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Implement the "print_insn" gdbarch method. */
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
bpf_gdb_print_insn (bfd_vma memaddr, disassemble_info *info)
|
|
|
|
|
{
|
|
|
|
|
info->symbols = NULL;
|
|
|
|
|
return default_print_insn (memaddr, info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Return PC of first real instruction of the function starting at
|
|
|
|
|
START_PC. */
|
|
|
|
|
|
|
|
|
|
static CORE_ADDR
|
|
|
|
|
bpf_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
|
|
|
|
|
{
|
2022-01-03 02:46:15 +08:00
|
|
|
|
gdb_printf (gdb_stdlog,
|
|
|
|
|
"Skipping prologue: start_pc=%s\n",
|
|
|
|
|
paddress (gdbarch, start_pc));
|
2020-08-05 00:01:55 +08:00
|
|
|
|
/* XXX: to be completed. */
|
|
|
|
|
return start_pc + 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Frame unwinder.
|
|
|
|
|
|
|
|
|
|
XXX it is not clear how to unwind in eBPF, since the stack is not
|
|
|
|
|
guaranteed to be contiguous, and therefore no relative stack
|
|
|
|
|
addressing can be done in the callee in order to access the
|
|
|
|
|
caller's stack frame. To explore with xBPF, which will relax this
|
|
|
|
|
restriction. */
|
|
|
|
|
|
|
|
|
|
/* Given THIS_FRAME, return its ID. */
|
|
|
|
|
|
|
|
|
|
static void
|
gdb: pass frames as `const frame_info_ptr &`
We currently pass frames to function by value, as `frame_info_ptr`.
This is somewhat expensive:
- the size of `frame_info_ptr` is 64 bytes, which is a bit big to pass
by value
- the constructors and destructor link/unlink the object in the global
`frame_info_ptr::frame_list` list. This is an `intrusive_list`, so
it's not so bad: it's just assigning a few points, there's no memory
allocation as if it was `std::list`, but still it's useless to do
that over and over.
As suggested by Tom Tromey, change many function signatures to accept
`const frame_info_ptr &` instead of `frame_info_ptr`.
Some functions reassign their `frame_info_ptr` parameter, like:
void
the_func (frame_info_ptr frame)
{
for (; frame != nullptr; frame = get_prev_frame (frame))
{
...
}
}
I wondered what to do about them, do I leave them as-is or change them
(and need to introduce a separate local variable that can be
re-assigned). I opted for the later for consistency. It might not be
clear why some functions take `const frame_info_ptr &` while others take
`frame_info_ptr`. Also, if a function took a `frame_info_ptr` because
it did re-assign its parameter, I doubt that we would think to change it
to `const frame_info_ptr &` should the implementation change such that
it doesn't need to take `frame_info_ptr` anymore. It seems better to
have a simple rule and apply it everywhere.
Change-Id: I59d10addef687d157f82ccf4d54f5dde9a963fd0
Approved-By: Andrew Burgess <aburgess@redhat.com>
2024-02-20 02:07:47 +08:00
|
|
|
|
bpf_frame_this_id (const frame_info_ptr &this_frame,
|
2020-08-05 00:01:55 +08:00
|
|
|
|
void **this_prologue_cache,
|
|
|
|
|
struct frame_id *this_id)
|
|
|
|
|
{
|
|
|
|
|
/* Note that THIS_ID defaults to the outermost frame if we don't set
|
|
|
|
|
anything here. See frame.c:compute_frame_id. */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Return the reason why we can't unwind past THIS_FRAME. */
|
|
|
|
|
|
|
|
|
|
static enum unwind_stop_reason
|
gdb: pass frames as `const frame_info_ptr &`
We currently pass frames to function by value, as `frame_info_ptr`.
This is somewhat expensive:
- the size of `frame_info_ptr` is 64 bytes, which is a bit big to pass
by value
- the constructors and destructor link/unlink the object in the global
`frame_info_ptr::frame_list` list. This is an `intrusive_list`, so
it's not so bad: it's just assigning a few points, there's no memory
allocation as if it was `std::list`, but still it's useless to do
that over and over.
As suggested by Tom Tromey, change many function signatures to accept
`const frame_info_ptr &` instead of `frame_info_ptr`.
Some functions reassign their `frame_info_ptr` parameter, like:
void
the_func (frame_info_ptr frame)
{
for (; frame != nullptr; frame = get_prev_frame (frame))
{
...
}
}
I wondered what to do about them, do I leave them as-is or change them
(and need to introduce a separate local variable that can be
re-assigned). I opted for the later for consistency. It might not be
clear why some functions take `const frame_info_ptr &` while others take
`frame_info_ptr`. Also, if a function took a `frame_info_ptr` because
it did re-assign its parameter, I doubt that we would think to change it
to `const frame_info_ptr &` should the implementation change such that
it doesn't need to take `frame_info_ptr` anymore. It seems better to
have a simple rule and apply it everywhere.
Change-Id: I59d10addef687d157f82ccf4d54f5dde9a963fd0
Approved-By: Andrew Burgess <aburgess@redhat.com>
2024-02-20 02:07:47 +08:00
|
|
|
|
bpf_frame_unwind_stop_reason (const frame_info_ptr &this_frame,
|
2020-08-05 00:01:55 +08:00
|
|
|
|
void **this_cache)
|
|
|
|
|
{
|
|
|
|
|
return UNWIND_OUTERMOST;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Ask THIS_FRAME to unwind its register. */
|
|
|
|
|
|
|
|
|
|
static struct value *
|
gdb: pass frames as `const frame_info_ptr &`
We currently pass frames to function by value, as `frame_info_ptr`.
This is somewhat expensive:
- the size of `frame_info_ptr` is 64 bytes, which is a bit big to pass
by value
- the constructors and destructor link/unlink the object in the global
`frame_info_ptr::frame_list` list. This is an `intrusive_list`, so
it's not so bad: it's just assigning a few points, there's no memory
allocation as if it was `std::list`, but still it's useless to do
that over and over.
As suggested by Tom Tromey, change many function signatures to accept
`const frame_info_ptr &` instead of `frame_info_ptr`.
Some functions reassign their `frame_info_ptr` parameter, like:
void
the_func (frame_info_ptr frame)
{
for (; frame != nullptr; frame = get_prev_frame (frame))
{
...
}
}
I wondered what to do about them, do I leave them as-is or change them
(and need to introduce a separate local variable that can be
re-assigned). I opted for the later for consistency. It might not be
clear why some functions take `const frame_info_ptr &` while others take
`frame_info_ptr`. Also, if a function took a `frame_info_ptr` because
it did re-assign its parameter, I doubt that we would think to change it
to `const frame_info_ptr &` should the implementation change such that
it doesn't need to take `frame_info_ptr` anymore. It seems better to
have a simple rule and apply it everywhere.
Change-Id: I59d10addef687d157f82ccf4d54f5dde9a963fd0
Approved-By: Andrew Burgess <aburgess@redhat.com>
2024-02-20 02:07:47 +08:00
|
|
|
|
bpf_frame_prev_register (const frame_info_ptr &this_frame,
|
2020-08-05 00:01:55 +08:00
|
|
|
|
void **this_prologue_cache, int regnum)
|
|
|
|
|
{
|
|
|
|
|
return frame_unwind_got_register (this_frame, regnum, regnum);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Frame unwinder machinery for BPF. */
|
|
|
|
|
|
|
|
|
|
static const struct frame_unwind bpf_frame_unwind =
|
|
|
|
|
{
|
2021-06-30 00:05:03 +08:00
|
|
|
|
"bpf prologue",
|
2020-08-05 00:01:55 +08:00
|
|
|
|
NORMAL_FRAME,
|
|
|
|
|
bpf_frame_unwind_stop_reason,
|
|
|
|
|
bpf_frame_this_id,
|
|
|
|
|
bpf_frame_prev_register,
|
|
|
|
|
NULL,
|
|
|
|
|
default_frame_sniffer
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Breakpoints. */
|
|
|
|
|
|
|
|
|
|
/* Enum describing the different kinds of breakpoints. We currently
|
|
|
|
|
just support one, implemented by the brkpt xbpf instruction. */
|
|
|
|
|
|
|
|
|
|
enum bpf_breakpoint_kinds
|
|
|
|
|
{
|
|
|
|
|
BPF_BP_KIND_BRKPT = 0,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Implement the breakpoint_kind_from_pc gdbarch method. */
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
bpf_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *start_pc)
|
|
|
|
|
{
|
|
|
|
|
/* We support just one kind of breakpoint. */
|
|
|
|
|
return BPF_BP_KIND_BRKPT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Implement the sw_breakpoint_from_kind gdbarch method. */
|
|
|
|
|
|
|
|
|
|
static const gdb_byte *
|
|
|
|
|
bpf_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
|
|
|
|
|
{
|
|
|
|
|
static unsigned char brkpt_insn[]
|
|
|
|
|
= {0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
|
|
|
|
|
|
|
|
switch (kind)
|
|
|
|
|
{
|
|
|
|
|
case BPF_BP_KIND_BRKPT:
|
|
|
|
|
*size = 8;
|
|
|
|
|
return brkpt_insn;
|
|
|
|
|
default:
|
|
|
|
|
gdb_assert_not_reached ("unexpected BPF breakpoint kind");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Assuming THIS_FRAME is a dummy frame, return its frame ID. */
|
|
|
|
|
|
|
|
|
|
static struct frame_id
|
gdb: pass frames as `const frame_info_ptr &`
We currently pass frames to function by value, as `frame_info_ptr`.
This is somewhat expensive:
- the size of `frame_info_ptr` is 64 bytes, which is a bit big to pass
by value
- the constructors and destructor link/unlink the object in the global
`frame_info_ptr::frame_list` list. This is an `intrusive_list`, so
it's not so bad: it's just assigning a few points, there's no memory
allocation as if it was `std::list`, but still it's useless to do
that over and over.
As suggested by Tom Tromey, change many function signatures to accept
`const frame_info_ptr &` instead of `frame_info_ptr`.
Some functions reassign their `frame_info_ptr` parameter, like:
void
the_func (frame_info_ptr frame)
{
for (; frame != nullptr; frame = get_prev_frame (frame))
{
...
}
}
I wondered what to do about them, do I leave them as-is or change them
(and need to introduce a separate local variable that can be
re-assigned). I opted for the later for consistency. It might not be
clear why some functions take `const frame_info_ptr &` while others take
`frame_info_ptr`. Also, if a function took a `frame_info_ptr` because
it did re-assign its parameter, I doubt that we would think to change it
to `const frame_info_ptr &` should the implementation change such that
it doesn't need to take `frame_info_ptr` anymore. It seems better to
have a simple rule and apply it everywhere.
Change-Id: I59d10addef687d157f82ccf4d54f5dde9a963fd0
Approved-By: Andrew Burgess <aburgess@redhat.com>
2024-02-20 02:07:47 +08:00
|
|
|
|
bpf_dummy_id (struct gdbarch *gdbarch, const frame_info_ptr &this_frame)
|
2020-08-05 00:01:55 +08:00
|
|
|
|
{
|
|
|
|
|
CORE_ADDR sp = get_frame_register_unsigned (this_frame,
|
|
|
|
|
gdbarch_sp_regnum (gdbarch));
|
|
|
|
|
return frame_id_build (sp, get_frame_pc (this_frame));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Implement the push dummy call gdbarch callback. */
|
|
|
|
|
|
|
|
|
|
static CORE_ADDR
|
|
|
|
|
bpf_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|
|
|
|
struct regcache *regcache, CORE_ADDR bp_addr,
|
|
|
|
|
int nargs, struct value **args, CORE_ADDR sp,
|
|
|
|
|
function_call_return_method return_method,
|
|
|
|
|
CORE_ADDR struct_addr)
|
|
|
|
|
{
|
2022-01-03 02:46:15 +08:00
|
|
|
|
gdb_printf (gdb_stdlog, "Pushing dummy call: sp=%s\n",
|
|
|
|
|
paddress (gdbarch, sp));
|
2020-08-05 00:01:55 +08:00
|
|
|
|
/* XXX writeme */
|
|
|
|
|
return sp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Extract a function return value of TYPE from REGCACHE,
|
|
|
|
|
and copy it into VALBUF. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
bpf_extract_return_value (struct type *type, struct regcache *regcache,
|
|
|
|
|
gdb_byte *valbuf)
|
|
|
|
|
{
|
2022-09-21 23:05:21 +08:00
|
|
|
|
int len = type->length ();
|
2020-08-05 00:01:55 +08:00
|
|
|
|
gdb_byte vbuf[8];
|
|
|
|
|
|
|
|
|
|
gdb_assert (len <= 8);
|
|
|
|
|
regcache->cooked_read (BPF_R0_REGNUM, vbuf);
|
|
|
|
|
memcpy (valbuf, vbuf + 8 - len, len);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Store the function return value of type TYPE from VALBUF into REGNAME. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
bpf_store_return_value (struct type *type, struct regcache *regcache,
|
|
|
|
|
const gdb_byte *valbuf)
|
|
|
|
|
{
|
2022-09-21 23:05:21 +08:00
|
|
|
|
int len = type->length ();
|
2020-08-05 00:01:55 +08:00
|
|
|
|
gdb_byte vbuf[8];
|
|
|
|
|
|
|
|
|
|
gdb_assert (len <= 8);
|
|
|
|
|
memset (vbuf, 0, sizeof (vbuf));
|
|
|
|
|
memcpy (vbuf + 8 - len, valbuf, len);
|
|
|
|
|
regcache->cooked_write (BPF_R0_REGNUM, vbuf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Handle function's return value. */
|
|
|
|
|
|
|
|
|
|
static enum return_value_convention
|
|
|
|
|
bpf_return_value (struct gdbarch *gdbarch, struct value *function,
|
|
|
|
|
struct type *type, struct regcache *regcache,
|
|
|
|
|
gdb_byte *readbuf, const gdb_byte *writebuf)
|
|
|
|
|
{
|
2022-09-21 23:05:21 +08:00
|
|
|
|
int len = type->length ();
|
2020-08-05 00:01:55 +08:00
|
|
|
|
|
|
|
|
|
if (len > 8)
|
|
|
|
|
return RETURN_VALUE_STRUCT_CONVENTION;
|
|
|
|
|
|
|
|
|
|
if (readbuf != NULL)
|
|
|
|
|
bpf_extract_return_value (type, regcache, readbuf);
|
|
|
|
|
if (writebuf != NULL)
|
|
|
|
|
bpf_store_return_value (type, regcache, writebuf);
|
|
|
|
|
|
|
|
|
|
return RETURN_VALUE_REGISTER_CONVENTION;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Initialize the current architecture based on INFO. If possible, re-use an
|
|
|
|
|
architecture from ARCHES, which is a list of architectures already created
|
|
|
|
|
during this debugging session. */
|
|
|
|
|
|
|
|
|
|
static struct gdbarch *
|
|
|
|
|
bpf_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|
|
|
|
{
|
|
|
|
|
/* If there is already a candidate, use it. */
|
|
|
|
|
arches = gdbarch_list_lookup_by_info (arches, &info);
|
|
|
|
|
if (arches != NULL)
|
|
|
|
|
return arches->gdbarch;
|
|
|
|
|
|
|
|
|
|
/* Allocate space for the new architecture. */
|
gdb: make gdbarch_alloc take ownership of the tdep
It's currently not clear how the ownership of gdbarch_tdep objects
works. In fact, nothing ever takes ownership of it. This is mostly
fine because we never free gdbarch objects, and thus we never free
gdbarch_tdep objects. There is an exception to that however: when
initialization fails, we do free the gdbarch object that is not going to
be used, and we free the tdep too. Currently, i386 and s390 do it.
To make things clearer, change gdbarch_alloc so that it takes ownership
of the tdep. The tdep is thus automatically freed if the gdbarch is
freed.
Change all gdbarch initialization functions to pass a new gdbarch_tdep
object to gdbarch_alloc and then retrieve a non-owning reference from
the gdbarch object.
Before this patch, the xtensa architecture had a single global instance
of xtensa_gdbarch_tdep. Since we need to pass a dynamically allocated
gdbarch_tdep_base instance to gdbarch_alloc, remove this global
instance, and dynamically allocate one as needed, like we do for all
other architectures. Make the `rmap` array externally visible and
rename it to the less collision-prone `xtensa_rmap` name.
Change-Id: Id3d70493ef80ce4bdff701c57636f4c79ed8aea2
Approved-By: Andrew Burgess <aburgess@redhat.com>
2022-10-03 23:15:14 +08:00
|
|
|
|
gdbarch *gdbarch
|
|
|
|
|
= gdbarch_alloc (&info, gdbarch_tdep_up (new bpf_gdbarch_tdep));
|
2020-08-05 00:01:55 +08:00
|
|
|
|
|
|
|
|
|
/* Information about registers, etc. */
|
|
|
|
|
set_gdbarch_num_regs (gdbarch, BPF_NUM_REGS);
|
|
|
|
|
set_gdbarch_register_name (gdbarch, bpf_register_name);
|
|
|
|
|
set_gdbarch_register_type (gdbarch, bpf_register_type);
|
|
|
|
|
|
|
|
|
|
/* Register numbers of various important registers. */
|
|
|
|
|
set_gdbarch_sp_regnum (gdbarch, BPF_R10_REGNUM);
|
|
|
|
|
set_gdbarch_pc_regnum (gdbarch, BPF_PC_REGNUM);
|
|
|
|
|
|
|
|
|
|
/* Map DWARF2 registers to GDB registers. */
|
|
|
|
|
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, bpf_dwarf2_reg_to_regnum);
|
|
|
|
|
|
|
|
|
|
/* Call dummy code. */
|
|
|
|
|
set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
|
|
|
|
|
set_gdbarch_dummy_id (gdbarch, bpf_dummy_id);
|
|
|
|
|
set_gdbarch_push_dummy_call (gdbarch, bpf_push_dummy_call);
|
|
|
|
|
|
|
|
|
|
/* Returning results. */
|
|
|
|
|
set_gdbarch_return_value (gdbarch, bpf_return_value);
|
|
|
|
|
|
|
|
|
|
/* Advance PC across function entry code. */
|
|
|
|
|
set_gdbarch_skip_prologue (gdbarch, bpf_skip_prologue);
|
|
|
|
|
|
|
|
|
|
/* Stack grows downward. */
|
|
|
|
|
set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
|
|
|
|
|
|
|
|
|
|
/* Breakpoint manipulation. */
|
|
|
|
|
set_gdbarch_breakpoint_kind_from_pc (gdbarch, bpf_breakpoint_kind_from_pc);
|
|
|
|
|
set_gdbarch_sw_breakpoint_from_kind (gdbarch, bpf_sw_breakpoint_from_kind);
|
|
|
|
|
|
|
|
|
|
/* Frame handling. */
|
|
|
|
|
set_gdbarch_frame_args_skip (gdbarch, 8);
|
|
|
|
|
|
|
|
|
|
/* Disassembly. */
|
|
|
|
|
set_gdbarch_print_insn (gdbarch, bpf_gdb_print_insn);
|
|
|
|
|
|
|
|
|
|
/* Hook in ABI-specific overrides, if they have been registered. */
|
|
|
|
|
gdbarch_init_osabi (info, gdbarch);
|
|
|
|
|
|
|
|
|
|
/* Install unwinders. */
|
|
|
|
|
frame_unwind_append_unwinder (gdbarch, &bpf_frame_unwind);
|
|
|
|
|
|
|
|
|
|
return gdbarch;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void _initialize_bpf_tdep ();
|
|
|
|
|
void
|
2021-05-28 01:59:01 +08:00
|
|
|
|
_initialize_bpf_tdep ()
|
2020-08-05 00:01:55 +08:00
|
|
|
|
{
|
2022-08-01 00:44:01 +08:00
|
|
|
|
gdbarch_register (bfd_arch_bpf, bpf_gdbarch_init);
|
2020-08-05 00:01:55 +08:00
|
|
|
|
|
|
|
|
|
/* Add commands 'set/show debug bpf'. */
|
|
|
|
|
add_setshow_zuinteger_cmd ("bpf", class_maintenance,
|
|
|
|
|
&bpf_debug_flag,
|
|
|
|
|
_("Set BPF debugging."),
|
|
|
|
|
_("Show BPF debugging."),
|
|
|
|
|
_("Enables BPF specific debugging output."),
|
|
|
|
|
NULL,
|
|
|
|
|
&show_bpf_debug,
|
|
|
|
|
&setdebuglist, &showdebuglist);
|
|
|
|
|
}
|