samples/bpf: Enable powerpc support
Add the necessary definitions for building bpf samples on ppc. Since ppc doesn't store function return address on the stack, modify how PT_REGS_RET() and PT_REGS_FP() work. Also, introduce PT_REGS_IP() to access the instruction pointer. Cc: Alexei Starovoitov <ast@fb.com> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: David S. Miller <davem@davemloft.net> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Acked-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
128d1514be
commit
138d6153a1
4 changed files with 30 additions and 4 deletions
|
@ -82,6 +82,7 @@ static int (*bpf_l4_csum_replace)(void *ctx, int off, int from, int to, int flag
|
||||||
#define PT_REGS_FP(x) ((x)->bp)
|
#define PT_REGS_FP(x) ((x)->bp)
|
||||||
#define PT_REGS_RC(x) ((x)->ax)
|
#define PT_REGS_RC(x) ((x)->ax)
|
||||||
#define PT_REGS_SP(x) ((x)->sp)
|
#define PT_REGS_SP(x) ((x)->sp)
|
||||||
|
#define PT_REGS_IP(x) ((x)->ip)
|
||||||
|
|
||||||
#elif defined(__s390x__)
|
#elif defined(__s390x__)
|
||||||
|
|
||||||
|
@ -94,6 +95,7 @@ static int (*bpf_l4_csum_replace)(void *ctx, int off, int from, int to, int flag
|
||||||
#define PT_REGS_FP(x) ((x)->gprs[11]) /* Works only with CONFIG_FRAME_POINTER */
|
#define PT_REGS_FP(x) ((x)->gprs[11]) /* Works only with CONFIG_FRAME_POINTER */
|
||||||
#define PT_REGS_RC(x) ((x)->gprs[2])
|
#define PT_REGS_RC(x) ((x)->gprs[2])
|
||||||
#define PT_REGS_SP(x) ((x)->gprs[15])
|
#define PT_REGS_SP(x) ((x)->gprs[15])
|
||||||
|
#define PT_REGS_IP(x) ((x)->ip)
|
||||||
|
|
||||||
#elif defined(__aarch64__)
|
#elif defined(__aarch64__)
|
||||||
|
|
||||||
|
@ -106,6 +108,30 @@ static int (*bpf_l4_csum_replace)(void *ctx, int off, int from, int to, int flag
|
||||||
#define PT_REGS_FP(x) ((x)->regs[29]) /* Works only with CONFIG_FRAME_POINTER */
|
#define PT_REGS_FP(x) ((x)->regs[29]) /* Works only with CONFIG_FRAME_POINTER */
|
||||||
#define PT_REGS_RC(x) ((x)->regs[0])
|
#define PT_REGS_RC(x) ((x)->regs[0])
|
||||||
#define PT_REGS_SP(x) ((x)->sp)
|
#define PT_REGS_SP(x) ((x)->sp)
|
||||||
|
#define PT_REGS_IP(x) ((x)->pc)
|
||||||
|
|
||||||
|
#elif defined(__powerpc__)
|
||||||
|
|
||||||
|
#define PT_REGS_PARM1(x) ((x)->gpr[3])
|
||||||
|
#define PT_REGS_PARM2(x) ((x)->gpr[4])
|
||||||
|
#define PT_REGS_PARM3(x) ((x)->gpr[5])
|
||||||
|
#define PT_REGS_PARM4(x) ((x)->gpr[6])
|
||||||
|
#define PT_REGS_PARM5(x) ((x)->gpr[7])
|
||||||
|
#define PT_REGS_RC(x) ((x)->gpr[3])
|
||||||
|
#define PT_REGS_SP(x) ((x)->sp)
|
||||||
|
#define PT_REGS_IP(x) ((x)->nip)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __powerpc__
|
||||||
|
#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; })
|
||||||
|
#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP
|
||||||
|
#else
|
||||||
|
#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ \
|
||||||
|
bpf_probe_read(&(ip), sizeof(ip), (void *)PT_REGS_RET(ctx)); })
|
||||||
|
#define BPF_KRETPROBE_READ_RET_IP(ip, ctx) ({ \
|
||||||
|
bpf_probe_read(&(ip), sizeof(ip), \
|
||||||
|
(void *)(PT_REGS_FP(ctx) + sizeof(ip))); })
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,7 +34,7 @@ struct bpf_map_def SEC("maps") stackmap = {
|
||||||
#define PROG(foo) \
|
#define PROG(foo) \
|
||||||
int foo(struct pt_regs *ctx) \
|
int foo(struct pt_regs *ctx) \
|
||||||
{ \
|
{ \
|
||||||
long v = ctx->ip, *val; \
|
long v = PT_REGS_IP(ctx), *val; \
|
||||||
\
|
\
|
||||||
val = bpf_map_lookup_elem(&my_map, &v); \
|
val = bpf_map_lookup_elem(&my_map, &v); \
|
||||||
bpf_map_update_elem(&my_map, &v, &v, BPF_ANY); \
|
bpf_map_update_elem(&my_map, &v, &v, BPF_ANY); \
|
||||||
|
|
|
@ -27,10 +27,10 @@ int bpf_prog2(struct pt_regs *ctx)
|
||||||
long init_val = 1;
|
long init_val = 1;
|
||||||
long *value;
|
long *value;
|
||||||
|
|
||||||
/* x64/s390x specific: read ip of kfree_skb caller.
|
/* read ip of kfree_skb caller.
|
||||||
* non-portable version of __builtin_return_address(0)
|
* non-portable version of __builtin_return_address(0)
|
||||||
*/
|
*/
|
||||||
bpf_probe_read(&loc, sizeof(loc), (void *)PT_REGS_RET(ctx));
|
BPF_KPROBE_READ_RET_IP(loc, ctx);
|
||||||
|
|
||||||
value = bpf_map_lookup_elem(&my_map, &loc);
|
value = bpf_map_lookup_elem(&my_map, &loc);
|
||||||
if (value)
|
if (value)
|
||||||
|
|
|
@ -40,7 +40,7 @@ int bpf_prog2(struct pt_regs *ctx)
|
||||||
long ip = 0;
|
long ip = 0;
|
||||||
|
|
||||||
/* get ip address of kmem_cache_alloc_node() caller */
|
/* get ip address of kmem_cache_alloc_node() caller */
|
||||||
bpf_probe_read(&ip, sizeof(ip), (void *)(PT_REGS_FP(ctx) + sizeof(ip)));
|
BPF_KRETPROBE_READ_RET_IP(ip, ctx);
|
||||||
|
|
||||||
struct pair v = {
|
struct pair v = {
|
||||||
.val = bpf_ktime_get_ns(),
|
.val = bpf_ktime_get_ns(),
|
||||||
|
|
Loading…
Add table
Reference in a new issue