Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d912557b authored by Michael Holzheu's avatar Michael Holzheu Committed by David S. Miller
Browse files

samples: bpf: enable trace samples for s390x



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: default avatarMichael Holzheu <holzheu@linux.vnet.ibm.com>
Acked-by: default avatarAlexei Starovoitov <ast@plumgrid.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7baaa909
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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);

+3 −3
Original line number Diff line number Diff line
@@ -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)
@@ -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 = {};
+2 −2
Original line number Diff line number Diff line
@@ -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);
@@ -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;

+3 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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(),
Loading