JIT blinds is building eBPF JMP insn directly, and is transforming BPF_K
into BPF_X.

Update the code to be aware of JMP32

Signed-off-by: Jiong Wang <jiong.w...@netronome.com>
---
 kernel/bpf/core.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index 33609f3..0252e28 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -902,7 +902,13 @@ static int bpf_jit_blind_insn(const struct bpf_insn *from,
                        off -= 2;
                *to++ = BPF_ALU64_IMM(BPF_MOV, BPF_REG_AX, imm_rnd ^ from->imm);
                *to++ = BPF_ALU64_IMM(BPF_XOR, BPF_REG_AX, imm_rnd);
-               *to++ = BPF_JMP_REG(from->code, from->dst_reg, BPF_REG_AX, off);
+               *to = BPF_JMP_REG(from->code, from->dst_reg, BPF_REG_AX, off);
+               if (from->src_reg)
+                       /* NOTE: BPF_K has been transformed into BPF_X,
+                        * mark imm instead of src_reg
+                        */
+                       to->imm |= BPF_JMP_SUBOP_32BIT;
+               to++;
                break;
 
        case BPF_LD | BPF_IMM | BPF_DW:
-- 
2.7.4

Reply via email to