__mark_reg_known(reg, 0);
 }
 
-static void __mark_reg_const_zero(struct bpf_reg_state *reg)
+static void __mark_reg_const_zero(const struct bpf_verifier_env *env, struct bpf_reg_state *reg)
 {
        __mark_reg_known(reg, 0);
        reg->type = SCALAR_VALUE;
+       /* all scalars are assumed imprecise initially (unless unprivileged,
+        * in which case everything is forced to be precise)
+        */
+       reg->precise = !env->bpf_capable;
 }
 
 static void mark_reg_known_zero(struct bpf_verifier_env *env,
                zeros++;
        }
        if (zeros == max_off - min_off) {
-               /* any access_size read into register is zero extended,
-                * so the whole register == const_zero
-                */
-               __mark_reg_const_zero(&state->regs[dst_regno]);
-               /* backtracking doesn't support STACK_ZERO yet,
-                * so mark it precise here, so that later
-                * backtracking can stop here.
-                * Backtracking may not need this if this register
-                * doesn't participate in pointer adjustment.
-                * Forward propagation of precise flag is not
-                * necessary either. This mark is only to stop
-                * backtracking. Any register that contributed
-                * to const 0 was marked precise before spill.
+               /* Any access_size read into register is zero extended,
+                * so the whole register == const_zero.
                 */
-               state->regs[dst_regno].precise = true;
+               __mark_reg_const_zero(env, &state->regs[dst_regno]);
        } else {
                /* have read misc data from the stack */
                mark_reg_unknown(env, state->regs, dst_regno);
 
                                if (spill_cnt == size &&
                                    tnum_is_const(reg->var_off) && reg->var_off.value == 0) {
-                                       __mark_reg_const_zero(&state->regs[dst_regno]);
+                                       __mark_reg_const_zero(env, &state->regs[dst_regno]);
                                        /* this IS register fill, so keep insn_flags */
                                } else if (zero_cnt == size) {
                                        /* similarly to mark_reg_stack_read(), preserve zeroes */
-                                       __mark_reg_const_zero(&state->regs[dst_regno]);
+                                       __mark_reg_const_zero(env, &state->regs[dst_regno]);
                                        insn_flags = 0; /* not restoring original register state */
                                } else {
                                        mark_reg_unknown(env, state->regs, dst_regno);
        /* switch to DRAINED state, but keep the depth unchanged */
        /* mark current iter state as drained and assume returned NULL */
        cur_iter->iter.state = BPF_ITER_STATE_DRAINED;
-       __mark_reg_const_zero(&cur_fr->regs[BPF_REG_0]);
+       __mark_reg_const_zero(env, &cur_fr->regs[BPF_REG_0]);
 
        return 0;
 }
 
 __msg("2: (7a) *(u64 *)(r10 -8) = 0          ; R10=fp0 fp-8_w=00000000")
 /* but fp-16 is spilled IMPRECISE zero const reg */
 __msg("4: (7b) *(u64 *)(r10 -16) = r0        ; R0_w=0 R10=fp0 fp-16_w=0")
-/* and now check that precision propagation works even for such tricky case */
-__msg("10: (71) r2 = *(u8 *)(r10 -9)         ; R2_w=P0 R10=fp0 fp-16_w=0")
+/* validate that assigning R2 from STACK_ZERO doesn't mark register
+ * precise immediately; if necessary, it will be marked precise later
+ */
+__msg("6: (71) r2 = *(u8 *)(r10 -1)          ; R2_w=0 R10=fp0 fp-8_w=00000000")
+/* similarly, when R2 is assigned from spilled register, it is initially
+ * imprecise, but will be marked precise later once it is used in precise context
+ */
+__msg("10: (71) r2 = *(u8 *)(r10 -9)         ; R2_w=0 R10=fp0 fp-16_w=0")
 __msg("11: (0f) r1 += r2")
 __msg("mark_precise: frame0: last_idx 11 first_idx 0 subseq_idx -1")
 __msg("mark_precise: frame0: regs=r2 stack= before 10: (71) r2 = *(u8 *)(r10 -9)")