bpf_jit_comp64.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Just-In-Time compiler for eBPF bytecode on MIPS.
  4. * Implementation of JIT functions for 64-bit CPUs.
  5. *
  6. * Copyright (c) 2021 Anyfi Networks AB.
  7. * Author: Johan Almbladh <johan.almbladh@gmail.com>
  8. *
  9. * Based on code and ideas from
  10. * Copyright (c) 2017 Cavium, Inc.
  11. * Copyright (c) 2017 Shubham Bansal <illusionist.neo@gmail.com>
  12. * Copyright (c) 2011 Mircea Gherzan <mgherzan@gmail.com>
  13. */
  14. #include <linux/errno.h>
  15. #include <linux/filter.h>
  16. #include <linux/bpf.h>
  17. #include <asm/cpu-features.h>
  18. #include <asm/isa-rev.h>
  19. #include <asm/uasm.h>
  20. #include "bpf_jit_comp.h"
  21. /* MIPS t0-t3 are not available in the n64 ABI */
  22. #undef MIPS_R_T0
  23. #undef MIPS_R_T1
  24. #undef MIPS_R_T2
  25. #undef MIPS_R_T3
  26. /* Stack is 16-byte aligned in n64 ABI */
  27. #define MIPS_STACK_ALIGNMENT 16
  28. /* Extra 64-bit eBPF registers used by JIT */
  29. #define JIT_REG_TC (MAX_BPF_JIT_REG + 0)
  30. #define JIT_REG_ZX (MAX_BPF_JIT_REG + 1)
  31. /* Number of prologue bytes to skip when doing a tail call */
  32. #define JIT_TCALL_SKIP 4
  33. /* Callee-saved CPU registers that the JIT must preserve */
  34. #define JIT_CALLEE_REGS \
  35. (BIT(MIPS_R_S0) | \
  36. BIT(MIPS_R_S1) | \
  37. BIT(MIPS_R_S2) | \
  38. BIT(MIPS_R_S3) | \
  39. BIT(MIPS_R_S4) | \
  40. BIT(MIPS_R_S5) | \
  41. BIT(MIPS_R_S6) | \
  42. BIT(MIPS_R_S7) | \
  43. BIT(MIPS_R_GP) | \
  44. BIT(MIPS_R_FP) | \
  45. BIT(MIPS_R_RA))
  46. /* Caller-saved CPU registers available for JIT use */
  47. #define JIT_CALLER_REGS \
  48. (BIT(MIPS_R_A5) | \
  49. BIT(MIPS_R_A6) | \
  50. BIT(MIPS_R_A7))
  51. /*
  52. * Mapping of 64-bit eBPF registers to 64-bit native MIPS registers.
  53. * MIPS registers t4 - t7 may be used by the JIT as temporary registers.
  54. * MIPS registers t8 - t9 are reserved for single-register common functions.
  55. */
  56. static const u8 bpf2mips64[] = {
  57. /* Return value from in-kernel function, and exit value from eBPF */
  58. [BPF_REG_0] = MIPS_R_V0,
  59. /* Arguments from eBPF program to in-kernel function */
  60. [BPF_REG_1] = MIPS_R_A0,
  61. [BPF_REG_2] = MIPS_R_A1,
  62. [BPF_REG_3] = MIPS_R_A2,
  63. [BPF_REG_4] = MIPS_R_A3,
  64. [BPF_REG_5] = MIPS_R_A4,
  65. /* Callee-saved registers that in-kernel function will preserve */
  66. [BPF_REG_6] = MIPS_R_S0,
  67. [BPF_REG_7] = MIPS_R_S1,
  68. [BPF_REG_8] = MIPS_R_S2,
  69. [BPF_REG_9] = MIPS_R_S3,
  70. /* Read-only frame pointer to access the eBPF stack */
  71. [BPF_REG_FP] = MIPS_R_FP,
  72. /* Temporary register for blinding constants */
  73. [BPF_REG_AX] = MIPS_R_AT,
  74. /* Tail call count register, caller-saved */
  75. [JIT_REG_TC] = MIPS_R_A5,
  76. /* Constant for register zero-extension */
  77. [JIT_REG_ZX] = MIPS_R_V1,
  78. };
  79. /*
  80. * MIPS 32-bit operations on 64-bit registers generate a sign-extended
  81. * result. However, the eBPF ISA mandates zero-extension, so we rely on the
  82. * verifier to add that for us (emit_zext_ver). In addition, ALU arithmetic
  83. * operations, right shift and byte swap require properly sign-extended
  84. * operands or the result is unpredictable. We emit explicit sign-extensions
  85. * in those cases.
  86. */
  87. /* Sign extension */
  88. static void emit_sext(struct jit_context *ctx, u8 dst, u8 src)
  89. {
  90. emit(ctx, sll, dst, src, 0);
  91. clobber_reg(ctx, dst);
  92. }
  93. /* Zero extension */
  94. static void emit_zext(struct jit_context *ctx, u8 dst)
  95. {
  96. if (cpu_has_mips64r2 || cpu_has_mips64r6) {
  97. emit(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
  98. } else {
  99. emit(ctx, and, dst, dst, bpf2mips64[JIT_REG_ZX]);
  100. access_reg(ctx, JIT_REG_ZX); /* We need the ZX register */
  101. }
  102. clobber_reg(ctx, dst);
  103. }
  104. /* Zero extension, if verifier does not do it for us */
  105. static void emit_zext_ver(struct jit_context *ctx, u8 dst)
  106. {
  107. if (!ctx->program->aux->verifier_zext)
  108. emit_zext(ctx, dst);
  109. }
  110. /* dst = imm (64-bit) */
  111. static void emit_mov_i64(struct jit_context *ctx, u8 dst, u64 imm64)
  112. {
  113. if (imm64 >= 0xffffffffffff8000ULL || imm64 < 0x8000ULL) {
  114. emit(ctx, daddiu, dst, MIPS_R_ZERO, (s16)imm64);
  115. } else if (imm64 >= 0xffffffff80000000ULL ||
  116. (imm64 < 0x80000000 && imm64 > 0xffff)) {
  117. emit(ctx, lui, dst, (s16)(imm64 >> 16));
  118. emit(ctx, ori, dst, dst, (u16)imm64 & 0xffff);
  119. } else {
  120. u8 acc = MIPS_R_ZERO;
  121. int shift = 0;
  122. int k;
  123. for (k = 0; k < 4; k++) {
  124. u16 half = imm64 >> (48 - 16 * k);
  125. if (acc == dst)
  126. shift += 16;
  127. if (half) {
  128. if (shift)
  129. emit(ctx, dsll_safe, dst, dst, shift);
  130. emit(ctx, ori, dst, acc, half);
  131. acc = dst;
  132. shift = 0;
  133. }
  134. }
  135. if (shift)
  136. emit(ctx, dsll_safe, dst, dst, shift);
  137. }
  138. clobber_reg(ctx, dst);
  139. }
  140. /* ALU immediate operation (64-bit) */
  141. static void emit_alu_i64(struct jit_context *ctx, u8 dst, s32 imm, u8 op)
  142. {
  143. switch (BPF_OP(op)) {
  144. /* dst = dst | imm */
  145. case BPF_OR:
  146. emit(ctx, ori, dst, dst, (u16)imm);
  147. break;
  148. /* dst = dst ^ imm */
  149. case BPF_XOR:
  150. emit(ctx, xori, dst, dst, (u16)imm);
  151. break;
  152. /* dst = -dst */
  153. case BPF_NEG:
  154. emit(ctx, dsubu, dst, MIPS_R_ZERO, dst);
  155. break;
  156. /* dst = dst << imm */
  157. case BPF_LSH:
  158. emit(ctx, dsll_safe, dst, dst, imm);
  159. break;
  160. /* dst = dst >> imm */
  161. case BPF_RSH:
  162. emit(ctx, dsrl_safe, dst, dst, imm);
  163. break;
  164. /* dst = dst >> imm (arithmetic) */
  165. case BPF_ARSH:
  166. emit(ctx, dsra_safe, dst, dst, imm);
  167. break;
  168. /* dst = dst + imm */
  169. case BPF_ADD:
  170. emit(ctx, daddiu, dst, dst, imm);
  171. break;
  172. /* dst = dst - imm */
  173. case BPF_SUB:
  174. emit(ctx, daddiu, dst, dst, -imm);
  175. break;
  176. default:
  177. /* Width-generic operations */
  178. emit_alu_i(ctx, dst, imm, op);
  179. }
  180. clobber_reg(ctx, dst);
  181. }
  182. /* ALU register operation (64-bit) */
  183. static void emit_alu_r64(struct jit_context *ctx, u8 dst, u8 src, u8 op)
  184. {
  185. switch (BPF_OP(op)) {
  186. /* dst = dst << src */
  187. case BPF_LSH:
  188. emit(ctx, dsllv, dst, dst, src);
  189. break;
  190. /* dst = dst >> src */
  191. case BPF_RSH:
  192. emit(ctx, dsrlv, dst, dst, src);
  193. break;
  194. /* dst = dst >> src (arithmetic) */
  195. case BPF_ARSH:
  196. emit(ctx, dsrav, dst, dst, src);
  197. break;
  198. /* dst = dst + src */
  199. case BPF_ADD:
  200. emit(ctx, daddu, dst, dst, src);
  201. break;
  202. /* dst = dst - src */
  203. case BPF_SUB:
  204. emit(ctx, dsubu, dst, dst, src);
  205. break;
  206. /* dst = dst * src */
  207. case BPF_MUL:
  208. if (cpu_has_mips64r6) {
  209. emit(ctx, dmulu, dst, dst, src);
  210. } else {
  211. emit(ctx, dmultu, dst, src);
  212. emit(ctx, mflo, dst);
  213. /* Ensure multiplication is completed */
  214. if (IS_ENABLED(CONFIG_CPU_R4000_WORKAROUNDS))
  215. emit(ctx, mfhi, MIPS_R_ZERO);
  216. }
  217. break;
  218. /* dst = dst / src */
  219. case BPF_DIV:
  220. if (cpu_has_mips64r6) {
  221. emit(ctx, ddivu_r6, dst, dst, src);
  222. } else {
  223. emit(ctx, ddivu, dst, src);
  224. emit(ctx, mflo, dst);
  225. }
  226. break;
  227. /* dst = dst % src */
  228. case BPF_MOD:
  229. if (cpu_has_mips64r6) {
  230. emit(ctx, dmodu, dst, dst, src);
  231. } else {
  232. emit(ctx, ddivu, dst, src);
  233. emit(ctx, mfhi, dst);
  234. }
  235. break;
  236. default:
  237. /* Width-generic operations */
  238. emit_alu_r(ctx, dst, src, op);
  239. }
  240. clobber_reg(ctx, dst);
  241. }
  242. /* Swap sub words in a register double word */
  243. static void emit_swap_r64(struct jit_context *ctx, u8 dst, u8 mask, u32 bits)
  244. {
  245. u8 tmp = MIPS_R_T9;
  246. emit(ctx, and, tmp, dst, mask); /* tmp = dst & mask */
  247. emit(ctx, dsll, tmp, tmp, bits); /* tmp = tmp << bits */
  248. emit(ctx, dsrl, dst, dst, bits); /* dst = dst >> bits */
  249. emit(ctx, and, dst, dst, mask); /* dst = dst & mask */
  250. emit(ctx, or, dst, dst, tmp); /* dst = dst | tmp */
  251. }
  252. /* Swap bytes and truncate a register double word, word or half word */
  253. static void emit_bswap_r64(struct jit_context *ctx, u8 dst, u32 width)
  254. {
  255. switch (width) {
  256. /* Swap bytes in a double word */
  257. case 64:
  258. if (cpu_has_mips64r2 || cpu_has_mips64r6) {
  259. emit(ctx, dsbh, dst, dst);
  260. emit(ctx, dshd, dst, dst);
  261. } else {
  262. u8 t1 = MIPS_R_T6;
  263. u8 t2 = MIPS_R_T7;
  264. emit(ctx, dsll32, t2, dst, 0); /* t2 = dst << 32 */
  265. emit(ctx, dsrl32, dst, dst, 0); /* dst = dst >> 32 */
  266. emit(ctx, or, dst, dst, t2); /* dst = dst | t2 */
  267. emit(ctx, ori, t2, MIPS_R_ZERO, 0xffff);
  268. emit(ctx, dsll32, t1, t2, 0); /* t1 = t2 << 32 */
  269. emit(ctx, or, t1, t1, t2); /* t1 = t1 | t2 */
  270. emit_swap_r64(ctx, dst, t1, 16);/* dst = swap16(dst) */
  271. emit(ctx, lui, t2, 0xff); /* t2 = 0x00ff0000 */
  272. emit(ctx, ori, t2, t2, 0xff); /* t2 = t2 | 0x00ff */
  273. emit(ctx, dsll32, t1, t2, 0); /* t1 = t2 << 32 */
  274. emit(ctx, or, t1, t1, t2); /* t1 = t1 | t2 */
  275. emit_swap_r64(ctx, dst, t1, 8); /* dst = swap8(dst) */
  276. }
  277. break;
  278. /* Swap bytes in a half word */
  279. /* Swap bytes in a word */
  280. case 32:
  281. case 16:
  282. emit_sext(ctx, dst, dst);
  283. emit_bswap_r(ctx, dst, width);
  284. if (cpu_has_mips64r2 || cpu_has_mips64r6)
  285. emit_zext(ctx, dst);
  286. break;
  287. }
  288. clobber_reg(ctx, dst);
  289. }
  290. /* Truncate a register double word, word or half word */
  291. static void emit_trunc_r64(struct jit_context *ctx, u8 dst, u32 width)
  292. {
  293. switch (width) {
  294. case 64:
  295. break;
  296. /* Zero-extend a word */
  297. case 32:
  298. emit_zext(ctx, dst);
  299. break;
  300. /* Zero-extend a half word */
  301. case 16:
  302. emit(ctx, andi, dst, dst, 0xffff);
  303. break;
  304. }
  305. clobber_reg(ctx, dst);
  306. }
  307. /* Load operation: dst = *(size*)(src + off) */
  308. static void emit_ldx(struct jit_context *ctx, u8 dst, u8 src, s16 off, u8 size)
  309. {
  310. switch (size) {
  311. /* Load a byte */
  312. case BPF_B:
  313. emit(ctx, lbu, dst, off, src);
  314. break;
  315. /* Load a half word */
  316. case BPF_H:
  317. emit(ctx, lhu, dst, off, src);
  318. break;
  319. /* Load a word */
  320. case BPF_W:
  321. emit(ctx, lwu, dst, off, src);
  322. break;
  323. /* Load a double word */
  324. case BPF_DW:
  325. emit(ctx, ld, dst, off, src);
  326. break;
  327. }
  328. clobber_reg(ctx, dst);
  329. }
  330. /* Store operation: *(size *)(dst + off) = src */
  331. static void emit_stx(struct jit_context *ctx, u8 dst, u8 src, s16 off, u8 size)
  332. {
  333. switch (size) {
  334. /* Store a byte */
  335. case BPF_B:
  336. emit(ctx, sb, src, off, dst);
  337. break;
  338. /* Store a half word */
  339. case BPF_H:
  340. emit(ctx, sh, src, off, dst);
  341. break;
  342. /* Store a word */
  343. case BPF_W:
  344. emit(ctx, sw, src, off, dst);
  345. break;
  346. /* Store a double word */
  347. case BPF_DW:
  348. emit(ctx, sd, src, off, dst);
  349. break;
  350. }
  351. }
  352. /* Atomic read-modify-write */
  353. static void emit_atomic_r64(struct jit_context *ctx,
  354. u8 dst, u8 src, s16 off, u8 code)
  355. {
  356. u8 t1 = MIPS_R_T6;
  357. u8 t2 = MIPS_R_T7;
  358. LLSC_sync(ctx);
  359. emit(ctx, lld, t1, off, dst);
  360. switch (code) {
  361. case BPF_ADD:
  362. case BPF_ADD | BPF_FETCH:
  363. emit(ctx, daddu, t2, t1, src);
  364. break;
  365. case BPF_AND:
  366. case BPF_AND | BPF_FETCH:
  367. emit(ctx, and, t2, t1, src);
  368. break;
  369. case BPF_OR:
  370. case BPF_OR | BPF_FETCH:
  371. emit(ctx, or, t2, t1, src);
  372. break;
  373. case BPF_XOR:
  374. case BPF_XOR | BPF_FETCH:
  375. emit(ctx, xor, t2, t1, src);
  376. break;
  377. case BPF_XCHG:
  378. emit(ctx, move, t2, src);
  379. break;
  380. }
  381. emit(ctx, scd, t2, off, dst);
  382. emit(ctx, LLSC_beqz, t2, -16 - LLSC_offset);
  383. emit(ctx, nop); /* Delay slot */
  384. if (code & BPF_FETCH) {
  385. emit(ctx, move, src, t1);
  386. clobber_reg(ctx, src);
  387. }
  388. }
  389. /* Atomic compare-and-exchange */
  390. static void emit_cmpxchg_r64(struct jit_context *ctx, u8 dst, u8 src, s16 off)
  391. {
  392. u8 r0 = bpf2mips64[BPF_REG_0];
  393. u8 t1 = MIPS_R_T6;
  394. u8 t2 = MIPS_R_T7;
  395. LLSC_sync(ctx);
  396. emit(ctx, lld, t1, off, dst);
  397. emit(ctx, bne, t1, r0, 12);
  398. emit(ctx, move, t2, src); /* Delay slot */
  399. emit(ctx, scd, t2, off, dst);
  400. emit(ctx, LLSC_beqz, t2, -20 - LLSC_offset);
  401. emit(ctx, move, r0, t1); /* Delay slot */
  402. clobber_reg(ctx, r0);
  403. }
  404. /* Function call */
  405. static int emit_call(struct jit_context *ctx, const struct bpf_insn *insn)
  406. {
  407. u8 zx = bpf2mips64[JIT_REG_ZX];
  408. u8 tmp = MIPS_R_T6;
  409. bool fixed;
  410. u64 addr;
  411. /* Decode the call address */
  412. if (bpf_jit_get_func_addr(ctx->program, insn, false,
  413. &addr, &fixed) < 0)
  414. return -1;
  415. if (!fixed)
  416. return -1;
  417. /* Push caller-saved registers on stack */
  418. push_regs(ctx, ctx->clobbered & JIT_CALLER_REGS, 0, 0);
  419. /* Emit function call */
  420. emit_mov_i64(ctx, tmp, addr & JALR_MASK);
  421. emit(ctx, jalr, MIPS_R_RA, tmp);
  422. emit(ctx, nop); /* Delay slot */
  423. /* Restore caller-saved registers */
  424. pop_regs(ctx, ctx->clobbered & JIT_CALLER_REGS, 0, 0);
  425. /* Re-initialize the JIT zero-extension register if accessed */
  426. if (ctx->accessed & BIT(JIT_REG_ZX)) {
  427. emit(ctx, daddiu, zx, MIPS_R_ZERO, -1);
  428. emit(ctx, dsrl32, zx, zx, 0);
  429. }
  430. clobber_reg(ctx, MIPS_R_RA);
  431. clobber_reg(ctx, MIPS_R_V0);
  432. clobber_reg(ctx, MIPS_R_V1);
  433. return 0;
  434. }
  435. /* Function tail call */
  436. static int emit_tail_call(struct jit_context *ctx)
  437. {
  438. u8 ary = bpf2mips64[BPF_REG_2];
  439. u8 ind = bpf2mips64[BPF_REG_3];
  440. u8 tcc = bpf2mips64[JIT_REG_TC];
  441. u8 tmp = MIPS_R_T6;
  442. int off;
  443. /*
  444. * Tail call:
  445. * eBPF R1 - function argument (context ptr), passed in a0-a1
  446. * eBPF R2 - ptr to object with array of function entry points
  447. * eBPF R3 - array index of function to be called
  448. */
  449. /* if (ind >= ary->map.max_entries) goto out */
  450. off = offsetof(struct bpf_array, map.max_entries);
  451. if (off > 0x7fff)
  452. return -1;
  453. emit(ctx, lwu, tmp, off, ary); /* tmp = ary->map.max_entrs*/
  454. emit(ctx, sltu, tmp, ind, tmp); /* tmp = ind < t1 */
  455. emit(ctx, beqz, tmp, get_offset(ctx, 1)); /* PC += off(1) if tmp == 0*/
  456. /* if (--TCC < 0) goto out */
  457. emit(ctx, daddiu, tcc, tcc, -1); /* tcc-- (delay slot) */
  458. emit(ctx, bltz, tcc, get_offset(ctx, 1)); /* PC += off(1) if tcc < 0 */
  459. /* (next insn delay slot) */
  460. /* prog = ary->ptrs[ind] */
  461. off = offsetof(struct bpf_array, ptrs);
  462. if (off > 0x7fff)
  463. return -1;
  464. emit(ctx, dsll, tmp, ind, 3); /* tmp = ind << 3 */
  465. emit(ctx, daddu, tmp, tmp, ary); /* tmp += ary */
  466. emit(ctx, ld, tmp, off, tmp); /* tmp = *(tmp + off) */
  467. /* if (prog == 0) goto out */
  468. emit(ctx, beqz, tmp, get_offset(ctx, 1)); /* PC += off(1) if tmp == 0*/
  469. emit(ctx, nop); /* Delay slot */
  470. /* func = prog->bpf_func + 8 (prologue skip offset) */
  471. off = offsetof(struct bpf_prog, bpf_func);
  472. if (off > 0x7fff)
  473. return -1;
  474. emit(ctx, ld, tmp, off, tmp); /* tmp = *(tmp + off) */
  475. emit(ctx, daddiu, tmp, tmp, JIT_TCALL_SKIP); /* tmp += skip (4) */
  476. /* goto func */
  477. build_epilogue(ctx, tmp);
  478. access_reg(ctx, JIT_REG_TC);
  479. return 0;
  480. }
  481. /*
  482. * Stack frame layout for a JITed program (stack grows down).
  483. *
  484. * Higher address : Previous stack frame :
  485. * +===========================+ <--- MIPS sp before call
  486. * | Callee-saved registers, |
  487. * | including RA and FP |
  488. * +---------------------------+ <--- eBPF FP (MIPS fp)
  489. * | Local eBPF variables |
  490. * | allocated by program |
  491. * +---------------------------+
  492. * | Reserved for caller-saved |
  493. * | registers |
  494. * Lower address +===========================+ <--- MIPS sp
  495. */
  496. /* Build program prologue to set up the stack and registers */
  497. void build_prologue(struct jit_context *ctx)
  498. {
  499. u8 fp = bpf2mips64[BPF_REG_FP];
  500. u8 tc = bpf2mips64[JIT_REG_TC];
  501. u8 zx = bpf2mips64[JIT_REG_ZX];
  502. int stack, saved, locals, reserved;
  503. /*
  504. * In the unlikely event that the TCC limit is raised to more
  505. * than 16 bits, it is clamped to the maximum value allowed for
  506. * the generated code (0xffff). It is better fail to compile
  507. * instead of degrading gracefully.
  508. */
  509. BUILD_BUG_ON(MAX_TAIL_CALL_CNT > 0xffff);
  510. /*
  511. * The first instruction initializes the tail call count register.
  512. * On a tail call, the calling function jumps into the prologue
  513. * after this instruction.
  514. */
  515. emit(ctx, ori, tc, MIPS_R_ZERO, MAX_TAIL_CALL_CNT);
  516. /* === Entry-point for tail calls === */
  517. /*
  518. * If the eBPF frame pointer and tail call count registers were
  519. * accessed they must be preserved. Mark them as clobbered here
  520. * to save and restore them on the stack as needed.
  521. */
  522. if (ctx->accessed & BIT(BPF_REG_FP))
  523. clobber_reg(ctx, fp);
  524. if (ctx->accessed & BIT(JIT_REG_TC))
  525. clobber_reg(ctx, tc);
  526. if (ctx->accessed & BIT(JIT_REG_ZX))
  527. clobber_reg(ctx, zx);
  528. /* Compute the stack space needed for callee-saved registers */
  529. saved = hweight32(ctx->clobbered & JIT_CALLEE_REGS) * sizeof(u64);
  530. saved = ALIGN(saved, MIPS_STACK_ALIGNMENT);
  531. /* Stack space used by eBPF program local data */
  532. locals = ALIGN(ctx->program->aux->stack_depth, MIPS_STACK_ALIGNMENT);
  533. /*
  534. * If we are emitting function calls, reserve extra stack space for
  535. * caller-saved registers needed by the JIT. The required space is
  536. * computed automatically during resource usage discovery (pass 1).
  537. */
  538. reserved = ctx->stack_used;
  539. /* Allocate the stack frame */
  540. stack = ALIGN(saved + locals + reserved, MIPS_STACK_ALIGNMENT);
  541. if (stack)
  542. emit(ctx, daddiu, MIPS_R_SP, MIPS_R_SP, -stack);
  543. /* Store callee-saved registers on stack */
  544. push_regs(ctx, ctx->clobbered & JIT_CALLEE_REGS, 0, stack - saved);
  545. /* Initialize the eBPF frame pointer if accessed */
  546. if (ctx->accessed & BIT(BPF_REG_FP))
  547. emit(ctx, daddiu, fp, MIPS_R_SP, stack - saved);
  548. /* Initialize the ePF JIT zero-extension register if accessed */
  549. if (ctx->accessed & BIT(JIT_REG_ZX)) {
  550. emit(ctx, daddiu, zx, MIPS_R_ZERO, -1);
  551. emit(ctx, dsrl32, zx, zx, 0);
  552. }
  553. ctx->saved_size = saved;
  554. ctx->stack_size = stack;
  555. }
  556. /* Build the program epilogue to restore the stack and registers */
  557. void build_epilogue(struct jit_context *ctx, int dest_reg)
  558. {
  559. /* Restore callee-saved registers from stack */
  560. pop_regs(ctx, ctx->clobbered & JIT_CALLEE_REGS, 0,
  561. ctx->stack_size - ctx->saved_size);
  562. /* Release the stack frame */
  563. if (ctx->stack_size)
  564. emit(ctx, daddiu, MIPS_R_SP, MIPS_R_SP, ctx->stack_size);
  565. /* Jump to return address and sign-extend the 32-bit return value */
  566. emit(ctx, jr, dest_reg);
  567. emit(ctx, sll, MIPS_R_V0, MIPS_R_V0, 0); /* Delay slot */
  568. }
  569. /* Build one eBPF instruction */
  570. int build_insn(const struct bpf_insn *insn, struct jit_context *ctx)
  571. {
  572. u8 dst = bpf2mips64[insn->dst_reg];
  573. u8 src = bpf2mips64[insn->src_reg];
  574. u8 res = bpf2mips64[BPF_REG_0];
  575. u8 code = insn->code;
  576. s16 off = insn->off;
  577. s32 imm = insn->imm;
  578. s32 val, rel;
  579. u8 alu, jmp;
  580. switch (code) {
  581. /* ALU operations */
  582. /* dst = imm */
  583. case BPF_ALU | BPF_MOV | BPF_K:
  584. emit_mov_i(ctx, dst, imm);
  585. emit_zext_ver(ctx, dst);
  586. break;
  587. /* dst = src */
  588. case BPF_ALU | BPF_MOV | BPF_X:
  589. if (imm == 1) {
  590. /* Special mov32 for zext */
  591. emit_zext(ctx, dst);
  592. } else {
  593. emit_mov_r(ctx, dst, src);
  594. emit_zext_ver(ctx, dst);
  595. }
  596. break;
  597. /* dst = -dst */
  598. case BPF_ALU | BPF_NEG:
  599. emit_sext(ctx, dst, dst);
  600. emit_alu_i(ctx, dst, 0, BPF_NEG);
  601. emit_zext_ver(ctx, dst);
  602. break;
  603. /* dst = dst & imm */
  604. /* dst = dst | imm */
  605. /* dst = dst ^ imm */
  606. /* dst = dst << imm */
  607. case BPF_ALU | BPF_OR | BPF_K:
  608. case BPF_ALU | BPF_AND | BPF_K:
  609. case BPF_ALU | BPF_XOR | BPF_K:
  610. case BPF_ALU | BPF_LSH | BPF_K:
  611. if (!valid_alu_i(BPF_OP(code), imm)) {
  612. emit_mov_i(ctx, MIPS_R_T4, imm);
  613. emit_alu_r(ctx, dst, MIPS_R_T4, BPF_OP(code));
  614. } else if (rewrite_alu_i(BPF_OP(code), imm, &alu, &val)) {
  615. emit_alu_i(ctx, dst, val, alu);
  616. }
  617. emit_zext_ver(ctx, dst);
  618. break;
  619. /* dst = dst >> imm */
  620. /* dst = dst >> imm (arithmetic) */
  621. /* dst = dst + imm */
  622. /* dst = dst - imm */
  623. /* dst = dst * imm */
  624. /* dst = dst / imm */
  625. /* dst = dst % imm */
  626. case BPF_ALU | BPF_RSH | BPF_K:
  627. case BPF_ALU | BPF_ARSH | BPF_K:
  628. case BPF_ALU | BPF_ADD | BPF_K:
  629. case BPF_ALU | BPF_SUB | BPF_K:
  630. case BPF_ALU | BPF_MUL | BPF_K:
  631. case BPF_ALU | BPF_DIV | BPF_K:
  632. case BPF_ALU | BPF_MOD | BPF_K:
  633. if (!valid_alu_i(BPF_OP(code), imm)) {
  634. emit_sext(ctx, dst, dst);
  635. emit_mov_i(ctx, MIPS_R_T4, imm);
  636. emit_alu_r(ctx, dst, MIPS_R_T4, BPF_OP(code));
  637. } else if (rewrite_alu_i(BPF_OP(code), imm, &alu, &val)) {
  638. emit_sext(ctx, dst, dst);
  639. emit_alu_i(ctx, dst, val, alu);
  640. }
  641. emit_zext_ver(ctx, dst);
  642. break;
  643. /* dst = dst & src */
  644. /* dst = dst | src */
  645. /* dst = dst ^ src */
  646. /* dst = dst << src */
  647. case BPF_ALU | BPF_AND | BPF_X:
  648. case BPF_ALU | BPF_OR | BPF_X:
  649. case BPF_ALU | BPF_XOR | BPF_X:
  650. case BPF_ALU | BPF_LSH | BPF_X:
  651. emit_alu_r(ctx, dst, src, BPF_OP(code));
  652. emit_zext_ver(ctx, dst);
  653. break;
  654. /* dst = dst >> src */
  655. /* dst = dst >> src (arithmetic) */
  656. /* dst = dst + src */
  657. /* dst = dst - src */
  658. /* dst = dst * src */
  659. /* dst = dst / src */
  660. /* dst = dst % src */
  661. case BPF_ALU | BPF_RSH | BPF_X:
  662. case BPF_ALU | BPF_ARSH | BPF_X:
  663. case BPF_ALU | BPF_ADD | BPF_X:
  664. case BPF_ALU | BPF_SUB | BPF_X:
  665. case BPF_ALU | BPF_MUL | BPF_X:
  666. case BPF_ALU | BPF_DIV | BPF_X:
  667. case BPF_ALU | BPF_MOD | BPF_X:
  668. emit_sext(ctx, dst, dst);
  669. emit_sext(ctx, MIPS_R_T4, src);
  670. emit_alu_r(ctx, dst, MIPS_R_T4, BPF_OP(code));
  671. emit_zext_ver(ctx, dst);
  672. break;
  673. /* dst = imm (64-bit) */
  674. case BPF_ALU64 | BPF_MOV | BPF_K:
  675. emit_mov_i(ctx, dst, imm);
  676. break;
  677. /* dst = src (64-bit) */
  678. case BPF_ALU64 | BPF_MOV | BPF_X:
  679. emit_mov_r(ctx, dst, src);
  680. break;
  681. /* dst = -dst (64-bit) */
  682. case BPF_ALU64 | BPF_NEG:
  683. emit_alu_i64(ctx, dst, 0, BPF_NEG);
  684. break;
  685. /* dst = dst & imm (64-bit) */
  686. /* dst = dst | imm (64-bit) */
  687. /* dst = dst ^ imm (64-bit) */
  688. /* dst = dst << imm (64-bit) */
  689. /* dst = dst >> imm (64-bit) */
  690. /* dst = dst >> imm ((64-bit, arithmetic) */
  691. /* dst = dst + imm (64-bit) */
  692. /* dst = dst - imm (64-bit) */
  693. /* dst = dst * imm (64-bit) */
  694. /* dst = dst / imm (64-bit) */
  695. /* dst = dst % imm (64-bit) */
  696. case BPF_ALU64 | BPF_AND | BPF_K:
  697. case BPF_ALU64 | BPF_OR | BPF_K:
  698. case BPF_ALU64 | BPF_XOR | BPF_K:
  699. case BPF_ALU64 | BPF_LSH | BPF_K:
  700. case BPF_ALU64 | BPF_RSH | BPF_K:
  701. case BPF_ALU64 | BPF_ARSH | BPF_K:
  702. case BPF_ALU64 | BPF_ADD | BPF_K:
  703. case BPF_ALU64 | BPF_SUB | BPF_K:
  704. case BPF_ALU64 | BPF_MUL | BPF_K:
  705. case BPF_ALU64 | BPF_DIV | BPF_K:
  706. case BPF_ALU64 | BPF_MOD | BPF_K:
  707. if (!valid_alu_i(BPF_OP(code), imm)) {
  708. emit_mov_i(ctx, MIPS_R_T4, imm);
  709. emit_alu_r64(ctx, dst, MIPS_R_T4, BPF_OP(code));
  710. } else if (rewrite_alu_i(BPF_OP(code), imm, &alu, &val)) {
  711. emit_alu_i64(ctx, dst, val, alu);
  712. }
  713. break;
  714. /* dst = dst & src (64-bit) */
  715. /* dst = dst | src (64-bit) */
  716. /* dst = dst ^ src (64-bit) */
  717. /* dst = dst << src (64-bit) */
  718. /* dst = dst >> src (64-bit) */
  719. /* dst = dst >> src (64-bit, arithmetic) */
  720. /* dst = dst + src (64-bit) */
  721. /* dst = dst - src (64-bit) */
  722. /* dst = dst * src (64-bit) */
  723. /* dst = dst / src (64-bit) */
  724. /* dst = dst % src (64-bit) */
  725. case BPF_ALU64 | BPF_AND | BPF_X:
  726. case BPF_ALU64 | BPF_OR | BPF_X:
  727. case BPF_ALU64 | BPF_XOR | BPF_X:
  728. case BPF_ALU64 | BPF_LSH | BPF_X:
  729. case BPF_ALU64 | BPF_RSH | BPF_X:
  730. case BPF_ALU64 | BPF_ARSH | BPF_X:
  731. case BPF_ALU64 | BPF_ADD | BPF_X:
  732. case BPF_ALU64 | BPF_SUB | BPF_X:
  733. case BPF_ALU64 | BPF_MUL | BPF_X:
  734. case BPF_ALU64 | BPF_DIV | BPF_X:
  735. case BPF_ALU64 | BPF_MOD | BPF_X:
  736. emit_alu_r64(ctx, dst, src, BPF_OP(code));
  737. break;
  738. /* dst = htole(dst) */
  739. /* dst = htobe(dst) */
  740. case BPF_ALU | BPF_END | BPF_FROM_LE:
  741. case BPF_ALU | BPF_END | BPF_FROM_BE:
  742. if (BPF_SRC(code) ==
  743. #ifdef __BIG_ENDIAN
  744. BPF_FROM_LE
  745. #else
  746. BPF_FROM_BE
  747. #endif
  748. )
  749. emit_bswap_r64(ctx, dst, imm);
  750. else
  751. emit_trunc_r64(ctx, dst, imm);
  752. break;
  753. /* dst = imm64 */
  754. case BPF_LD | BPF_IMM | BPF_DW:
  755. emit_mov_i64(ctx, dst, (u32)imm | ((u64)insn[1].imm << 32));
  756. return 1;
  757. /* LDX: dst = *(size *)(src + off) */
  758. case BPF_LDX | BPF_MEM | BPF_W:
  759. case BPF_LDX | BPF_MEM | BPF_H:
  760. case BPF_LDX | BPF_MEM | BPF_B:
  761. case BPF_LDX | BPF_MEM | BPF_DW:
  762. emit_ldx(ctx, dst, src, off, BPF_SIZE(code));
  763. break;
  764. /* ST: *(size *)(dst + off) = imm */
  765. case BPF_ST | BPF_MEM | BPF_W:
  766. case BPF_ST | BPF_MEM | BPF_H:
  767. case BPF_ST | BPF_MEM | BPF_B:
  768. case BPF_ST | BPF_MEM | BPF_DW:
  769. emit_mov_i(ctx, MIPS_R_T4, imm);
  770. emit_stx(ctx, dst, MIPS_R_T4, off, BPF_SIZE(code));
  771. break;
  772. /* STX: *(size *)(dst + off) = src */
  773. case BPF_STX | BPF_MEM | BPF_W:
  774. case BPF_STX | BPF_MEM | BPF_H:
  775. case BPF_STX | BPF_MEM | BPF_B:
  776. case BPF_STX | BPF_MEM | BPF_DW:
  777. emit_stx(ctx, dst, src, off, BPF_SIZE(code));
  778. break;
  779. /* Speculation barrier */
  780. case BPF_ST | BPF_NOSPEC:
  781. break;
  782. /* Atomics */
  783. case BPF_STX | BPF_ATOMIC | BPF_W:
  784. case BPF_STX | BPF_ATOMIC | BPF_DW:
  785. switch (imm) {
  786. case BPF_ADD:
  787. case BPF_ADD | BPF_FETCH:
  788. case BPF_AND:
  789. case BPF_AND | BPF_FETCH:
  790. case BPF_OR:
  791. case BPF_OR | BPF_FETCH:
  792. case BPF_XOR:
  793. case BPF_XOR | BPF_FETCH:
  794. case BPF_XCHG:
  795. if (BPF_SIZE(code) == BPF_DW) {
  796. emit_atomic_r64(ctx, dst, src, off, imm);
  797. } else if (imm & BPF_FETCH) {
  798. u8 tmp = dst;
  799. if (src == dst) { /* Don't overwrite dst */
  800. emit_mov_r(ctx, MIPS_R_T4, dst);
  801. tmp = MIPS_R_T4;
  802. }
  803. emit_sext(ctx, src, src);
  804. emit_atomic_r(ctx, tmp, src, off, imm);
  805. emit_zext_ver(ctx, src);
  806. } else { /* 32-bit, no fetch */
  807. emit_sext(ctx, MIPS_R_T4, src);
  808. emit_atomic_r(ctx, dst, MIPS_R_T4, off, imm);
  809. }
  810. break;
  811. case BPF_CMPXCHG:
  812. if (BPF_SIZE(code) == BPF_DW) {
  813. emit_cmpxchg_r64(ctx, dst, src, off);
  814. } else {
  815. u8 tmp = res;
  816. if (res == dst) /* Don't overwrite dst */
  817. tmp = MIPS_R_T4;
  818. emit_sext(ctx, tmp, res);
  819. emit_sext(ctx, MIPS_R_T5, src);
  820. emit_cmpxchg_r(ctx, dst, MIPS_R_T5, tmp, off);
  821. if (res == dst) /* Restore result */
  822. emit_mov_r(ctx, res, MIPS_R_T4);
  823. /* Result zext inserted by verifier */
  824. }
  825. break;
  826. default:
  827. goto notyet;
  828. }
  829. break;
  830. /* PC += off if dst == src */
  831. /* PC += off if dst != src */
  832. /* PC += off if dst & src */
  833. /* PC += off if dst > src */
  834. /* PC += off if dst >= src */
  835. /* PC += off if dst < src */
  836. /* PC += off if dst <= src */
  837. /* PC += off if dst > src (signed) */
  838. /* PC += off if dst >= src (signed) */
  839. /* PC += off if dst < src (signed) */
  840. /* PC += off if dst <= src (signed) */
  841. case BPF_JMP32 | BPF_JEQ | BPF_X:
  842. case BPF_JMP32 | BPF_JNE | BPF_X:
  843. case BPF_JMP32 | BPF_JSET | BPF_X:
  844. case BPF_JMP32 | BPF_JGT | BPF_X:
  845. case BPF_JMP32 | BPF_JGE | BPF_X:
  846. case BPF_JMP32 | BPF_JLT | BPF_X:
  847. case BPF_JMP32 | BPF_JLE | BPF_X:
  848. case BPF_JMP32 | BPF_JSGT | BPF_X:
  849. case BPF_JMP32 | BPF_JSGE | BPF_X:
  850. case BPF_JMP32 | BPF_JSLT | BPF_X:
  851. case BPF_JMP32 | BPF_JSLE | BPF_X:
  852. if (off == 0)
  853. break;
  854. setup_jmp_r(ctx, dst == src, BPF_OP(code), off, &jmp, &rel);
  855. emit_sext(ctx, MIPS_R_T4, dst); /* Sign-extended dst */
  856. emit_sext(ctx, MIPS_R_T5, src); /* Sign-extended src */
  857. emit_jmp_r(ctx, MIPS_R_T4, MIPS_R_T5, rel, jmp);
  858. if (finish_jmp(ctx, jmp, off) < 0)
  859. goto toofar;
  860. break;
  861. /* PC += off if dst == imm */
  862. /* PC += off if dst != imm */
  863. /* PC += off if dst & imm */
  864. /* PC += off if dst > imm */
  865. /* PC += off if dst >= imm */
  866. /* PC += off if dst < imm */
  867. /* PC += off if dst <= imm */
  868. /* PC += off if dst > imm (signed) */
  869. /* PC += off if dst >= imm (signed) */
  870. /* PC += off if dst < imm (signed) */
  871. /* PC += off if dst <= imm (signed) */
  872. case BPF_JMP32 | BPF_JEQ | BPF_K:
  873. case BPF_JMP32 | BPF_JNE | BPF_K:
  874. case BPF_JMP32 | BPF_JSET | BPF_K:
  875. case BPF_JMP32 | BPF_JGT | BPF_K:
  876. case BPF_JMP32 | BPF_JGE | BPF_K:
  877. case BPF_JMP32 | BPF_JLT | BPF_K:
  878. case BPF_JMP32 | BPF_JLE | BPF_K:
  879. case BPF_JMP32 | BPF_JSGT | BPF_K:
  880. case BPF_JMP32 | BPF_JSGE | BPF_K:
  881. case BPF_JMP32 | BPF_JSLT | BPF_K:
  882. case BPF_JMP32 | BPF_JSLE | BPF_K:
  883. if (off == 0)
  884. break;
  885. setup_jmp_i(ctx, imm, 32, BPF_OP(code), off, &jmp, &rel);
  886. emit_sext(ctx, MIPS_R_T4, dst); /* Sign-extended dst */
  887. if (valid_jmp_i(jmp, imm)) {
  888. emit_jmp_i(ctx, MIPS_R_T4, imm, rel, jmp);
  889. } else {
  890. /* Move large immediate to register, sign-extended */
  891. emit_mov_i(ctx, MIPS_R_T5, imm);
  892. emit_jmp_r(ctx, MIPS_R_T4, MIPS_R_T5, rel, jmp);
  893. }
  894. if (finish_jmp(ctx, jmp, off) < 0)
  895. goto toofar;
  896. break;
  897. /* PC += off if dst == src */
  898. /* PC += off if dst != src */
  899. /* PC += off if dst & src */
  900. /* PC += off if dst > src */
  901. /* PC += off if dst >= src */
  902. /* PC += off if dst < src */
  903. /* PC += off if dst <= src */
  904. /* PC += off if dst > src (signed) */
  905. /* PC += off if dst >= src (signed) */
  906. /* PC += off if dst < src (signed) */
  907. /* PC += off if dst <= src (signed) */
  908. case BPF_JMP | BPF_JEQ | BPF_X:
  909. case BPF_JMP | BPF_JNE | BPF_X:
  910. case BPF_JMP | BPF_JSET | BPF_X:
  911. case BPF_JMP | BPF_JGT | BPF_X:
  912. case BPF_JMP | BPF_JGE | BPF_X:
  913. case BPF_JMP | BPF_JLT | BPF_X:
  914. case BPF_JMP | BPF_JLE | BPF_X:
  915. case BPF_JMP | BPF_JSGT | BPF_X:
  916. case BPF_JMP | BPF_JSGE | BPF_X:
  917. case BPF_JMP | BPF_JSLT | BPF_X:
  918. case BPF_JMP | BPF_JSLE | BPF_X:
  919. if (off == 0)
  920. break;
  921. setup_jmp_r(ctx, dst == src, BPF_OP(code), off, &jmp, &rel);
  922. emit_jmp_r(ctx, dst, src, rel, jmp);
  923. if (finish_jmp(ctx, jmp, off) < 0)
  924. goto toofar;
  925. break;
  926. /* PC += off if dst == imm */
  927. /* PC += off if dst != imm */
  928. /* PC += off if dst & imm */
  929. /* PC += off if dst > imm */
  930. /* PC += off if dst >= imm */
  931. /* PC += off if dst < imm */
  932. /* PC += off if dst <= imm */
  933. /* PC += off if dst > imm (signed) */
  934. /* PC += off if dst >= imm (signed) */
  935. /* PC += off if dst < imm (signed) */
  936. /* PC += off if dst <= imm (signed) */
  937. case BPF_JMP | BPF_JEQ | BPF_K:
  938. case BPF_JMP | BPF_JNE | BPF_K:
  939. case BPF_JMP | BPF_JSET | BPF_K:
  940. case BPF_JMP | BPF_JGT | BPF_K:
  941. case BPF_JMP | BPF_JGE | BPF_K:
  942. case BPF_JMP | BPF_JLT | BPF_K:
  943. case BPF_JMP | BPF_JLE | BPF_K:
  944. case BPF_JMP | BPF_JSGT | BPF_K:
  945. case BPF_JMP | BPF_JSGE | BPF_K:
  946. case BPF_JMP | BPF_JSLT | BPF_K:
  947. case BPF_JMP | BPF_JSLE | BPF_K:
  948. if (off == 0)
  949. break;
  950. setup_jmp_i(ctx, imm, 64, BPF_OP(code), off, &jmp, &rel);
  951. if (valid_jmp_i(jmp, imm)) {
  952. emit_jmp_i(ctx, dst, imm, rel, jmp);
  953. } else {
  954. /* Move large immediate to register */
  955. emit_mov_i(ctx, MIPS_R_T4, imm);
  956. emit_jmp_r(ctx, dst, MIPS_R_T4, rel, jmp);
  957. }
  958. if (finish_jmp(ctx, jmp, off) < 0)
  959. goto toofar;
  960. break;
  961. /* PC += off */
  962. case BPF_JMP | BPF_JA:
  963. if (off == 0)
  964. break;
  965. if (emit_ja(ctx, off) < 0)
  966. goto toofar;
  967. break;
  968. /* Tail call */
  969. case BPF_JMP | BPF_TAIL_CALL:
  970. if (emit_tail_call(ctx) < 0)
  971. goto invalid;
  972. break;
  973. /* Function call */
  974. case BPF_JMP | BPF_CALL:
  975. if (emit_call(ctx, insn) < 0)
  976. goto invalid;
  977. break;
  978. /* Function return */
  979. case BPF_JMP | BPF_EXIT:
  980. /*
  981. * Optimization: when last instruction is EXIT
  982. * simply continue to epilogue.
  983. */
  984. if (ctx->bpf_index == ctx->program->len - 1)
  985. break;
  986. if (emit_exit(ctx) < 0)
  987. goto toofar;
  988. break;
  989. default:
  990. invalid:
  991. pr_err_once("unknown opcode %02x\n", code);
  992. return -EINVAL;
  993. notyet:
  994. pr_info_once("*** NOT YET: opcode %02x ***\n", code);
  995. return -EFAULT;
  996. toofar:
  997. pr_info_once("*** TOO FAR: jump at %u opcode %02x ***\n",
  998. ctx->bpf_index, code);
  999. return -E2BIG;
  1000. }
  1001. return 0;
  1002. }