0001 {
0002 "atomic compare-and-exchange smoketest - 64bit",
0003 .insns = {
0004
0005 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 3),
0006
0007 BPF_MOV64_IMM(BPF_REG_1, 4),
0008 BPF_MOV64_IMM(BPF_REG_0, 2),
0009 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -8),
0010
0011 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
0012 BPF_MOV64_IMM(BPF_REG_0, 2),
0013 BPF_EXIT_INSN(),
0014
0015 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
0016 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
0017 BPF_MOV64_IMM(BPF_REG_0, 3),
0018 BPF_EXIT_INSN(),
0019
0020 BPF_MOV64_IMM(BPF_REG_1, 4),
0021 BPF_MOV64_IMM(BPF_REG_0, 3),
0022 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -8),
0023
0024 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
0025 BPF_MOV64_IMM(BPF_REG_0, 4),
0026 BPF_EXIT_INSN(),
0027
0028 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
0029 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 4, 2),
0030 BPF_MOV64_IMM(BPF_REG_0, 5),
0031 BPF_EXIT_INSN(),
0032
0033 BPF_MOV64_IMM(BPF_REG_0, 0),
0034 BPF_EXIT_INSN(),
0035 },
0036 .result = ACCEPT,
0037 },
0038 {
0039 "atomic compare-and-exchange smoketest - 32bit",
0040 .insns = {
0041
0042 BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 3),
0043
0044 BPF_MOV32_IMM(BPF_REG_1, 4),
0045 BPF_MOV32_IMM(BPF_REG_0, 2),
0046 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -4),
0047
0048 BPF_JMP32_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
0049 BPF_MOV32_IMM(BPF_REG_0, 2),
0050 BPF_EXIT_INSN(),
0051
0052 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -4),
0053 BPF_JMP32_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
0054 BPF_MOV32_IMM(BPF_REG_0, 3),
0055 BPF_EXIT_INSN(),
0056
0057 BPF_MOV32_IMM(BPF_REG_1, 4),
0058 BPF_MOV32_IMM(BPF_REG_0, 3),
0059 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -4),
0060
0061 BPF_JMP32_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
0062 BPF_MOV32_IMM(BPF_REG_0, 4),
0063 BPF_EXIT_INSN(),
0064
0065 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -4),
0066 BPF_JMP32_IMM(BPF_JEQ, BPF_REG_0, 4, 2),
0067 BPF_MOV32_IMM(BPF_REG_0, 5),
0068 BPF_EXIT_INSN(),
0069
0070 BPF_MOV32_IMM(BPF_REG_0, 0),
0071 BPF_EXIT_INSN(),
0072 },
0073 .result = ACCEPT,
0074 },
0075 {
0076 "Can't use cmpxchg on uninit src reg",
0077 .insns = {
0078 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 3),
0079 BPF_MOV64_IMM(BPF_REG_0, 3),
0080 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_2, -8),
0081 BPF_EXIT_INSN(),
0082 },
0083 .result = REJECT,
0084 .errstr = "!read_ok",
0085 },
0086 {
0087 "Can't use cmpxchg on uninit memory",
0088 .insns = {
0089 BPF_MOV64_IMM(BPF_REG_0, 3),
0090 BPF_MOV64_IMM(BPF_REG_2, 4),
0091 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_2, -8),
0092 BPF_EXIT_INSN(),
0093 },
0094 .result = REJECT,
0095 .errstr = "invalid read from stack",
0096 },
0097 {
0098 "BPF_W cmpxchg should zero top 32 bits",
0099 .insns = {
0100
0101 BPF_MOV64_IMM(BPF_REG_0, 0),
0102 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 1),
0103
0104 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
0105
0106 BPF_MOV32_IMM(BPF_REG_1, 1),
0107 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -8),
0108
0109 BPF_MOV64_IMM(BPF_REG_1, 1),
0110 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 32),
0111 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 1),
0112
0113 BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_1, 2),
0114 BPF_MOV32_IMM(BPF_REG_0, 1),
0115 BPF_EXIT_INSN(),
0116
0117 BPF_MOV32_IMM(BPF_REG_0, 0),
0118 BPF_EXIT_INSN(),
0119 },
0120 .result = ACCEPT,
0121 },
0122 {
0123 "Dest pointer in r0 - fail",
0124 .insns = {
0125
0126 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
0127
0128 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
0129
0130 BPF_MOV64_IMM(BPF_REG_1, 1),
0131 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -8),
0132
0133 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
0134 BPF_MOV64_IMM(BPF_REG_0, 1),
0135 BPF_EXIT_INSN(),
0136
0137 BPF_MOV64_IMM(BPF_REG_0, 0),
0138 BPF_EXIT_INSN(),
0139 },
0140 .result = ACCEPT,
0141 .result_unpriv = REJECT,
0142 .errstr_unpriv = "R0 leaks addr into mem",
0143 },
0144 {
0145 "Dest pointer in r0 - succeed",
0146 .insns = {
0147
0148 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
0149
0150 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
0151
0152 BPF_MOV64_IMM(BPF_REG_1, 0),
0153 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -8),
0154
0155 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8),
0156
0157 BPF_MOV64_IMM(BPF_REG_0, 0),
0158 BPF_EXIT_INSN(),
0159 },
0160 .result = ACCEPT,
0161 .result_unpriv = REJECT,
0162 .errstr_unpriv = "R0 leaks addr into mem",
0163 },
0164 {
0165 "Dest pointer in r0 - succeed, check 2",
0166 .insns = {
0167
0168 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
0169
0170 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
0171
0172 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10),
0173
0174 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_5, -8),
0175
0176 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8),
0177
0178 BPF_MOV64_IMM(BPF_REG_0, 0),
0179 BPF_EXIT_INSN(),
0180 },
0181 .result = ACCEPT,
0182 .result_unpriv = REJECT,
0183 .errstr_unpriv = "R0 leaks addr into mem",
0184 },
0185 {
0186 "Dest pointer in r0 - succeed, check 3",
0187 .insns = {
0188
0189 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
0190
0191 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
0192
0193 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10),
0194
0195 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_5, -8),
0196
0197 BPF_MOV64_IMM(BPF_REG_0, 0),
0198 BPF_EXIT_INSN(),
0199 },
0200 .result = REJECT,
0201 .errstr = "invalid size of register fill",
0202 .errstr_unpriv = "R0 leaks addr into mem",
0203 },
0204 {
0205 "Dest pointer in r0 - succeed, check 4",
0206 .insns = {
0207
0208 BPF_MOV32_REG(BPF_REG_0, BPF_REG_10),
0209
0210 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -8),
0211
0212 BPF_MOV32_REG(BPF_REG_5, BPF_REG_10),
0213
0214 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_5, -8),
0215
0216 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_10, -8),
0217
0218 BPF_MOV64_IMM(BPF_REG_0, 0),
0219 BPF_EXIT_INSN(),
0220 },
0221 .result = ACCEPT,
0222 .result_unpriv = REJECT,
0223 .errstr_unpriv = "R10 partial copy of pointer",
0224 },
0225 {
0226 "Dest pointer in r0 - succeed, check 5",
0227 .insns = {
0228
0229 BPF_MOV32_REG(BPF_REG_0, BPF_REG_10),
0230
0231 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -8),
0232
0233 BPF_MOV32_REG(BPF_REG_5, BPF_REG_10),
0234
0235 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_5, -8),
0236
0237 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, -8),
0238
0239 BPF_MOV64_IMM(BPF_REG_0, 0),
0240 BPF_EXIT_INSN(),
0241 },
0242 .result = REJECT,
0243 .errstr = "R0 invalid mem access",
0244 .errstr_unpriv = "R10 partial copy of pointer",
0245 },