bpf, arm64: implement jiting of BPF_J{LT, LE, SLT, SLE}
authorDaniel Borkmann <daniel@iogearbox.net>
Wed, 9 Aug 2017 23:39:57 +0000 (01:39 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 9 Aug 2017 23:53:56 +0000 (16:53 -0700)
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>
arch/arm64/net/bpf_jit.h
arch/arm64/net/bpf_jit_comp.c

index b02a9268dfbf1093016dc3609e79681fa6da9dba..783de51a6c4e5b33725d4904be6b09011dd48605 100644 (file)
 #define A64_COND_NE    AARCH64_INSN_COND_NE /* != */
 #define A64_COND_CS    AARCH64_INSN_COND_CS /* unsigned >= */
 #define A64_COND_HI    AARCH64_INSN_COND_HI /* unsigned > */
+#define A64_COND_LS    AARCH64_INSN_COND_LS /* unsigned <= */
+#define A64_COND_CC    AARCH64_INSN_COND_CC /* unsigned < */
 #define A64_COND_GE    AARCH64_INSN_COND_GE /* signed >= */
 #define A64_COND_GT    AARCH64_INSN_COND_GT /* signed > */
+#define A64_COND_LE    AARCH64_INSN_COND_LE /* signed <= */
+#define A64_COND_LT    AARCH64_INSN_COND_LT /* signed < */
 #define A64_B_(cond, imm19) A64_COND_BRANCH(cond, (imm19) << 2)
 
 /* Unconditional branch (immediate) */
index f32144b2e07fc13e39baa929bfb9f9c29796905f..ba38d403abb2fc92d8ea6ae9a6c3c38e70979062 100644 (file)
@@ -527,10 +527,14 @@ emit_bswap_uxt:
        /* IF (dst COND src) JUMP off */
        case BPF_JMP | BPF_JEQ | BPF_X:
        case BPF_JMP | BPF_JGT | BPF_X:
+       case BPF_JMP | BPF_JLT | BPF_X:
        case BPF_JMP | BPF_JGE | BPF_X:
+       case BPF_JMP | BPF_JLE | BPF_X:
        case BPF_JMP | BPF_JNE | BPF_X:
        case BPF_JMP | BPF_JSGT | BPF_X:
+       case BPF_JMP | BPF_JSLT | BPF_X:
        case BPF_JMP | BPF_JSGE | BPF_X:
+       case BPF_JMP | BPF_JSLE | BPF_X:
                emit(A64_CMP(1, dst, src), ctx);
 emit_cond_jmp:
                jmp_offset = bpf2a64_offset(i + off, i, ctx);
@@ -542,9 +546,15 @@ emit_cond_jmp:
                case BPF_JGT:
                        jmp_cond = A64_COND_HI;
                        break;
+               case BPF_JLT:
+                       jmp_cond = A64_COND_CC;
+                       break;
                case BPF_JGE:
                        jmp_cond = A64_COND_CS;
                        break;
+               case BPF_JLE:
+                       jmp_cond = A64_COND_LS;
+                       break;
                case BPF_JSET:
                case BPF_JNE:
                        jmp_cond = A64_COND_NE;
@@ -552,9 +562,15 @@ emit_cond_jmp:
                case BPF_JSGT:
                        jmp_cond = A64_COND_GT;
                        break;
+               case BPF_JSLT:
+                       jmp_cond = A64_COND_LT;
+                       break;
                case BPF_JSGE:
                        jmp_cond = A64_COND_GE;
                        break;
+               case BPF_JSLE:
+                       jmp_cond = A64_COND_LE;
+                       break;
                default:
                        return -EFAULT;
                }
@@ -566,10 +582,14 @@ emit_cond_jmp:
        /* IF (dst COND imm) JUMP off */
        case BPF_JMP | BPF_JEQ | BPF_K:
        case BPF_JMP | BPF_JGT | BPF_K:
+       case BPF_JMP | BPF_JLT | BPF_K:
        case BPF_JMP | BPF_JGE | BPF_K:
+       case BPF_JMP | BPF_JLE | BPF_K:
        case BPF_JMP | BPF_JNE | BPF_K:
        case BPF_JMP | BPF_JSGT | BPF_K:
+       case BPF_JMP | BPF_JSLT | BPF_K:
        case BPF_JMP | BPF_JSGE | BPF_K:
+       case BPF_JMP | BPF_JSLE | BPF_K:
                emit_a64_mov_i(1, tmp, imm, ctx);
                emit(A64_CMP(1, dst, tmp), ctx);
                goto emit_cond_jmp;