@@ -5508,49 +5508,6 @@ static struct bpf_test tests[] = {
55085508 .stack_depth = 40 ,
55095509 },
55105510 /* BPF_STX | BPF_ATOMIC | BPF_W/DW */
5511- {
5512- "STX_XADD_W: Test: 0x12 + 0x10 = 0x22" ,
5513- .u .insns_int = {
5514- BPF_ALU32_IMM (BPF_MOV , R0 , 0x12 ),
5515- BPF_ST_MEM (BPF_W , R10 , -40 , 0x10 ),
5516- BPF_ATOMIC_OP (BPF_W , BPF_ADD , R10 , R0 , -40 ),
5517- BPF_LDX_MEM (BPF_W , R0 , R10 , -40 ),
5518- BPF_EXIT_INSN (),
5519- },
5520- INTERNAL ,
5521- { },
5522- { { 0 , 0x22 } },
5523- .stack_depth = 40 ,
5524- },
5525- {
5526- "STX_XADD_W: Test side-effects, r10: 0x12 + 0x10 = 0x22" ,
5527- .u .insns_int = {
5528- BPF_ALU64_REG (BPF_MOV , R1 , R10 ),
5529- BPF_ALU32_IMM (BPF_MOV , R0 , 0x12 ),
5530- BPF_ST_MEM (BPF_W , R10 , -40 , 0x10 ),
5531- BPF_ATOMIC_OP (BPF_W , BPF_ADD , R10 , R0 , -40 ),
5532- BPF_ALU64_REG (BPF_MOV , R0 , R10 ),
5533- BPF_ALU64_REG (BPF_SUB , R0 , R1 ),
5534- BPF_EXIT_INSN (),
5535- },
5536- INTERNAL ,
5537- { },
5538- { { 0 , 0 } },
5539- .stack_depth = 40 ,
5540- },
5541- {
5542- "STX_XADD_W: Test side-effects, r0: 0x12 + 0x10 = 0x22" ,
5543- .u .insns_int = {
5544- BPF_ALU32_IMM (BPF_MOV , R0 , 0x12 ),
5545- BPF_ST_MEM (BPF_W , R10 , -40 , 0x10 ),
5546- BPF_ATOMIC_OP (BPF_W , BPF_ADD , R10 , R0 , -40 ),
5547- BPF_EXIT_INSN (),
5548- },
5549- INTERNAL ,
5550- { },
5551- { { 0 , 0x12 } },
5552- .stack_depth = 40 ,
5553- },
55545511 {
55555512 "STX_XADD_W: X + 1 + 1 + 1 + ..." ,
55565513 { },
@@ -5559,49 +5516,6 @@ static struct bpf_test tests[] = {
55595516 { { 0 , 4134 } },
55605517 .fill_helper = bpf_fill_stxw ,
55615518 },
5562- {
5563- "STX_XADD_DW: Test: 0x12 + 0x10 = 0x22" ,
5564- .u .insns_int = {
5565- BPF_ALU32_IMM (BPF_MOV , R0 , 0x12 ),
5566- BPF_ST_MEM (BPF_DW , R10 , -40 , 0x10 ),
5567- BPF_ATOMIC_OP (BPF_DW , BPF_ADD , R10 , R0 , -40 ),
5568- BPF_LDX_MEM (BPF_DW , R0 , R10 , -40 ),
5569- BPF_EXIT_INSN (),
5570- },
5571- INTERNAL ,
5572- { },
5573- { { 0 , 0x22 } },
5574- .stack_depth = 40 ,
5575- },
5576- {
5577- "STX_XADD_DW: Test side-effects, r10: 0x12 + 0x10 = 0x22" ,
5578- .u .insns_int = {
5579- BPF_ALU64_REG (BPF_MOV , R1 , R10 ),
5580- BPF_ALU32_IMM (BPF_MOV , R0 , 0x12 ),
5581- BPF_ST_MEM (BPF_DW , R10 , -40 , 0x10 ),
5582- BPF_ATOMIC_OP (BPF_DW , BPF_ADD , R10 , R0 , -40 ),
5583- BPF_ALU64_REG (BPF_MOV , R0 , R10 ),
5584- BPF_ALU64_REG (BPF_SUB , R0 , R1 ),
5585- BPF_EXIT_INSN (),
5586- },
5587- INTERNAL ,
5588- { },
5589- { { 0 , 0 } },
5590- .stack_depth = 40 ,
5591- },
5592- {
5593- "STX_XADD_DW: Test side-effects, r0: 0x12 + 0x10 = 0x22" ,
5594- .u .insns_int = {
5595- BPF_ALU32_IMM (BPF_MOV , R0 , 0x12 ),
5596- BPF_ST_MEM (BPF_DW , R10 , -40 , 0x10 ),
5597- BPF_ATOMIC_OP (BPF_DW , BPF_ADD , R10 , R0 , -40 ),
5598- BPF_EXIT_INSN (),
5599- },
5600- INTERNAL ,
5601- { },
5602- { { 0 , 0x12 } },
5603- .stack_depth = 40 ,
5604- },
56055519 {
56065520 "STX_XADD_DW: X + 1 + 1 + 1 + ..." ,
56075521 { },
@@ -5610,6 +5524,172 @@ static struct bpf_test tests[] = {
56105524 { { 0 , 4134 } },
56115525 .fill_helper = bpf_fill_stxdw ,
56125526 },
5527+ /*
5528+ * Exhaustive tests of atomic operation variants.
5529+ * Individual tests are expanded from template macros for all
5530+ * combinations of ALU operation, word size and fetching.
5531+ */
5532+ #define BPF_ATOMIC_OP_TEST1 (width , op , logic , old , update , result ) \
5533+ { \
5534+ "BPF_ATOMIC | " #width ", " #op ": Test: " \
5535+ #old " " #logic " " #update " = " #result, \
5536+ .u.insns_int = { \
5537+ BPF_ALU32_IMM(BPF_MOV, R5, update), \
5538+ BPF_ST_MEM(width, R10, -40, old), \
5539+ BPF_ATOMIC_OP(width, op, R10, R5, -40), \
5540+ BPF_LDX_MEM(width, R0, R10, -40), \
5541+ BPF_EXIT_INSN(), \
5542+ }, \
5543+ INTERNAL, \
5544+ { }, \
5545+ { { 0, result } }, \
5546+ .stack_depth = 40, \
5547+ }
5548+ #define BPF_ATOMIC_OP_TEST2 (width , op , logic , old , update , result ) \
5549+ { \
5550+ "BPF_ATOMIC | " #width ", " #op ": Test side effects, r10: " \
5551+ #old " " #logic " " #update " = " #result, \
5552+ .u.insns_int = { \
5553+ BPF_ALU64_REG(BPF_MOV, R1, R10), \
5554+ BPF_ALU32_IMM(BPF_MOV, R0, update), \
5555+ BPF_ST_MEM(BPF_W, R10, -40, old), \
5556+ BPF_ATOMIC_OP(width, op, R10, R0, -40), \
5557+ BPF_ALU64_REG(BPF_MOV, R0, R10), \
5558+ BPF_ALU64_REG(BPF_SUB, R0, R1), \
5559+ BPF_EXIT_INSN(), \
5560+ }, \
5561+ INTERNAL, \
5562+ { }, \
5563+ { { 0, 0 } }, \
5564+ .stack_depth = 40, \
5565+ }
5566+ #define BPF_ATOMIC_OP_TEST3 (width , op , logic , old , update , result ) \
5567+ { \
5568+ "BPF_ATOMIC | " #width ", " #op ": Test side effects, r0: " \
5569+ #old " " #logic " " #update " = " #result, \
5570+ .u.insns_int = { \
5571+ BPF_ALU64_REG(BPF_MOV, R0, R10), \
5572+ BPF_ALU32_IMM(BPF_MOV, R1, update), \
5573+ BPF_ST_MEM(width, R10, -40, old), \
5574+ BPF_ATOMIC_OP(width, op, R10, R1, -40), \
5575+ BPF_ALU64_REG(BPF_SUB, R0, R10), \
5576+ BPF_EXIT_INSN(), \
5577+ }, \
5578+ INTERNAL, \
5579+ { }, \
5580+ { { 0, 0 } }, \
5581+ .stack_depth = 40, \
5582+ }
5583+ #define BPF_ATOMIC_OP_TEST4 (width , op , logic , old , update , result ) \
5584+ { \
5585+ "BPF_ATOMIC | " #width ", " #op ": Test fetch: " \
5586+ #old " " #logic " " #update " = " #result, \
5587+ .u.insns_int = { \
5588+ BPF_ALU32_IMM(BPF_MOV, R3, update), \
5589+ BPF_ST_MEM(width, R10, -40, old), \
5590+ BPF_ATOMIC_OP(width, op, R10, R3, -40), \
5591+ BPF_ALU64_REG(BPF_MOV, R0, R3), \
5592+ BPF_EXIT_INSN(), \
5593+ }, \
5594+ INTERNAL, \
5595+ { }, \
5596+ { { 0, (op) & BPF_FETCH ? old : update } }, \
5597+ .stack_depth = 40, \
5598+ }
5599+ /* BPF_ATOMIC | BPF_W: BPF_ADD */
5600+ BPF_ATOMIC_OP_TEST1 (BPF_W , BPF_ADD , + , 0x12 , 0xab , 0xbd ),
5601+ BPF_ATOMIC_OP_TEST2 (BPF_W , BPF_ADD , + , 0x12 , 0xab , 0xbd ),
5602+ BPF_ATOMIC_OP_TEST3 (BPF_W , BPF_ADD , + , 0x12 , 0xab , 0xbd ),
5603+ BPF_ATOMIC_OP_TEST4 (BPF_W , BPF_ADD , + , 0x12 , 0xab , 0xbd ),
5604+ /* BPF_ATOMIC | BPF_W: BPF_ADD | BPF_FETCH */
5605+ BPF_ATOMIC_OP_TEST1 (BPF_W , BPF_ADD | BPF_FETCH , + , 0x12 , 0xab , 0xbd ),
5606+ BPF_ATOMIC_OP_TEST2 (BPF_W , BPF_ADD | BPF_FETCH , + , 0x12 , 0xab , 0xbd ),
5607+ BPF_ATOMIC_OP_TEST3 (BPF_W , BPF_ADD | BPF_FETCH , + , 0x12 , 0xab , 0xbd ),
5608+ BPF_ATOMIC_OP_TEST4 (BPF_W , BPF_ADD | BPF_FETCH , + , 0x12 , 0xab , 0xbd ),
5609+ /* BPF_ATOMIC | BPF_DW: BPF_ADD */
5610+ BPF_ATOMIC_OP_TEST1 (BPF_DW , BPF_ADD , + , 0x12 , 0xab , 0xbd ),
5611+ BPF_ATOMIC_OP_TEST2 (BPF_DW , BPF_ADD , + , 0x12 , 0xab , 0xbd ),
5612+ BPF_ATOMIC_OP_TEST3 (BPF_DW , BPF_ADD , + , 0x12 , 0xab , 0xbd ),
5613+ BPF_ATOMIC_OP_TEST4 (BPF_DW , BPF_ADD , + , 0x12 , 0xab , 0xbd ),
5614+ /* BPF_ATOMIC | BPF_DW: BPF_ADD | BPF_FETCH */
5615+ BPF_ATOMIC_OP_TEST1 (BPF_DW , BPF_ADD | BPF_FETCH , + , 0x12 , 0xab , 0xbd ),
5616+ BPF_ATOMIC_OP_TEST2 (BPF_DW , BPF_ADD | BPF_FETCH , + , 0x12 , 0xab , 0xbd ),
5617+ BPF_ATOMIC_OP_TEST3 (BPF_DW , BPF_ADD | BPF_FETCH , + , 0x12 , 0xab , 0xbd ),
5618+ BPF_ATOMIC_OP_TEST4 (BPF_DW , BPF_ADD | BPF_FETCH , + , 0x12 , 0xab , 0xbd ),
5619+ /* BPF_ATOMIC | BPF_W: BPF_AND */
5620+ BPF_ATOMIC_OP_TEST1 (BPF_W , BPF_AND , & , 0x12 , 0xab , 0x02 ),
5621+ BPF_ATOMIC_OP_TEST2 (BPF_W , BPF_AND , & , 0x12 , 0xab , 0x02 ),
5622+ BPF_ATOMIC_OP_TEST3 (BPF_W , BPF_AND , & , 0x12 , 0xab , 0x02 ),
5623+ BPF_ATOMIC_OP_TEST4 (BPF_W , BPF_AND , & , 0x12 , 0xab , 0x02 ),
5624+ /* BPF_ATOMIC | BPF_W: BPF_AND | BPF_FETCH */
5625+ BPF_ATOMIC_OP_TEST1 (BPF_W , BPF_AND | BPF_FETCH , & , 0x12 , 0xab , 0x02 ),
5626+ BPF_ATOMIC_OP_TEST2 (BPF_W , BPF_AND | BPF_FETCH , & , 0x12 , 0xab , 0x02 ),
5627+ BPF_ATOMIC_OP_TEST3 (BPF_W , BPF_AND | BPF_FETCH , & , 0x12 , 0xab , 0x02 ),
5628+ BPF_ATOMIC_OP_TEST4 (BPF_W , BPF_AND | BPF_FETCH , & , 0x12 , 0xab , 0x02 ),
5629+ /* BPF_ATOMIC | BPF_DW: BPF_AND */
5630+ BPF_ATOMIC_OP_TEST1 (BPF_DW , BPF_AND , & , 0x12 , 0xab , 0x02 ),
5631+ BPF_ATOMIC_OP_TEST2 (BPF_DW , BPF_AND , & , 0x12 , 0xab , 0x02 ),
5632+ BPF_ATOMIC_OP_TEST3 (BPF_DW , BPF_AND , & , 0x12 , 0xab , 0x02 ),
5633+ BPF_ATOMIC_OP_TEST4 (BPF_DW , BPF_AND , & , 0x12 , 0xab , 0x02 ),
5634+ /* BPF_ATOMIC | BPF_DW: BPF_AND | BPF_FETCH */
5635+ BPF_ATOMIC_OP_TEST1 (BPF_DW , BPF_AND | BPF_FETCH , & , 0x12 , 0xab , 0x02 ),
5636+ BPF_ATOMIC_OP_TEST2 (BPF_DW , BPF_AND | BPF_FETCH , & , 0x12 , 0xab , 0x02 ),
5637+ BPF_ATOMIC_OP_TEST3 (BPF_DW , BPF_AND | BPF_FETCH , & , 0x12 , 0xab , 0x02 ),
5638+ BPF_ATOMIC_OP_TEST4 (BPF_DW , BPF_AND | BPF_FETCH , & , 0x12 , 0xab , 0x02 ),
5639+ /* BPF_ATOMIC | BPF_W: BPF_OR */
5640+ BPF_ATOMIC_OP_TEST1 (BPF_W , BPF_OR , |, 0x12 , 0xab , 0xbb ),
5641+ BPF_ATOMIC_OP_TEST2 (BPF_W , BPF_OR , |, 0x12 , 0xab , 0xbb ),
5642+ BPF_ATOMIC_OP_TEST3 (BPF_W , BPF_OR , |, 0x12 , 0xab , 0xbb ),
5643+ BPF_ATOMIC_OP_TEST4 (BPF_W , BPF_OR , |, 0x12 , 0xab , 0xbb ),
5644+ /* BPF_ATOMIC | BPF_W: BPF_OR | BPF_FETCH */
5645+ BPF_ATOMIC_OP_TEST1 (BPF_W , BPF_OR | BPF_FETCH , |, 0x12 , 0xab , 0xbb ),
5646+ BPF_ATOMIC_OP_TEST2 (BPF_W , BPF_OR | BPF_FETCH , |, 0x12 , 0xab , 0xbb ),
5647+ BPF_ATOMIC_OP_TEST3 (BPF_W , BPF_OR | BPF_FETCH , |, 0x12 , 0xab , 0xbb ),
5648+ BPF_ATOMIC_OP_TEST4 (BPF_W , BPF_OR | BPF_FETCH , |, 0x12 , 0xab , 0xbb ),
5649+ /* BPF_ATOMIC | BPF_DW: BPF_OR */
5650+ BPF_ATOMIC_OP_TEST1 (BPF_DW , BPF_OR , |, 0x12 , 0xab , 0xbb ),
5651+ BPF_ATOMIC_OP_TEST2 (BPF_DW , BPF_OR , |, 0x12 , 0xab , 0xbb ),
5652+ BPF_ATOMIC_OP_TEST3 (BPF_DW , BPF_OR , |, 0x12 , 0xab , 0xbb ),
5653+ BPF_ATOMIC_OP_TEST4 (BPF_DW , BPF_OR , |, 0x12 , 0xab , 0xbb ),
5654+ /* BPF_ATOMIC | BPF_DW: BPF_OR | BPF_FETCH */
5655+ BPF_ATOMIC_OP_TEST1 (BPF_DW , BPF_OR | BPF_FETCH , |, 0x12 , 0xab , 0xbb ),
5656+ BPF_ATOMIC_OP_TEST2 (BPF_DW , BPF_OR | BPF_FETCH , |, 0x12 , 0xab , 0xbb ),
5657+ BPF_ATOMIC_OP_TEST3 (BPF_DW , BPF_OR | BPF_FETCH , |, 0x12 , 0xab , 0xbb ),
5658+ BPF_ATOMIC_OP_TEST4 (BPF_DW , BPF_OR | BPF_FETCH , |, 0x12 , 0xab , 0xbb ),
5659+ /* BPF_ATOMIC | BPF_W: BPF_XOR */
5660+ BPF_ATOMIC_OP_TEST1 (BPF_W , BPF_XOR , ^, 0x12 , 0xab , 0xb9 ),
5661+ BPF_ATOMIC_OP_TEST2 (BPF_W , BPF_XOR , ^, 0x12 , 0xab , 0xb9 ),
5662+ BPF_ATOMIC_OP_TEST3 (BPF_W , BPF_XOR , ^, 0x12 , 0xab , 0xb9 ),
5663+ BPF_ATOMIC_OP_TEST4 (BPF_W , BPF_XOR , ^, 0x12 , 0xab , 0xb9 ),
5664+ /* BPF_ATOMIC | BPF_W: BPF_XOR | BPF_FETCH */
5665+ BPF_ATOMIC_OP_TEST1 (BPF_W , BPF_XOR | BPF_FETCH , ^, 0x12 , 0xab , 0xb9 ),
5666+ BPF_ATOMIC_OP_TEST2 (BPF_W , BPF_XOR | BPF_FETCH , ^, 0x12 , 0xab , 0xb9 ),
5667+ BPF_ATOMIC_OP_TEST3 (BPF_W , BPF_XOR | BPF_FETCH , ^, 0x12 , 0xab , 0xb9 ),
5668+ BPF_ATOMIC_OP_TEST4 (BPF_W , BPF_XOR | BPF_FETCH , ^, 0x12 , 0xab , 0xb9 ),
5669+ /* BPF_ATOMIC | BPF_DW: BPF_XOR */
5670+ BPF_ATOMIC_OP_TEST1 (BPF_DW , BPF_XOR , ^, 0x12 , 0xab , 0xb9 ),
5671+ BPF_ATOMIC_OP_TEST2 (BPF_DW , BPF_XOR , ^, 0x12 , 0xab , 0xb9 ),
5672+ BPF_ATOMIC_OP_TEST3 (BPF_DW , BPF_XOR , ^, 0x12 , 0xab , 0xb9 ),
5673+ BPF_ATOMIC_OP_TEST4 (BPF_DW , BPF_XOR , ^, 0x12 , 0xab , 0xb9 ),
5674+ /* BPF_ATOMIC | BPF_DW: BPF_XOR | BPF_FETCH */
5675+ BPF_ATOMIC_OP_TEST1 (BPF_DW , BPF_XOR | BPF_FETCH , ^, 0x12 , 0xab , 0xb9 ),
5676+ BPF_ATOMIC_OP_TEST2 (BPF_DW , BPF_XOR | BPF_FETCH , ^, 0x12 , 0xab , 0xb9 ),
5677+ BPF_ATOMIC_OP_TEST3 (BPF_DW , BPF_XOR | BPF_FETCH , ^, 0x12 , 0xab , 0xb9 ),
5678+ BPF_ATOMIC_OP_TEST4 (BPF_DW , BPF_XOR | BPF_FETCH , ^, 0x12 , 0xab , 0xb9 ),
5679+ /* BPF_ATOMIC | BPF_W: BPF_XCHG */
5680+ BPF_ATOMIC_OP_TEST1 (BPF_W , BPF_XCHG , xchg , 0x12 , 0xab , 0xab ),
5681+ BPF_ATOMIC_OP_TEST2 (BPF_W , BPF_XCHG , xchg , 0x12 , 0xab , 0xab ),
5682+ BPF_ATOMIC_OP_TEST3 (BPF_W , BPF_XCHG , xchg , 0x12 , 0xab , 0xab ),
5683+ BPF_ATOMIC_OP_TEST4 (BPF_W , BPF_XCHG , xchg , 0x12 , 0xab , 0xab ),
5684+ /* BPF_ATOMIC | BPF_DW: BPF_XCHG */
5685+ BPF_ATOMIC_OP_TEST1 (BPF_DW , BPF_XCHG , xchg , 0x12 , 0xab , 0xab ),
5686+ BPF_ATOMIC_OP_TEST2 (BPF_DW , BPF_XCHG , xchg , 0x12 , 0xab , 0xab ),
5687+ BPF_ATOMIC_OP_TEST3 (BPF_DW , BPF_XCHG , xchg , 0x12 , 0xab , 0xab ),
5688+ BPF_ATOMIC_OP_TEST4 (BPF_DW , BPF_XCHG , xchg , 0x12 , 0xab , 0xab ),
5689+ #undef BPF_ATOMIC_OP_TEST1
5690+ #undef BPF_ATOMIC_OP_TEST2
5691+ #undef BPF_ATOMIC_OP_TEST3
5692+ #undef BPF_ATOMIC_OP_TEST4
56135693 /* BPF_JMP32 | BPF_JEQ | BPF_K */
56145694 {
56155695 "JMP32_JEQ_K: Small immediate" ,
0 commit comments