Commit a99855d1 authored by David S. Miller's avatar David S. Miller

Merge branch 'ebpf-samples-cross-compile'

Joel Fernandes says:

====================
Add cross-compilation support to eBPF samples

These patches fix issues seen when cross-compiling eBPF samples on arm64.
Compared to [1], I dropped the controversial inline-asm patch and exploring
other options to fix it. However these patches are a step in the right
direction and I look forward to getting them into -next and the merge window.

Changes since v3:
- just a repost with acks

[1] https://lkml.org/lkml/2017/8/7/417
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ae3e24fd 8bf2ac25
...@@ -177,6 +177,11 @@ HOSTLOADLIBES_syscall_tp += -lelf ...@@ -177,6 +177,11 @@ HOSTLOADLIBES_syscall_tp += -lelf
LLC ?= llc LLC ?= llc
CLANG ?= clang CLANG ?= clang
# Detect that we're cross compiling and use the cross compiler
ifdef CROSS_COMPILE
HOSTCC = $(CROSS_COMPILE)gcc
endif
# Trick to allow make to be run from this directory # Trick to allow make to be run from this directory
all: all:
$(MAKE) -C ../../ $(CURDIR)/ $(MAKE) -C ../../ $(CURDIR)/
...@@ -225,7 +230,7 @@ $(obj)/%.o: $(src)/%.c ...@@ -225,7 +230,7 @@ $(obj)/%.o: $(src)/%.c
$(CLANG) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) -I$(obj) \ $(CLANG) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) -I$(obj) \
-I$(srctree)/tools/testing/selftests/bpf/ \ -I$(srctree)/tools/testing/selftests/bpf/ \
-D__KERNEL__ -D__ASM_SYSREG_H -Wno-unused-value -Wno-pointer-sign \ -D__KERNEL__ -D__ASM_SYSREG_H -Wno-unused-value -Wno-pointer-sign \
-Wno-compare-distinct-pointer-types \ -D__TARGET_ARCH_$(ARCH) -Wno-compare-distinct-pointer-types \
-Wno-gnu-variable-sized-type-not-at-end \ -Wno-gnu-variable-sized-type-not-at-end \
-Wno-address-of-packed-member -Wno-tautological-compare \ -Wno-address-of-packed-member -Wno-tautological-compare \
-Wno-unknown-warning-option \ -Wno-unknown-warning-option \
......
...@@ -64,3 +64,13 @@ It is also possible to point make to the newly compiled 'llc' or ...@@ -64,3 +64,13 @@ It is also possible to point make to the newly compiled 'llc' or
'clang' command via redefining LLC or CLANG on the make command line:: 'clang' command via redefining LLC or CLANG on the make command line::
make samples/bpf/ LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang make samples/bpf/ LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang
Cross compiling samples
-----------------------
In order to cross-compile, say for arm64 targets, export CROSS_COMPILE and ARCH
environment variables before calling make. This will direct make to build
samples for the cross target.
export ARCH=arm64
export CROSS_COMPILE="aarch64-linux-gnu-"
make samples/bpf/ LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang
...@@ -266,7 +266,7 @@ int stress_hash_map_lookup(struct pt_regs *ctx) ...@@ -266,7 +266,7 @@ int stress_hash_map_lookup(struct pt_regs *ctx)
return 0; return 0;
} }
SEC("kprobe/sys_getpgrp") SEC("kprobe/sys_getppid")
int stress_array_map_lookup(struct pt_regs *ctx) int stress_array_map_lookup(struct pt_regs *ctx)
{ {
u32 key = 1, i; u32 key = 1, i;
......
...@@ -282,7 +282,7 @@ static void test_array_lookup(int cpu) ...@@ -282,7 +282,7 @@ static void test_array_lookup(int cpu)
start_time = time_get_ns(); start_time = time_get_ns();
for (i = 0; i < max_cnt; i++) for (i = 0; i < max_cnt; i++)
syscall(__NR_getpgrp, 0); syscall(__NR_getppid, 0);
printf("%d:array_lookup %lld lookups per sec\n", printf("%d:array_lookup %lld lookups per sec\n",
cpu, max_cnt * 1000000000ll * 64 / (time_get_ns() - start_time)); cpu, max_cnt * 1000000000ll * 64 / (time_get_ns() - start_time));
} }
......
...@@ -109,7 +109,47 @@ static int (*bpf_skb_under_cgroup)(void *ctx, void *map, int index) = ...@@ -109,7 +109,47 @@ static int (*bpf_skb_under_cgroup)(void *ctx, void *map, int index) =
static int (*bpf_skb_change_head)(void *, int len, int flags) = static int (*bpf_skb_change_head)(void *, int len, int flags) =
(void *) BPF_FUNC_skb_change_head; (void *) BPF_FUNC_skb_change_head;
/* Scan the ARCH passed in from ARCH env variable (see Makefile) */
#if defined(__TARGET_ARCH_x86)
#define bpf_target_x86
#define bpf_target_defined
#elif defined(__TARGET_ARCH_s930x)
#define bpf_target_s930x
#define bpf_target_defined
#elif defined(__TARGET_ARCH_arm64)
#define bpf_target_arm64
#define bpf_target_defined
#elif defined(__TARGET_ARCH_mips)
#define bpf_target_mips
#define bpf_target_defined
#elif defined(__TARGET_ARCH_powerpc)
#define bpf_target_powerpc
#define bpf_target_defined
#elif defined(__TARGET_ARCH_sparc)
#define bpf_target_sparc
#define bpf_target_defined
#else
#undef bpf_target_defined
#endif
/* Fall back to what the compiler says */
#ifndef bpf_target_defined
#if defined(__x86_64__) #if defined(__x86_64__)
#define bpf_target_x86
#elif defined(__s390x__)
#define bpf_target_s930x
#elif defined(__aarch64__)
#define bpf_target_arm64
#elif defined(__mips__)
#define bpf_target_mips
#elif defined(__powerpc__)
#define bpf_target_powerpc
#elif defined(__sparc__)
#define bpf_target_sparc
#endif
#endif
#if defined(bpf_target_x86)
#define PT_REGS_PARM1(x) ((x)->di) #define PT_REGS_PARM1(x) ((x)->di)
#define PT_REGS_PARM2(x) ((x)->si) #define PT_REGS_PARM2(x) ((x)->si)
...@@ -122,7 +162,7 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) = ...@@ -122,7 +162,7 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) =
#define PT_REGS_SP(x) ((x)->sp) #define PT_REGS_SP(x) ((x)->sp)
#define PT_REGS_IP(x) ((x)->ip) #define PT_REGS_IP(x) ((x)->ip)
#elif defined(__s390x__) #elif defined(bpf_target_s390x)
#define PT_REGS_PARM1(x) ((x)->gprs[2]) #define PT_REGS_PARM1(x) ((x)->gprs[2])
#define PT_REGS_PARM2(x) ((x)->gprs[3]) #define PT_REGS_PARM2(x) ((x)->gprs[3])
...@@ -135,7 +175,7 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) = ...@@ -135,7 +175,7 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) =
#define PT_REGS_SP(x) ((x)->gprs[15]) #define PT_REGS_SP(x) ((x)->gprs[15])
#define PT_REGS_IP(x) ((x)->psw.addr) #define PT_REGS_IP(x) ((x)->psw.addr)
#elif defined(__aarch64__) #elif defined(bpf_target_arm64)
#define PT_REGS_PARM1(x) ((x)->regs[0]) #define PT_REGS_PARM1(x) ((x)->regs[0])
#define PT_REGS_PARM2(x) ((x)->regs[1]) #define PT_REGS_PARM2(x) ((x)->regs[1])
...@@ -148,7 +188,7 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) = ...@@ -148,7 +188,7 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) =
#define PT_REGS_SP(x) ((x)->sp) #define PT_REGS_SP(x) ((x)->sp)
#define PT_REGS_IP(x) ((x)->pc) #define PT_REGS_IP(x) ((x)->pc)
#elif defined(__mips__) #elif defined(bpf_target_mips)
#define PT_REGS_PARM1(x) ((x)->regs[4]) #define PT_REGS_PARM1(x) ((x)->regs[4])
#define PT_REGS_PARM2(x) ((x)->regs[5]) #define PT_REGS_PARM2(x) ((x)->regs[5])
...@@ -161,7 +201,7 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) = ...@@ -161,7 +201,7 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) =
#define PT_REGS_SP(x) ((x)->regs[29]) #define PT_REGS_SP(x) ((x)->regs[29])
#define PT_REGS_IP(x) ((x)->cp0_epc) #define PT_REGS_IP(x) ((x)->cp0_epc)
#elif defined(__powerpc__) #elif defined(bpf_target_powerpc)
#define PT_REGS_PARM1(x) ((x)->gpr[3]) #define PT_REGS_PARM1(x) ((x)->gpr[3])
#define PT_REGS_PARM2(x) ((x)->gpr[4]) #define PT_REGS_PARM2(x) ((x)->gpr[4])
...@@ -172,7 +212,7 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) = ...@@ -172,7 +212,7 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) =
#define PT_REGS_SP(x) ((x)->sp) #define PT_REGS_SP(x) ((x)->sp)
#define PT_REGS_IP(x) ((x)->nip) #define PT_REGS_IP(x) ((x)->nip)
#elif defined(__sparc__) #elif defined(bpf_target_sparc)
#define PT_REGS_PARM1(x) ((x)->u_regs[UREG_I0]) #define PT_REGS_PARM1(x) ((x)->u_regs[UREG_I0])
#define PT_REGS_PARM2(x) ((x)->u_regs[UREG_I1]) #define PT_REGS_PARM2(x) ((x)->u_regs[UREG_I1])
...@@ -182,6 +222,8 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) = ...@@ -182,6 +222,8 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) =
#define PT_REGS_RET(x) ((x)->u_regs[UREG_I7]) #define PT_REGS_RET(x) ((x)->u_regs[UREG_I7])
#define PT_REGS_RC(x) ((x)->u_regs[UREG_I0]) #define PT_REGS_RC(x) ((x)->u_regs[UREG_I0])
#define PT_REGS_SP(x) ((x)->u_regs[UREG_FP]) #define PT_REGS_SP(x) ((x)->u_regs[UREG_FP])
/* Should this also be a bpf_target check for the sparc case? */
#if defined(__arch64__) #if defined(__arch64__)
#define PT_REGS_IP(x) ((x)->tpc) #define PT_REGS_IP(x) ((x)->tpc)
#else #else
...@@ -190,10 +232,10 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) = ...@@ -190,10 +232,10 @@ static int (*bpf_skb_change_head)(void *, int len, int flags) =
#endif #endif
#ifdef __powerpc__ #ifdef bpf_target_powerpc
#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; }) #define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; })
#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP #define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP
#elif defined(__sparc__) #elif bpf_target_sparc
#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); }) #define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); })
#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP #define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP
#else #else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment