]>
Commit | Line | Data |
---|---|---|
cd7df56e JK |
1 | /* |
2 | * Copyright (C) 2016 Netronome Systems, Inc. | |
3 | * | |
4 | * This software is dual licensed under the GNU General License Version 2, | |
5 | * June 1991 as shown in the file COPYING in the top-level directory of this | |
6 | * source tree or the BSD 2-Clause License provided below. You have the | |
7 | * option to license this software under the complete terms of either license. | |
8 | * | |
9 | * The BSD 2-Clause License: | |
10 | * | |
11 | * Redistribution and use in source and binary forms, with or | |
12 | * without modification, are permitted provided that the following | |
13 | * conditions are met: | |
14 | * | |
15 | * 1. Redistributions of source code must retain the above | |
16 | * copyright notice, this list of conditions and the following | |
17 | * disclaimer. | |
18 | * | |
19 | * 2. Redistributions in binary form must reproduce the above | |
20 | * copyright notice, this list of conditions and the following | |
21 | * disclaimer in the documentation and/or other materials | |
22 | * provided with the distribution. | |
23 | * | |
24 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
25 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
26 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
27 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | |
28 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | |
29 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
30 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
31 | * SOFTWARE. | |
32 | */ | |
33 | ||
34 | #ifndef __NFP_BPF_H__ | |
35 | #define __NFP_BPF_H__ 1 | |
36 | ||
37 | #include <linux/bitfield.h> | |
38 | #include <linux/bpf.h> | |
2ca71441 | 39 | #include <linux/bpf_verifier.h> |
cd7df56e JK |
40 | #include <linux/list.h> |
41 | #include <linux/types.h> | |
42 | ||
b3f868df | 43 | #include "../nfp_asm.h" |
c66a9cf4 | 44 | |
cd7df56e JK |
45 | /* For branch fixup logic use up-most byte of branch instruction as scratch |
46 | * area. Remember to clear this before sending instructions to HW! | |
47 | */ | |
48 | #define OP_BR_SPECIAL 0xff00000000000000ULL | |
49 | ||
50 | enum br_special { | |
51 | OP_BR_NORMAL = 0, | |
52 | OP_BR_GO_OUT, | |
53 | OP_BR_GO_ABORT, | |
54 | }; | |
55 | ||
56 | enum static_regs { | |
18e53b6c | 57 | STATIC_REG_IMM = 21, /* Bank AB */ |
d3488480 | 58 | STATIC_REG_STACK = 22, /* Bank A */ |
18e53b6c JK |
59 | STATIC_REG_PKT_LEN = 22, /* Bank B */ |
60 | }; | |
61 | ||
62 | enum pkt_vec { | |
63 | PKT_VEC_PKT_LEN = 0, | |
64 | PKT_VEC_PKT_PTR = 2, | |
cd7df56e JK |
65 | }; |
66 | ||
18e53b6c JK |
67 | #define pv_len(np) reg_lm(1, PKT_VEC_PKT_LEN) |
68 | #define pv_ctm_ptr(np) reg_lm(1, PKT_VEC_PKT_PTR) | |
69 | ||
d3488480 JK |
70 | #define stack_reg(np) reg_a(STATIC_REG_STACK) |
71 | #define stack_imm(np) imm_b(np) | |
18e53b6c JK |
72 | #define plen_reg(np) reg_b(STATIC_REG_PKT_LEN) |
73 | #define pptr_reg(np) pv_ctm_ptr(np) | |
74 | #define imm_a(np) reg_a(STATIC_REG_IMM) | |
75 | #define imm_b(np) reg_b(STATIC_REG_IMM) | |
76 | #define imm_both(np) reg_both(STATIC_REG_IMM) | |
cd7df56e | 77 | |
509144e2 | 78 | #define NFP_BPF_ABI_FLAGS reg_imm(0) |
19d0f54e | 79 | #define NFP_BPF_ABI_FLAG_MARK 1 |
cd7df56e JK |
80 | |
81 | struct nfp_prog; | |
82 | struct nfp_insn_meta; | |
83 | typedef int (*instr_cb_t)(struct nfp_prog *, struct nfp_insn_meta *); | |
84 | ||
85 | #define nfp_prog_first_meta(nfp_prog) \ | |
86 | list_first_entry(&(nfp_prog)->insns, struct nfp_insn_meta, l) | |
87 | #define nfp_prog_last_meta(nfp_prog) \ | |
88 | list_last_entry(&(nfp_prog)->insns, struct nfp_insn_meta, l) | |
89 | #define nfp_meta_next(meta) list_next_entry(meta, l) | |
90 | #define nfp_meta_prev(meta) list_prev_entry(meta, l) | |
91 | ||
92 | /** | |
93 | * struct nfp_insn_meta - BPF instruction wrapper | |
94 | * @insn: BPF instruction | |
2ca71441 | 95 | * @ptr: pointer type for memory operations |
b14157ee | 96 | * @ptr_not_const: pointer is not always constant |
cd7df56e JK |
97 | * @off: index of first generated machine instruction (in nfp_prog.prog) |
98 | * @n: eBPF instruction number | |
99 | * @skip: skip this instruction (optimized out) | |
100 | * @double_cb: callback for second part of the instruction | |
101 | * @l: link on nfp_prog->insns list | |
102 | */ | |
103 | struct nfp_insn_meta { | |
104 | struct bpf_insn insn; | |
2ca71441 | 105 | struct bpf_reg_state ptr; |
b14157ee | 106 | bool ptr_not_const; |
cd7df56e JK |
107 | unsigned int off; |
108 | unsigned short n; | |
109 | bool skip; | |
110 | instr_cb_t double_cb; | |
111 | ||
112 | struct list_head l; | |
113 | }; | |
114 | ||
115 | #define BPF_SIZE_MASK 0x18 | |
116 | ||
117 | static inline u8 mbpf_class(const struct nfp_insn_meta *meta) | |
118 | { | |
119 | return BPF_CLASS(meta->insn.code); | |
120 | } | |
121 | ||
122 | static inline u8 mbpf_src(const struct nfp_insn_meta *meta) | |
123 | { | |
124 | return BPF_SRC(meta->insn.code); | |
125 | } | |
126 | ||
127 | static inline u8 mbpf_op(const struct nfp_insn_meta *meta) | |
128 | { | |
129 | return BPF_OP(meta->insn.code); | |
130 | } | |
131 | ||
132 | static inline u8 mbpf_mode(const struct nfp_insn_meta *meta) | |
133 | { | |
134 | return BPF_MODE(meta->insn.code); | |
135 | } | |
136 | ||
137 | /** | |
138 | * struct nfp_prog - nfp BPF program | |
139 | * @prog: machine code | |
140 | * @prog_len: number of valid instructions in @prog array | |
141 | * @__prog_alloc_len: alloc size of @prog array | |
c6c580d7 | 142 | * @verifier_meta: temporary storage for verifier's insn meta |
012bb8a8 | 143 | * @type: BPF program type |
cd7df56e JK |
144 | * @start_off: address of the first instruction in the memory |
145 | * @tgt_out: jump target for normal exit | |
146 | * @tgt_abort: jump target for abort (e.g. access outside of packet buffer) | |
147 | * @tgt_done: jump target to get the next packet | |
148 | * @n_translated: number of successfully translated instructions (for errors) | |
149 | * @error: error code if something went wrong | |
ee9133a8 | 150 | * @stack_depth: max stack depth from the verifier |
cd7df56e JK |
151 | * @insns: list of BPF instruction wrappers (struct nfp_insn_meta) |
152 | */ | |
153 | struct nfp_prog { | |
154 | u64 *prog; | |
155 | unsigned int prog_len; | |
156 | unsigned int __prog_alloc_len; | |
157 | ||
c6c580d7 JK |
158 | struct nfp_insn_meta *verifier_meta; |
159 | ||
012bb8a8 | 160 | enum bpf_prog_type type; |
cd7df56e | 161 | |
cd7df56e JK |
162 | unsigned int start_off; |
163 | unsigned int tgt_out; | |
164 | unsigned int tgt_abort; | |
165 | unsigned int tgt_done; | |
166 | ||
167 | unsigned int n_translated; | |
168 | int error; | |
169 | ||
ee9133a8 JK |
170 | unsigned int stack_depth; |
171 | ||
cd7df56e JK |
172 | struct list_head insns; |
173 | }; | |
174 | ||
d3f89b98 JK |
175 | /** |
176 | * struct nfp_bpf_vnic - per-vNIC BPF priv structure | |
177 | * @tc_prog: currently loaded cls_bpf program | |
178 | */ | |
179 | struct nfp_bpf_vnic { | |
180 | struct bpf_prog *tc_prog; | |
181 | }; | |
182 | ||
c6c580d7 | 183 | int nfp_bpf_jit(struct nfp_prog *prog); |
cd7df56e | 184 | |
c6c580d7 | 185 | extern const struct bpf_ext_analyzer_ops nfp_bpf_analyzer_ops; |
cd7df56e | 186 | |
c6c580d7 JK |
187 | struct netdev_bpf; |
188 | struct nfp_app; | |
bb45e51c | 189 | struct nfp_net; |
bb45e51c | 190 | |
9ce7a956 | 191 | int nfp_net_bpf_offload(struct nfp_net *nn, struct bpf_prog *prog, |
e4a91cd5 | 192 | bool old_prog); |
bb45e51c | 193 | |
c6c580d7 JK |
194 | int nfp_bpf_verifier_prep(struct nfp_app *app, struct nfp_net *nn, |
195 | struct netdev_bpf *bpf); | |
196 | int nfp_bpf_translate(struct nfp_app *app, struct nfp_net *nn, | |
197 | struct bpf_prog *prog); | |
198 | int nfp_bpf_destroy(struct nfp_app *app, struct nfp_net *nn, | |
199 | struct bpf_prog *prog); | |
cd7df56e | 200 | #endif |