|
@@ -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",
|