From: Stanislav Fomichev <sdf@google.com>
To: bpf@vger.kernel.org
Cc: ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
martin.lau@linux.dev, song@kernel.org, yhs@fb.com,
john.fastabend@gmail.com, kpsingh@kernel.org, sdf@google.com,
haoluo@google.com, jolsa@kernel.org,
Zi Shen Lim <zlim.lnx@gmail.com>
Subject: [PATCH bpf-next 04/11] bpf: Implement hidden BPF_PUSH64 and BPF_POP64 instructions
Date: Mon, 14 Nov 2022 19:02:03 -0800 [thread overview]
Message-ID: <20221115030210.3159213-5-sdf@google.com> (raw)
In-Reply-To: <20221115030210.3159213-1-sdf@google.com>
Implemented for:
- x86_64 jit (tested)
- arm64 jit (untested)
Interpreter is not implemented because push/pop are currently
used only with xdp kfunc and jit is required to use kfuncs.
Fundamentally:
BPF_ST | BPF_STACK + src_reg == store into the stack
BPF_LD | BPF_STACK + dst_reg == load from the stack
off/imm are unused
Updated disasm code to properly dump these new instructions:
31: (e2) push r1
32: (79) r5 = *(u64 *)(r1 +56)
33: (55) if r5 != 0x0 goto pc+2
34: (b7) r0 = 0
35: (05) goto pc+1
36: (79) r0 = *(u64 *)(r5 +32)
37: (e0) pop r1
Cc: Zi Shen Lim <zlim.lnx@gmail.com>
Suggested-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Stanislav Fomichev <sdf@google.com>
---
arch/arm64/net/bpf_jit_comp.c | 8 ++++++++
arch/x86/net/bpf_jit_comp.c | 8 ++++++++
include/linux/filter.h | 23 +++++++++++++++++++++++
kernel/bpf/disasm.c | 6 ++++++
4 files changed, 45 insertions(+)
diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c
index 62f805f427b7..4c0e70e6572a 100644
--- a/arch/arm64/net/bpf_jit_comp.c
+++ b/arch/arm64/net/bpf_jit_comp.c
@@ -1185,6 +1185,14 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
*/
break;
+ /* kernel hidden stack operations */
+ case BPF_ST | BPF_STACK:
+ emit(A64_PUSH(src, src, A64_SP), ctx);
+ break;
+ case BPF_LD | BPF_STACK:
+ emit(A64_POP(dst, dst, A64_SP), ctx);
+ break;
+
/* ST: *(size *)(dst + off) = imm */
case BPF_ST | BPF_MEM | BPF_W:
case BPF_ST | BPF_MEM | BPF_H:
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
index cec5195602bc..528bece87ca4 100644
--- a/arch/x86/net/bpf_jit_comp.c
+++ b/arch/x86/net/bpf_jit_comp.c
@@ -1324,6 +1324,14 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, u8 *rw_image
EMIT_LFENCE();
break;
+ /* kernel hidden stack operations */
+ case BPF_ST | BPF_STACK:
+ EMIT1(add_1reg(0x50, src_reg)); /* pushq */
+ break;
+ case BPF_LD | BPF_STACK:
+ EMIT1(add_1reg(0x58, dst_reg)); /* popq */
+ break;
+
/* ST: *(u8*)(dst_reg + off) = imm */
case BPF_ST | BPF_MEM | BPF_B:
if (is_ereg(dst_reg))
diff --git a/include/linux/filter.h b/include/linux/filter.h
index efc42a6e3aed..42c61ec8f895 100644
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -76,6 +76,9 @@ struct ctl_table_header;
*/
#define BPF_NOSPEC 0xc0
+/* unused opcode for kernel hidden stack operations */
+#define BPF_STACK 0xe0
+
/* As per nm, we expose JITed images as text (code) section for
* kallsyms. That way, tools like perf can find it to match
* addresses.
@@ -402,6 +405,26 @@ static inline bool insn_is_zext(const struct bpf_insn *insn)
.off = 0, \
.imm = 0 })
+/* Push SRC register value onto the stack */
+
+#define BPF_PUSH64(SRC) \
+ ((struct bpf_insn) { \
+ .code = BPF_ST | BPF_STACK, \
+ .dst_reg = 0, \
+ .src_reg = SRC, \
+ .off = 0, \
+ .imm = 0 })
+
+/* Pop stack value into DST register */
+
+#define BPF_POP64(DST) \
+ ((struct bpf_insn) { \
+ .code = BPF_LD | BPF_STACK, \
+ .dst_reg = DST, \
+ .src_reg = 0, \
+ .off = 0, \
+ .imm = 0 })
+
/* Internal classic blocks for direct assignment */
#define __BPF_STMT(CODE, K) \
diff --git a/kernel/bpf/disasm.c b/kernel/bpf/disasm.c
index 7b4afb7d96db..9cd22f3591de 100644
--- a/kernel/bpf/disasm.c
+++ b/kernel/bpf/disasm.c
@@ -214,6 +214,9 @@ void print_bpf_insn(const struct bpf_insn_cbs *cbs,
insn->off, insn->imm);
} else if (BPF_MODE(insn->code) == 0xc0 /* BPF_NOSPEC, no UAPI */) {
verbose(cbs->private_data, "(%02x) nospec\n", insn->code);
+ } else if (BPF_MODE(insn->code) == 0xe0 /* BPF_STACK, no UAPI */) {
+ verbose(cbs->private_data, "(%02x) push r%d\n",
+ insn->code, insn->src_reg);
} else {
verbose(cbs->private_data, "BUG_st_%02x\n", insn->code);
}
@@ -254,6 +257,9 @@ void print_bpf_insn(const struct bpf_insn_cbs *cbs,
insn->code, insn->dst_reg,
__func_imm_name(cbs, insn, imm,
tmp, sizeof(tmp)));
+ } else if (BPF_MODE(insn->code) == 0xe0 /* BPF_STACK, no UAPI */) {
+ verbose(cbs->private_data, "(%02x) pop r%d\n",
+ insn->code, insn->dst_reg);
} else {
verbose(cbs->private_data, "BUG_ld_%02x\n", insn->code);
return;
--
2.38.1.431.g37b22c650d-goog
next prev parent reply other threads:[~2022-11-15 3:04 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-15 3:01 [PATCH bpf-next 00/11] xdp: hints via kfuncs Stanislav Fomichev
2022-11-15 3:02 ` [PATCH bpf-next 01/11] bpf: Document XDP RX metadata Stanislav Fomichev
2022-11-15 22:31 ` Zvi Effron
2022-11-15 22:43 ` Stanislav Fomichev
2022-11-15 23:34 ` Zvi Effron
2022-11-16 3:50 ` Stanislav Fomichev
2022-11-15 3:02 ` [PATCH bpf-next 02/11] bpf: Introduce bpf_patch Stanislav Fomichev
2022-11-15 3:02 ` [PATCH bpf-next 03/11] bpf: Support inlined/unrolled kfuncs for xdp metadata Stanislav Fomichev
2022-11-15 16:16 ` [xdp-hints] " Toke Høiland-Jørgensen
2022-11-15 18:37 ` Stanislav Fomichev
2022-11-16 20:42 ` Jakub Kicinski
2022-11-16 20:53 ` Stanislav Fomichev
2022-11-15 3:02 ` Stanislav Fomichev [this message]
2022-11-15 3:02 ` [PATCH bpf-next 05/11] veth: Support rx timestamp metadata for xdp Stanislav Fomichev
2022-11-15 16:17 ` [xdp-hints] " Toke Høiland-Jørgensen
2022-11-15 18:37 ` Stanislav Fomichev
2022-11-15 22:46 ` [xdp-hints] " Toke Høiland-Jørgensen
2022-11-16 4:09 ` Stanislav Fomichev
2022-11-16 6:38 ` John Fastabend
2022-11-16 7:47 ` Martin KaFai Lau
2022-11-16 10:08 ` Toke Høiland-Jørgensen
2022-11-16 18:20 ` Martin KaFai Lau
2022-11-16 19:03 ` John Fastabend
2022-11-16 20:50 ` Stanislav Fomichev
2022-11-16 23:47 ` John Fastabend
2022-11-17 0:19 ` Stanislav Fomichev
2022-11-17 2:17 ` Alexei Starovoitov
2022-11-17 2:53 ` Stanislav Fomichev
2022-11-17 2:59 ` Alexei Starovoitov
2022-11-17 4:18 ` Stanislav Fomichev
2022-11-17 6:55 ` John Fastabend
2022-11-17 17:51 ` Stanislav Fomichev
2022-11-17 19:47 ` John Fastabend
2022-11-17 20:17 ` Alexei Starovoitov
2022-11-17 11:32 ` Toke Høiland-Jørgensen
2022-11-17 16:59 ` Alexei Starovoitov
2022-11-17 17:52 ` Stanislav Fomichev
2022-11-17 23:46 ` Toke Høiland-Jørgensen
2022-11-18 0:02 ` Alexei Starovoitov
2022-11-18 0:29 ` Toke Høiland-Jørgensen
2022-11-17 10:27 ` Toke Høiland-Jørgensen
2022-11-15 3:02 ` [PATCH bpf-next 06/11] xdp: Carry over xdp metadata into skb context Stanislav Fomichev
2022-11-15 23:20 ` [xdp-hints] " Toke Høiland-Jørgensen
2022-11-16 3:49 ` Stanislav Fomichev
2022-11-16 9:30 ` [xdp-hints] " Toke Høiland-Jørgensen
2022-11-16 7:04 ` Martin KaFai Lau
2022-11-16 9:48 ` [xdp-hints] " Toke Høiland-Jørgensen
2022-11-16 20:51 ` Stanislav Fomichev
2022-11-16 20:51 ` Stanislav Fomichev
2022-11-16 21:12 ` Jakub Kicinski
2022-11-16 21:49 ` Martin KaFai Lau
2022-11-18 14:05 ` Jesper Dangaard Brouer
2022-11-18 18:18 ` Stanislav Fomichev
2022-11-19 12:31 ` [xdp-hints] " Toke Høiland-Jørgensen
2022-11-21 17:53 ` Stanislav Fomichev
2022-11-21 18:47 ` Jakub Kicinski
2022-11-21 19:41 ` Stanislav Fomichev
2022-11-15 3:02 ` [PATCH bpf-next 07/11] selftests/bpf: Verify xdp_metadata xdp->af_xdp path Stanislav Fomichev
2022-11-15 3:02 ` [PATCH bpf-next 08/11] selftests/bpf: Verify xdp_metadata xdp->skb path Stanislav Fomichev
2022-11-15 3:02 ` [PATCH bpf-next 09/11] mlx4: Introduce mlx4_xdp_buff wrapper for xdp_buff Stanislav Fomichev
2022-11-15 3:02 ` [PATCH bpf-next 10/11] mxl4: Support rx timestamp metadata for xdp Stanislav Fomichev
2022-11-15 3:02 ` [PATCH bpf-next 11/11] selftests/bpf: Simple program to dump XDP RX metadata Stanislav Fomichev
2022-11-15 15:54 ` [xdp-hints] [PATCH bpf-next 00/11] xdp: hints via kfuncs Toke Høiland-Jørgensen
2022-11-15 18:37 ` Stanislav Fomichev
2022-11-15 22:31 ` [xdp-hints] " Toke Høiland-Jørgensen
2022-11-15 22:54 ` [xdp-hints] " Alexei Starovoitov
2022-11-15 23:13 ` [xdp-hints] " Toke Høiland-Jørgensen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221115030210.3159213-5-sdf@google.com \
--to=sdf@google.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=haoluo@google.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kpsingh@kernel.org \
--cc=martin.lau@linux.dev \
--cc=song@kernel.org \
--cc=yhs@fb.com \
--cc=zlim.lnx@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox