Skip to content

Commit

Permalink
samples/bpf: Fix tracex5 to work with MIPS syscalls.
Browse files Browse the repository at this point in the history
There are two problems:

1) In MIPS the __NR_* macros expand to an expression, this causes the
   sections of the object file to be named like:

  .
  .
  .
  [ 5] kprobe/(5000 + 1) PROGBITS        0000000000000000 000160 ...
  [ 6] kprobe/(5000 + 0) PROGBITS        0000000000000000 000258 ...
  [ 7] kprobe/(5000 + 9) PROGBITS        0000000000000000 000348 ...
  .
  .
  .

The fix here is to use the "asm_offsets" trick to evaluate the macros
in the C compiler and generate a header file with a usable form of the
macros.

2) MIPS syscall numbers start at 5000, so we need a bigger map to hold
the sub-programs.

Signed-off-by: David Daney <[email protected]>
Acked-by: Daniel Borkmann <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
daviddaney authored and davem330 committed Jun 14, 2017
1 parent c1932cd commit 4b7190e
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 3 deletions.
13 changes: 13 additions & 0 deletions samples/bpf/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,17 @@ clean:
$(MAKE) -C ../../ M=$(CURDIR) clean
@rm -f *~

$(obj)/syscall_nrs.s: $(src)/syscall_nrs.c
$(call if_changed_dep,cc_s_c)

$(obj)/syscall_nrs.h: $(obj)/syscall_nrs.s FORCE
$(call filechk,offsets,__SYSCALL_NRS_H__)

clean-files += syscall_nrs.h

FORCE:


# Verify LLVM compiler tools are available and bpf target is supported by llc
.PHONY: verify_cmds verify_target_bpf $(CLANG) $(LLC)

Expand All @@ -180,6 +191,8 @@ verify_target_bpf: verify_cmds

$(src)/*.c: verify_target_bpf

$(obj)/tracex5_kern.o: $(obj)/syscall_nrs.h

# asm/sysreg.h - inline assembly used by it is incompatible with llvm.
# But, there is no easy way to fix it, so just exclude it since it is
# useless for BPF samples.
Expand Down
12 changes: 12 additions & 0 deletions samples/bpf/syscall_nrs.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#include <uapi/linux/unistd.h>
#include <linux/kbuild.h>

#define SYSNR(_NR) DEFINE(SYS ## _NR, _NR)

void syscall_defines(void)
{
COMMENT("Linux system call numbers.");
SYSNR(__NR_write);
SYSNR(__NR_read);
SYSNR(__NR_mmap);
}
11 changes: 8 additions & 3 deletions samples/bpf/tracex5_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <uapi/linux/bpf.h>
#include <uapi/linux/seccomp.h>
#include <uapi/linux/unistd.h>
#include "syscall_nrs.h"
#include "bpf_helpers.h"

#define PROG(F) SEC("kprobe/"__stringify(F)) int bpf_func_##F
Expand All @@ -17,7 +18,11 @@ struct bpf_map_def SEC("maps") progs = {
.type = BPF_MAP_TYPE_PROG_ARRAY,
.key_size = sizeof(u32),
.value_size = sizeof(u32),
#ifdef __mips__
.max_entries = 6000, /* MIPS n64 syscalls start at 5000 */
#else
.max_entries = 1024,
#endif
};

SEC("kprobe/__seccomp_filter")
Expand All @@ -37,7 +42,7 @@ int bpf_prog1(struct pt_regs *ctx)
}

/* we jump here when syscall number == __NR_write */
PROG(__NR_write)(struct pt_regs *ctx)
PROG(SYS__NR_write)(struct pt_regs *ctx)
{
struct seccomp_data sd;

Expand All @@ -50,7 +55,7 @@ PROG(__NR_write)(struct pt_regs *ctx)
return 0;
}

PROG(__NR_read)(struct pt_regs *ctx)
PROG(SYS__NR_read)(struct pt_regs *ctx)
{
struct seccomp_data sd;

Expand All @@ -63,7 +68,7 @@ PROG(__NR_read)(struct pt_regs *ctx)
return 0;
}

PROG(__NR_mmap)(struct pt_regs *ctx)
PROG(SYS__NR_mmap)(struct pt_regs *ctx)
{
char fmt[] = "mmap\n";
bpf_trace_printk(fmt, sizeof(fmt));
Expand Down

0 comments on commit 4b7190e

Please sign in to comment.