bpf_jit.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Common functionality for PARISC32 and PARISC64 BPF JIT compilers
  4. *
  5. * Copyright (c) 2023 Helge Deller <deller@gmx.de>
  6. *
  7. */
  8. #ifndef _BPF_JIT_H
  9. #define _BPF_JIT_H
  10. #include <linux/bpf.h>
  11. #include <linux/filter.h>
  12. #include <asm/cacheflush.h>
  13. #define HPPA_JIT_DEBUG 0
  14. #define HPPA_JIT_REBOOT 0
  15. #define HPPA_JIT_DUMP 0
  16. #define OPTIMIZE_HPPA 1 /* enable some asm optimizations */
  17. // echo 1 > /proc/sys/net/core/bpf_jit_enable
  18. #define HPPA_R(nr) nr /* use HPPA register #nr */
  19. enum {
  20. HPPA_REG_ZERO = 0, /* The constant value 0 */
  21. HPPA_REG_R1 = 1, /* used for addil */
  22. HPPA_REG_RP = 2, /* Return address */
  23. HPPA_REG_ARG7 = 19, /* ARG4-7 used in 64-bit ABI */
  24. HPPA_REG_ARG6 = 20,
  25. HPPA_REG_ARG5 = 21,
  26. HPPA_REG_ARG4 = 22,
  27. HPPA_REG_ARG3 = 23, /* ARG0-3 in 32- and 64-bit ABI */
  28. HPPA_REG_ARG2 = 24,
  29. HPPA_REG_ARG1 = 25,
  30. HPPA_REG_ARG0 = 26,
  31. HPPA_REG_GP = 27, /* Global pointer */
  32. HPPA_REG_RET0 = 28, /* Return value, HI in 32-bit */
  33. HPPA_REG_RET1 = 29, /* Return value, LOW in 32-bit */
  34. HPPA_REG_SP = 30, /* Stack pointer */
  35. HPPA_REG_R31 = 31,
  36. #ifdef CONFIG_64BIT
  37. HPPA_REG_TCC = 3,
  38. HPPA_REG_TCC_SAVED = 4,
  39. HPPA_REG_TCC_IN_INIT = HPPA_REG_R31,
  40. #else
  41. HPPA_REG_TCC = 18,
  42. HPPA_REG_TCC_SAVED = 17,
  43. HPPA_REG_TCC_IN_INIT = HPPA_REG_R31,
  44. #endif
  45. HPPA_REG_T0 = HPPA_REG_R1, /* Temporaries */
  46. HPPA_REG_T1 = HPPA_REG_R31,
  47. HPPA_REG_T2 = HPPA_REG_ARG4,
  48. #ifndef CONFIG_64BIT
  49. HPPA_REG_T3 = HPPA_REG_ARG5, /* not used in 64-bit */
  50. HPPA_REG_T4 = HPPA_REG_ARG6,
  51. HPPA_REG_T5 = HPPA_REG_ARG7,
  52. #endif
  53. };
  54. struct hppa_jit_context {
  55. struct bpf_prog *prog;
  56. u32 *insns; /* HPPA insns */
  57. int ninsns;
  58. int reg_seen_collect;
  59. int reg_seen;
  60. int body_len;
  61. int epilogue_offset;
  62. int prologue_len;
  63. int *offset; /* BPF to HPPA */
  64. };
  65. #define REG_SET_SEEN(ctx, nr) { if (ctx->reg_seen_collect) ctx->reg_seen |= BIT(nr); }
  66. #define REG_SET_SEEN_ALL(ctx) { if (ctx->reg_seen_collect) ctx->reg_seen = -1; }
  67. #define REG_FORCE_SEEN(ctx, nr) { ctx->reg_seen |= BIT(nr); }
  68. #define REG_WAS_SEEN(ctx, nr) (ctx->reg_seen & BIT(nr))
  69. #define REG_ALL_SEEN(ctx) (ctx->reg_seen == -1)
  70. #define HPPA_INSN_SIZE 4 /* bytes per HPPA asm instruction */
  71. #define REG_SIZE REG_SZ /* bytes per native "long" word */
  72. /* subtract hppa displacement on branches which is .+8 */
  73. #define HPPA_BRANCH_DISPLACEMENT 2 /* instructions */
  74. /* asm statement indicator to execute delay slot */
  75. #define EXEC_NEXT_INSTR 0
  76. #define NOP_NEXT_INSTR 1
  77. #define im11(val) (((u32)(val)) & 0x07ff)
  78. #define hppa_ldil(addr, reg) \
  79. hppa_t5_insn(0x08, reg, ((u32)(addr)) >> 11) /* ldil im21,reg */
  80. #define hppa_addil(addr, reg) \
  81. hppa_t5_insn(0x0a, reg, ((u32)(addr)) >> 11) /* addil im21,reg -> result in gr1 */
  82. #define hppa_ldo(im14, reg, target) \
  83. hppa_t1_insn(0x0d, reg, target, im14) /* ldo val14(reg),target */
  84. #define hppa_ldi(im14, reg) \
  85. hppa_ldo(im14, HPPA_REG_ZERO, reg) /* ldi val14,reg */
  86. #define hppa_or(reg1, reg2, target) \
  87. hppa_t6_insn(0x02, reg2, reg1, 0, 0, 0x09, target) /* or reg1,reg2,target */
  88. #define hppa_or_cond(reg1, reg2, cond, f, target) \
  89. hppa_t6_insn(0x02, reg2, reg1, cond, f, 0x09, target)
  90. #define hppa_and(reg1, reg2, target) \
  91. hppa_t6_insn(0x02, reg2, reg1, 0, 0, 0x08, target) /* and reg1,reg2,target */
  92. #define hppa_and_cond(reg1, reg2, cond, f, target) \
  93. hppa_t6_insn(0x02, reg2, reg1, cond, f, 0x08, target)
  94. #define hppa_xor(reg1, reg2, target) \
  95. hppa_t6_insn(0x02, reg2, reg1, 0, 0, 0x0a, target) /* xor reg1,reg2,target */
  96. #define hppa_add(reg1, reg2, target) \
  97. hppa_t6_insn(0x02, reg2, reg1, 0, 0, 0x18, target) /* add reg1,reg2,target */
  98. #define hppa_addc(reg1, reg2, target) \
  99. hppa_t6_insn(0x02, reg2, reg1, 0, 0, 0x1c, target) /* add,c reg1,reg2,target */
  100. #define hppa_sub(reg1, reg2, target) \
  101. hppa_t6_insn(0x02, reg2, reg1, 0, 0, 0x10, target) /* sub reg1,reg2,target */
  102. #define hppa_subb(reg1, reg2, target) \
  103. hppa_t6_insn(0x02, reg2, reg1, 0, 0, 0x14, target) /* sub,b reg1,reg2,target */
  104. #define hppa_nop() \
  105. hppa_or(0,0,0) /* nop: or 0,0,0 */
  106. #define hppa_addi(val11, reg, target) \
  107. hppa_t7_insn(0x2d, reg, target, val11) /* addi im11,reg,target */
  108. #define hppa_subi(val11, reg, target) \
  109. hppa_t7_insn(0x25, reg, target, val11) /* subi im11,reg,target */
  110. #define hppa_copy(reg, target) \
  111. hppa_or(reg, HPPA_REG_ZERO, target) /* copy reg,target */
  112. #define hppa_ldw(val14, reg, target) \
  113. hppa_t1_insn(0x12, reg, target, val14) /* ldw im14(reg),target */
  114. #define hppa_ldb(val14, reg, target) \
  115. hppa_t1_insn(0x10, reg, target, val14) /* ldb im14(reg),target */
  116. #define hppa_ldh(val14, reg, target) \
  117. hppa_t1_insn(0x11, reg, target, val14) /* ldh im14(reg),target */
  118. #define hppa_stw(reg, val14, base) \
  119. hppa_t1_insn(0x1a, base, reg, val14) /* stw reg,im14(base) */
  120. #define hppa_stb(reg, val14, base) \
  121. hppa_t1_insn(0x18, base, reg, val14) /* stb reg,im14(base) */
  122. #define hppa_sth(reg, val14, base) \
  123. hppa_t1_insn(0x19, base, reg, val14) /* sth reg,im14(base) */
  124. #define hppa_stwma(reg, val14, base) \
  125. hppa_t1_insn(0x1b, base, reg, val14) /* stw,ma reg,im14(base) */
  126. #define hppa_bv(reg, base, nop) \
  127. hppa_t11_insn(0x3a, base, reg, 0x06, 0, nop) /* bv(,n) reg(base) */
  128. #define hppa_be(offset, base) \
  129. hppa_t12_insn(0x38, base, offset, 0x00, 1) /* be,n offset(0,base) */
  130. #define hppa_be_l(offset, base, nop) \
  131. hppa_t12_insn(0x39, base, offset, 0x00, nop) /* ble(,nop) offset(0,base) */
  132. #define hppa_mtctl(reg, cr) \
  133. hppa_t21_insn(0x00, cr, reg, 0xc2, 0) /* mtctl reg,cr */
  134. #define hppa_mtsar(reg) \
  135. hppa_mtctl(reg, 11) /* mtsar reg */
  136. #define hppa_zdep(r, p, len, target) \
  137. hppa_t10_insn(0x35, target, r, 0, 2, p, len) /* zdep r,a,b,t */
  138. #define hppa_shl(r, len, target) \
  139. hppa_zdep(r, len, len, lo(rd))
  140. #define hppa_depwz(r, p, len, target) \
  141. hppa_t10_insn(0x35, target, r, 0, 3, 31-(p), 32-(len)) /* depw,z r,p,len,ret1 */
  142. #define hppa_depwz_sar(reg, target) \
  143. hppa_t1_insn(0x35, target, reg, 0) /* depw,z reg,sar,32,target */
  144. #define hppa_shrpw_sar(reg, target) \
  145. hppa_t10_insn(0x34, reg, 0, 0, 0, 0, target) /* shrpw r0,reg,sar,target */
  146. #define hppa_shrpw(r1, r2, p, target) \
  147. hppa_t10_insn(0x34, r2, r1, 0, 2, 31-(p), target) /* shrpw r1,r2,p,target */
  148. #define hppa_shd(r1, r2, p, target) \
  149. hppa_t10_insn(0x34, r2, r1, 0, 2, 31-(p), target) /* shrpw r1,r2,p,tarfer */
  150. #define hppa_extrws_sar(reg, target) \
  151. hppa_t10_insn(0x34, reg, target, 0, 5, 0, 0) /* extrw,s reg,sar,32,ret0 */
  152. #define hppa_extrws(reg, p, len, target) \
  153. hppa_t10_insn(0x34, reg, target, 0, 7, p, len) /* extrw,s reg,p,len,target */
  154. #define hppa_extru(r, p, len, target) \
  155. hppa_t10_insn(0x34, r, target, 0, 6, p, 32-(len))
  156. #define hppa_shr(r, len, target) \
  157. hppa_extru(r, 31-(len), 32-(len), target)
  158. #define hppa_bl(imm17, rp) \
  159. hppa_t12_insn(0x3a, rp, imm17, 0x00, 1) /* bl,n target_addr,rp */
  160. #define hppa_sh2add(r1, r2, target) \
  161. hppa_t6_insn(0x02, r2, r1, 0, 0, 0x1a, target) /* sh2add r1,r2,target */
  162. #define hppa_combt(r1, r2, target_addr, condition, nop) \
  163. hppa_t11_insn(IS_ENABLED(CONFIG_64BIT) ? 0x27 : 0x20, \
  164. r2, r1, condition, target_addr, nop) /* combt,cond,n r1,r2,addr */
  165. #define hppa_beq(r1, r2, target_addr) \
  166. hppa_combt(r1, r2, target_addr, 1, NOP_NEXT_INSTR)
  167. #define hppa_blt(r1, r2, target_addr) \
  168. hppa_combt(r1, r2, target_addr, 2, NOP_NEXT_INSTR)
  169. #define hppa_ble(r1, r2, target_addr) \
  170. hppa_combt(r1, r2, target_addr, 3, NOP_NEXT_INSTR)
  171. #define hppa_bltu(r1, r2, target_addr) \
  172. hppa_combt(r1, r2, target_addr, 4, NOP_NEXT_INSTR)
  173. #define hppa_bleu(r1, r2, target_addr) \
  174. hppa_combt(r1, r2, target_addr, 5, NOP_NEXT_INSTR)
  175. #define hppa_combf(r1, r2, target_addr, condition, nop) \
  176. hppa_t11_insn(IS_ENABLED(CONFIG_64BIT) ? 0x2f : 0x22, \
  177. r2, r1, condition, target_addr, nop) /* combf,cond,n r1,r2,addr */
  178. #define hppa_bne(r1, r2, target_addr) \
  179. hppa_combf(r1, r2, target_addr, 1, NOP_NEXT_INSTR)
  180. #define hppa_bge(r1, r2, target_addr) \
  181. hppa_combf(r1, r2, target_addr, 2, NOP_NEXT_INSTR)
  182. #define hppa_bgt(r1, r2, target_addr) \
  183. hppa_combf(r1, r2, target_addr, 3, NOP_NEXT_INSTR)
  184. #define hppa_bgeu(r1, r2, target_addr) \
  185. hppa_combf(r1, r2, target_addr, 4, NOP_NEXT_INSTR)
  186. #define hppa_bgtu(r1, r2, target_addr) \
  187. hppa_combf(r1, r2, target_addr, 5, NOP_NEXT_INSTR)
  188. /* 64-bit instructions */
  189. #ifdef CONFIG_64BIT
  190. #define hppa64_ldd_reg(reg, b, target) \
  191. hppa_t10_insn(0x03, b, reg, 0, 0, 3<<1, target)
  192. #define hppa64_ldd_im5(im5, b, target) \
  193. hppa_t10_insn(0x03, b, low_sign_unext(im5,5), 0, 1<<2, 3<<1, target)
  194. #define hppa64_ldd_im16(im16, b, target) \
  195. hppa_t10_insn(0x14, b, target, 0, 0, 0, 0) | re_assemble_16(im16)
  196. #define hppa64_std_im5(src, im5, b) \
  197. hppa_t10_insn(0x03, b, src, 0, 1<<2, 0xB<<1, low_sign_unext(im5,5))
  198. #define hppa64_std_im16(src, im16, b) \
  199. hppa_t10_insn(0x1c, b, src, 0, 0, 0, 0) | re_assemble_16(im16)
  200. #define hppa64_bl_long(offs22) \
  201. hppa_t12_L_insn(0x3a, offs22, 1)
  202. #define hppa64_mtsarcm(reg) \
  203. hppa_t21_insn(0x00, 11, reg, 0xc6, 0)
  204. #define hppa64_shrpd_sar(reg, target) \
  205. hppa_t10_insn(0x34, reg, 0, 0, 0, 1<<4, target)
  206. #define hppa64_shladd(r1, sa, r2, target) \
  207. hppa_t6_insn(0x02, r2, r1, 0, 0, 1<<4|1<<3|sa, target)
  208. #define hppa64_depdz_sar(reg, target) \
  209. hppa_t21_insn(0x35, target, reg, 3<<3, 0)
  210. #define hppa_extrd_sar(reg, target, se) \
  211. hppa_t10_insn(0x34, reg, target, 0, 0, 0, 0) | 2<<11 | (se&1)<<10 | 1<<9 | 1<<8
  212. #define hppa64_bve_l_rp(base) \
  213. (0x3a << 26) | (base << 21) | 0xf000
  214. #define hppa64_permh_3210(r, target) \
  215. (0x3e << 26) | (r << 21) | (r << 16) | (target) | 0x00006900
  216. #define hppa64_hshl(r, sa, target) \
  217. (0x3e << 26) | (0 << 21) | (r << 16) | (sa << 6) | (target) | 0x00008800
  218. #define hppa64_hshr_u(r, sa, target) \
  219. (0x3e << 26) | (r << 21) | (0 << 16) | (sa << 6) | (target) | 0x0000c800
  220. #endif
  221. struct hppa_jit_data {
  222. struct bpf_binary_header *header;
  223. u8 *image;
  224. struct hppa_jit_context ctx;
  225. };
  226. static inline void bpf_fill_ill_insns(void *area, unsigned int size)
  227. {
  228. memset(area, 0, size);
  229. }
  230. static inline void bpf_flush_icache(void *start, void *end)
  231. {
  232. flush_icache_range((unsigned long)start, (unsigned long)end);
  233. }
  234. /* Emit a 4-byte HPPA instruction. */
  235. static inline void emit(const u32 insn, struct hppa_jit_context *ctx)
  236. {
  237. if (ctx->insns) {
  238. ctx->insns[ctx->ninsns] = insn;
  239. }
  240. ctx->ninsns++;
  241. }
  242. static inline int epilogue_offset(struct hppa_jit_context *ctx)
  243. {
  244. int to = ctx->epilogue_offset, from = ctx->ninsns;
  245. return (to - from);
  246. }
  247. /* Return -1 or inverted cond. */
  248. static inline int invert_bpf_cond(u8 cond)
  249. {
  250. switch (cond) {
  251. case BPF_JEQ:
  252. return BPF_JNE;
  253. case BPF_JGT:
  254. return BPF_JLE;
  255. case BPF_JLT:
  256. return BPF_JGE;
  257. case BPF_JGE:
  258. return BPF_JLT;
  259. case BPF_JLE:
  260. return BPF_JGT;
  261. case BPF_JNE:
  262. return BPF_JEQ;
  263. case BPF_JSGT:
  264. return BPF_JSLE;
  265. case BPF_JSLT:
  266. return BPF_JSGE;
  267. case BPF_JSGE:
  268. return BPF_JSLT;
  269. case BPF_JSLE:
  270. return BPF_JSGT;
  271. }
  272. return -1;
  273. }
  274. static inline signed long hppa_offset(int insn, int off, struct hppa_jit_context *ctx)
  275. {
  276. signed long from, to;
  277. off++; /* BPF branch is from PC+1 */
  278. from = (insn > 0) ? ctx->offset[insn - 1] : 0;
  279. to = (insn + off > 0) ? ctx->offset[insn + off - 1] : 0;
  280. return (to - from);
  281. }
  282. /* does the signed value fits into a given number of bits ? */
  283. static inline int check_bits_int(signed long val, int bits)
  284. {
  285. return ((val >= 0) && ((val >> bits) == 0)) ||
  286. ((val < 0) && (((~((u32)val)) >> (bits-1)) == 0));
  287. }
  288. /* can the signed value be used in relative code ? */
  289. static inline int relative_bits_ok(signed long val, int bits)
  290. {
  291. return ((val >= 0) && (val < (1UL << (bits-1)))) || /* XXX */
  292. ((val < 0) && (((~((unsigned long)val)) >> (bits-1)) == 0)
  293. && (val & (1UL << (bits-1))));
  294. }
  295. /* can the signed value be used in relative branches ? */
  296. static inline int relative_branch_ok(signed long val, int bits)
  297. {
  298. return ((val >= 0) && (val < (1UL << (bits-2)))) || /* XXX */
  299. ((val < 0) && (((~((unsigned long)val)) < (1UL << (bits-2))))
  300. && (val & (1UL << (bits-1))));
  301. }
  302. #define is_5b_int(val) check_bits_int(val, 5)
  303. static inline unsigned sign_unext(unsigned x, unsigned len)
  304. {
  305. unsigned len_ones;
  306. len_ones = (1 << len) - 1;
  307. return x & len_ones;
  308. }
  309. static inline unsigned low_sign_unext(unsigned x, unsigned len)
  310. {
  311. unsigned temp;
  312. unsigned sign;
  313. sign = (x >> (len-1)) & 1;
  314. temp = sign_unext (x, len-1);
  315. return (temp << 1) | sign;
  316. }
  317. static inline unsigned re_assemble_12(unsigned as12)
  318. {
  319. return (( (as12 & 0x800) >> 11)
  320. | ((as12 & 0x400) >> (10 - 2))
  321. | ((as12 & 0x3ff) << (1 + 2)));
  322. }
  323. static inline unsigned re_assemble_14(unsigned as14)
  324. {
  325. return (( (as14 & 0x1fff) << 1)
  326. | ((as14 & 0x2000) >> 13));
  327. }
  328. #ifdef CONFIG_64BIT
  329. static inline unsigned re_assemble_16(unsigned as16)
  330. {
  331. unsigned s, t;
  332. /* Unusual 16-bit encoding, for wide mode only. */
  333. t = (as16 << 1) & 0xffff;
  334. s = (as16 & 0x8000);
  335. return (t ^ s ^ (s >> 1)) | (s >> 15);
  336. }
  337. #endif
  338. static inline unsigned re_assemble_17(unsigned as17)
  339. {
  340. return (( (as17 & 0x10000) >> 16)
  341. | ((as17 & 0x0f800) << (16 - 11))
  342. | ((as17 & 0x00400) >> (10 - 2))
  343. | ((as17 & 0x003ff) << (1 + 2)));
  344. }
  345. static inline unsigned re_assemble_21(unsigned as21)
  346. {
  347. return (( (as21 & 0x100000) >> 20)
  348. | ((as21 & 0x0ffe00) >> 8)
  349. | ((as21 & 0x000180) << 7)
  350. | ((as21 & 0x00007c) << 14)
  351. | ((as21 & 0x000003) << 12));
  352. }
  353. static inline unsigned re_assemble_22(unsigned as22)
  354. {
  355. return (( (as22 & 0x200000) >> 21)
  356. | ((as22 & 0x1f0000) << (21 - 16))
  357. | ((as22 & 0x00f800) << (16 - 11))
  358. | ((as22 & 0x000400) >> (10 - 2))
  359. | ((as22 & 0x0003ff) << (1 + 2)));
  360. }
  361. /* Various HPPA instruction formats. */
  362. /* see https://parisc.wiki.kernel.org/images-parisc/6/68/Pa11_acd.pdf, appendix C */
  363. static inline u32 hppa_t1_insn(u8 opcode, u8 b, u8 r, s16 im14)
  364. {
  365. return ((opcode << 26) | (b << 21) | (r << 16) | re_assemble_14(im14));
  366. }
  367. static inline u32 hppa_t5_insn(u8 opcode, u8 tr, u32 val21)
  368. {
  369. return ((opcode << 26) | (tr << 21) | re_assemble_21(val21));
  370. }
  371. static inline u32 hppa_t6_insn(u8 opcode, u8 r2, u8 r1, u8 c, u8 f, u8 ext6, u16 t)
  372. {
  373. return ((opcode << 26) | (r2 << 21) | (r1 << 16) | (c << 13) | (f << 12) |
  374. (ext6 << 6) | t);
  375. }
  376. /* 7. Arithmetic immediate */
  377. static inline u32 hppa_t7_insn(u8 opcode, u8 r, u8 t, u32 im11)
  378. {
  379. return ((opcode << 26) | (r << 21) | (t << 16) | low_sign_unext(im11, 11));
  380. }
  381. /* 10. Shift instructions */
  382. static inline u32 hppa_t10_insn(u8 opcode, u8 r2, u8 r1, u8 c, u8 ext3, u8 cp, u8 t)
  383. {
  384. return ((opcode << 26) | (r2 << 21) | (r1 << 16) | (c << 13) |
  385. (ext3 << 10) | (cp << 5) | t);
  386. }
  387. /* 11. Conditional branch instructions */
  388. static inline u32 hppa_t11_insn(u8 opcode, u8 r2, u8 r1, u8 c, u32 w, u8 nop)
  389. {
  390. u32 ra = re_assemble_12(w);
  391. // ra = low_sign_unext(w,11) | (w & (1<<10)
  392. return ((opcode << 26) | (r2 << 21) | (r1 << 16) | (c << 13) | (nop << 1) | ra);
  393. }
  394. /* 12. Branch instructions */
  395. static inline u32 hppa_t12_insn(u8 opcode, u8 rp, u32 w, u8 ext3, u8 nop)
  396. {
  397. return ((opcode << 26) | (rp << 21) | (ext3 << 13) | (nop << 1) | re_assemble_17(w));
  398. }
  399. static inline u32 hppa_t12_L_insn(u8 opcode, u32 w, u8 nop)
  400. {
  401. return ((opcode << 26) | (0x05 << 13) | (nop << 1) | re_assemble_22(w));
  402. }
  403. /* 21. Move to control register */
  404. static inline u32 hppa_t21_insn(u8 opcode, u8 r2, u8 r1, u8 ext8, u8 t)
  405. {
  406. return ((opcode << 26) | (r2 << 21) | (r1 << 16) | (ext8 << 5) | t);
  407. }
  408. /* Helper functions called by jit code on HPPA32 and HPPA64. */
  409. u64 hppa_div64(u64 div, u64 divisor);
  410. u64 hppa_div64_rem(u64 div, u64 divisor);
  411. /* Helper functions that emit HPPA instructions when possible. */
  412. void bpf_jit_build_prologue(struct hppa_jit_context *ctx);
  413. void bpf_jit_build_epilogue(struct hppa_jit_context *ctx);
  414. int bpf_jit_emit_insn(const struct bpf_insn *insn, struct hppa_jit_context *ctx,
  415. bool extra_pass);
  416. #endif /* _BPF_JIT_H */