forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 1f93a7dfd1f8d5ff7a5c53246c7534fe2332d6f4
kernel/arch/arm64/net/bpf_jit.h
....@@ -1,19 +1,8 @@
1
+/* SPDX-License-Identifier: GPL-2.0-only */
12 /*
23 * BPF JIT compiler for ARM64
34 *
45 * Copyright (C) 2014-2016 Zi Shen Lim <zlim.lnx@gmail.com>
5
- *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License version 2 as
8
- * published by the Free Software Foundation.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
176 */
187 #ifndef _BPF_JIT_H
198 #define _BPF_JIT_H
....@@ -111,6 +100,14 @@
111100 /* Rd = Rn OP imm12 */
112101 #define A64_ADD_I(sf, Rd, Rn, imm12) A64_ADDSUB_IMM(sf, Rd, Rn, imm12, ADD)
113102 #define A64_SUB_I(sf, Rd, Rn, imm12) A64_ADDSUB_IMM(sf, Rd, Rn, imm12, SUB)
103
+#define A64_ADDS_I(sf, Rd, Rn, imm12) \
104
+ A64_ADDSUB_IMM(sf, Rd, Rn, imm12, ADD_SETFLAGS)
105
+#define A64_SUBS_I(sf, Rd, Rn, imm12) \
106
+ A64_ADDSUB_IMM(sf, Rd, Rn, imm12, SUB_SETFLAGS)
107
+/* Rn + imm12; set condition flags */
108
+#define A64_CMN_I(sf, Rn, imm12) A64_ADDS_I(sf, A64_ZR, Rn, imm12)
109
+/* Rn - imm12; set condition flags */
110
+#define A64_CMP_I(sf, Rn, imm12) A64_SUBS_I(sf, A64_ZR, Rn, imm12)
114111 /* Rd = Rn */
115112 #define A64_MOV(sf, Rd, Rn) A64_ADD_I(sf, Rd, Rn, 0)
116113
....@@ -182,6 +179,9 @@
182179 /* Rd = Ra + Rn * Rm */
183180 #define A64_MADD(sf, Rd, Ra, Rn, Rm) aarch64_insn_gen_data3(Rd, Ra, Rn, Rm, \
184181 A64_VARIANT(sf), AARCH64_INSN_DATA3_MADD)
182
+/* Rd = Ra - Rn * Rm */
183
+#define A64_MSUB(sf, Rd, Ra, Rn, Rm) aarch64_insn_gen_data3(Rd, Ra, Rn, Rm, \
184
+ A64_VARIANT(sf), AARCH64_INSN_DATA3_MSUB)
185185 /* Rd = Rn * Rm */
186186 #define A64_MUL(sf, Rd, Rn, Rm) A64_MADD(sf, Rd, A64_ZR, Rn, Rm)
187187
....@@ -197,4 +197,26 @@
197197 /* Rn & Rm; set condition flags */
198198 #define A64_TST(sf, Rn, Rm) A64_ANDS(sf, A64_ZR, Rn, Rm)
199199
200
+/* Logical (immediate) */
201
+#define A64_LOGIC_IMM(sf, Rd, Rn, imm, type) ({ \
202
+ u64 imm64 = (sf) ? (u64)imm : (u64)(u32)imm; \
203
+ aarch64_insn_gen_logical_immediate(AARCH64_INSN_LOGIC_##type, \
204
+ A64_VARIANT(sf), Rn, Rd, imm64); \
205
+})
206
+/* Rd = Rn OP imm */
207
+#define A64_AND_I(sf, Rd, Rn, imm) A64_LOGIC_IMM(sf, Rd, Rn, imm, AND)
208
+#define A64_ORR_I(sf, Rd, Rn, imm) A64_LOGIC_IMM(sf, Rd, Rn, imm, ORR)
209
+#define A64_EOR_I(sf, Rd, Rn, imm) A64_LOGIC_IMM(sf, Rd, Rn, imm, EOR)
210
+#define A64_ANDS_I(sf, Rd, Rn, imm) A64_LOGIC_IMM(sf, Rd, Rn, imm, AND_SETFLAGS)
211
+/* Rn & imm; set condition flags */
212
+#define A64_TST_I(sf, Rn, imm) A64_ANDS_I(sf, A64_ZR, Rn, imm)
213
+
214
+/* HINTs */
215
+#define A64_HINT(x) aarch64_insn_gen_hint(x)
216
+
217
+/* BTI */
218
+#define A64_BTI_C A64_HINT(AARCH64_INSN_HINT_BTIC)
219
+#define A64_BTI_J A64_HINT(AARCH64_INSN_HINT_BTIJ)
220
+#define A64_BTI_JC A64_HINT(AARCH64_INSN_HINT_BTIJC)
221
+
200222 #endif /* _BPF_JIT_H */