-
-
Notifications
You must be signed in to change notification settings - Fork 25
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add 27-attach-tracepoint-with-syscall
- Loading branch information
Showing
6 changed files
with
548 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
test.c | ||
test |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
OUTPUT = ./output | ||
LIBBPF = ../libbpf | ||
|
||
LIBBPF_SRC = $(abspath $(LIBBPF)/src) | ||
LIBBPF_OBJ = $(abspath $(OUTPUT)/libbpf.a) | ||
|
||
CC = gcc | ||
CLANG = clang | ||
|
||
ARCH := $(shell uname -m) | ||
ARCH := $(subst x86_64,amd64,$(ARCH)) | ||
GOARCH := $(ARCH) | ||
|
||
BPFTOOL = $(shell which bpftool || /bin/false) | ||
BTFFILE = /sys/kernel/btf/vmlinux | ||
DBGVMLINUX = /usr/lib/debug/boot/vmlinux-$(shell uname -r) | ||
GIT = $(shell which git || /bin/false) | ||
VMLINUXH = vmlinux.h | ||
|
||
# libbpf | ||
|
||
LIBBPF_OBJDIR = $(abspath ./$(OUTPUT)/libbpf) | ||
LIBBPF_DESTDIR = $(abspath ./$(OUTPUT)) | ||
|
||
CFLAGS = -ggdb -gdwarf -O2 -Wall -fpie -Wno-unused-variable -Wno-unused-function | ||
LDFLAGS = | ||
|
||
BPF_CFLAGS_STATIC = "-I$(abspath $(OUTPUT))" | ||
BPF_LDFLAGS_STATIC = "-lelf -lz $(LIBBPF_OBJ)" | ||
|
||
CGO_CFLAGS_STATIC = "-I$(abspath $(OUTPUT))" | ||
CGO_LDFLAGS_STATIC = "-lelf -lz $(LIBBPF_OBJ)" | ||
CGO_EXTLDFLAGS_STATIC = '-w -extldflags "-static"' | ||
|
||
CGO_CFGLAGS_DYN = "-I. -I/usr/include/" | ||
CGO_LDFLAGS_DYN = "-lelf -lz -lbpf" | ||
CGO_EXTLDFLAGS_DYN = '-w' | ||
|
||
## program | ||
|
||
.PHONY: $(PROGRAM) | ||
.PHONY: $(PROGRAM).bpf.c | ||
|
||
PROGRAM = main | ||
|
||
all: | ||
$(MAKE) -C . $(PROGRAM) | ||
|
||
# vmlinux header file | ||
|
||
.PHONY: vmlinuxh | ||
vmlinuxh: $(VMLINUXH) | ||
|
||
$(VMLINUXH): $(OUTPUT) | ||
ifeq ($(wildcard $(BPFTOOL)),) | ||
@echo "ERROR: could not find bpftool" | ||
@exit 1 | ||
endif | ||
@if [ -f $(DBGVMLINUX) ]; then \ | ||
echo "INFO: found dbg kernel, generating $(VMLINUXH) from $(DBGVMLINUX)"; \ | ||
$(BPFTOOL) btf dump file $(DBGVMLINUX) format c > $(VMLINUXH); \ | ||
fi | ||
@if [ ! -f $(BTFFILE) ] && [ ! -f $(DBGVMLINUX) ]; then \ | ||
echo "ERROR: kernel does not seem to support BTF"; \ | ||
exit 1; \ | ||
fi | ||
@if [ ! -f $(VMLINUXH) ]; then \ | ||
echo "INFO: generating $(VMLINUXH) from $(BTFFILE)"; \ | ||
$(BPFTOOL) btf dump file $(BTFFILE) format c > $(VMLINUXH); \ | ||
fi | ||
|
||
# static libbpf generation for the git submodule | ||
|
||
.PHONY: libbpf | ||
libbpf: $(LIBBPF_OBJ) | ||
|
||
$(LIBBPF_OBJ): $(LIBBPF_SRC) $(wildcard $(LIBBPF_SRC)/*.[ch]) | $(OUTPUT)/libbpf | ||
CC="$(CC)" CFLAGS="$(CFLAGS)" LD_FLAGS="$(LDFLAGS)" \ | ||
$(MAKE) -C $(LIBBPF_SRC) \ | ||
BUILD_STATIC_ONLY=1 \ | ||
OBJDIR=$(LIBBPF_OBJDIR) \ | ||
DESTDIR=$(LIBBPF_DESTDIR) \ | ||
INCLUDEDIR= LIBDIR= UAPIDIR= prefix= libdir= install | ||
$(MAKE) -C $(LIBBPF_SRC) UAPIDIR=$(LIBBPF_DESTDIR) install_uapi_headers | ||
|
||
$(LIBBPF_SRC): | ||
ifeq ($(wildcard $@), ) | ||
echo "INFO: updating submodule 'libbpf'" | ||
$(GIT) submodule update --init --recursive | ||
endif | ||
|
||
# output dir | ||
|
||
$(OUTPUT): | ||
mkdir -p $(OUTPUT) | ||
|
||
$(OUTPUT)/libbpf: | ||
mkdir -p $(OUTPUT)/libbpf | ||
|
||
## program bpf dependency | ||
|
||
$(PROGRAM).bpf.o: $(PROGRAM).bpf.c | vmlinuxh | ||
$(CLANG) $(CFLAGS) -target bpf -D__TARGET_ARCH_x86 -I. -I$(OUTPUT) -c $< -o $@ | ||
|
||
## GO example | ||
|
||
.PHONY: $(PROGRAM) | ||
|
||
$(PROGRAM): libbpf | $(PROGRAM).bpf.o | ||
gcc ./main.c -o main | ||
|
||
.PHONE: run | ||
run: | ||
sudo ./main | ||
|
||
.PHONE: cat | ||
cat: | ||
sudo cat /sys/kernel/debug/tracing/trace_pipe | ||
|
||
## clean | ||
|
||
.PHONY: clean | ||
clean: | ||
$(MAKE) -C $(LIBBPF_SRC) clean | ||
rm -rf $(OUTPUT) | ||
rm -rf $(VMLINUXH) | ||
rm -rf $(PROGRAM) $(PROGRAM)-*static $(PROGRAM)-*dynamic | ||
rm -rf $(PROGRAM).bpf.o $(PROGRAM).o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
|
||
|
||
## Usage | ||
|
||
build: | ||
|
||
``` | ||
$ make | ||
``` | ||
|
||
run: | ||
|
||
``` | ||
$ make run | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,234 @@ | ||
/* copy from https://github.com/torvalds/linux/blob/master/samples/bpf/bpf_insn.h */ | ||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ | ||
/* eBPF instruction mini library */ | ||
#ifndef __BPF_INSN_H | ||
#define __BPF_INSN_H | ||
|
||
struct bpf_insn; | ||
|
||
/* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */ | ||
|
||
#define BPF_ALU64_REG(OP, DST, SRC) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_ALU64 | BPF_OP(OP) | BPF_X, \ | ||
.dst_reg = DST, \ | ||
.src_reg = SRC, \ | ||
.off = 0, \ | ||
.imm = 0 }) | ||
|
||
#define BPF_ALU32_REG(OP, DST, SRC) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_ALU | BPF_OP(OP) | BPF_X, \ | ||
.dst_reg = DST, \ | ||
.src_reg = SRC, \ | ||
.off = 0, \ | ||
.imm = 0 }) | ||
|
||
/* ALU ops on immediates, bpf_add|sub|...: dst_reg += imm32 */ | ||
|
||
#define BPF_ALU64_IMM(OP, DST, IMM) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_ALU64 | BPF_OP(OP) | BPF_K, \ | ||
.dst_reg = DST, \ | ||
.src_reg = 0, \ | ||
.off = 0, \ | ||
.imm = IMM }) | ||
|
||
#define BPF_ALU32_IMM(OP, DST, IMM) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_ALU | BPF_OP(OP) | BPF_K, \ | ||
.dst_reg = DST, \ | ||
.src_reg = 0, \ | ||
.off = 0, \ | ||
.imm = IMM }) | ||
|
||
/* Short form of mov, dst_reg = src_reg */ | ||
|
||
#define BPF_MOV64_REG(DST, SRC) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_ALU64 | BPF_MOV | BPF_X, \ | ||
.dst_reg = DST, \ | ||
.src_reg = SRC, \ | ||
.off = 0, \ | ||
.imm = 0 }) | ||
|
||
#define BPF_MOV32_REG(DST, SRC) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_ALU | BPF_MOV | BPF_X, \ | ||
.dst_reg = DST, \ | ||
.src_reg = SRC, \ | ||
.off = 0, \ | ||
.imm = 0 }) | ||
|
||
/* Short form of mov, dst_reg = imm32 */ | ||
|
||
#define BPF_MOV64_IMM(DST, IMM) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_ALU64 | BPF_MOV | BPF_K, \ | ||
.dst_reg = DST, \ | ||
.src_reg = 0, \ | ||
.off = 0, \ | ||
.imm = IMM }) | ||
|
||
#define BPF_MOV32_IMM(DST, IMM) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_ALU | BPF_MOV | BPF_K, \ | ||
.dst_reg = DST, \ | ||
.src_reg = 0, \ | ||
.off = 0, \ | ||
.imm = IMM }) | ||
|
||
/* BPF_LD_IMM64 macro encodes single 'load 64-bit immediate' insn */ | ||
#define BPF_LD_IMM64(DST, IMM) \ | ||
BPF_LD_IMM64_RAW(DST, 0, IMM) | ||
|
||
#define BPF_LD_IMM64_RAW(DST, SRC, IMM) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_LD | BPF_DW | BPF_IMM, \ | ||
.dst_reg = DST, \ | ||
.src_reg = SRC, \ | ||
.off = 0, \ | ||
.imm = (__u32) (IMM) }), \ | ||
((struct bpf_insn) { \ | ||
.code = 0, /* zero is reserved opcode */ \ | ||
.dst_reg = 0, \ | ||
.src_reg = 0, \ | ||
.off = 0, \ | ||
.imm = ((__u64) (IMM)) >> 32 }) | ||
|
||
#ifndef BPF_PSEUDO_MAP_FD | ||
# define BPF_PSEUDO_MAP_FD 1 | ||
#endif | ||
|
||
/* pseudo BPF_LD_IMM64 insn used to refer to process-local map_fd */ | ||
#define BPF_LD_MAP_FD(DST, MAP_FD) \ | ||
BPF_LD_IMM64_RAW(DST, BPF_PSEUDO_MAP_FD, MAP_FD) | ||
|
||
|
||
/* Direct packet access, R0 = *(uint *) (skb->data + imm32) */ | ||
|
||
#define BPF_LD_ABS(SIZE, IMM) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_LD | BPF_SIZE(SIZE) | BPF_ABS, \ | ||
.dst_reg = 0, \ | ||
.src_reg = 0, \ | ||
.off = 0, \ | ||
.imm = IMM }) | ||
|
||
/* Memory load, dst_reg = *(uint *) (src_reg + off16) */ | ||
|
||
#define BPF_LDX_MEM(SIZE, DST, SRC, OFF) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM, \ | ||
.dst_reg = DST, \ | ||
.src_reg = SRC, \ | ||
.off = OFF, \ | ||
.imm = 0 }) | ||
|
||
/* Memory store, *(uint *) (dst_reg + off16) = src_reg */ | ||
|
||
#define BPF_STX_MEM(SIZE, DST, SRC, OFF) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM, \ | ||
.dst_reg = DST, \ | ||
.src_reg = SRC, \ | ||
.off = OFF, \ | ||
.imm = 0 }) | ||
|
||
/* | ||
* Atomic operations: | ||
* | ||
* BPF_ADD *(uint *) (dst_reg + off16) += src_reg | ||
* BPF_AND *(uint *) (dst_reg + off16) &= src_reg | ||
* BPF_OR *(uint *) (dst_reg + off16) |= src_reg | ||
* BPF_XOR *(uint *) (dst_reg + off16) ^= src_reg | ||
* BPF_ADD | BPF_FETCH src_reg = atomic_fetch_add(dst_reg + off16, src_reg); | ||
* BPF_AND | BPF_FETCH src_reg = atomic_fetch_and(dst_reg + off16, src_reg); | ||
* BPF_OR | BPF_FETCH src_reg = atomic_fetch_or(dst_reg + off16, src_reg); | ||
* BPF_XOR | BPF_FETCH src_reg = atomic_fetch_xor(dst_reg + off16, src_reg); | ||
* BPF_XCHG src_reg = atomic_xchg(dst_reg + off16, src_reg) | ||
* BPF_CMPXCHG r0 = atomic_cmpxchg(dst_reg + off16, r0, src_reg) | ||
*/ | ||
|
||
#define BPF_ATOMIC_OP(SIZE, OP, DST, SRC, OFF) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_STX | BPF_SIZE(SIZE) | BPF_ATOMIC, \ | ||
.dst_reg = DST, \ | ||
.src_reg = SRC, \ | ||
.off = OFF, \ | ||
.imm = OP }) | ||
|
||
/* Legacy alias */ | ||
#define BPF_STX_XADD(SIZE, DST, SRC, OFF) BPF_ATOMIC_OP(SIZE, BPF_ADD, DST, SRC, OFF) | ||
|
||
/* Memory store, *(uint *) (dst_reg + off16) = imm32 */ | ||
|
||
#define BPF_ST_MEM(SIZE, DST, OFF, IMM) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM, \ | ||
.dst_reg = DST, \ | ||
.src_reg = 0, \ | ||
.off = OFF, \ | ||
.imm = IMM }) | ||
|
||
/* Conditional jumps against registers, if (dst_reg 'op' src_reg) goto pc + off16 */ | ||
|
||
#define BPF_JMP_REG(OP, DST, SRC, OFF) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_JMP | BPF_OP(OP) | BPF_X, \ | ||
.dst_reg = DST, \ | ||
.src_reg = SRC, \ | ||
.off = OFF, \ | ||
.imm = 0 }) | ||
|
||
/* Like BPF_JMP_REG, but with 32-bit wide operands for comparison. */ | ||
|
||
#define BPF_JMP32_REG(OP, DST, SRC, OFF) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_JMP32 | BPF_OP(OP) | BPF_X, \ | ||
.dst_reg = DST, \ | ||
.src_reg = SRC, \ | ||
.off = OFF, \ | ||
.imm = 0 }) | ||
|
||
/* Conditional jumps against immediates, if (dst_reg 'op' imm32) goto pc + off16 */ | ||
|
||
#define BPF_JMP_IMM(OP, DST, IMM, OFF) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_JMP | BPF_OP(OP) | BPF_K, \ | ||
.dst_reg = DST, \ | ||
.src_reg = 0, \ | ||
.off = OFF, \ | ||
.imm = IMM }) | ||
|
||
/* Like BPF_JMP_IMM, but with 32-bit wide operands for comparison. */ | ||
|
||
#define BPF_JMP32_IMM(OP, DST, IMM, OFF) \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_JMP32 | BPF_OP(OP) | BPF_K, \ | ||
.dst_reg = DST, \ | ||
.src_reg = 0, \ | ||
.off = OFF, \ | ||
.imm = IMM }) | ||
|
||
/* Raw code statement block */ | ||
|
||
#define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM) \ | ||
((struct bpf_insn) { \ | ||
.code = CODE, \ | ||
.dst_reg = DST, \ | ||
.src_reg = SRC, \ | ||
.off = OFF, \ | ||
.imm = IMM }) | ||
|
||
/* Program exit */ | ||
|
||
#define BPF_EXIT_INSN() \ | ||
((struct bpf_insn) { \ | ||
.code = BPF_JMP | BPF_EXIT, \ | ||
.dst_reg = 0, \ | ||
.src_reg = 0, \ | ||
.off = 0, \ | ||
.imm = 0 }) | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
#include "vmlinux.h" | ||
|
||
#include <bpf/bpf_core_read.h> | ||
#include <bpf/bpf_helpers.h> | ||
#include <bpf/bpf_tracing.h> | ||
|
||
|
||
SEC("tracepoint/syscalls/sys_enter_openat") | ||
int tracepoint_openat(struct trace_event_raw_sys_enter *ctx) { | ||
char fmt[] = "hello world:\n"; | ||
bpf_trace_printk(fmt, sizeof(fmt)); | ||
|
||
return 0; | ||
} | ||
|
||
char _license[] SEC("license") = "GPL"; |
Oops, something went wrong.