@@ -434,6 +434,41 @@ static int bpf_fill_ld_abs_vlan_push_pop(struct bpf_test *self)
434434 return 0 ;
435435}
436436
437+ static int __bpf_fill_stxdw (struct bpf_test * self , int size )
438+ {
439+ unsigned int len = BPF_MAXINSNS ;
440+ struct bpf_insn * insn ;
441+ int i ;
442+
443+ insn = kmalloc_array (len , sizeof (* insn ), GFP_KERNEL );
444+ if (!insn )
445+ return - ENOMEM ;
446+
447+ insn [0 ] = BPF_ALU32_IMM (BPF_MOV , R0 , 1 );
448+ insn [1 ] = BPF_ST_MEM (size , R10 , -40 , 42 );
449+
450+ for (i = 2 ; i < len - 2 ; i ++ )
451+ insn [i ] = BPF_STX_XADD (size , R10 , R0 , -40 );
452+
453+ insn [len - 2 ] = BPF_LDX_MEM (size , R0 , R10 , -40 );
454+ insn [len - 1 ] = BPF_EXIT_INSN ();
455+
456+ self -> u .ptr .insns = insn ;
457+ self -> u .ptr .len = len ;
458+
459+ return 0 ;
460+ }
461+
462+ static int bpf_fill_stxw (struct bpf_test * self )
463+ {
464+ return __bpf_fill_stxdw (self , BPF_W );
465+ }
466+
467+ static int bpf_fill_stxdw (struct bpf_test * self )
468+ {
469+ return __bpf_fill_stxdw (self , BPF_DW );
470+ }
471+
437472static struct bpf_test tests [] = {
438473 {
439474 "TAX" ,
@@ -4302,6 +4337,41 @@ static struct bpf_test tests[] = {
43024337 { },
43034338 { { 0 , 0x22 } },
43044339 },
4340+ {
4341+ "STX_XADD_W: Test side-effects, r10: 0x12 + 0x10 = 0x22" ,
4342+ .u .insns_int = {
4343+ BPF_ALU64_REG (BPF_MOV , R1 , R10 ),
4344+ BPF_ALU32_IMM (BPF_MOV , R0 , 0x12 ),
4345+ BPF_ST_MEM (BPF_W , R10 , -40 , 0x10 ),
4346+ BPF_STX_XADD (BPF_W , R10 , R0 , -40 ),
4347+ BPF_ALU64_REG (BPF_MOV , R0 , R10 ),
4348+ BPF_ALU64_REG (BPF_SUB , R0 , R1 ),
4349+ BPF_EXIT_INSN (),
4350+ },
4351+ INTERNAL ,
4352+ { },
4353+ { { 0 , 0 } },
4354+ },
4355+ {
4356+ "STX_XADD_W: Test side-effects, r0: 0x12 + 0x10 = 0x22" ,
4357+ .u .insns_int = {
4358+ BPF_ALU32_IMM (BPF_MOV , R0 , 0x12 ),
4359+ BPF_ST_MEM (BPF_W , R10 , -40 , 0x10 ),
4360+ BPF_STX_XADD (BPF_W , R10 , R0 , -40 ),
4361+ BPF_EXIT_INSN (),
4362+ },
4363+ INTERNAL ,
4364+ { },
4365+ { { 0 , 0x12 } },
4366+ },
4367+ {
4368+ "STX_XADD_W: X + 1 + 1 + 1 + ..." ,
4369+ { },
4370+ INTERNAL ,
4371+ { },
4372+ { { 0 , 4134 } },
4373+ .fill_helper = bpf_fill_stxw ,
4374+ },
43054375 {
43064376 "STX_XADD_DW: Test: 0x12 + 0x10 = 0x22" ,
43074377 .u .insns_int = {
@@ -4315,6 +4385,41 @@ static struct bpf_test tests[] = {
43154385 { },
43164386 { { 0 , 0x22 } },
43174387 },
4388+ {
4389+ "STX_XADD_DW: Test side-effects, r10: 0x12 + 0x10 = 0x22" ,
4390+ .u .insns_int = {
4391+ BPF_ALU64_REG (BPF_MOV , R1 , R10 ),
4392+ BPF_ALU32_IMM (BPF_MOV , R0 , 0x12 ),
4393+ BPF_ST_MEM (BPF_DW , R10 , -40 , 0x10 ),
4394+ BPF_STX_XADD (BPF_DW , R10 , R0 , -40 ),
4395+ BPF_ALU64_REG (BPF_MOV , R0 , R10 ),
4396+ BPF_ALU64_REG (BPF_SUB , R0 , R1 ),
4397+ BPF_EXIT_INSN (),
4398+ },
4399+ INTERNAL ,
4400+ { },
4401+ { { 0 , 0 } },
4402+ },
4403+ {
4404+ "STX_XADD_DW: Test side-effects, r0: 0x12 + 0x10 = 0x22" ,
4405+ .u .insns_int = {
4406+ BPF_ALU32_IMM (BPF_MOV , R0 , 0x12 ),
4407+ BPF_ST_MEM (BPF_DW , R10 , -40 , 0x10 ),
4408+ BPF_STX_XADD (BPF_DW , R10 , R0 , -40 ),
4409+ BPF_EXIT_INSN (),
4410+ },
4411+ INTERNAL ,
4412+ { },
4413+ { { 0 , 0x12 } },
4414+ },
4415+ {
4416+ "STX_XADD_DW: X + 1 + 1 + 1 + ..." ,
4417+ { },
4418+ INTERNAL ,
4419+ { },
4420+ { { 0 , 4134 } },
4421+ .fill_helper = bpf_fill_stxdw ,
4422+ },
43184423 /* BPF_JMP | BPF_EXIT */
43194424 {
43204425 "JMP_EXIT" ,
0 commit comments