| 237 | } |
| 238 | |
| 239 | static void |
| 240 | eval_add(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, uint64_t msk) |
| 241 | { |
| 242 | struct bpf_reg_val rv; |
| 243 | |
| 244 | rv.u.min = (rd->u.min + rs->u.min) & msk; |
| 245 | rv.u.max = (rd->u.max + rs->u.max) & msk; |
| 246 | rv.s.min = (rd->s.min + rs->s.min) & msk; |
| 247 | rv.s.max = (rd->s.max + rs->s.max) & msk; |
| 248 | |
| 249 | /* |
| 250 | * if at least one of the operands is not constant, |
| 251 | * then check for overflow |
| 252 | */ |
| 253 | if ((rd->u.min != rd->u.max || rs->u.min != rs->u.max) && |
| 254 | (rv.u.min < rd->u.min || rv.u.max < rd->u.max)) |
| 255 | eval_umax_bound(&rv, msk); |
| 256 | |
| 257 | if ((rd->s.min != rd->s.max || rs->s.min != rs->s.max) && |
| 258 | (((rs->s.min < 0 && rv.s.min > rd->s.min) || |
| 259 | rv.s.min < rd->s.min) || |
| 260 | ((rs->s.max < 0 && rv.s.max > rd->s.max) || |
| 261 | rv.s.max < rd->s.max))) |
| 262 | eval_smax_bound(&rv, msk); |
| 263 | |
| 264 | rd->s = rv.s; |
| 265 | rd->u = rv.u; |
| 266 | } |
| 267 | |
| 268 | static void |
| 269 | eval_sub(struct bpf_reg_val *rd, const struct bpf_reg_val *rs, uint64_t msk) |
no test coverage detected