]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - lib/test_bpf.c
Merge tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[karo-tx-linux.git] / lib / test_bpf.c
index 0362da0b66c352e4cb3eb96748fe2db4955d6b11..889bc31785bee57901ae969f16a55390db8265c4 100644 (file)
@@ -434,6 +434,41 @@ loop:
        return 0;
 }
 
+static int __bpf_fill_stxdw(struct bpf_test *self, int size)
+{
+       unsigned int len = BPF_MAXINSNS;
+       struct bpf_insn *insn;
+       int i;
+
+       insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
+       if (!insn)
+               return -ENOMEM;
+
+       insn[0] = BPF_ALU32_IMM(BPF_MOV, R0, 1);
+       insn[1] = BPF_ST_MEM(size, R10, -40, 42);
+
+       for (i = 2; i < len - 2; i++)
+               insn[i] = BPF_STX_XADD(size, R10, R0, -40);
+
+       insn[len - 2] = BPF_LDX_MEM(size, R0, R10, -40);
+       insn[len - 1] = BPF_EXIT_INSN();
+
+       self->u.ptr.insns = insn;
+       self->u.ptr.len = len;
+
+       return 0;
+}
+
+static int bpf_fill_stxw(struct bpf_test *self)
+{
+       return __bpf_fill_stxdw(self, BPF_W);
+}
+
+static int bpf_fill_stxdw(struct bpf_test *self)
+{
+       return __bpf_fill_stxdw(self, BPF_DW);
+}
+
 static struct bpf_test tests[] = {
        {
                "TAX",
@@ -4302,6 +4337,41 @@ static struct bpf_test tests[] = {
                { },
                { { 0, 0x22 } },
        },
+       {
+               "STX_XADD_W: Test side-effects, r10: 0x12 + 0x10 = 0x22",
+               .u.insns_int = {
+                       BPF_ALU64_REG(BPF_MOV, R1, R10),
+                       BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
+                       BPF_ST_MEM(BPF_W, R10, -40, 0x10),
+                       BPF_STX_XADD(BPF_W, R10, R0, -40),
+                       BPF_ALU64_REG(BPF_MOV, R0, R10),
+                       BPF_ALU64_REG(BPF_SUB, R0, R1),
+                       BPF_EXIT_INSN(),
+               },
+               INTERNAL,
+               { },
+               { { 0, 0 } },
+       },
+       {
+               "STX_XADD_W: Test side-effects, r0: 0x12 + 0x10 = 0x22",
+               .u.insns_int = {
+                       BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
+                       BPF_ST_MEM(BPF_W, R10, -40, 0x10),
+                       BPF_STX_XADD(BPF_W, R10, R0, -40),
+                       BPF_EXIT_INSN(),
+               },
+               INTERNAL,
+               { },
+               { { 0, 0x12 } },
+       },
+       {
+               "STX_XADD_W: X + 1 + 1 + 1 + ...",
+               { },
+               INTERNAL,
+               { },
+               { { 0, 4134 } },
+               .fill_helper = bpf_fill_stxw,
+       },
        {
                "STX_XADD_DW: Test: 0x12 + 0x10 = 0x22",
                .u.insns_int = {
@@ -4315,6 +4385,41 @@ static struct bpf_test tests[] = {
                { },
                { { 0, 0x22 } },
        },
+       {
+               "STX_XADD_DW: Test side-effects, r10: 0x12 + 0x10 = 0x22",
+               .u.insns_int = {
+                       BPF_ALU64_REG(BPF_MOV, R1, R10),
+                       BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
+                       BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
+                       BPF_STX_XADD(BPF_DW, R10, R0, -40),
+                       BPF_ALU64_REG(BPF_MOV, R0, R10),
+                       BPF_ALU64_REG(BPF_SUB, R0, R1),
+                       BPF_EXIT_INSN(),
+               },
+               INTERNAL,
+               { },
+               { { 0, 0 } },
+       },
+       {
+               "STX_XADD_DW: Test side-effects, r0: 0x12 + 0x10 = 0x22",
+               .u.insns_int = {
+                       BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
+                       BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
+                       BPF_STX_XADD(BPF_DW, R10, R0, -40),
+                       BPF_EXIT_INSN(),
+               },
+               INTERNAL,
+               { },
+               { { 0, 0x12 } },
+       },
+       {
+               "STX_XADD_DW: X + 1 + 1 + 1 + ...",
+               { },
+               INTERNAL,
+               { },
+               { { 0, 4134 } },
+               .fill_helper = bpf_fill_stxdw,
+       },
        /* BPF_JMP | BPF_EXIT */
        {
                "JMP_EXIT",
@@ -4656,6 +4761,51 @@ static struct bpf_test tests[] = {
                { },
                { { 0, 1 } },
        },
+       {
+               /* Mainly testing JIT + imm64 here. */
+               "JMP_JGE_X: ldimm64 test 1",
+               .u.insns_int = {
+                       BPF_ALU32_IMM(BPF_MOV, R0, 0),
+                       BPF_LD_IMM64(R1, 3),
+                       BPF_LD_IMM64(R2, 2),
+                       BPF_JMP_REG(BPF_JGE, R1, R2, 2),
+                       BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
+                       BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
+                       BPF_EXIT_INSN(),
+               },
+               INTERNAL,
+               { },
+               { { 0, 0xeeeeeeeeU } },
+       },
+       {
+               "JMP_JGE_X: ldimm64 test 2",
+               .u.insns_int = {
+                       BPF_ALU32_IMM(BPF_MOV, R0, 0),
+                       BPF_LD_IMM64(R1, 3),
+                       BPF_LD_IMM64(R2, 2),
+                       BPF_JMP_REG(BPF_JGE, R1, R2, 0),
+                       BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
+                       BPF_EXIT_INSN(),
+               },
+               INTERNAL,
+               { },
+               { { 0, 0xffffffffU } },
+       },
+       {
+               "JMP_JGE_X: ldimm64 test 3",
+               .u.insns_int = {
+                       BPF_ALU32_IMM(BPF_MOV, R0, 1),
+                       BPF_LD_IMM64(R1, 3),
+                       BPF_LD_IMM64(R2, 2),
+                       BPF_JMP_REG(BPF_JGE, R1, R2, 4),
+                       BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
+                       BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
+                       BPF_EXIT_INSN(),
+               },
+               INTERNAL,
+               { },
+               { { 0, 1 } },
+       },
        /* BPF_JMP | BPF_JNE | BPF_X */
        {
                "JMP_JNE_X: if (3 != 2) return 1",