Skip to content

Commit 6a3b24c

Browse files
Johan Almbladhborkmann
authored andcommitted
bpf, tests: Add tests for BPF_CMPXCHG
Tests for BPF_CMPXCHG with both word and double word operands. As with the tests for other atomic operations, these tests only check the result of the arithmetic operation. The atomicity of the operations is not tested. Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/bpf/20210809091829.810076-14-johan.almbladh@anyfinetworks.com
1 parent e4517b3 commit 6a3b24c

File tree

1 file changed

+166
-0
lines changed

1 file changed

+166
-0
lines changed

lib/test_bpf.c

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5690,6 +5690,172 @@ static struct bpf_test tests[] = {
56905690
#undef BPF_ATOMIC_OP_TEST2
56915691
#undef BPF_ATOMIC_OP_TEST3
56925692
#undef BPF_ATOMIC_OP_TEST4
5693+
/* BPF_ATOMIC | BPF_W, BPF_CMPXCHG */
5694+
{
5695+
"BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful return",
5696+
.u.insns_int = {
5697+
BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
5698+
BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
5699+
BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
5700+
BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5701+
BPF_EXIT_INSN(),
5702+
},
5703+
INTERNAL,
5704+
{ },
5705+
{ { 0, 0x01234567 } },
5706+
.stack_depth = 40,
5707+
},
5708+
{
5709+
"BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful store",
5710+
.u.insns_int = {
5711+
BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
5712+
BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
5713+
BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
5714+
BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5715+
BPF_LDX_MEM(BPF_W, R0, R10, -40),
5716+
BPF_EXIT_INSN(),
5717+
},
5718+
INTERNAL,
5719+
{ },
5720+
{ { 0, 0x89abcdef } },
5721+
.stack_depth = 40,
5722+
},
5723+
{
5724+
"BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure return",
5725+
.u.insns_int = {
5726+
BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
5727+
BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
5728+
BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
5729+
BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5730+
BPF_EXIT_INSN(),
5731+
},
5732+
INTERNAL,
5733+
{ },
5734+
{ { 0, 0x01234567 } },
5735+
.stack_depth = 40,
5736+
},
5737+
{
5738+
"BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure store",
5739+
.u.insns_int = {
5740+
BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
5741+
BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210),
5742+
BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
5743+
BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5744+
BPF_LDX_MEM(BPF_W, R0, R10, -40),
5745+
BPF_EXIT_INSN(),
5746+
},
5747+
INTERNAL,
5748+
{ },
5749+
{ { 0, 0x01234567 } },
5750+
.stack_depth = 40,
5751+
},
5752+
{
5753+
"BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test side effects",
5754+
.u.insns_int = {
5755+
BPF_ST_MEM(BPF_W, R10, -40, 0x01234567),
5756+
BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567),
5757+
BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef),
5758+
BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5759+
BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40),
5760+
BPF_ALU32_REG(BPF_MOV, R0, R3),
5761+
BPF_EXIT_INSN(),
5762+
},
5763+
INTERNAL,
5764+
{ },
5765+
{ { 0, 0x89abcdef } },
5766+
.stack_depth = 40,
5767+
},
5768+
/* BPF_ATOMIC | BPF_DW, BPF_CMPXCHG */
5769+
{
5770+
"BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful return",
5771+
.u.insns_int = {
5772+
BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
5773+
BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
5774+
BPF_ALU64_REG(BPF_MOV, R0, R1),
5775+
BPF_STX_MEM(BPF_DW, R10, R1, -40),
5776+
BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
5777+
BPF_JMP_REG(BPF_JNE, R0, R1, 1),
5778+
BPF_ALU64_REG(BPF_SUB, R0, R1),
5779+
BPF_EXIT_INSN(),
5780+
},
5781+
INTERNAL,
5782+
{ },
5783+
{ { 0, 0 } },
5784+
.stack_depth = 40,
5785+
},
5786+
{
5787+
"BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful store",
5788+
.u.insns_int = {
5789+
BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
5790+
BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
5791+
BPF_ALU64_REG(BPF_MOV, R0, R1),
5792+
BPF_STX_MEM(BPF_DW, R10, R0, -40),
5793+
BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
5794+
BPF_LDX_MEM(BPF_DW, R0, R10, -40),
5795+
BPF_JMP_REG(BPF_JNE, R0, R2, 1),
5796+
BPF_ALU64_REG(BPF_SUB, R0, R2),
5797+
BPF_EXIT_INSN(),
5798+
},
5799+
INTERNAL,
5800+
{ },
5801+
{ { 0, 0 } },
5802+
.stack_depth = 40,
5803+
},
5804+
{
5805+
"BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure return",
5806+
.u.insns_int = {
5807+
BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
5808+
BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
5809+
BPF_ALU64_REG(BPF_MOV, R0, R1),
5810+
BPF_ALU64_IMM(BPF_ADD, R0, 1),
5811+
BPF_STX_MEM(BPF_DW, R10, R1, -40),
5812+
BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
5813+
BPF_JMP_REG(BPF_JNE, R0, R1, 1),
5814+
BPF_ALU64_REG(BPF_SUB, R0, R1),
5815+
BPF_EXIT_INSN(),
5816+
},
5817+
INTERNAL,
5818+
{ },
5819+
{ { 0, 0 } },
5820+
.stack_depth = 40,
5821+
},
5822+
{
5823+
"BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure store",
5824+
.u.insns_int = {
5825+
BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
5826+
BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
5827+
BPF_ALU64_REG(BPF_MOV, R0, R1),
5828+
BPF_ALU64_IMM(BPF_ADD, R0, 1),
5829+
BPF_STX_MEM(BPF_DW, R10, R1, -40),
5830+
BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
5831+
BPF_LDX_MEM(BPF_DW, R0, R10, -40),
5832+
BPF_JMP_REG(BPF_JNE, R0, R1, 1),
5833+
BPF_ALU64_REG(BPF_SUB, R0, R1),
5834+
BPF_EXIT_INSN(),
5835+
},
5836+
INTERNAL,
5837+
{ },
5838+
{ { 0, 0 } },
5839+
.stack_depth = 40,
5840+
},
5841+
{
5842+
"BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test side effects",
5843+
.u.insns_int = {
5844+
BPF_LD_IMM64(R1, 0x0123456789abcdefULL),
5845+
BPF_LD_IMM64(R2, 0xfecdba9876543210ULL),
5846+
BPF_ALU64_REG(BPF_MOV, R0, R1),
5847+
BPF_STX_MEM(BPF_DW, R10, R1, -40),
5848+
BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40),
5849+
BPF_LD_IMM64(R0, 0xfecdba9876543210ULL),
5850+
BPF_JMP_REG(BPF_JNE, R0, R2, 1),
5851+
BPF_ALU64_REG(BPF_SUB, R0, R2),
5852+
BPF_EXIT_INSN(),
5853+
},
5854+
INTERNAL,
5855+
{ },
5856+
{ { 0, 0 } },
5857+
.stack_depth = 40,
5858+
},
56935859
/* BPF_JMP32 | BPF_JEQ | BPF_K */
56945860
{
56955861
"JMP32_JEQ_K: Small immediate",

0 commit comments

Comments
 (0)