aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNic Viljoen <nick.viljoen@netronome.com>2018-01-10 07:26:05 -0500
committerDaniel Borkmann <daniel@iogearbox.net>2018-01-10 07:49:36 -0500
commitc087aa8bbf83ddcd54e49f42cf463bcea5bd2b94 (patch)
tree071c8a696b64b2acd27f1aaf82fb8a0af6da5d38
parentaf93d15ac6c40d097b08c18a65a0414f94110401 (diff)
nfp: bpf: add signed jump insns
This patch adds signed jump instructions (jsgt, jsge, jslt, jsle) to the nfp jit. As well as adding the additional required raw assembler branch mask to nfp_asm.h Signed-off-by: Nic Viljoen <nick.viljoen@netronome.com> Reviewed-by: Jiong Wang <jiong.wang@netronome.com> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/jit.c48
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_asm.h1
2 files changed, 49 insertions, 0 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c
index b4ed6bca4ea9..47c5224f8d6f 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c
@@ -1914,6 +1914,26 @@ static int jle_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
1914 return wrp_cmp_imm(nfp_prog, meta, BR_BHS, true); 1914 return wrp_cmp_imm(nfp_prog, meta, BR_BHS, true);
1915} 1915}
1916 1916
1917static int jsgt_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
1918{
1919 return wrp_cmp_imm(nfp_prog, meta, BR_BLT, true);
1920}
1921
1922static int jsge_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
1923{
1924 return wrp_cmp_imm(nfp_prog, meta, BR_BGE, false);
1925}
1926
1927static int jslt_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
1928{
1929 return wrp_cmp_imm(nfp_prog, meta, BR_BLT, false);
1930}
1931
1932static int jsle_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
1933{
1934 return wrp_cmp_imm(nfp_prog, meta, BR_BGE, true);
1935}
1936
1917static int jset_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) 1937static int jset_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
1918{ 1938{
1919 const struct bpf_insn *insn = &meta->insn; 1939 const struct bpf_insn *insn = &meta->insn;
@@ -2003,6 +2023,26 @@ static int jle_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
2003 return wrp_cmp_reg(nfp_prog, meta, BR_BHS, true); 2023 return wrp_cmp_reg(nfp_prog, meta, BR_BHS, true);
2004} 2024}
2005 2025
2026static int jsgt_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
2027{
2028 return wrp_cmp_reg(nfp_prog, meta, BR_BLT, true);
2029}
2030
2031static int jsge_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
2032{
2033 return wrp_cmp_reg(nfp_prog, meta, BR_BGE, false);
2034}
2035
2036static int jslt_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
2037{
2038 return wrp_cmp_reg(nfp_prog, meta, BR_BLT, false);
2039}
2040
2041static int jsle_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
2042{
2043 return wrp_cmp_reg(nfp_prog, meta, BR_BGE, true);
2044}
2045
2006static int jset_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) 2046static int jset_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
2007{ 2047{
2008 return wrp_test_reg(nfp_prog, meta, ALU_OP_AND, BR_BNE); 2048 return wrp_test_reg(nfp_prog, meta, ALU_OP_AND, BR_BNE);
@@ -2087,6 +2127,10 @@ static const instr_cb_t instr_cb[256] = {
2087 [BPF_JMP | BPF_JGE | BPF_K] = jge_imm, 2127 [BPF_JMP | BPF_JGE | BPF_K] = jge_imm,
2088 [BPF_JMP | BPF_JLT | BPF_K] = jlt_imm, 2128 [BPF_JMP | BPF_JLT | BPF_K] = jlt_imm,
2089 [BPF_JMP | BPF_JLE | BPF_K] = jle_imm, 2129 [BPF_JMP | BPF_JLE | BPF_K] = jle_imm,
2130 [BPF_JMP | BPF_JSGT | BPF_K] = jsgt_imm,
2131 [BPF_JMP | BPF_JSGE | BPF_K] = jsge_imm,
2132 [BPF_JMP | BPF_JSLT | BPF_K] = jslt_imm,
2133 [BPF_JMP | BPF_JSLE | BPF_K] = jsle_imm,
2090 [BPF_JMP | BPF_JSET | BPF_K] = jset_imm, 2134 [BPF_JMP | BPF_JSET | BPF_K] = jset_imm,
2091 [BPF_JMP | BPF_JNE | BPF_K] = jne_imm, 2135 [BPF_JMP | BPF_JNE | BPF_K] = jne_imm,
2092 [BPF_JMP | BPF_JEQ | BPF_X] = jeq_reg, 2136 [BPF_JMP | BPF_JEQ | BPF_X] = jeq_reg,
@@ -2094,6 +2138,10 @@ static const instr_cb_t instr_cb[256] = {
2094 [BPF_JMP | BPF_JGE | BPF_X] = jge_reg, 2138 [BPF_JMP | BPF_JGE | BPF_X] = jge_reg,
2095 [BPF_JMP | BPF_JLT | BPF_X] = jlt_reg, 2139 [BPF_JMP | BPF_JLT | BPF_X] = jlt_reg,
2096 [BPF_JMP | BPF_JLE | BPF_X] = jle_reg, 2140 [BPF_JMP | BPF_JLE | BPF_X] = jle_reg,
2141 [BPF_JMP | BPF_JSGT | BPF_X] = jsgt_reg,
2142 [BPF_JMP | BPF_JSGE | BPF_X] = jsge_reg,
2143 [BPF_JMP | BPF_JSLT | BPF_X] = jslt_reg,
2144 [BPF_JMP | BPF_JSLE | BPF_X] = jsle_reg,
2097 [BPF_JMP | BPF_JSET | BPF_X] = jset_reg, 2145 [BPF_JMP | BPF_JSET | BPF_X] = jset_reg,
2098 [BPF_JMP | BPF_JNE | BPF_X] = jne_reg, 2146 [BPF_JMP | BPF_JNE | BPF_X] = jne_reg,
2099 [BPF_JMP | BPF_CALL] = call, 2147 [BPF_JMP | BPF_CALL] = call,
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_asm.h b/drivers/net/ethernet/netronome/nfp/nfp_asm.h
index a50240ab0ce2..20e51cb60e69 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_asm.h
+++ b/drivers/net/ethernet/netronome/nfp/nfp_asm.h
@@ -81,6 +81,7 @@ enum br_mask {
81 BR_BHS = 0x04, 81 BR_BHS = 0x04,
82 BR_BLO = 0x05, 82 BR_BLO = 0x05,
83 BR_BGE = 0x08, 83 BR_BGE = 0x08,
84 BR_BLT = 0x09,
84 BR_UNC = 0x18, 85 BR_UNC = 0x18,
85}; 86};
86 87