0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/netdevice.h>
0013 #include <linux/filter.h>
0014 #include <linux/if_vlan.h>
0015 #include <asm/cacheflush.h>
0016 #include <asm/set_memory.h>
0017 #include <asm/nospec-branch.h>
0018 #include <asm/asm-prototypes.h>
0019 #include <linux/bpf.h>
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 static u8 *emit_code(u8 *ptr, u32 bytes, unsigned int len)
0052 {
0053 if (len == 1)
0054 *ptr = bytes;
0055 else if (len == 2)
0056 *(u16 *)ptr = bytes;
0057 else {
0058 *(u32 *)ptr = bytes;
0059 barrier();
0060 }
0061 return ptr + len;
0062 }
0063
0064 #define EMIT(bytes, len) \
0065 do { prog = emit_code(prog, bytes, len); cnt += len; } while (0)
0066
0067 #define EMIT1(b1) EMIT(b1, 1)
0068 #define EMIT2(b1, b2) EMIT((b1) + ((b2) << 8), 2)
0069 #define EMIT3(b1, b2, b3) EMIT((b1) + ((b2) << 8) + ((b3) << 16), 3)
0070 #define EMIT4(b1, b2, b3, b4) \
0071 EMIT((b1) + ((b2) << 8) + ((b3) << 16) + ((b4) << 24), 4)
0072
0073 #define EMIT1_off32(b1, off) \
0074 do { EMIT1(b1); EMIT(off, 4); } while (0)
0075 #define EMIT2_off32(b1, b2, off) \
0076 do { EMIT2(b1, b2); EMIT(off, 4); } while (0)
0077 #define EMIT3_off32(b1, b2, b3, off) \
0078 do { EMIT3(b1, b2, b3); EMIT(off, 4); } while (0)
0079 #define EMIT4_off32(b1, b2, b3, b4, off) \
0080 do { EMIT4(b1, b2, b3, b4); EMIT(off, 4); } while (0)
0081
0082 #define jmp_label(label, jmp_insn_len) (label - cnt - jmp_insn_len)
0083
0084 static bool is_imm8(int value)
0085 {
0086 return value <= 127 && value >= -128;
0087 }
0088
0089 static bool is_simm32(s64 value)
0090 {
0091 return value == (s64) (s32) value;
0092 }
0093
0094 #define STACK_OFFSET(k) (k)
0095 #define TCALL_CNT (MAX_BPF_JIT_REG + 0)
0096
0097 #define IA32_EAX (0x0)
0098 #define IA32_EBX (0x3)
0099 #define IA32_ECX (0x1)
0100 #define IA32_EDX (0x2)
0101 #define IA32_ESI (0x6)
0102 #define IA32_EDI (0x7)
0103 #define IA32_EBP (0x5)
0104 #define IA32_ESP (0x4)
0105
0106
0107
0108
0109
0110 #define IA32_JB 0x72
0111 #define IA32_JAE 0x73
0112 #define IA32_JE 0x74
0113 #define IA32_JNE 0x75
0114 #define IA32_JBE 0x76
0115 #define IA32_JA 0x77
0116 #define IA32_JL 0x7C
0117 #define IA32_JGE 0x7D
0118 #define IA32_JLE 0x7E
0119 #define IA32_JG 0x7F
0120
0121 #define COND_JMP_OPCODE_INVALID (0xFF)
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138 static const u8 bpf2ia32[][2] = {
0139
0140 [BPF_REG_0] = {STACK_OFFSET(0), STACK_OFFSET(4)},
0141
0142
0143
0144 [BPF_REG_1] = {STACK_OFFSET(8), STACK_OFFSET(12)},
0145 [BPF_REG_2] = {STACK_OFFSET(16), STACK_OFFSET(20)},
0146 [BPF_REG_3] = {STACK_OFFSET(24), STACK_OFFSET(28)},
0147 [BPF_REG_4] = {STACK_OFFSET(32), STACK_OFFSET(36)},
0148 [BPF_REG_5] = {STACK_OFFSET(40), STACK_OFFSET(44)},
0149
0150
0151
0152 [BPF_REG_6] = {STACK_OFFSET(48), STACK_OFFSET(52)},
0153 [BPF_REG_7] = {STACK_OFFSET(56), STACK_OFFSET(60)},
0154 [BPF_REG_8] = {STACK_OFFSET(64), STACK_OFFSET(68)},
0155 [BPF_REG_9] = {STACK_OFFSET(72), STACK_OFFSET(76)},
0156
0157
0158 [BPF_REG_FP] = {STACK_OFFSET(80), STACK_OFFSET(84)},
0159
0160
0161 [BPF_REG_AX] = {IA32_ESI, IA32_EDI},
0162
0163
0164 [TCALL_CNT] = {STACK_OFFSET(88), STACK_OFFSET(92)},
0165 };
0166
0167 #define dst_lo dst[0]
0168 #define dst_hi dst[1]
0169 #define src_lo src[0]
0170 #define src_hi src[1]
0171
0172 #define STACK_ALIGNMENT 8
0173
0174
0175
0176
0177
0178 #define SCRATCH_SIZE 96
0179
0180
0181 #define _STACK_SIZE (stack_depth + SCRATCH_SIZE)
0182
0183 #define STACK_SIZE ALIGN(_STACK_SIZE, STACK_ALIGNMENT)
0184
0185
0186 #define STACK_VAR(off) (off)
0187
0188
0189 static u8 add_1reg(u8 byte, u32 dst_reg)
0190 {
0191 return byte + dst_reg;
0192 }
0193
0194
0195 static u8 add_2reg(u8 byte, u32 dst_reg, u32 src_reg)
0196 {
0197 return byte + dst_reg + (src_reg << 3);
0198 }
0199
0200 static void jit_fill_hole(void *area, unsigned int size)
0201 {
0202
0203 memset(area, 0xcc, size);
0204 }
0205
0206 static inline void emit_ia32_mov_i(const u8 dst, const u32 val, bool dstk,
0207 u8 **pprog)
0208 {
0209 u8 *prog = *pprog;
0210 int cnt = 0;
0211
0212 if (dstk) {
0213 if (val == 0) {
0214
0215 EMIT2(0x33, add_2reg(0xC0, IA32_EAX, IA32_EAX));
0216
0217 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EAX),
0218 STACK_VAR(dst));
0219 } else {
0220 EMIT3_off32(0xC7, add_1reg(0x40, IA32_EBP),
0221 STACK_VAR(dst), val);
0222 }
0223 } else {
0224 if (val == 0)
0225 EMIT2(0x33, add_2reg(0xC0, dst, dst));
0226 else
0227 EMIT2_off32(0xC7, add_1reg(0xC0, dst),
0228 val);
0229 }
0230 *pprog = prog;
0231 }
0232
0233
0234 static inline void emit_ia32_mov_r(const u8 dst, const u8 src, bool dstk,
0235 bool sstk, u8 **pprog)
0236 {
0237 u8 *prog = *pprog;
0238 int cnt = 0;
0239 u8 sreg = sstk ? IA32_EAX : src;
0240
0241 if (sstk)
0242
0243 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(src));
0244 if (dstk)
0245
0246 EMIT3(0x89, add_2reg(0x40, IA32_EBP, sreg), STACK_VAR(dst));
0247 else
0248
0249 EMIT2(0x89, add_2reg(0xC0, dst, sreg));
0250
0251 *pprog = prog;
0252 }
0253
0254
0255 static inline void emit_ia32_mov_r64(const bool is64, const u8 dst[],
0256 const u8 src[], bool dstk,
0257 bool sstk, u8 **pprog,
0258 const struct bpf_prog_aux *aux)
0259 {
0260 emit_ia32_mov_r(dst_lo, src_lo, dstk, sstk, pprog);
0261 if (is64)
0262
0263 emit_ia32_mov_r(dst_hi, src_hi, dstk, sstk, pprog);
0264 else if (!aux->verifier_zext)
0265
0266 emit_ia32_mov_i(dst_hi, 0, dstk, pprog);
0267 }
0268
0269
0270 static inline void emit_ia32_mov_i64(const bool is64, const u8 dst[],
0271 const u32 val, bool dstk, u8 **pprog)
0272 {
0273 u32 hi = 0;
0274
0275 if (is64 && (val & (1<<31)))
0276 hi = (u32)~0;
0277 emit_ia32_mov_i(dst_lo, val, dstk, pprog);
0278 emit_ia32_mov_i(dst_hi, hi, dstk, pprog);
0279 }
0280
0281
0282
0283
0284
0285 static inline void emit_ia32_mul_r(const u8 dst, const u8 src, bool dstk,
0286 bool sstk, u8 **pprog)
0287 {
0288 u8 *prog = *pprog;
0289 int cnt = 0;
0290 u8 sreg = sstk ? IA32_ECX : src;
0291
0292 if (sstk)
0293
0294 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX), STACK_VAR(src));
0295
0296 if (dstk)
0297
0298 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(dst));
0299 else
0300
0301 EMIT2(0x8B, add_2reg(0xC0, dst, IA32_EAX));
0302
0303
0304 EMIT2(0xF7, add_1reg(0xE0, sreg));
0305
0306 if (dstk)
0307
0308 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EAX),
0309 STACK_VAR(dst));
0310 else
0311
0312 EMIT2(0x89, add_2reg(0xC0, dst, IA32_EAX));
0313
0314 *pprog = prog;
0315 }
0316
0317 static inline void emit_ia32_to_le_r64(const u8 dst[], s32 val,
0318 bool dstk, u8 **pprog,
0319 const struct bpf_prog_aux *aux)
0320 {
0321 u8 *prog = *pprog;
0322 int cnt = 0;
0323 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
0324 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
0325
0326 if (dstk && val != 64) {
0327 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
0328 STACK_VAR(dst_lo));
0329 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX),
0330 STACK_VAR(dst_hi));
0331 }
0332 switch (val) {
0333 case 16:
0334
0335
0336
0337
0338 EMIT2(0x0F, 0xB7);
0339 EMIT1(add_2reg(0xC0, dreg_lo, dreg_lo));
0340 if (!aux->verifier_zext)
0341
0342 EMIT2(0x33, add_2reg(0xC0, dreg_hi, dreg_hi));
0343 break;
0344 case 32:
0345 if (!aux->verifier_zext)
0346
0347 EMIT2(0x33, add_2reg(0xC0, dreg_hi, dreg_hi));
0348 break;
0349 case 64:
0350
0351 break;
0352 }
0353
0354 if (dstk && val != 64) {
0355
0356 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_lo),
0357 STACK_VAR(dst_lo));
0358
0359 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_hi),
0360 STACK_VAR(dst_hi));
0361 }
0362 *pprog = prog;
0363 }
0364
0365 static inline void emit_ia32_to_be_r64(const u8 dst[], s32 val,
0366 bool dstk, u8 **pprog,
0367 const struct bpf_prog_aux *aux)
0368 {
0369 u8 *prog = *pprog;
0370 int cnt = 0;
0371 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
0372 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
0373
0374 if (dstk) {
0375 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
0376 STACK_VAR(dst_lo));
0377 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX),
0378 STACK_VAR(dst_hi));
0379 }
0380 switch (val) {
0381 case 16:
0382
0383 EMIT1(0x66);
0384 EMIT3(0xC1, add_1reg(0xC8, dreg_lo), 8);
0385
0386 EMIT2(0x0F, 0xB7);
0387 EMIT1(add_2reg(0xC0, dreg_lo, dreg_lo));
0388
0389 if (!aux->verifier_zext)
0390
0391 EMIT2(0x33, add_2reg(0xC0, dreg_hi, dreg_hi));
0392 break;
0393 case 32:
0394
0395 EMIT1(0x0F);
0396 EMIT1(add_1reg(0xC8, dreg_lo));
0397
0398 if (!aux->verifier_zext)
0399
0400 EMIT2(0x33, add_2reg(0xC0, dreg_hi, dreg_hi));
0401 break;
0402 case 64:
0403
0404 EMIT1(0x0F);
0405 EMIT1(add_1reg(0xC8, dreg_lo));
0406
0407
0408 EMIT1(0x0F);
0409 EMIT1(add_1reg(0xC8, dreg_hi));
0410
0411
0412 EMIT2(0x89, add_2reg(0xC0, IA32_ECX, dreg_hi));
0413
0414 EMIT2(0x89, add_2reg(0xC0, dreg_hi, dreg_lo));
0415
0416 EMIT2(0x89, add_2reg(0xC0, dreg_lo, IA32_ECX));
0417
0418 break;
0419 }
0420 if (dstk) {
0421
0422 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_lo),
0423 STACK_VAR(dst_lo));
0424
0425 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_hi),
0426 STACK_VAR(dst_hi));
0427 }
0428 *pprog = prog;
0429 }
0430
0431
0432
0433
0434
0435 static inline void emit_ia32_div_mod_r(const u8 op, const u8 dst, const u8 src,
0436 bool dstk, bool sstk, u8 **pprog)
0437 {
0438 u8 *prog = *pprog;
0439 int cnt = 0;
0440
0441 if (sstk)
0442
0443 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX),
0444 STACK_VAR(src));
0445 else if (src != IA32_ECX)
0446
0447 EMIT2(0x8B, add_2reg(0xC0, src, IA32_ECX));
0448
0449 if (dstk)
0450
0451 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
0452 STACK_VAR(dst));
0453 else
0454
0455 EMIT2(0x8B, add_2reg(0xC0, dst, IA32_EAX));
0456
0457
0458 EMIT2(0x31, add_2reg(0xC0, IA32_EDX, IA32_EDX));
0459
0460 EMIT2(0xF7, add_1reg(0xF0, IA32_ECX));
0461
0462 if (op == BPF_MOD) {
0463 if (dstk)
0464 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EDX),
0465 STACK_VAR(dst));
0466 else
0467 EMIT2(0x89, add_2reg(0xC0, dst, IA32_EDX));
0468 } else {
0469 if (dstk)
0470 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EAX),
0471 STACK_VAR(dst));
0472 else
0473 EMIT2(0x89, add_2reg(0xC0, dst, IA32_EAX));
0474 }
0475 *pprog = prog;
0476 }
0477
0478
0479
0480
0481
0482 static inline void emit_ia32_shift_r(const u8 op, const u8 dst, const u8 src,
0483 bool dstk, bool sstk, u8 **pprog)
0484 {
0485 u8 *prog = *pprog;
0486 int cnt = 0;
0487 u8 dreg = dstk ? IA32_EAX : dst;
0488 u8 b2;
0489
0490 if (dstk)
0491
0492 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(dst));
0493
0494 if (sstk)
0495
0496 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX), STACK_VAR(src));
0497 else if (src != IA32_ECX)
0498
0499 EMIT2(0x8B, add_2reg(0xC0, src, IA32_ECX));
0500
0501 switch (op) {
0502 case BPF_LSH:
0503 b2 = 0xE0; break;
0504 case BPF_RSH:
0505 b2 = 0xE8; break;
0506 case BPF_ARSH:
0507 b2 = 0xF8; break;
0508 default:
0509 return;
0510 }
0511 EMIT2(0xD3, add_1reg(b2, dreg));
0512
0513 if (dstk)
0514
0515 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg), STACK_VAR(dst));
0516 *pprog = prog;
0517 }
0518
0519
0520
0521
0522
0523 static inline void emit_ia32_alu_r(const bool is64, const bool hi, const u8 op,
0524 const u8 dst, const u8 src, bool dstk,
0525 bool sstk, u8 **pprog)
0526 {
0527 u8 *prog = *pprog;
0528 int cnt = 0;
0529 u8 sreg = sstk ? IA32_EAX : src;
0530 u8 dreg = dstk ? IA32_EDX : dst;
0531
0532 if (sstk)
0533
0534 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(src));
0535
0536 if (dstk)
0537
0538 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX), STACK_VAR(dst));
0539
0540 switch (BPF_OP(op)) {
0541
0542 case BPF_ADD:
0543 if (hi && is64)
0544 EMIT2(0x11, add_2reg(0xC0, dreg, sreg));
0545 else
0546 EMIT2(0x01, add_2reg(0xC0, dreg, sreg));
0547 break;
0548
0549 case BPF_SUB:
0550 if (hi && is64)
0551 EMIT2(0x19, add_2reg(0xC0, dreg, sreg));
0552 else
0553 EMIT2(0x29, add_2reg(0xC0, dreg, sreg));
0554 break;
0555
0556 case BPF_OR:
0557 EMIT2(0x09, add_2reg(0xC0, dreg, sreg));
0558 break;
0559
0560 case BPF_AND:
0561 EMIT2(0x21, add_2reg(0xC0, dreg, sreg));
0562 break;
0563
0564 case BPF_XOR:
0565 EMIT2(0x31, add_2reg(0xC0, dreg, sreg));
0566 break;
0567 }
0568
0569 if (dstk)
0570
0571 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg),
0572 STACK_VAR(dst));
0573 *pprog = prog;
0574 }
0575
0576
0577 static inline void emit_ia32_alu_r64(const bool is64, const u8 op,
0578 const u8 dst[], const u8 src[],
0579 bool dstk, bool sstk,
0580 u8 **pprog, const struct bpf_prog_aux *aux)
0581 {
0582 u8 *prog = *pprog;
0583
0584 emit_ia32_alu_r(is64, false, op, dst_lo, src_lo, dstk, sstk, &prog);
0585 if (is64)
0586 emit_ia32_alu_r(is64, true, op, dst_hi, src_hi, dstk, sstk,
0587 &prog);
0588 else if (!aux->verifier_zext)
0589 emit_ia32_mov_i(dst_hi, 0, dstk, &prog);
0590 *pprog = prog;
0591 }
0592
0593
0594
0595
0596
0597 static inline void emit_ia32_alu_i(const bool is64, const bool hi, const u8 op,
0598 const u8 dst, const s32 val, bool dstk,
0599 u8 **pprog)
0600 {
0601 u8 *prog = *pprog;
0602 int cnt = 0;
0603 u8 dreg = dstk ? IA32_EAX : dst;
0604 u8 sreg = IA32_EDX;
0605
0606 if (dstk)
0607
0608 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(dst));
0609
0610 if (!is_imm8(val))
0611
0612 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_EDX), val);
0613
0614 switch (op) {
0615
0616 case BPF_ADD:
0617 if (hi && is64) {
0618 if (is_imm8(val))
0619 EMIT3(0x83, add_1reg(0xD0, dreg), val);
0620 else
0621 EMIT2(0x11, add_2reg(0xC0, dreg, sreg));
0622 } else {
0623 if (is_imm8(val))
0624 EMIT3(0x83, add_1reg(0xC0, dreg), val);
0625 else
0626 EMIT2(0x01, add_2reg(0xC0, dreg, sreg));
0627 }
0628 break;
0629
0630 case BPF_SUB:
0631 if (hi && is64) {
0632 if (is_imm8(val))
0633 EMIT3(0x83, add_1reg(0xD8, dreg), val);
0634 else
0635 EMIT2(0x19, add_2reg(0xC0, dreg, sreg));
0636 } else {
0637 if (is_imm8(val))
0638 EMIT3(0x83, add_1reg(0xE8, dreg), val);
0639 else
0640 EMIT2(0x29, add_2reg(0xC0, dreg, sreg));
0641 }
0642 break;
0643
0644 case BPF_OR:
0645 if (is_imm8(val))
0646 EMIT3(0x83, add_1reg(0xC8, dreg), val);
0647 else
0648 EMIT2(0x09, add_2reg(0xC0, dreg, sreg));
0649 break;
0650
0651 case BPF_AND:
0652 if (is_imm8(val))
0653 EMIT3(0x83, add_1reg(0xE0, dreg), val);
0654 else
0655 EMIT2(0x21, add_2reg(0xC0, dreg, sreg));
0656 break;
0657
0658 case BPF_XOR:
0659 if (is_imm8(val))
0660 EMIT3(0x83, add_1reg(0xF0, dreg), val);
0661 else
0662 EMIT2(0x31, add_2reg(0xC0, dreg, sreg));
0663 break;
0664 case BPF_NEG:
0665 EMIT2(0xF7, add_1reg(0xD8, dreg));
0666 break;
0667 }
0668
0669 if (dstk)
0670
0671 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg),
0672 STACK_VAR(dst));
0673 *pprog = prog;
0674 }
0675
0676
0677 static inline void emit_ia32_alu_i64(const bool is64, const u8 op,
0678 const u8 dst[], const u32 val,
0679 bool dstk, u8 **pprog,
0680 const struct bpf_prog_aux *aux)
0681 {
0682 u8 *prog = *pprog;
0683 u32 hi = 0;
0684
0685 if (is64 && (val & (1<<31)))
0686 hi = (u32)~0;
0687
0688 emit_ia32_alu_i(is64, false, op, dst_lo, val, dstk, &prog);
0689 if (is64)
0690 emit_ia32_alu_i(is64, true, op, dst_hi, hi, dstk, &prog);
0691 else if (!aux->verifier_zext)
0692 emit_ia32_mov_i(dst_hi, 0, dstk, &prog);
0693
0694 *pprog = prog;
0695 }
0696
0697
0698 static inline void emit_ia32_neg64(const u8 dst[], bool dstk, u8 **pprog)
0699 {
0700 u8 *prog = *pprog;
0701 int cnt = 0;
0702 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
0703 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
0704
0705 if (dstk) {
0706 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
0707 STACK_VAR(dst_lo));
0708 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX),
0709 STACK_VAR(dst_hi));
0710 }
0711
0712
0713 EMIT2(0xF7, add_1reg(0xD8, dreg_lo));
0714
0715 EMIT3(0x83, add_1reg(0xD0, dreg_hi), 0x00);
0716
0717 EMIT2(0xF7, add_1reg(0xD8, dreg_hi));
0718
0719 if (dstk) {
0720
0721 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_lo),
0722 STACK_VAR(dst_lo));
0723
0724 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_hi),
0725 STACK_VAR(dst_hi));
0726 }
0727 *pprog = prog;
0728 }
0729
0730
0731 static inline void emit_ia32_lsh_r64(const u8 dst[], const u8 src[],
0732 bool dstk, bool sstk, u8 **pprog)
0733 {
0734 u8 *prog = *pprog;
0735 int cnt = 0;
0736 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
0737 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
0738
0739 if (dstk) {
0740 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
0741 STACK_VAR(dst_lo));
0742 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX),
0743 STACK_VAR(dst_hi));
0744 }
0745
0746 if (sstk)
0747
0748 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX),
0749 STACK_VAR(src_lo));
0750 else
0751
0752 EMIT2(0x8B, add_2reg(0xC0, src_lo, IA32_ECX));
0753
0754
0755 EMIT3(0x0F, 0xA5, add_2reg(0xC0, dreg_hi, dreg_lo));
0756
0757 EMIT2(0xD3, add_1reg(0xE0, dreg_lo));
0758
0759
0760
0761
0762 EMIT3(0x83, add_1reg(0xF8, IA32_ECX), 32);
0763
0764 EMIT2(IA32_JB, 4);
0765
0766
0767 EMIT2(0x89, add_2reg(0xC0, dreg_hi, dreg_lo));
0768
0769 EMIT2(0x33, add_2reg(0xC0, dreg_lo, dreg_lo));
0770
0771 if (dstk) {
0772
0773 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_lo),
0774 STACK_VAR(dst_lo));
0775
0776 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_hi),
0777 STACK_VAR(dst_hi));
0778 }
0779
0780 *pprog = prog;
0781 }
0782
0783
0784 static inline void emit_ia32_arsh_r64(const u8 dst[], const u8 src[],
0785 bool dstk, bool sstk, u8 **pprog)
0786 {
0787 u8 *prog = *pprog;
0788 int cnt = 0;
0789 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
0790 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
0791
0792 if (dstk) {
0793 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
0794 STACK_VAR(dst_lo));
0795 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX),
0796 STACK_VAR(dst_hi));
0797 }
0798
0799 if (sstk)
0800
0801 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX),
0802 STACK_VAR(src_lo));
0803 else
0804
0805 EMIT2(0x8B, add_2reg(0xC0, src_lo, IA32_ECX));
0806
0807
0808 EMIT3(0x0F, 0xAD, add_2reg(0xC0, dreg_lo, dreg_hi));
0809
0810 EMIT2(0xD3, add_1reg(0xF8, dreg_hi));
0811
0812
0813
0814
0815 EMIT3(0x83, add_1reg(0xF8, IA32_ECX), 32);
0816
0817 EMIT2(IA32_JB, 5);
0818
0819
0820 EMIT2(0x89, add_2reg(0xC0, dreg_lo, dreg_hi));
0821
0822 EMIT3(0xC1, add_1reg(0xF8, dreg_hi), 31);
0823
0824 if (dstk) {
0825
0826 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_lo),
0827 STACK_VAR(dst_lo));
0828
0829 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_hi),
0830 STACK_VAR(dst_hi));
0831 }
0832
0833 *pprog = prog;
0834 }
0835
0836
0837 static inline void emit_ia32_rsh_r64(const u8 dst[], const u8 src[], bool dstk,
0838 bool sstk, u8 **pprog)
0839 {
0840 u8 *prog = *pprog;
0841 int cnt = 0;
0842 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
0843 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
0844
0845 if (dstk) {
0846 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
0847 STACK_VAR(dst_lo));
0848 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX),
0849 STACK_VAR(dst_hi));
0850 }
0851
0852 if (sstk)
0853
0854 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX),
0855 STACK_VAR(src_lo));
0856 else
0857
0858 EMIT2(0x8B, add_2reg(0xC0, src_lo, IA32_ECX));
0859
0860
0861 EMIT3(0x0F, 0xAD, add_2reg(0xC0, dreg_lo, dreg_hi));
0862
0863 EMIT2(0xD3, add_1reg(0xE8, dreg_hi));
0864
0865
0866
0867
0868 EMIT3(0x83, add_1reg(0xF8, IA32_ECX), 32);
0869
0870 EMIT2(IA32_JB, 4);
0871
0872
0873 EMIT2(0x89, add_2reg(0xC0, dreg_lo, dreg_hi));
0874
0875 EMIT2(0x33, add_2reg(0xC0, dreg_hi, dreg_hi));
0876
0877 if (dstk) {
0878
0879 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_lo),
0880 STACK_VAR(dst_lo));
0881
0882 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_hi),
0883 STACK_VAR(dst_hi));
0884 }
0885
0886 *pprog = prog;
0887 }
0888
0889
0890 static inline void emit_ia32_lsh_i64(const u8 dst[], const u32 val,
0891 bool dstk, u8 **pprog)
0892 {
0893 u8 *prog = *pprog;
0894 int cnt = 0;
0895 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
0896 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
0897
0898 if (dstk) {
0899 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
0900 STACK_VAR(dst_lo));
0901 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX),
0902 STACK_VAR(dst_hi));
0903 }
0904
0905 if (val < 32) {
0906
0907 EMIT4(0x0F, 0xA4, add_2reg(0xC0, dreg_hi, dreg_lo), val);
0908
0909 EMIT3(0xC1, add_1reg(0xE0, dreg_lo), val);
0910 } else if (val >= 32 && val < 64) {
0911 u32 value = val - 32;
0912
0913
0914 EMIT3(0xC1, add_1reg(0xE0, dreg_lo), value);
0915
0916 EMIT2(0x89, add_2reg(0xC0, dreg_hi, dreg_lo));
0917
0918 EMIT2(0x33, add_2reg(0xC0, dreg_lo, dreg_lo));
0919 } else {
0920
0921 EMIT2(0x33, add_2reg(0xC0, dreg_lo, dreg_lo));
0922
0923 EMIT2(0x33, add_2reg(0xC0, dreg_hi, dreg_hi));
0924 }
0925
0926 if (dstk) {
0927
0928 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_lo),
0929 STACK_VAR(dst_lo));
0930
0931 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_hi),
0932 STACK_VAR(dst_hi));
0933 }
0934 *pprog = prog;
0935 }
0936
0937
0938 static inline void emit_ia32_rsh_i64(const u8 dst[], const u32 val,
0939 bool dstk, u8 **pprog)
0940 {
0941 u8 *prog = *pprog;
0942 int cnt = 0;
0943 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
0944 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
0945
0946 if (dstk) {
0947 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
0948 STACK_VAR(dst_lo));
0949 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX),
0950 STACK_VAR(dst_hi));
0951 }
0952
0953
0954 if (val < 32) {
0955
0956 EMIT4(0x0F, 0xAC, add_2reg(0xC0, dreg_lo, dreg_hi), val);
0957
0958 EMIT3(0xC1, add_1reg(0xE8, dreg_hi), val);
0959 } else if (val >= 32 && val < 64) {
0960 u32 value = val - 32;
0961
0962
0963 EMIT3(0xC1, add_1reg(0xE8, dreg_hi), value);
0964
0965 EMIT2(0x89, add_2reg(0xC0, dreg_lo, dreg_hi));
0966
0967 EMIT2(0x33, add_2reg(0xC0, dreg_hi, dreg_hi));
0968 } else {
0969
0970 EMIT2(0x33, add_2reg(0xC0, dreg_lo, dreg_lo));
0971
0972 EMIT2(0x33, add_2reg(0xC0, dreg_hi, dreg_hi));
0973 }
0974
0975 if (dstk) {
0976
0977 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_lo),
0978 STACK_VAR(dst_lo));
0979
0980 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_hi),
0981 STACK_VAR(dst_hi));
0982 }
0983 *pprog = prog;
0984 }
0985
0986
0987 static inline void emit_ia32_arsh_i64(const u8 dst[], const u32 val,
0988 bool dstk, u8 **pprog)
0989 {
0990 u8 *prog = *pprog;
0991 int cnt = 0;
0992 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
0993 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
0994
0995 if (dstk) {
0996 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
0997 STACK_VAR(dst_lo));
0998 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX),
0999 STACK_VAR(dst_hi));
1000 }
1001
1002 if (val < 32) {
1003
1004 EMIT4(0x0F, 0xAC, add_2reg(0xC0, dreg_lo, dreg_hi), val);
1005
1006 EMIT3(0xC1, add_1reg(0xF8, dreg_hi), val);
1007 } else if (val >= 32 && val < 64) {
1008 u32 value = val - 32;
1009
1010
1011 EMIT3(0xC1, add_1reg(0xF8, dreg_hi), value);
1012
1013 EMIT2(0x89, add_2reg(0xC0, dreg_lo, dreg_hi));
1014
1015
1016 EMIT3(0xC1, add_1reg(0xF8, dreg_hi), 31);
1017 } else {
1018
1019 EMIT3(0xC1, add_1reg(0xF8, dreg_hi), 31);
1020
1021 EMIT2(0x89, add_2reg(0xC0, dreg_lo, dreg_hi));
1022 }
1023
1024 if (dstk) {
1025
1026 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_lo),
1027 STACK_VAR(dst_lo));
1028
1029 EMIT3(0x89, add_2reg(0x40, IA32_EBP, dreg_hi),
1030 STACK_VAR(dst_hi));
1031 }
1032 *pprog = prog;
1033 }
1034
1035 static inline void emit_ia32_mul_r64(const u8 dst[], const u8 src[], bool dstk,
1036 bool sstk, u8 **pprog)
1037 {
1038 u8 *prog = *pprog;
1039 int cnt = 0;
1040
1041 if (dstk)
1042
1043 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
1044 STACK_VAR(dst_hi));
1045 else
1046
1047 EMIT2(0x8B, add_2reg(0xC0, dst_hi, IA32_EAX));
1048
1049 if (sstk)
1050
1051 EMIT3(0xF7, add_1reg(0x60, IA32_EBP), STACK_VAR(src_lo));
1052 else
1053
1054 EMIT2(0xF7, add_1reg(0xE0, src_lo));
1055
1056
1057 EMIT2(0x89, add_2reg(0xC0, IA32_ECX, IA32_EAX));
1058
1059 if (dstk)
1060
1061 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
1062 STACK_VAR(dst_lo));
1063 else
1064
1065 EMIT2(0x8B, add_2reg(0xC0, dst_lo, IA32_EAX));
1066
1067 if (sstk)
1068
1069 EMIT3(0xF7, add_1reg(0x60, IA32_EBP), STACK_VAR(src_hi));
1070 else
1071
1072 EMIT2(0xF7, add_1reg(0xE0, src_hi));
1073
1074
1075 EMIT2(0x01, add_2reg(0xC0, IA32_ECX, IA32_EAX));
1076
1077 if (dstk)
1078
1079 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
1080 STACK_VAR(dst_lo));
1081 else
1082
1083 EMIT2(0x8B, add_2reg(0xC0, dst_lo, IA32_EAX));
1084
1085 if (sstk)
1086
1087 EMIT3(0xF7, add_1reg(0x60, IA32_EBP), STACK_VAR(src_lo));
1088 else
1089
1090 EMIT2(0xF7, add_1reg(0xE0, src_lo));
1091
1092
1093 EMIT2(0x01, add_2reg(0xC0, IA32_ECX, IA32_EDX));
1094
1095 if (dstk) {
1096
1097 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EAX),
1098 STACK_VAR(dst_lo));
1099
1100 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_ECX),
1101 STACK_VAR(dst_hi));
1102 } else {
1103
1104 EMIT2(0x89, add_2reg(0xC0, dst_lo, IA32_EAX));
1105
1106 EMIT2(0x89, add_2reg(0xC0, dst_hi, IA32_ECX));
1107 }
1108
1109 *pprog = prog;
1110 }
1111
1112 static inline void emit_ia32_mul_i64(const u8 dst[], const u32 val,
1113 bool dstk, u8 **pprog)
1114 {
1115 u8 *prog = *pprog;
1116 int cnt = 0;
1117 u32 hi;
1118
1119 hi = val & (1<<31) ? (u32)~0 : 0;
1120
1121 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_EAX), val);
1122 if (dstk)
1123
1124 EMIT3(0xF7, add_1reg(0x60, IA32_EBP), STACK_VAR(dst_hi));
1125 else
1126
1127 EMIT2(0xF7, add_1reg(0xE0, dst_hi));
1128
1129
1130 EMIT2(0x89, add_2reg(0xC0, IA32_ECX, IA32_EAX));
1131
1132
1133 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_EAX), hi);
1134 if (dstk)
1135
1136 EMIT3(0xF7, add_1reg(0x60, IA32_EBP), STACK_VAR(dst_lo));
1137 else
1138
1139 EMIT2(0xF7, add_1reg(0xE0, dst_lo));
1140
1141 EMIT2(0x01, add_2reg(0xC0, IA32_ECX, IA32_EAX));
1142
1143
1144 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_EAX), val);
1145 if (dstk)
1146
1147 EMIT3(0xF7, add_1reg(0x60, IA32_EBP), STACK_VAR(dst_lo));
1148 else
1149
1150 EMIT2(0xF7, add_1reg(0xE0, dst_lo));
1151
1152
1153 EMIT2(0x01, add_2reg(0xC0, IA32_ECX, IA32_EDX));
1154
1155 if (dstk) {
1156
1157 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EAX),
1158 STACK_VAR(dst_lo));
1159
1160 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_ECX),
1161 STACK_VAR(dst_hi));
1162 } else {
1163
1164 EMIT2(0x89, add_2reg(0xC0, dst_lo, IA32_EAX));
1165
1166 EMIT2(0x89, add_2reg(0xC0, dst_hi, IA32_ECX));
1167 }
1168
1169 *pprog = prog;
1170 }
1171
1172 static int bpf_size_to_x86_bytes(int bpf_size)
1173 {
1174 if (bpf_size == BPF_W)
1175 return 4;
1176 else if (bpf_size == BPF_H)
1177 return 2;
1178 else if (bpf_size == BPF_B)
1179 return 1;
1180 else if (bpf_size == BPF_DW)
1181 return 4;
1182 else
1183 return 0;
1184 }
1185
1186 struct jit_context {
1187 int cleanup_addr;
1188 };
1189
1190
1191 #define BPF_MAX_INSN_SIZE 128
1192 #define BPF_INSN_SAFETY 64
1193
1194 #define PROLOGUE_SIZE 35
1195
1196
1197
1198
1199
1200 static void emit_prologue(u8 **pprog, u32 stack_depth)
1201 {
1202 u8 *prog = *pprog;
1203 int cnt = 0;
1204 const u8 *r1 = bpf2ia32[BPF_REG_1];
1205 const u8 fplo = bpf2ia32[BPF_REG_FP][0];
1206 const u8 fphi = bpf2ia32[BPF_REG_FP][1];
1207 const u8 *tcc = bpf2ia32[TCALL_CNT];
1208
1209
1210 EMIT1(0x55);
1211
1212 EMIT2(0x89, 0xE5);
1213
1214 EMIT1(0x57);
1215
1216 EMIT1(0x56);
1217
1218 EMIT1(0x53);
1219
1220
1221 EMIT2_off32(0x81, 0xEC, STACK_SIZE);
1222
1223 EMIT3(0x83, add_1reg(0xE8, IA32_EBP), SCRATCH_SIZE + 12);
1224
1225 EMIT2(0x31, add_2reg(0xC0, IA32_EBX, IA32_EBX));
1226
1227
1228 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EBP), STACK_VAR(fplo));
1229 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EBX), STACK_VAR(fphi));
1230
1231
1232
1233 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(r1[0]));
1234 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EBX), STACK_VAR(r1[1]));
1235
1236
1237 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EBX), STACK_VAR(tcc[0]));
1238 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EBX), STACK_VAR(tcc[1]));
1239
1240 BUILD_BUG_ON(cnt != PROLOGUE_SIZE);
1241 *pprog = prog;
1242 }
1243
1244
1245 static void emit_epilogue(u8 **pprog, u32 stack_depth)
1246 {
1247 u8 *prog = *pprog;
1248 const u8 *r0 = bpf2ia32[BPF_REG_0];
1249 int cnt = 0;
1250
1251
1252 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(r0[0]));
1253
1254 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX), STACK_VAR(r0[1]));
1255
1256
1257 EMIT3(0x83, add_1reg(0xC0, IA32_EBP), SCRATCH_SIZE + 12);
1258
1259
1260 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EBX), -12);
1261
1262 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ESI), -8);
1263
1264 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDI), -4);
1265
1266 EMIT1(0xC9);
1267 EMIT1(0xC3);
1268 *pprog = prog;
1269 }
1270
1271 static int emit_jmp_edx(u8 **pprog, u8 *ip)
1272 {
1273 u8 *prog = *pprog;
1274 int cnt = 0;
1275
1276 #ifdef CONFIG_RETPOLINE
1277 EMIT1_off32(0xE9, (u8 *)__x86_indirect_thunk_edx - (ip + 5));
1278 #else
1279 EMIT2(0xFF, 0xE2);
1280 #endif
1281 *pprog = prog;
1282
1283 return cnt;
1284 }
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299 static void emit_bpf_tail_call(u8 **pprog, u8 *ip)
1300 {
1301 u8 *prog = *pprog;
1302 int cnt = 0;
1303 const u8 *r1 = bpf2ia32[BPF_REG_1];
1304 const u8 *r2 = bpf2ia32[BPF_REG_2];
1305 const u8 *r3 = bpf2ia32[BPF_REG_3];
1306 const u8 *tcc = bpf2ia32[TCALL_CNT];
1307 u32 lo, hi;
1308 static int jmp_label1 = -1;
1309
1310
1311
1312
1313
1314
1315 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(r2[0]));
1316
1317 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX), STACK_VAR(r3[0]));
1318
1319
1320 EMIT3(0x39, add_2reg(0x40, IA32_EAX, IA32_EDX),
1321 offsetof(struct bpf_array, map.max_entries));
1322
1323 EMIT2(IA32_JBE, jmp_label(jmp_label1, 2));
1324
1325
1326
1327
1328
1329 lo = (u32)MAX_TAIL_CALL_CNT;
1330 hi = (u32)((u64)MAX_TAIL_CALL_CNT >> 32);
1331 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX), STACK_VAR(tcc[0]));
1332 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EBX), STACK_VAR(tcc[1]));
1333
1334
1335 EMIT3(0x83, add_1reg(0xF8, IA32_EBX), hi);
1336 EMIT2(IA32_JNE, 3);
1337
1338 EMIT3(0x83, add_1reg(0xF8, IA32_ECX), lo);
1339
1340
1341 EMIT2(IA32_JAE, jmp_label(jmp_label1, 2));
1342
1343
1344 EMIT3(0x83, add_1reg(0xC0, IA32_ECX), 0x01);
1345
1346 EMIT3(0x83, add_1reg(0xD0, IA32_EBX), 0x00);
1347
1348
1349 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_ECX), STACK_VAR(tcc[0]));
1350
1351 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EBX), STACK_VAR(tcc[1]));
1352
1353
1354
1355 EMIT3_off32(0x8B, 0x94, 0x90, offsetof(struct bpf_array, ptrs));
1356
1357
1358
1359
1360
1361
1362 EMIT2(0x85, add_2reg(0xC0, IA32_EDX, IA32_EDX));
1363
1364 EMIT2(IA32_JE, jmp_label(jmp_label1, 2));
1365
1366
1367
1368 EMIT3(0x8B, add_2reg(0x40, IA32_EDX, IA32_EDX),
1369 offsetof(struct bpf_prog, bpf_func));
1370
1371 EMIT3(0x83, add_1reg(0xC0, IA32_EDX), PROLOGUE_SIZE);
1372
1373
1374 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(r1[0]));
1375
1376
1377
1378
1379
1380
1381 cnt += emit_jmp_edx(&prog, ip + cnt);
1382
1383 if (jmp_label1 == -1)
1384 jmp_label1 = cnt;
1385
1386
1387 *pprog = prog;
1388 }
1389
1390
1391 static inline void emit_push_r64(const u8 src[], u8 **pprog)
1392 {
1393 u8 *prog = *pprog;
1394 int cnt = 0;
1395
1396
1397 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX), STACK_VAR(src_hi));
1398
1399 EMIT1(0x51);
1400
1401
1402 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX), STACK_VAR(src_lo));
1403
1404 EMIT1(0x51);
1405
1406 *pprog = prog;
1407 }
1408
1409 static void emit_push_r32(const u8 src[], u8 **pprog)
1410 {
1411 u8 *prog = *pprog;
1412 int cnt = 0;
1413
1414
1415 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX), STACK_VAR(src_lo));
1416
1417 EMIT1(0x51);
1418
1419 *pprog = prog;
1420 }
1421
1422 static u8 get_cond_jmp_opcode(const u8 op, bool is_cmp_lo)
1423 {
1424 u8 jmp_cond;
1425
1426
1427 switch (op) {
1428 case BPF_JEQ:
1429 jmp_cond = IA32_JE;
1430 break;
1431 case BPF_JSET:
1432 case BPF_JNE:
1433 jmp_cond = IA32_JNE;
1434 break;
1435 case BPF_JGT:
1436
1437 jmp_cond = IA32_JA;
1438 break;
1439 case BPF_JLT:
1440
1441 jmp_cond = IA32_JB;
1442 break;
1443 case BPF_JGE:
1444
1445 jmp_cond = IA32_JAE;
1446 break;
1447 case BPF_JLE:
1448
1449 jmp_cond = IA32_JBE;
1450 break;
1451 case BPF_JSGT:
1452 if (!is_cmp_lo)
1453
1454 jmp_cond = IA32_JG;
1455 else
1456
1457 jmp_cond = IA32_JA;
1458 break;
1459 case BPF_JSLT:
1460 if (!is_cmp_lo)
1461
1462 jmp_cond = IA32_JL;
1463 else
1464
1465 jmp_cond = IA32_JB;
1466 break;
1467 case BPF_JSGE:
1468 if (!is_cmp_lo)
1469
1470 jmp_cond = IA32_JGE;
1471 else
1472
1473 jmp_cond = IA32_JAE;
1474 break;
1475 case BPF_JSLE:
1476 if (!is_cmp_lo)
1477
1478 jmp_cond = IA32_JLE;
1479 else
1480
1481 jmp_cond = IA32_JBE;
1482 break;
1483 default:
1484 jmp_cond = COND_JMP_OPCODE_INVALID;
1485 break;
1486 }
1487
1488 return jmp_cond;
1489 }
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569 static int emit_kfunc_call(const struct bpf_prog *bpf_prog, u8 *end_addr,
1570 const struct bpf_insn *insn, u8 **pprog)
1571 {
1572 const u8 arg_regs[] = { IA32_EAX, IA32_EDX, IA32_ECX };
1573 int i, cnt = 0, first_stack_regno, last_stack_regno;
1574 int free_arg_regs = ARRAY_SIZE(arg_regs);
1575 const struct btf_func_model *fm;
1576 int bytes_in_stack = 0;
1577 const u8 *cur_arg_reg;
1578 u8 *prog = *pprog;
1579 s64 jmp_offset;
1580
1581 fm = bpf_jit_find_kfunc_model(bpf_prog, insn);
1582 if (!fm)
1583 return -EINVAL;
1584
1585 first_stack_regno = BPF_REG_1;
1586 for (i = 0; i < fm->nr_args; i++) {
1587 int regs_needed = fm->arg_size[i] > sizeof(u32) ? 2 : 1;
1588
1589 if (regs_needed > free_arg_regs)
1590 break;
1591
1592 free_arg_regs -= regs_needed;
1593 first_stack_regno++;
1594 }
1595
1596
1597 last_stack_regno = BPF_REG_0 + fm->nr_args;
1598 for (i = last_stack_regno; i >= first_stack_regno; i--) {
1599 if (fm->arg_size[i - 1] > sizeof(u32)) {
1600 emit_push_r64(bpf2ia32[i], &prog);
1601 bytes_in_stack += 8;
1602 } else {
1603 emit_push_r32(bpf2ia32[i], &prog);
1604 bytes_in_stack += 4;
1605 }
1606 }
1607
1608 cur_arg_reg = &arg_regs[0];
1609 for (i = BPF_REG_1; i < first_stack_regno; i++) {
1610
1611 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, *cur_arg_reg++),
1612 STACK_VAR(bpf2ia32[i][0]));
1613 if (fm->arg_size[i - 1] > sizeof(u32))
1614
1615 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, *cur_arg_reg++),
1616 STACK_VAR(bpf2ia32[i][1]));
1617 }
1618
1619 if (bytes_in_stack)
1620
1621 end_addr -= 3;
1622
1623
1624 if (fm->ret_size > sizeof(u32))
1625 end_addr -= 3;
1626
1627
1628 if (fm->ret_size)
1629 end_addr -= 3;
1630
1631 jmp_offset = (u8 *)__bpf_call_base + insn->imm - end_addr;
1632 if (!is_simm32(jmp_offset)) {
1633 pr_err("unsupported BPF kernel function jmp_offset:%lld\n",
1634 jmp_offset);
1635 return -EINVAL;
1636 }
1637
1638 EMIT1_off32(0xE8, jmp_offset);
1639
1640 if (fm->ret_size)
1641
1642 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EAX),
1643 STACK_VAR(bpf2ia32[BPF_REG_0][0]));
1644
1645 if (fm->ret_size > sizeof(u32))
1646
1647 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EDX),
1648 STACK_VAR(bpf2ia32[BPF_REG_0][1]));
1649
1650 if (bytes_in_stack)
1651
1652 EMIT3(0x83, add_1reg(0xC0, IA32_ESP), bytes_in_stack);
1653
1654 *pprog = prog;
1655
1656 return 0;
1657 }
1658
1659 static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
1660 int oldproglen, struct jit_context *ctx)
1661 {
1662 struct bpf_insn *insn = bpf_prog->insnsi;
1663 int insn_cnt = bpf_prog->len;
1664 bool seen_exit = false;
1665 u8 temp[BPF_MAX_INSN_SIZE + BPF_INSN_SAFETY];
1666 int i, cnt = 0;
1667 int proglen = 0;
1668 u8 *prog = temp;
1669
1670 emit_prologue(&prog, bpf_prog->aux->stack_depth);
1671
1672 for (i = 0; i < insn_cnt; i++, insn++) {
1673 const s32 imm32 = insn->imm;
1674 const bool is64 = BPF_CLASS(insn->code) == BPF_ALU64;
1675 const bool dstk = insn->dst_reg != BPF_REG_AX;
1676 const bool sstk = insn->src_reg != BPF_REG_AX;
1677 const u8 code = insn->code;
1678 const u8 *dst = bpf2ia32[insn->dst_reg];
1679 const u8 *src = bpf2ia32[insn->src_reg];
1680 const u8 *r0 = bpf2ia32[BPF_REG_0];
1681 s64 jmp_offset;
1682 u8 jmp_cond;
1683 int ilen;
1684 u8 *func;
1685
1686 switch (code) {
1687
1688
1689 case BPF_ALU | BPF_MOV | BPF_K:
1690 case BPF_ALU | BPF_MOV | BPF_X:
1691 case BPF_ALU64 | BPF_MOV | BPF_K:
1692 case BPF_ALU64 | BPF_MOV | BPF_X:
1693 switch (BPF_SRC(code)) {
1694 case BPF_X:
1695 if (imm32 == 1) {
1696
1697 emit_ia32_mov_i(dst_hi, 0, dstk, &prog);
1698 break;
1699 }
1700 emit_ia32_mov_r64(is64, dst, src, dstk, sstk,
1701 &prog, bpf_prog->aux);
1702 break;
1703 case BPF_K:
1704
1705 emit_ia32_mov_i64(is64, dst, imm32,
1706 dstk, &prog);
1707 break;
1708 }
1709 break;
1710
1711
1712
1713
1714
1715
1716
1717
1718 case BPF_ALU | BPF_ADD | BPF_K:
1719 case BPF_ALU | BPF_ADD | BPF_X:
1720 case BPF_ALU | BPF_SUB | BPF_K:
1721 case BPF_ALU | BPF_SUB | BPF_X:
1722 case BPF_ALU | BPF_OR | BPF_K:
1723 case BPF_ALU | BPF_OR | BPF_X:
1724 case BPF_ALU | BPF_AND | BPF_K:
1725 case BPF_ALU | BPF_AND | BPF_X:
1726 case BPF_ALU | BPF_XOR | BPF_K:
1727 case BPF_ALU | BPF_XOR | BPF_X:
1728 case BPF_ALU64 | BPF_ADD | BPF_K:
1729 case BPF_ALU64 | BPF_ADD | BPF_X:
1730 case BPF_ALU64 | BPF_SUB | BPF_K:
1731 case BPF_ALU64 | BPF_SUB | BPF_X:
1732 case BPF_ALU64 | BPF_OR | BPF_K:
1733 case BPF_ALU64 | BPF_OR | BPF_X:
1734 case BPF_ALU64 | BPF_AND | BPF_K:
1735 case BPF_ALU64 | BPF_AND | BPF_X:
1736 case BPF_ALU64 | BPF_XOR | BPF_K:
1737 case BPF_ALU64 | BPF_XOR | BPF_X:
1738 switch (BPF_SRC(code)) {
1739 case BPF_X:
1740 emit_ia32_alu_r64(is64, BPF_OP(code), dst,
1741 src, dstk, sstk, &prog,
1742 bpf_prog->aux);
1743 break;
1744 case BPF_K:
1745 emit_ia32_alu_i64(is64, BPF_OP(code), dst,
1746 imm32, dstk, &prog,
1747 bpf_prog->aux);
1748 break;
1749 }
1750 break;
1751 case BPF_ALU | BPF_MUL | BPF_K:
1752 case BPF_ALU | BPF_MUL | BPF_X:
1753 switch (BPF_SRC(code)) {
1754 case BPF_X:
1755 emit_ia32_mul_r(dst_lo, src_lo, dstk,
1756 sstk, &prog);
1757 break;
1758 case BPF_K:
1759
1760 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_ECX),
1761 imm32);
1762 emit_ia32_mul_r(dst_lo, IA32_ECX, dstk,
1763 false, &prog);
1764 break;
1765 }
1766 if (!bpf_prog->aux->verifier_zext)
1767 emit_ia32_mov_i(dst_hi, 0, dstk, &prog);
1768 break;
1769 case BPF_ALU | BPF_LSH | BPF_X:
1770 case BPF_ALU | BPF_RSH | BPF_X:
1771 case BPF_ALU | BPF_ARSH | BPF_K:
1772 case BPF_ALU | BPF_ARSH | BPF_X:
1773 switch (BPF_SRC(code)) {
1774 case BPF_X:
1775 emit_ia32_shift_r(BPF_OP(code), dst_lo, src_lo,
1776 dstk, sstk, &prog);
1777 break;
1778 case BPF_K:
1779
1780 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_ECX),
1781 imm32);
1782 emit_ia32_shift_r(BPF_OP(code), dst_lo,
1783 IA32_ECX, dstk, false,
1784 &prog);
1785 break;
1786 }
1787 if (!bpf_prog->aux->verifier_zext)
1788 emit_ia32_mov_i(dst_hi, 0, dstk, &prog);
1789 break;
1790
1791
1792 case BPF_ALU | BPF_DIV | BPF_K:
1793 case BPF_ALU | BPF_DIV | BPF_X:
1794 case BPF_ALU | BPF_MOD | BPF_K:
1795 case BPF_ALU | BPF_MOD | BPF_X:
1796 switch (BPF_SRC(code)) {
1797 case BPF_X:
1798 emit_ia32_div_mod_r(BPF_OP(code), dst_lo,
1799 src_lo, dstk, sstk, &prog);
1800 break;
1801 case BPF_K:
1802
1803 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_ECX),
1804 imm32);
1805 emit_ia32_div_mod_r(BPF_OP(code), dst_lo,
1806 IA32_ECX, dstk, false,
1807 &prog);
1808 break;
1809 }
1810 if (!bpf_prog->aux->verifier_zext)
1811 emit_ia32_mov_i(dst_hi, 0, dstk, &prog);
1812 break;
1813 case BPF_ALU64 | BPF_DIV | BPF_K:
1814 case BPF_ALU64 | BPF_DIV | BPF_X:
1815 case BPF_ALU64 | BPF_MOD | BPF_K:
1816 case BPF_ALU64 | BPF_MOD | BPF_X:
1817 goto notyet;
1818
1819
1820 case BPF_ALU | BPF_RSH | BPF_K:
1821 case BPF_ALU | BPF_LSH | BPF_K:
1822 if (unlikely(imm32 > 31))
1823 return -EINVAL;
1824
1825 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_ECX), imm32);
1826 emit_ia32_shift_r(BPF_OP(code), dst_lo, IA32_ECX, dstk,
1827 false, &prog);
1828 if (!bpf_prog->aux->verifier_zext)
1829 emit_ia32_mov_i(dst_hi, 0, dstk, &prog);
1830 break;
1831
1832 case BPF_ALU64 | BPF_LSH | BPF_K:
1833 if (unlikely(imm32 > 63))
1834 return -EINVAL;
1835 emit_ia32_lsh_i64(dst, imm32, dstk, &prog);
1836 break;
1837
1838 case BPF_ALU64 | BPF_RSH | BPF_K:
1839 if (unlikely(imm32 > 63))
1840 return -EINVAL;
1841 emit_ia32_rsh_i64(dst, imm32, dstk, &prog);
1842 break;
1843
1844 case BPF_ALU64 | BPF_LSH | BPF_X:
1845 emit_ia32_lsh_r64(dst, src, dstk, sstk, &prog);
1846 break;
1847
1848 case BPF_ALU64 | BPF_RSH | BPF_X:
1849 emit_ia32_rsh_r64(dst, src, dstk, sstk, &prog);
1850 break;
1851
1852 case BPF_ALU64 | BPF_ARSH | BPF_X:
1853 emit_ia32_arsh_r64(dst, src, dstk, sstk, &prog);
1854 break;
1855
1856 case BPF_ALU64 | BPF_ARSH | BPF_K:
1857 if (unlikely(imm32 > 63))
1858 return -EINVAL;
1859 emit_ia32_arsh_i64(dst, imm32, dstk, &prog);
1860 break;
1861
1862 case BPF_ALU | BPF_NEG:
1863 emit_ia32_alu_i(is64, false, BPF_OP(code),
1864 dst_lo, 0, dstk, &prog);
1865 if (!bpf_prog->aux->verifier_zext)
1866 emit_ia32_mov_i(dst_hi, 0, dstk, &prog);
1867 break;
1868
1869 case BPF_ALU64 | BPF_NEG:
1870 emit_ia32_neg64(dst, dstk, &prog);
1871 break;
1872
1873 case BPF_ALU64 | BPF_MUL | BPF_X:
1874 case BPF_ALU64 | BPF_MUL | BPF_K:
1875 switch (BPF_SRC(code)) {
1876 case BPF_X:
1877 emit_ia32_mul_r64(dst, src, dstk, sstk, &prog);
1878 break;
1879 case BPF_K:
1880 emit_ia32_mul_i64(dst, imm32, dstk, &prog);
1881 break;
1882 }
1883 break;
1884
1885 case BPF_ALU | BPF_END | BPF_FROM_LE:
1886 emit_ia32_to_le_r64(dst, imm32, dstk, &prog,
1887 bpf_prog->aux);
1888 break;
1889
1890 case BPF_ALU | BPF_END | BPF_FROM_BE:
1891 emit_ia32_to_be_r64(dst, imm32, dstk, &prog,
1892 bpf_prog->aux);
1893 break;
1894
1895 case BPF_LD | BPF_IMM | BPF_DW: {
1896 s32 hi, lo = imm32;
1897
1898 hi = insn[1].imm;
1899 emit_ia32_mov_i(dst_lo, lo, dstk, &prog);
1900 emit_ia32_mov_i(dst_hi, hi, dstk, &prog);
1901 insn++;
1902 i++;
1903 break;
1904 }
1905
1906 case BPF_ST | BPF_NOSPEC:
1907 if (boot_cpu_has(X86_FEATURE_XMM2))
1908
1909 EMIT3(0x0F, 0xAE, 0xE8);
1910 break;
1911
1912 case BPF_ST | BPF_MEM | BPF_H:
1913 case BPF_ST | BPF_MEM | BPF_B:
1914 case BPF_ST | BPF_MEM | BPF_W:
1915 case BPF_ST | BPF_MEM | BPF_DW:
1916 if (dstk)
1917
1918 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
1919 STACK_VAR(dst_lo));
1920 else
1921
1922 EMIT2(0x8B, add_2reg(0xC0, dst_lo, IA32_EAX));
1923
1924 switch (BPF_SIZE(code)) {
1925 case BPF_B:
1926 EMIT(0xC6, 1); break;
1927 case BPF_H:
1928 EMIT2(0x66, 0xC7); break;
1929 case BPF_W:
1930 case BPF_DW:
1931 EMIT(0xC7, 1); break;
1932 }
1933
1934 if (is_imm8(insn->off))
1935 EMIT2(add_1reg(0x40, IA32_EAX), insn->off);
1936 else
1937 EMIT1_off32(add_1reg(0x80, IA32_EAX),
1938 insn->off);
1939 EMIT(imm32, bpf_size_to_x86_bytes(BPF_SIZE(code)));
1940
1941 if (BPF_SIZE(code) == BPF_DW) {
1942 u32 hi;
1943
1944 hi = imm32 & (1<<31) ? (u32)~0 : 0;
1945 EMIT2_off32(0xC7, add_1reg(0x80, IA32_EAX),
1946 insn->off + 4);
1947 EMIT(hi, 4);
1948 }
1949 break;
1950
1951
1952 case BPF_STX | BPF_MEM | BPF_B:
1953 case BPF_STX | BPF_MEM | BPF_H:
1954 case BPF_STX | BPF_MEM | BPF_W:
1955 case BPF_STX | BPF_MEM | BPF_DW:
1956 if (dstk)
1957
1958 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
1959 STACK_VAR(dst_lo));
1960 else
1961
1962 EMIT2(0x8B, add_2reg(0xC0, dst_lo, IA32_EAX));
1963
1964 if (sstk)
1965
1966 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX),
1967 STACK_VAR(src_lo));
1968 else
1969
1970 EMIT2(0x8B, add_2reg(0xC0, src_lo, IA32_EDX));
1971
1972 switch (BPF_SIZE(code)) {
1973 case BPF_B:
1974 EMIT(0x88, 1); break;
1975 case BPF_H:
1976 EMIT2(0x66, 0x89); break;
1977 case BPF_W:
1978 case BPF_DW:
1979 EMIT(0x89, 1); break;
1980 }
1981
1982 if (is_imm8(insn->off))
1983 EMIT2(add_2reg(0x40, IA32_EAX, IA32_EDX),
1984 insn->off);
1985 else
1986 EMIT1_off32(add_2reg(0x80, IA32_EAX, IA32_EDX),
1987 insn->off);
1988
1989 if (BPF_SIZE(code) == BPF_DW) {
1990 if (sstk)
1991
1992 EMIT3(0x8B, add_2reg(0x40, IA32_EBP,
1993 IA32_EDX),
1994 STACK_VAR(src_hi));
1995 else
1996
1997 EMIT2(0x8B, add_2reg(0xC0, src_hi,
1998 IA32_EDX));
1999 EMIT1(0x89);
2000 if (is_imm8(insn->off + 4)) {
2001 EMIT2(add_2reg(0x40, IA32_EAX,
2002 IA32_EDX),
2003 insn->off + 4);
2004 } else {
2005 EMIT1(add_2reg(0x80, IA32_EAX,
2006 IA32_EDX));
2007 EMIT(insn->off + 4, 4);
2008 }
2009 }
2010 break;
2011
2012
2013 case BPF_LDX | BPF_MEM | BPF_B:
2014 case BPF_LDX | BPF_MEM | BPF_H:
2015 case BPF_LDX | BPF_MEM | BPF_W:
2016 case BPF_LDX | BPF_MEM | BPF_DW:
2017 if (sstk)
2018
2019 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
2020 STACK_VAR(src_lo));
2021 else
2022
2023 EMIT2(0x8B, add_2reg(0xC0, src_lo, IA32_EAX));
2024
2025 switch (BPF_SIZE(code)) {
2026 case BPF_B:
2027 EMIT2(0x0F, 0xB6); break;
2028 case BPF_H:
2029 EMIT2(0x0F, 0xB7); break;
2030 case BPF_W:
2031 case BPF_DW:
2032 EMIT(0x8B, 1); break;
2033 }
2034
2035 if (is_imm8(insn->off))
2036 EMIT2(add_2reg(0x40, IA32_EAX, IA32_EDX),
2037 insn->off);
2038 else
2039 EMIT1_off32(add_2reg(0x80, IA32_EAX, IA32_EDX),
2040 insn->off);
2041
2042 if (dstk)
2043
2044 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EDX),
2045 STACK_VAR(dst_lo));
2046 else
2047
2048 EMIT2(0x89, add_2reg(0xC0, dst_lo, IA32_EDX));
2049 switch (BPF_SIZE(code)) {
2050 case BPF_B:
2051 case BPF_H:
2052 case BPF_W:
2053 if (bpf_prog->aux->verifier_zext)
2054 break;
2055 if (dstk) {
2056 EMIT3(0xC7, add_1reg(0x40, IA32_EBP),
2057 STACK_VAR(dst_hi));
2058 EMIT(0x0, 4);
2059 } else {
2060
2061 EMIT2(0x33,
2062 add_2reg(0xC0, dst_hi, dst_hi));
2063 }
2064 break;
2065 case BPF_DW:
2066 EMIT2_off32(0x8B,
2067 add_2reg(0x80, IA32_EAX, IA32_EDX),
2068 insn->off + 4);
2069 if (dstk)
2070 EMIT3(0x89,
2071 add_2reg(0x40, IA32_EBP,
2072 IA32_EDX),
2073 STACK_VAR(dst_hi));
2074 else
2075 EMIT2(0x89,
2076 add_2reg(0xC0, dst_hi, IA32_EDX));
2077 break;
2078 default:
2079 break;
2080 }
2081 break;
2082
2083 case BPF_JMP | BPF_CALL:
2084 {
2085 const u8 *r1 = bpf2ia32[BPF_REG_1];
2086 const u8 *r2 = bpf2ia32[BPF_REG_2];
2087 const u8 *r3 = bpf2ia32[BPF_REG_3];
2088 const u8 *r4 = bpf2ia32[BPF_REG_4];
2089 const u8 *r5 = bpf2ia32[BPF_REG_5];
2090
2091 if (insn->src_reg == BPF_PSEUDO_CALL)
2092 goto notyet;
2093
2094 if (insn->src_reg == BPF_PSEUDO_KFUNC_CALL) {
2095 int err;
2096
2097 err = emit_kfunc_call(bpf_prog,
2098 image + addrs[i],
2099 insn, &prog);
2100
2101 if (err)
2102 return err;
2103 break;
2104 }
2105
2106 func = (u8 *) __bpf_call_base + imm32;
2107 jmp_offset = func - (image + addrs[i]);
2108
2109 if (!imm32 || !is_simm32(jmp_offset)) {
2110 pr_err("unsupported BPF func %d addr %p image %p\n",
2111 imm32, func, image);
2112 return -EINVAL;
2113 }
2114
2115
2116 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
2117 STACK_VAR(r1[0]));
2118
2119 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX),
2120 STACK_VAR(r1[1]));
2121
2122 emit_push_r64(r5, &prog);
2123 emit_push_r64(r4, &prog);
2124 emit_push_r64(r3, &prog);
2125 emit_push_r64(r2, &prog);
2126
2127 EMIT1_off32(0xE8, jmp_offset + 9);
2128
2129
2130 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EAX),
2131 STACK_VAR(r0[0]));
2132
2133 EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EDX),
2134 STACK_VAR(r0[1]));
2135
2136
2137 EMIT3(0x83, add_1reg(0xC0, IA32_ESP), 32);
2138 break;
2139 }
2140 case BPF_JMP | BPF_TAIL_CALL:
2141 emit_bpf_tail_call(&prog, image + addrs[i - 1]);
2142 break;
2143
2144
2145 case BPF_JMP | BPF_JEQ | BPF_X:
2146 case BPF_JMP | BPF_JNE | BPF_X:
2147 case BPF_JMP | BPF_JGT | BPF_X:
2148 case BPF_JMP | BPF_JLT | BPF_X:
2149 case BPF_JMP | BPF_JGE | BPF_X:
2150 case BPF_JMP | BPF_JLE | BPF_X:
2151 case BPF_JMP32 | BPF_JEQ | BPF_X:
2152 case BPF_JMP32 | BPF_JNE | BPF_X:
2153 case BPF_JMP32 | BPF_JGT | BPF_X:
2154 case BPF_JMP32 | BPF_JLT | BPF_X:
2155 case BPF_JMP32 | BPF_JGE | BPF_X:
2156 case BPF_JMP32 | BPF_JLE | BPF_X:
2157 case BPF_JMP32 | BPF_JSGT | BPF_X:
2158 case BPF_JMP32 | BPF_JSLE | BPF_X:
2159 case BPF_JMP32 | BPF_JSLT | BPF_X:
2160 case BPF_JMP32 | BPF_JSGE | BPF_X: {
2161 bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP;
2162 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
2163 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
2164 u8 sreg_lo = sstk ? IA32_ECX : src_lo;
2165 u8 sreg_hi = sstk ? IA32_EBX : src_hi;
2166
2167 if (dstk) {
2168 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
2169 STACK_VAR(dst_lo));
2170 if (is_jmp64)
2171 EMIT3(0x8B,
2172 add_2reg(0x40, IA32_EBP,
2173 IA32_EDX),
2174 STACK_VAR(dst_hi));
2175 }
2176
2177 if (sstk) {
2178 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX),
2179 STACK_VAR(src_lo));
2180 if (is_jmp64)
2181 EMIT3(0x8B,
2182 add_2reg(0x40, IA32_EBP,
2183 IA32_EBX),
2184 STACK_VAR(src_hi));
2185 }
2186
2187 if (is_jmp64) {
2188
2189 EMIT2(0x39, add_2reg(0xC0, dreg_hi, sreg_hi));
2190 EMIT2(IA32_JNE, 2);
2191 }
2192
2193 EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo));
2194 goto emit_cond_jmp;
2195 }
2196 case BPF_JMP | BPF_JSGT | BPF_X:
2197 case BPF_JMP | BPF_JSLE | BPF_X:
2198 case BPF_JMP | BPF_JSLT | BPF_X:
2199 case BPF_JMP | BPF_JSGE | BPF_X: {
2200 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
2201 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
2202 u8 sreg_lo = sstk ? IA32_ECX : src_lo;
2203 u8 sreg_hi = sstk ? IA32_EBX : src_hi;
2204
2205 if (dstk) {
2206 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
2207 STACK_VAR(dst_lo));
2208 EMIT3(0x8B,
2209 add_2reg(0x40, IA32_EBP,
2210 IA32_EDX),
2211 STACK_VAR(dst_hi));
2212 }
2213
2214 if (sstk) {
2215 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX),
2216 STACK_VAR(src_lo));
2217 EMIT3(0x8B,
2218 add_2reg(0x40, IA32_EBP,
2219 IA32_EBX),
2220 STACK_VAR(src_hi));
2221 }
2222
2223
2224 EMIT2(0x39, add_2reg(0xC0, dreg_hi, sreg_hi));
2225 EMIT2(IA32_JNE, 10);
2226
2227 EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo));
2228 goto emit_cond_jmp_signed;
2229 }
2230 case BPF_JMP | BPF_JSET | BPF_X:
2231 case BPF_JMP32 | BPF_JSET | BPF_X: {
2232 bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP;
2233 u8 dreg_lo = IA32_EAX;
2234 u8 dreg_hi = IA32_EDX;
2235 u8 sreg_lo = sstk ? IA32_ECX : src_lo;
2236 u8 sreg_hi = sstk ? IA32_EBX : src_hi;
2237
2238 if (dstk) {
2239 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
2240 STACK_VAR(dst_lo));
2241 if (is_jmp64)
2242 EMIT3(0x8B,
2243 add_2reg(0x40, IA32_EBP,
2244 IA32_EDX),
2245 STACK_VAR(dst_hi));
2246 } else {
2247
2248 EMIT2(0x89, add_2reg(0xC0, dreg_lo, dst_lo));
2249 if (is_jmp64)
2250
2251 EMIT2(0x89,
2252 add_2reg(0xC0, dreg_hi, dst_hi));
2253 }
2254
2255 if (sstk) {
2256 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX),
2257 STACK_VAR(src_lo));
2258 if (is_jmp64)
2259 EMIT3(0x8B,
2260 add_2reg(0x40, IA32_EBP,
2261 IA32_EBX),
2262 STACK_VAR(src_hi));
2263 }
2264
2265 EMIT2(0x23, add_2reg(0xC0, sreg_lo, dreg_lo));
2266 if (is_jmp64) {
2267
2268 EMIT2(0x23, add_2reg(0xC0, sreg_hi, dreg_hi));
2269
2270 EMIT2(0x09, add_2reg(0xC0, dreg_lo, dreg_hi));
2271 }
2272 goto emit_cond_jmp;
2273 }
2274 case BPF_JMP | BPF_JSET | BPF_K:
2275 case BPF_JMP32 | BPF_JSET | BPF_K: {
2276 bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP;
2277 u8 dreg_lo = IA32_EAX;
2278 u8 dreg_hi = IA32_EDX;
2279 u8 sreg_lo = IA32_ECX;
2280 u8 sreg_hi = IA32_EBX;
2281 u32 hi;
2282
2283 if (dstk) {
2284 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
2285 STACK_VAR(dst_lo));
2286 if (is_jmp64)
2287 EMIT3(0x8B,
2288 add_2reg(0x40, IA32_EBP,
2289 IA32_EDX),
2290 STACK_VAR(dst_hi));
2291 } else {
2292
2293 EMIT2(0x89, add_2reg(0xC0, dreg_lo, dst_lo));
2294 if (is_jmp64)
2295
2296 EMIT2(0x89,
2297 add_2reg(0xC0, dreg_hi, dst_hi));
2298 }
2299
2300
2301 EMIT2_off32(0xC7, add_1reg(0xC0, sreg_lo), imm32);
2302
2303
2304 EMIT2(0x23, add_2reg(0xC0, sreg_lo, dreg_lo));
2305 if (is_jmp64) {
2306 hi = imm32 & (1 << 31) ? (u32)~0 : 0;
2307
2308 EMIT2_off32(0xC7, add_1reg(0xC0, sreg_hi), hi);
2309
2310 EMIT2(0x23, add_2reg(0xC0, sreg_hi, dreg_hi));
2311
2312 EMIT2(0x09, add_2reg(0xC0, dreg_lo, dreg_hi));
2313 }
2314 goto emit_cond_jmp;
2315 }
2316 case BPF_JMP | BPF_JEQ | BPF_K:
2317 case BPF_JMP | BPF_JNE | BPF_K:
2318 case BPF_JMP | BPF_JGT | BPF_K:
2319 case BPF_JMP | BPF_JLT | BPF_K:
2320 case BPF_JMP | BPF_JGE | BPF_K:
2321 case BPF_JMP | BPF_JLE | BPF_K:
2322 case BPF_JMP32 | BPF_JEQ | BPF_K:
2323 case BPF_JMP32 | BPF_JNE | BPF_K:
2324 case BPF_JMP32 | BPF_JGT | BPF_K:
2325 case BPF_JMP32 | BPF_JLT | BPF_K:
2326 case BPF_JMP32 | BPF_JGE | BPF_K:
2327 case BPF_JMP32 | BPF_JLE | BPF_K:
2328 case BPF_JMP32 | BPF_JSGT | BPF_K:
2329 case BPF_JMP32 | BPF_JSLE | BPF_K:
2330 case BPF_JMP32 | BPF_JSLT | BPF_K:
2331 case BPF_JMP32 | BPF_JSGE | BPF_K: {
2332 bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP;
2333 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
2334 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
2335 u8 sreg_lo = IA32_ECX;
2336 u8 sreg_hi = IA32_EBX;
2337 u32 hi;
2338
2339 if (dstk) {
2340 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
2341 STACK_VAR(dst_lo));
2342 if (is_jmp64)
2343 EMIT3(0x8B,
2344 add_2reg(0x40, IA32_EBP,
2345 IA32_EDX),
2346 STACK_VAR(dst_hi));
2347 }
2348
2349
2350 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_ECX), imm32);
2351 if (is_jmp64) {
2352 hi = imm32 & (1 << 31) ? (u32)~0 : 0;
2353
2354 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_EBX), hi);
2355
2356 EMIT2(0x39, add_2reg(0xC0, dreg_hi, sreg_hi));
2357 EMIT2(IA32_JNE, 2);
2358 }
2359
2360 EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo));
2361
2362 emit_cond_jmp: jmp_cond = get_cond_jmp_opcode(BPF_OP(code), false);
2363 if (jmp_cond == COND_JMP_OPCODE_INVALID)
2364 return -EFAULT;
2365 jmp_offset = addrs[i + insn->off] - addrs[i];
2366 if (is_imm8(jmp_offset)) {
2367 EMIT2(jmp_cond, jmp_offset);
2368 } else if (is_simm32(jmp_offset)) {
2369 EMIT2_off32(0x0F, jmp_cond + 0x10, jmp_offset);
2370 } else {
2371 pr_err("cond_jmp gen bug %llx\n", jmp_offset);
2372 return -EFAULT;
2373 }
2374 break;
2375 }
2376 case BPF_JMP | BPF_JSGT | BPF_K:
2377 case BPF_JMP | BPF_JSLE | BPF_K:
2378 case BPF_JMP | BPF_JSLT | BPF_K:
2379 case BPF_JMP | BPF_JSGE | BPF_K: {
2380 u8 dreg_lo = dstk ? IA32_EAX : dst_lo;
2381 u8 dreg_hi = dstk ? IA32_EDX : dst_hi;
2382 u8 sreg_lo = IA32_ECX;
2383 u8 sreg_hi = IA32_EBX;
2384 u32 hi;
2385
2386 if (dstk) {
2387 EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX),
2388 STACK_VAR(dst_lo));
2389 EMIT3(0x8B,
2390 add_2reg(0x40, IA32_EBP,
2391 IA32_EDX),
2392 STACK_VAR(dst_hi));
2393 }
2394
2395
2396 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_ECX), imm32);
2397 hi = imm32 & (1 << 31) ? (u32)~0 : 0;
2398
2399 EMIT2_off32(0xC7, add_1reg(0xC0, IA32_EBX), hi);
2400
2401 EMIT2(0x39, add_2reg(0xC0, dreg_hi, sreg_hi));
2402 EMIT2(IA32_JNE, 10);
2403
2404 EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo));
2405
2406
2407
2408
2409
2410 emit_cond_jmp_signed:
2411 jmp_cond = get_cond_jmp_opcode(BPF_OP(code), true);
2412 if (jmp_cond == COND_JMP_OPCODE_INVALID)
2413 return -EFAULT;
2414 jmp_offset = addrs[i + insn->off] - addrs[i] + 8;
2415 if (is_simm32(jmp_offset)) {
2416 EMIT2_off32(0x0F, jmp_cond + 0x10, jmp_offset);
2417 } else {
2418 pr_err("cond_jmp gen bug %llx\n", jmp_offset);
2419 return -EFAULT;
2420 }
2421 EMIT2(0xEB, 6);
2422
2423
2424 jmp_cond = get_cond_jmp_opcode(BPF_OP(code), false);
2425 if (jmp_cond == COND_JMP_OPCODE_INVALID)
2426 return -EFAULT;
2427 jmp_offset = addrs[i + insn->off] - addrs[i];
2428 if (is_simm32(jmp_offset)) {
2429 EMIT2_off32(0x0F, jmp_cond + 0x10, jmp_offset);
2430 } else {
2431 pr_err("cond_jmp gen bug %llx\n", jmp_offset);
2432 return -EFAULT;
2433 }
2434 break;
2435 }
2436 case BPF_JMP | BPF_JA:
2437 if (insn->off == -1)
2438
2439
2440
2441
2442
2443
2444 jmp_offset = -2;
2445 else
2446 jmp_offset = addrs[i + insn->off] - addrs[i];
2447
2448 if (!jmp_offset)
2449
2450 break;
2451 emit_jmp:
2452 if (is_imm8(jmp_offset)) {
2453 EMIT2(0xEB, jmp_offset);
2454 } else if (is_simm32(jmp_offset)) {
2455 EMIT1_off32(0xE9, jmp_offset);
2456 } else {
2457 pr_err("jmp gen bug %llx\n", jmp_offset);
2458 return -EFAULT;
2459 }
2460 break;
2461 case BPF_STX | BPF_ATOMIC | BPF_W:
2462 case BPF_STX | BPF_ATOMIC | BPF_DW:
2463 goto notyet;
2464 case BPF_JMP | BPF_EXIT:
2465 if (seen_exit) {
2466 jmp_offset = ctx->cleanup_addr - addrs[i];
2467 goto emit_jmp;
2468 }
2469 seen_exit = true;
2470
2471 ctx->cleanup_addr = proglen;
2472 emit_epilogue(&prog, bpf_prog->aux->stack_depth);
2473 break;
2474 notyet:
2475 pr_info_once("*** NOT YET: opcode %02x ***\n", code);
2476 return -EFAULT;
2477 default:
2478
2479
2480
2481
2482
2483 pr_err("bpf_jit: unknown opcode %02x\n", code);
2484 return -EINVAL;
2485 }
2486
2487 ilen = prog - temp;
2488 if (ilen > BPF_MAX_INSN_SIZE) {
2489 pr_err("bpf_jit: fatal insn size error\n");
2490 return -EFAULT;
2491 }
2492
2493 if (image) {
2494
2495
2496
2497
2498
2499
2500
2501
2502 if (unlikely(proglen + ilen > oldproglen ||
2503 proglen + ilen != addrs[i])) {
2504 pr_err("bpf_jit: fatal error\n");
2505 return -EFAULT;
2506 }
2507 memcpy(image + proglen, temp, ilen);
2508 }
2509 proglen += ilen;
2510 addrs[i] = proglen;
2511 prog = temp;
2512 }
2513 return proglen;
2514 }
2515
2516 bool bpf_jit_needs_zext(void)
2517 {
2518 return true;
2519 }
2520
2521 struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
2522 {
2523 struct bpf_binary_header *header = NULL;
2524 struct bpf_prog *tmp, *orig_prog = prog;
2525 int proglen, oldproglen = 0;
2526 struct jit_context ctx = {};
2527 bool tmp_blinded = false;
2528 u8 *image = NULL;
2529 int *addrs;
2530 int pass;
2531 int i;
2532
2533 if (!prog->jit_requested)
2534 return orig_prog;
2535
2536 tmp = bpf_jit_blind_constants(prog);
2537
2538
2539
2540
2541 if (IS_ERR(tmp))
2542 return orig_prog;
2543 if (tmp != prog) {
2544 tmp_blinded = true;
2545 prog = tmp;
2546 }
2547
2548 addrs = kmalloc_array(prog->len, sizeof(*addrs), GFP_KERNEL);
2549 if (!addrs) {
2550 prog = orig_prog;
2551 goto out;
2552 }
2553
2554
2555
2556
2557
2558 for (proglen = 0, i = 0; i < prog->len; i++) {
2559 proglen += 64;
2560 addrs[i] = proglen;
2561 }
2562 ctx.cleanup_addr = proglen;
2563
2564
2565
2566
2567
2568
2569
2570 for (pass = 0; pass < 20 || image; pass++) {
2571 proglen = do_jit(prog, addrs, image, oldproglen, &ctx);
2572 if (proglen <= 0) {
2573 out_image:
2574 image = NULL;
2575 if (header)
2576 bpf_jit_binary_free(header);
2577 prog = orig_prog;
2578 goto out_addrs;
2579 }
2580 if (image) {
2581 if (proglen != oldproglen) {
2582 pr_err("bpf_jit: proglen=%d != oldproglen=%d\n",
2583 proglen, oldproglen);
2584 goto out_image;
2585 }
2586 break;
2587 }
2588 if (proglen == oldproglen) {
2589 header = bpf_jit_binary_alloc(proglen, &image,
2590 1, jit_fill_hole);
2591 if (!header) {
2592 prog = orig_prog;
2593 goto out_addrs;
2594 }
2595 }
2596 oldproglen = proglen;
2597 cond_resched();
2598 }
2599
2600 if (bpf_jit_enable > 1)
2601 bpf_jit_dump(prog->len, proglen, pass + 1, image);
2602
2603 if (image) {
2604 bpf_jit_binary_lock_ro(header);
2605 prog->bpf_func = (void *)image;
2606 prog->jited = 1;
2607 prog->jited_len = proglen;
2608 } else {
2609 prog = orig_prog;
2610 }
2611
2612 out_addrs:
2613 kfree(addrs);
2614 out:
2615 if (tmp_blinded)
2616 bpf_jit_prog_release_other(prog, prog == orig_prog ?
2617 tmp : orig_prog);
2618 return prog;
2619 }
2620
2621 bool bpf_jit_supports_kfunc_call(void)
2622 {
2623 return true;
2624 }