BPF_REG_0, BPF_REG_1, BPF_REG_2, BPF_REG_3, BPF_REG_4, BPF_REG_5
 };
 
-static void __mark_reg_not_init(struct bpf_reg_state *reg);
+static void __mark_reg_not_init(const struct bpf_verifier_env *env,
+                               struct bpf_reg_state *reg);
 
 /* Mark the unknown part of a register (variable offset or scalar value) as
  * known to have the value @imm.
                verbose(env, "mark_reg_known_zero(regs, %u)\n", regno);
                /* Something bad happened, let's kill all regs */
                for (regno = 0; regno < MAX_BPF_REG; regno++)
-                       __mark_reg_not_init(regs + regno);
+                       __mark_reg_not_init(env, regs + regno);
                return;
        }
        __mark_reg_known_zero(regs + regno);
 }
 
 /* Mark a register as having a completely unknown (scalar) value. */
-static void __mark_reg_unknown(struct bpf_reg_state *reg)
+static void __mark_reg_unknown(const struct bpf_verifier_env *env,
+                              struct bpf_reg_state *reg)
 {
        /*
         * Clear type, id, off, and union(map_ptr, range) and
        reg->type = SCALAR_VALUE;
        reg->var_off = tnum_unknown;
        reg->frameno = 0;
+       reg->precise = env->subprog_cnt > 1 || !env->allow_ptr_leaks ?
+                      true : false;
        __mark_reg_unbounded(reg);
 }
 
                verbose(env, "mark_reg_unknown(regs, %u)\n", regno);
                /* Something bad happened, let's kill all regs except FP */
                for (regno = 0; regno < BPF_REG_FP; regno++)
-                       __mark_reg_not_init(regs + regno);
+                       __mark_reg_not_init(env, regs + regno);
                return;
        }
-       regs += regno;
-       __mark_reg_unknown(regs);
-       /* constant backtracking is enabled for root without bpf2bpf calls */
-       regs->precise = env->subprog_cnt > 1 || !env->allow_ptr_leaks ?
-                       true : false;
+       __mark_reg_unknown(env, regs + regno);
 }
 
-static void __mark_reg_not_init(struct bpf_reg_state *reg)
+static void __mark_reg_not_init(const struct bpf_verifier_env *env,
+                               struct bpf_reg_state *reg)
 {
-       __mark_reg_unknown(reg);
+       __mark_reg_unknown(env, reg);
        reg->type = NOT_INIT;
 }
 
                verbose(env, "mark_reg_not_init(regs, %u)\n", regno);
                /* Something bad happened, let's kill all regs except FP */
                for (regno = 0; regno < BPF_REG_FP; regno++)
-                       __mark_reg_not_init(regs + regno);
+                       __mark_reg_not_init(env, regs + regno);
                return;
        }
-       __mark_reg_not_init(regs + regno);
+       __mark_reg_not_init(env, regs + regno);
 }
 
 #define DEF_NOT_SUBREG (0)
                }
                if (state->stack[spi].slot_type[0] == STACK_SPILL &&
                    state->stack[spi].spilled_ptr.type == SCALAR_VALUE) {
-                       __mark_reg_unknown(&state->stack[spi].spilled_ptr);
+                       __mark_reg_unknown(env, &state->stack[spi].spilled_ptr);
                        for (j = 0; j < BPF_REG_SIZE; j++)
                                state->stack[spi].slot_type[j] = STACK_MISC;
                        goto mark;
                if (!reg)
                        continue;
                if (reg_is_pkt_pointer_any(reg))
-                       __mark_reg_unknown(reg);
+                       __mark_reg_unknown(env, reg);
        }
 }
 
                if (!reg)
                        continue;
                if (reg->ref_obj_id == ref_obj_id)
-                       __mark_reg_unknown(reg);
+                       __mark_reg_unknown(env, reg);
        }
 }
 
                /* Taint dst register if offset had invalid bounds derived from
                 * e.g. dead branches.
                 */
-               __mark_reg_unknown(dst_reg);
+               __mark_reg_unknown(env, dst_reg);
                return 0;
        }
 
                /* Taint dst register if offset had invalid bounds derived from
                 * e.g. dead branches.
                 */
-               __mark_reg_unknown(dst_reg);
+               __mark_reg_unknown(env, dst_reg);
                return 0;
        }
 
        if (!src_known &&
            opcode != BPF_ADD && opcode != BPF_SUB && opcode != BPF_AND) {
-               __mark_reg_unknown(dst_reg);
+               __mark_reg_unknown(env, dst_reg);
                return 0;
        }
 
                        /* since the register is unused, clear its state
                         * to make further comparison simpler
                         */
-                       __mark_reg_not_init(&st->regs[i]);
+                       __mark_reg_not_init(env, &st->regs[i]);
        }
 
        for (i = 0; i < st->allocated_stack / BPF_REG_SIZE; i++) {
                /* liveness must not touch this stack slot anymore */
                st->stack[i].spilled_ptr.live |= REG_LIVE_DONE;
                if (!(live & REG_LIVE_READ)) {
-                       __mark_reg_not_init(&st->stack[i].spilled_ptr);
+                       __mark_reg_not_init(env, &st->stack[i].spilled_ptr);
                        for (j = 0; j < BPF_REG_SIZE; j++)
                                st->stack[i].slot_type[j] = STACK_INVALID;
                }