bpf/tests: Add JMP tests with small offsets
authorJohan Almbladh <johan.almbladh@anyfinetworks.com>
Tue, 14 Sep 2021 09:18:37 +0000 (11:18 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 28 Sep 2021 07:26:28 +0000 (09:26 +0200)
This patch adds a set of tests for JMP to verify that the JITed jump
offset is calculated correctly. We pretend that the verifier has inserted
any zero extensions to make the jump-over operations JIT to one
instruction each, in order to control the exact JITed jump offset.

Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20210914091842.4186267-10-johan.almbladh@anyfinetworks.com
lib/test_bpf.c

index 0c1c8cc..2eb1d0e 100644 (file)
@@ -10709,6 +10709,77 @@ static struct bpf_test tests[] = {
                .fill_helper = bpf_fill_jmp32_jsle_reg,
                .nr_testruns = NR_PATTERN_RUNS,
        },
+       /* Short relative jumps */
+       {
+               "Short relative jump: offset=0",
+               .u.insns_int = {
+                       BPF_ALU64_IMM(BPF_MOV, R0, 0),
+                       BPF_JMP_IMM(BPF_JEQ, R0, 0, 0),
+                       BPF_EXIT_INSN(),
+                       BPF_ALU32_IMM(BPF_MOV, R0, -1),
+               },
+               INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
+               { },
+               { { 0, 0 } },
+       },
+       {
+               "Short relative jump: offset=1",
+               .u.insns_int = {
+                       BPF_ALU64_IMM(BPF_MOV, R0, 0),
+                       BPF_JMP_IMM(BPF_JEQ, R0, 0, 1),
+                       BPF_ALU32_IMM(BPF_ADD, R0, 1),
+                       BPF_EXIT_INSN(),
+                       BPF_ALU32_IMM(BPF_MOV, R0, -1),
+               },
+               INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
+               { },
+               { { 0, 0 } },
+       },
+       {
+               "Short relative jump: offset=2",
+               .u.insns_int = {
+                       BPF_ALU64_IMM(BPF_MOV, R0, 0),
+                       BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
+                       BPF_ALU32_IMM(BPF_ADD, R0, 1),
+                       BPF_ALU32_IMM(BPF_ADD, R0, 1),
+                       BPF_EXIT_INSN(),
+                       BPF_ALU32_IMM(BPF_MOV, R0, -1),
+               },
+               INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
+               { },
+               { { 0, 0 } },
+       },
+       {
+               "Short relative jump: offset=3",
+               .u.insns_int = {
+                       BPF_ALU64_IMM(BPF_MOV, R0, 0),
+                       BPF_JMP_IMM(BPF_JEQ, R0, 0, 3),
+                       BPF_ALU32_IMM(BPF_ADD, R0, 1),
+                       BPF_ALU32_IMM(BPF_ADD, R0, 1),
+                       BPF_ALU32_IMM(BPF_ADD, R0, 1),
+                       BPF_EXIT_INSN(),
+                       BPF_ALU32_IMM(BPF_MOV, R0, -1),
+               },
+               INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
+               { },
+               { { 0, 0 } },
+       },
+       {
+               "Short relative jump: offset=4",
+               .u.insns_int = {
+                       BPF_ALU64_IMM(BPF_MOV, R0, 0),
+                       BPF_JMP_IMM(BPF_JEQ, R0, 0, 4),
+                       BPF_ALU32_IMM(BPF_ADD, R0, 1),
+                       BPF_ALU32_IMM(BPF_ADD, R0, 1),
+                       BPF_ALU32_IMM(BPF_ADD, R0, 1),
+                       BPF_ALU32_IMM(BPF_ADD, R0, 1),
+                       BPF_EXIT_INSN(),
+                       BPF_ALU32_IMM(BPF_MOV, R0, -1),
+               },
+               INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT,
+               { },
+               { { 0, 0 } },
+       },
        /* Staggered jump sequences, immediate */
        {
                "Staggered jumps: JMP_JA",