198d666d0SBrendan Jackman { 298d666d0SBrendan Jackman "BPF_ATOMIC_AND without fetch", 398d666d0SBrendan Jackman .insns = { 498d666d0SBrendan Jackman /* val = 0x110; */ 598d666d0SBrendan Jackman BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0x110), 698d666d0SBrendan Jackman /* atomic_and(&val, 0x011); */ 798d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_1, 0x011), 898d666d0SBrendan Jackman BPF_ATOMIC_OP(BPF_DW, BPF_AND, BPF_REG_10, BPF_REG_1, -8), 998d666d0SBrendan Jackman /* if (val != 0x010) exit(2); */ 1045df3052SIlya Leoshkevich BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 1198d666d0SBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0x010, 2), 1298d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 2), 1398d666d0SBrendan Jackman BPF_EXIT_INSN(), 1498d666d0SBrendan Jackman /* r1 should not be clobbered, no BPF_FETCH flag */ 1598d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 0), 1698d666d0SBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x011, 1), 1798d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 1), 1898d666d0SBrendan Jackman BPF_EXIT_INSN(), 1998d666d0SBrendan Jackman }, 2098d666d0SBrendan Jackman .result = ACCEPT, 2198d666d0SBrendan Jackman }, 2298d666d0SBrendan Jackman { 2398d666d0SBrendan Jackman "BPF_ATOMIC_AND with fetch", 2498d666d0SBrendan Jackman .insns = { 2598d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 123), 2698d666d0SBrendan Jackman /* val = 0x110; */ 2798d666d0SBrendan Jackman BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0x110), 2898d666d0SBrendan Jackman /* old = atomic_fetch_and(&val, 0x011); */ 2998d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_1, 0x011), 3098d666d0SBrendan Jackman BPF_ATOMIC_OP(BPF_DW, BPF_AND | BPF_FETCH, BPF_REG_10, BPF_REG_1, -8), 3198d666d0SBrendan Jackman /* if (old != 0x110) exit(3); */ 3298d666d0SBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x110, 2), 3398d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 3), 3498d666d0SBrendan Jackman BPF_EXIT_INSN(), 3598d666d0SBrendan Jackman /* if (val != 0x010) exit(2); */ 3698d666d0SBrendan Jackman BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -8), 3798d666d0SBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x010, 2), 3898d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_1, 2), 3998d666d0SBrendan Jackman BPF_EXIT_INSN(), 4098d666d0SBrendan Jackman /* Check R0 wasn't clobbered (for fear of x86 JIT bug) */ 4198d666d0SBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 123, 2), 4298d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 1), 4398d666d0SBrendan Jackman BPF_EXIT_INSN(), 4498d666d0SBrendan Jackman /* exit(0); */ 4598d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 0), 4698d666d0SBrendan Jackman BPF_EXIT_INSN(), 4798d666d0SBrendan Jackman }, 4898d666d0SBrendan Jackman .result = ACCEPT, 4998d666d0SBrendan Jackman }, 5098d666d0SBrendan Jackman { 5198d666d0SBrendan Jackman "BPF_ATOMIC_AND with fetch 32bit", 5298d666d0SBrendan Jackman .insns = { 5398d666d0SBrendan Jackman /* r0 = (s64) -1 */ 5498d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 0), 5598d666d0SBrendan Jackman BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 1), 5698d666d0SBrendan Jackman /* val = 0x110; */ 5798d666d0SBrendan Jackman BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0x110), 5898d666d0SBrendan Jackman /* old = atomic_fetch_and(&val, 0x011); */ 5998d666d0SBrendan Jackman BPF_MOV32_IMM(BPF_REG_1, 0x011), 6098d666d0SBrendan Jackman BPF_ATOMIC_OP(BPF_W, BPF_AND | BPF_FETCH, BPF_REG_10, BPF_REG_1, -4), 6198d666d0SBrendan Jackman /* if (old != 0x110) exit(3); */ 6298d666d0SBrendan Jackman BPF_JMP32_IMM(BPF_JEQ, BPF_REG_1, 0x110, 2), 6398d666d0SBrendan Jackman BPF_MOV32_IMM(BPF_REG_0, 3), 6498d666d0SBrendan Jackman BPF_EXIT_INSN(), 6598d666d0SBrendan Jackman /* if (val != 0x010) exit(2); */ 6698d666d0SBrendan Jackman BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_10, -4), 6798d666d0SBrendan Jackman BPF_JMP32_IMM(BPF_JEQ, BPF_REG_1, 0x010, 2), 6898d666d0SBrendan Jackman BPF_MOV32_IMM(BPF_REG_1, 2), 6998d666d0SBrendan Jackman BPF_EXIT_INSN(), 7098d666d0SBrendan Jackman /* Check R0 wasn't clobbered (for fear of x86 JIT bug) 7198d666d0SBrendan Jackman * It should be -1 so add 1 to get exit code. 7298d666d0SBrendan Jackman */ 7398d666d0SBrendan Jackman BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 7498d666d0SBrendan Jackman BPF_EXIT_INSN(), 7598d666d0SBrendan Jackman }, 7698d666d0SBrendan Jackman .result = ACCEPT, 7798d666d0SBrendan Jackman }, 78*b29dd96bSBrendan Jackman { 79*b29dd96bSBrendan Jackman "BPF_ATOMIC_AND with fetch - r0 as source reg", 80*b29dd96bSBrendan Jackman .insns = { 81*b29dd96bSBrendan Jackman /* val = 0x110; */ 82*b29dd96bSBrendan Jackman BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0x110), 83*b29dd96bSBrendan Jackman /* old = atomic_fetch_and(&val, 0x011); */ 84*b29dd96bSBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 0x011), 85*b29dd96bSBrendan Jackman BPF_ATOMIC_OP(BPF_DW, BPF_AND | BPF_FETCH, BPF_REG_10, BPF_REG_0, -8), 86*b29dd96bSBrendan Jackman /* if (old != 0x110) exit(3); */ 87*b29dd96bSBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0x110, 2), 88*b29dd96bSBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 3), 89*b29dd96bSBrendan Jackman BPF_EXIT_INSN(), 90*b29dd96bSBrendan Jackman /* if (val != 0x010) exit(2); */ 91*b29dd96bSBrendan Jackman BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -8), 92*b29dd96bSBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x010, 2), 93*b29dd96bSBrendan Jackman BPF_MOV64_IMM(BPF_REG_1, 2), 94*b29dd96bSBrendan Jackman BPF_EXIT_INSN(), 95*b29dd96bSBrendan Jackman /* exit(0); */ 96*b29dd96bSBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 0), 97*b29dd96bSBrendan Jackman BPF_EXIT_INSN(), 98*b29dd96bSBrendan Jackman }, 99*b29dd96bSBrendan Jackman .result = ACCEPT, 100*b29dd96bSBrendan Jackman }, 101