Skip to content

Commit

Permalink
samples: bpf: enable trace samples for s390x
Browse files Browse the repository at this point in the history
The trace bpf samples do not compile on s390x because they use x86
specific fields from the "pt_regs" structure.

Fix this and access the fields via new PT_REGS macros.

Signed-off-by: Michael Holzheu <[email protected]>
Acked-by: Alexei Starovoitov <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Michael Holzheu authored and davem330 committed Jul 8, 2015
1 parent 7baaa90 commit d912557
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 12 deletions.
25 changes: 25 additions & 0 deletions samples/bpf/bpf_helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,29 @@ static int (*bpf_l3_csum_replace)(void *ctx, int off, int from, int to, int flag
static int (*bpf_l4_csum_replace)(void *ctx, int off, int from, int to, int flags) =
(void *) BPF_FUNC_l4_csum_replace;

#if defined(__x86_64__)

#define PT_REGS_PARM1(x) ((x)->di)
#define PT_REGS_PARM2(x) ((x)->si)
#define PT_REGS_PARM3(x) ((x)->dx)
#define PT_REGS_PARM4(x) ((x)->cx)
#define PT_REGS_PARM5(x) ((x)->r8)
#define PT_REGS_RET(x) ((x)->sp)
#define PT_REGS_FP(x) ((x)->bp)
#define PT_REGS_RC(x) ((x)->ax)
#define PT_REGS_SP(x) ((x)->sp)

#elif defined(__s390x__)

#define PT_REGS_PARM1(x) ((x)->gprs[2])
#define PT_REGS_PARM2(x) ((x)->gprs[3])
#define PT_REGS_PARM3(x) ((x)->gprs[4])
#define PT_REGS_PARM4(x) ((x)->gprs[5])
#define PT_REGS_PARM5(x) ((x)->gprs[6])
#define PT_REGS_RET(x) ((x)->gprs[14])
#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_SP(x) ((x)->gprs[15])

#endif
#endif
2 changes: 1 addition & 1 deletion samples/bpf/tracex1_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ int bpf_prog1(struct pt_regs *ctx)
int len;

/* non-portable! works for the given kernel only */
skb = (struct sk_buff *) ctx->di;
skb = (struct sk_buff *) PT_REGS_PARM1(ctx);

dev = _(skb->dev);

Expand Down
6 changes: 3 additions & 3 deletions samples/bpf/tracex2_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ int bpf_prog2(struct pt_regs *ctx)
long init_val = 1;
long *value;

/* x64 specific: read ip of kfree_skb caller.
/* x64/s390x specific: read ip of kfree_skb caller.
* non-portable version of __builtin_return_address(0)
*/
bpf_probe_read(&loc, sizeof(loc), (void *)ctx->sp);
bpf_probe_read(&loc, sizeof(loc), (void *)PT_REGS_RET(ctx));

value = bpf_map_lookup_elem(&my_map, &loc);
if (value)
Expand Down Expand Up @@ -79,7 +79,7 @@ struct bpf_map_def SEC("maps") my_hist_map = {
SEC("kprobe/sys_write")
int bpf_prog3(struct pt_regs *ctx)
{
long write_size = ctx->dx; /* arg3 */
long write_size = PT_REGS_PARM3(ctx);
long init_val = 1;
long *value;
struct hist_key key = {};
Expand Down
4 changes: 2 additions & 2 deletions samples/bpf/tracex3_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ struct bpf_map_def SEC("maps") my_map = {
SEC("kprobe/blk_mq_start_request")
int bpf_prog1(struct pt_regs *ctx)
{
long rq = ctx->di;
long rq = PT_REGS_PARM1(ctx);
u64 val = bpf_ktime_get_ns();

bpf_map_update_elem(&my_map, &rq, &val, BPF_ANY);
Expand Down Expand Up @@ -51,7 +51,7 @@ struct bpf_map_def SEC("maps") lat_map = {
SEC("kprobe/blk_update_request")
int bpf_prog2(struct pt_regs *ctx)
{
long rq = ctx->di;
long rq = PT_REGS_PARM1(ctx);
u64 *value, l, base;
u32 index;

Expand Down
6 changes: 3 additions & 3 deletions samples/bpf/tracex4_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ struct bpf_map_def SEC("maps") my_map = {
SEC("kprobe/kmem_cache_free")
int bpf_prog1(struct pt_regs *ctx)
{
long ptr = ctx->si;
long ptr = PT_REGS_PARM2(ctx);

bpf_map_delete_elem(&my_map, &ptr);
return 0;
Expand All @@ -36,11 +36,11 @@ int bpf_prog1(struct pt_regs *ctx)
SEC("kretprobe/kmem_cache_alloc_node")
int bpf_prog2(struct pt_regs *ctx)
{
long ptr = ctx->ax;
long ptr = PT_REGS_RC(ctx);
long ip = 0;

/* get ip address of kmem_cache_alloc_node() caller */
bpf_probe_read(&ip, sizeof(ip), (void *)(ctx->bp + sizeof(ip)));
bpf_probe_read(&ip, sizeof(ip), (void *)(PT_REGS_FP(ctx) + sizeof(ip)));

struct pair v = {
.val = bpf_ktime_get_ns(),
Expand Down
6 changes: 3 additions & 3 deletions samples/bpf/tracex5_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ int bpf_prog1(struct pt_regs *ctx)
{
struct seccomp_data sd = {};

bpf_probe_read(&sd, sizeof(sd), (void *)ctx->di);
bpf_probe_read(&sd, sizeof(sd), (void *)PT_REGS_PARM1(ctx));

/* dispatch into next BPF program depending on syscall number */
bpf_tail_call(ctx, &progs, sd.nr);
Expand All @@ -42,7 +42,7 @@ PROG(__NR_write)(struct pt_regs *ctx)
{
struct seccomp_data sd = {};

bpf_probe_read(&sd, sizeof(sd), (void *)ctx->di);
bpf_probe_read(&sd, sizeof(sd), (void *)PT_REGS_PARM1(ctx));
if (sd.args[2] == 512) {
char fmt[] = "write(fd=%d, buf=%p, size=%d)\n";
bpf_trace_printk(fmt, sizeof(fmt),
Expand All @@ -55,7 +55,7 @@ PROG(__NR_read)(struct pt_regs *ctx)
{
struct seccomp_data sd = {};

bpf_probe_read(&sd, sizeof(sd), (void *)ctx->di);
bpf_probe_read(&sd, sizeof(sd), (void *)PT_REGS_PARM1(ctx));
if (sd.args[2] > 128 && sd.args[2] <= 1024) {
char fmt[] = "read(fd=%d, buf=%p, size=%d)\n";
bpf_trace_printk(fmt, sizeof(fmt),
Expand Down

0 comments on commit d912557

Please sign in to comment.