Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bpf, arm64: implement jiting of BPF_J{LT, LE, SLT, SLE}

This work implements jiting of BPF_J{LT,LE,SLT,SLE} instructions
with BPF_X/BPF_K variants for the arm64 eBPF JIT.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Daniel Borkmann and committed by
David S. Miller
c362b2f3 52afc51e

+24
+4
arch/arm64/net/bpf_jit.h
··· 44 44 #define A64_COND_NE AARCH64_INSN_COND_NE /* != */ 45 45 #define A64_COND_CS AARCH64_INSN_COND_CS /* unsigned >= */ 46 46 #define A64_COND_HI AARCH64_INSN_COND_HI /* unsigned > */ 47 + #define A64_COND_LS AARCH64_INSN_COND_LS /* unsigned <= */ 48 + #define A64_COND_CC AARCH64_INSN_COND_CC /* unsigned < */ 47 49 #define A64_COND_GE AARCH64_INSN_COND_GE /* signed >= */ 48 50 #define A64_COND_GT AARCH64_INSN_COND_GT /* signed > */ 51 + #define A64_COND_LE AARCH64_INSN_COND_LE /* signed <= */ 52 + #define A64_COND_LT AARCH64_INSN_COND_LT /* signed < */ 49 53 #define A64_B_(cond, imm19) A64_COND_BRANCH(cond, (imm19) << 2) 50 54 51 55 /* Unconditional branch (immediate) */
+20
arch/arm64/net/bpf_jit_comp.c
··· 527 527 /* IF (dst COND src) JUMP off */ 528 528 case BPF_JMP | BPF_JEQ | BPF_X: 529 529 case BPF_JMP | BPF_JGT | BPF_X: 530 + case BPF_JMP | BPF_JLT | BPF_X: 530 531 case BPF_JMP | BPF_JGE | BPF_X: 532 + case BPF_JMP | BPF_JLE | BPF_X: 531 533 case BPF_JMP | BPF_JNE | BPF_X: 532 534 case BPF_JMP | BPF_JSGT | BPF_X: 535 + case BPF_JMP | BPF_JSLT | BPF_X: 533 536 case BPF_JMP | BPF_JSGE | BPF_X: 537 + case BPF_JMP | BPF_JSLE | BPF_X: 534 538 emit(A64_CMP(1, dst, src), ctx); 535 539 emit_cond_jmp: 536 540 jmp_offset = bpf2a64_offset(i + off, i, ctx); ··· 546 542 case BPF_JGT: 547 543 jmp_cond = A64_COND_HI; 548 544 break; 545 + case BPF_JLT: 546 + jmp_cond = A64_COND_CC; 547 + break; 549 548 case BPF_JGE: 550 549 jmp_cond = A64_COND_CS; 550 + break; 551 + case BPF_JLE: 552 + jmp_cond = A64_COND_LS; 551 553 break; 552 554 case BPF_JSET: 553 555 case BPF_JNE: ··· 562 552 case BPF_JSGT: 563 553 jmp_cond = A64_COND_GT; 564 554 break; 555 + case BPF_JSLT: 556 + jmp_cond = A64_COND_LT; 557 + break; 565 558 case BPF_JSGE: 566 559 jmp_cond = A64_COND_GE; 560 + break; 561 + case BPF_JSLE: 562 + jmp_cond = A64_COND_LE; 567 563 break; 568 564 default: 569 565 return -EFAULT; ··· 582 566 /* IF (dst COND imm) JUMP off */ 583 567 case BPF_JMP | BPF_JEQ | BPF_K: 584 568 case BPF_JMP | BPF_JGT | BPF_K: 569 + case BPF_JMP | BPF_JLT | BPF_K: 585 570 case BPF_JMP | BPF_JGE | BPF_K: 571 + case BPF_JMP | BPF_JLE | BPF_K: 586 572 case BPF_JMP | BPF_JNE | BPF_K: 587 573 case BPF_JMP | BPF_JSGT | BPF_K: 574 + case BPF_JMP | BPF_JSLT | BPF_K: 588 575 case BPF_JMP | BPF_JSGE | BPF_K: 576 + case BPF_JMP | BPF_JSLE | BPF_K: 589 577 emit_a64_mov_i(1, tmp, imm, ctx); 590 578 emit(A64_CMP(1, dst, tmp), ctx); 591 579 goto emit_cond_jmp;