162306a36Sopenharmony_ci{ 262306a36Sopenharmony_ci "BPF_ATOMIC_AND without fetch", 362306a36Sopenharmony_ci .insns = { 462306a36Sopenharmony_ci /* val = 0x110; */ 562306a36Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0x110), 662306a36Sopenharmony_ci /* atomic_and(&val, 0x011); */ 762306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 0x011), 862306a36Sopenharmony_ci BPF_ATOMIC_OP(BPF_DW, BPF_AND, BPF_REG_10, BPF_REG_1, -8), 962306a36Sopenharmony_ci /* if (val != 0x010) exit(2); */ 1062306a36Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 1162306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0x010, 2), 1262306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 1362306a36Sopenharmony_ci BPF_EXIT_INSN(), 1462306a36Sopenharmony_ci /* r1 should not be clobbered, no BPF_FETCH flag */ 1562306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1662306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x011, 1), 1762306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1862306a36Sopenharmony_ci BPF_EXIT_INSN(), 1962306a36Sopenharmony_ci }, 2062306a36Sopenharmony_ci .result = ACCEPT, 2162306a36Sopenharmony_ci}, 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci "BPF_ATOMIC_AND with fetch", 2462306a36Sopenharmony_ci .insns = { 2562306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 123), 2662306a36Sopenharmony_ci /* val = 0x110; */ 2762306a36Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0x110), 2862306a36Sopenharmony_ci /* old = atomic_fetch_and(&val, 0x011); */ 2962306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 0x011), 3062306a36Sopenharmony_ci BPF_ATOMIC_OP(BPF_DW, BPF_AND | BPF_FETCH, BPF_REG_10, BPF_REG_1, -8), 3162306a36Sopenharmony_ci /* if (old != 0x110) exit(3); */ 3262306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x110, 2), 3362306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 3), 3462306a36Sopenharmony_ci BPF_EXIT_INSN(), 3562306a36Sopenharmony_ci /* if (val != 0x010) exit(2); */ 3662306a36Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -8), 3762306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x010, 2), 3862306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 2), 3962306a36Sopenharmony_ci BPF_EXIT_INSN(), 4062306a36Sopenharmony_ci /* Check R0 wasn't clobbered (for fear of x86 JIT bug) */ 4162306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 123, 2), 4262306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 4362306a36Sopenharmony_ci BPF_EXIT_INSN(), 4462306a36Sopenharmony_ci /* exit(0); */ 4562306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4662306a36Sopenharmony_ci BPF_EXIT_INSN(), 4762306a36Sopenharmony_ci }, 4862306a36Sopenharmony_ci .result = ACCEPT, 4962306a36Sopenharmony_ci}, 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci "BPF_ATOMIC_AND with fetch 32bit", 5262306a36Sopenharmony_ci .insns = { 5362306a36Sopenharmony_ci /* r0 = (s64) -1 */ 5462306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5562306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 1), 5662306a36Sopenharmony_ci /* val = 0x110; */ 5762306a36Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0x110), 5862306a36Sopenharmony_ci /* old = atomic_fetch_and(&val, 0x011); */ 5962306a36Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_1, 0x011), 6062306a36Sopenharmony_ci BPF_ATOMIC_OP(BPF_W, BPF_AND | BPF_FETCH, BPF_REG_10, BPF_REG_1, -4), 6162306a36Sopenharmony_ci /* if (old != 0x110) exit(3); */ 6262306a36Sopenharmony_ci BPF_JMP32_IMM(BPF_JEQ, BPF_REG_1, 0x110, 2), 6362306a36Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_0, 3), 6462306a36Sopenharmony_ci BPF_EXIT_INSN(), 6562306a36Sopenharmony_ci /* if (val != 0x010) exit(2); */ 6662306a36Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_10, -4), 6762306a36Sopenharmony_ci BPF_JMP32_IMM(BPF_JEQ, BPF_REG_1, 0x010, 2), 6862306a36Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_1, 2), 6962306a36Sopenharmony_ci BPF_EXIT_INSN(), 7062306a36Sopenharmony_ci /* Check R0 wasn't clobbered (for fear of x86 JIT bug) 7162306a36Sopenharmony_ci * It should be -1 so add 1 to get exit code. 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 7462306a36Sopenharmony_ci BPF_EXIT_INSN(), 7562306a36Sopenharmony_ci }, 7662306a36Sopenharmony_ci .result = ACCEPT, 7762306a36Sopenharmony_ci}, 7862306a36Sopenharmony_ci{ 7962306a36Sopenharmony_ci "BPF_ATOMIC_AND with fetch - r0 as source reg", 8062306a36Sopenharmony_ci .insns = { 8162306a36Sopenharmony_ci /* val = 0x110; */ 8262306a36Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0x110), 8362306a36Sopenharmony_ci /* old = atomic_fetch_and(&val, 0x011); */ 8462306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0x011), 8562306a36Sopenharmony_ci BPF_ATOMIC_OP(BPF_DW, BPF_AND | BPF_FETCH, BPF_REG_10, BPF_REG_0, -8), 8662306a36Sopenharmony_ci /* if (old != 0x110) exit(3); */ 8762306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0x110, 2), 8862306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 3), 8962306a36Sopenharmony_ci BPF_EXIT_INSN(), 9062306a36Sopenharmony_ci /* if (val != 0x010) exit(2); */ 9162306a36Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -8), 9262306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x010, 2), 9362306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 2), 9462306a36Sopenharmony_ci BPF_EXIT_INSN(), 9562306a36Sopenharmony_ci /* exit(0); */ 9662306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 9762306a36Sopenharmony_ci BPF_EXIT_INSN(), 9862306a36Sopenharmony_ci }, 9962306a36Sopenharmony_ci .result = ACCEPT, 10062306a36Sopenharmony_ci}, 101