summaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
diff options
context:
space:
mode:
authorJakub Kicinski2017-12-15 06:29:17 +0100
committerDaniel Borkmann2017-12-15 14:18:18 +0100
commit2cb230bdedb1b422507359ebc39d8f134300bf01 (patch)
treec4657960936925853118fa7da7f8fc9aa188827e /drivers/net/ethernet/netronome/nfp/bpf/verifier.c
parentnfp: bpf: prepare for parsing BPF FW capabilities (diff)
downloadkernel-qcow2-linux-2cb230bdedb1b422507359ebc39d8f134300bf01.tar.gz
kernel-qcow2-linux-2cb230bdedb1b422507359ebc39d8f134300bf01.tar.xz
kernel-qcow2-linux-2cb230bdedb1b422507359ebc39d8f134300bf01.zip
nfp: bpf: prepare for call support
Add skeleton of verifier checks and translation handler for call instructions. Make sure jump target resolution will not treat them as jumps. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'drivers/net/ethernet/netronome/nfp/bpf/verifier.c')
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/verifier.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
index d2bf29c90226..3b940b682ac3 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
@@ -69,6 +69,20 @@ nfp_bpf_goto_meta(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
}
static int
+nfp_bpf_check_call(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+{
+ u32 func_id = meta->insn.imm;
+
+ switch (func_id) {
+ default:
+ pr_warn("unsupported function id: %d\n", func_id);
+ return -EOPNOTSUPP;
+ }
+
+ return 0;
+}
+
+static int
nfp_bpf_check_exit(struct nfp_prog *nfp_prog,
struct bpf_verifier_env *env)
{
@@ -177,6 +191,8 @@ nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx)
return -EINVAL;
}
+ if (meta->insn.code == (BPF_JMP | BPF_CALL))
+ return nfp_bpf_check_call(nfp_prog, meta);
if (meta->insn.code == (BPF_JMP | BPF_EXIT))
return nfp_bpf_check_exit(nfp_prog, env);