1*98d666d0SBrendan Jackman { 2*98d666d0SBrendan Jackman "BPF_ATOMIC_AND without fetch", 3*98d666d0SBrendan Jackman .insns = { 4*98d666d0SBrendan Jackman /* val = 0x110; */ 5*98d666d0SBrendan Jackman BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0x110), 6*98d666d0SBrendan Jackman /* atomic_and(&val, 0x011); */ 7*98d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_1, 0x011), 8*98d666d0SBrendan Jackman BPF_ATOMIC_OP(BPF_DW, BPF_AND, BPF_REG_10, BPF_REG_1, -8), 9*98d666d0SBrendan Jackman /* if (val != 0x010) exit(2); */ 10*98d666d0SBrendan Jackman BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8), 11*98d666d0SBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0x010, 2), 12*98d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 2), 13*98d666d0SBrendan Jackman BPF_EXIT_INSN(), 14*98d666d0SBrendan Jackman /* r1 should not be clobbered, no BPF_FETCH flag */ 15*98d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 0), 16*98d666d0SBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x011, 1), 17*98d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 1), 18*98d666d0SBrendan Jackman BPF_EXIT_INSN(), 19*98d666d0SBrendan Jackman }, 20*98d666d0SBrendan Jackman .result = ACCEPT, 21*98d666d0SBrendan Jackman }, 22*98d666d0SBrendan Jackman { 23*98d666d0SBrendan Jackman "BPF_ATOMIC_AND with fetch", 24*98d666d0SBrendan Jackman .insns = { 25*98d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 123), 26*98d666d0SBrendan Jackman /* val = 0x110; */ 27*98d666d0SBrendan Jackman BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0x110), 28*98d666d0SBrendan Jackman /* old = atomic_fetch_and(&val, 0x011); */ 29*98d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_1, 0x011), 30*98d666d0SBrendan Jackman BPF_ATOMIC_OP(BPF_DW, BPF_AND | BPF_FETCH, BPF_REG_10, BPF_REG_1, -8), 31*98d666d0SBrendan Jackman /* if (old != 0x110) exit(3); */ 32*98d666d0SBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x110, 2), 33*98d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 3), 34*98d666d0SBrendan Jackman BPF_EXIT_INSN(), 35*98d666d0SBrendan Jackman /* if (val != 0x010) exit(2); */ 36*98d666d0SBrendan Jackman BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -8), 37*98d666d0SBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x010, 2), 38*98d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_1, 2), 39*98d666d0SBrendan Jackman BPF_EXIT_INSN(), 40*98d666d0SBrendan Jackman /* Check R0 wasn't clobbered (for fear of x86 JIT bug) */ 41*98d666d0SBrendan Jackman BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 123, 2), 42*98d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 1), 43*98d666d0SBrendan Jackman BPF_EXIT_INSN(), 44*98d666d0SBrendan Jackman /* exit(0); */ 45*98d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 0), 46*98d666d0SBrendan Jackman BPF_EXIT_INSN(), 47*98d666d0SBrendan Jackman }, 48*98d666d0SBrendan Jackman .result = ACCEPT, 49*98d666d0SBrendan Jackman }, 50*98d666d0SBrendan Jackman { 51*98d666d0SBrendan Jackman "BPF_ATOMIC_AND with fetch 32bit", 52*98d666d0SBrendan Jackman .insns = { 53*98d666d0SBrendan Jackman /* r0 = (s64) -1 */ 54*98d666d0SBrendan Jackman BPF_MOV64_IMM(BPF_REG_0, 0), 55*98d666d0SBrendan Jackman BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 1), 56*98d666d0SBrendan Jackman /* val = 0x110; */ 57*98d666d0SBrendan Jackman BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0x110), 58*98d666d0SBrendan Jackman /* old = atomic_fetch_and(&val, 0x011); */ 59*98d666d0SBrendan Jackman BPF_MOV32_IMM(BPF_REG_1, 0x011), 60*98d666d0SBrendan Jackman BPF_ATOMIC_OP(BPF_W, BPF_AND | BPF_FETCH, BPF_REG_10, BPF_REG_1, -4), 61*98d666d0SBrendan Jackman /* if (old != 0x110) exit(3); */ 62*98d666d0SBrendan Jackman BPF_JMP32_IMM(BPF_JEQ, BPF_REG_1, 0x110, 2), 63*98d666d0SBrendan Jackman BPF_MOV32_IMM(BPF_REG_0, 3), 64*98d666d0SBrendan Jackman BPF_EXIT_INSN(), 65*98d666d0SBrendan Jackman /* if (val != 0x010) exit(2); */ 66*98d666d0SBrendan Jackman BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_10, -4), 67*98d666d0SBrendan Jackman BPF_JMP32_IMM(BPF_JEQ, BPF_REG_1, 0x010, 2), 68*98d666d0SBrendan Jackman BPF_MOV32_IMM(BPF_REG_1, 2), 69*98d666d0SBrendan Jackman BPF_EXIT_INSN(), 70*98d666d0SBrendan Jackman /* Check R0 wasn't clobbered (for fear of x86 JIT bug) 71*98d666d0SBrendan Jackman * It should be -1 so add 1 to get exit code. 72*98d666d0SBrendan Jackman */ 73*98d666d0SBrendan Jackman BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 74*98d666d0SBrendan Jackman BPF_EXIT_INSN(), 75*98d666d0SBrendan Jackman }, 76*98d666d0SBrendan Jackman .result = ACCEPT, 77*98d666d0SBrendan Jackman }, 78