Lines Matching full:bt
113 static inline void bt_init(struct backtrack_state *bt, u32 frame) in bt_init() argument
115 bt->frame = frame; in bt_init()
118 static inline void bt_reset(struct backtrack_state *bt) in bt_reset() argument
120 struct bpf_verifier_env *env = bt->env; in bt_reset()
122 memset(bt, 0, sizeof(*bt)); in bt_reset()
123 bt->env = env; in bt_reset()
126 static inline u32 bt_empty(struct backtrack_state *bt) in bt_empty() argument
131 for (i = 0; i <= bt->frame; i++) in bt_empty()
132 mask |= bt->reg_masks[i] | bt->stack_masks[i] | bt->stack_arg_masks[i]; in bt_empty()
137 static inline void bt_clear_frame_stack_arg_slot(struct backtrack_state *bt, u32 frame, u32 slot) in bt_clear_frame_stack_arg_slot() argument
139 bt->stack_arg_masks[frame] &= ~(1 << slot); in bt_clear_frame_stack_arg_slot()
142 static inline bool bt_is_frame_stack_arg_slot_set(struct backtrack_state *bt, u32 frame, u32 slot) in bt_is_frame_stack_arg_slot_set() argument
144 return bt->stack_arg_masks[frame] & (1 << slot); in bt_is_frame_stack_arg_slot_set()
147 static inline int bt_subprog_enter(struct backtrack_state *bt) in bt_subprog_enter() argument
149 if (bt->frame == MAX_CALL_FRAMES - 1) { in bt_subprog_enter()
150 verifier_bug(bt->env, "subprog enter from frame %d", bt->frame); in bt_subprog_enter()
153 bt->frame++; in bt_subprog_enter()
157 static inline int bt_subprog_exit(struct backtrack_state *bt) in bt_subprog_exit() argument
159 if (bt->frame == 0) { in bt_subprog_exit()
160 verifier_bug(bt->env, "subprog exit from frame 0"); in bt_subprog_exit()
163 bt->frame--; in bt_subprog_exit()
167 static inline void bt_clear_frame_reg(struct backtrack_state *bt, u32 frame, u32 reg) in bt_clear_frame_reg() argument
169 bt->reg_masks[frame] &= ~(1 << reg); in bt_clear_frame_reg()
172 static inline void bt_set_reg(struct backtrack_state *bt, u32 reg) in bt_set_reg() argument
174 bpf_bt_set_frame_reg(bt, bt->frame, reg); in bt_set_reg()
177 static inline void bt_clear_reg(struct backtrack_state *bt, u32 reg) in bt_clear_reg() argument
179 bt_clear_frame_reg(bt, bt->frame, reg); in bt_clear_reg()
182 static inline void bt_clear_frame_slot(struct backtrack_state *bt, u32 frame, u32 slot) in bt_clear_frame_slot() argument
184 bt->stack_masks[frame] &= ~(1ull << slot); in bt_clear_frame_slot()
187 static inline u32 bt_frame_reg_mask(struct backtrack_state *bt, u32 frame) in bt_frame_reg_mask() argument
189 return bt->reg_masks[frame]; in bt_frame_reg_mask()
192 static inline u32 bt_reg_mask(struct backtrack_state *bt) in bt_reg_mask() argument
194 return bt->reg_masks[bt->frame]; in bt_reg_mask()
197 static inline u64 bt_frame_stack_mask(struct backtrack_state *bt, u32 frame) in bt_frame_stack_mask() argument
199 return bt->stack_masks[frame]; in bt_frame_stack_mask()
202 static inline u64 bt_stack_mask(struct backtrack_state *bt) in bt_stack_mask() argument
204 return bt->stack_masks[bt->frame]; in bt_stack_mask()
207 static inline u8 bt_stack_arg_mask(struct backtrack_state *bt) in bt_stack_arg_mask() argument
209 return bt->stack_arg_masks[bt->frame]; in bt_stack_arg_mask()
212 static inline bool bt_is_reg_set(struct backtrack_state *bt, u32 reg) in bt_is_reg_set() argument
214 return bt->reg_masks[bt->frame] & (1 << reg); in bt_is_reg_set()
266 struct bpf_jmp_history_entry *hist, struct backtrack_state *bt) in backtrack_insn() argument
279 fmt_reg_mask(env->tmp_str_buf, TMP_STR_BUF_LEN, bt_reg_mask(bt)); in backtrack_insn()
281 bt->frame, env->tmp_str_buf); in backtrack_insn()
282 bpf_fmt_stack_mask(env->tmp_str_buf, TMP_STR_BUF_LEN, bt_stack_mask(bt)); in backtrack_insn()
293 bpf_bt_sync_linked_regs(bt, hist); in backtrack_insn()
296 if (!bt_is_reg_set(bt, dreg)) in backtrack_insn()
309 bt_clear_reg(bt, dreg); in backtrack_insn()
311 bt_set_reg(bt, sreg); in backtrack_insn()
319 bt_clear_reg(bt, dreg); in backtrack_insn()
328 bt_set_reg(bt, sreg); in backtrack_insn()
348 if (!bt_is_reg_set(bt, load_reg)) in backtrack_insn()
350 bt_clear_reg(bt, load_reg); in backtrack_insn()
361 bt_set_frame_stack_arg_slot(bt, bt->frame - 1, spi); in backtrack_insn()
379 bpf_bt_set_frame_slot(bt, fr, spi); in backtrack_insn()
381 if (bt_is_reg_set(bt, dreg)) in backtrack_insn()
390 if (!bt_is_frame_stack_arg_slot_set(bt, bt->frame, spi)) in backtrack_insn()
392 bt_clear_frame_stack_arg_slot(bt, bt->frame, spi); in backtrack_insn()
394 bt_set_reg(bt, sreg); in backtrack_insn()
403 if (!bt_is_frame_slot_set(bt, fr, spi)) in backtrack_insn()
405 bt_clear_frame_slot(bt, fr, spi); in backtrack_insn()
407 bt_set_reg(bt, sreg); in backtrack_insn()
430 if (bt_reg_mask(bt) & BPF_REGMASK_ARGS) { in backtrack_insn()
432 bt_reg_mask(bt)); in backtrack_insn()
436 bt_clear_reg(bt, BPF_REG_0); in backtrack_insn()
445 if (bt_reg_mask(bt) & ~BPF_REGMASK_ARGS) { in backtrack_insn()
447 bt_reg_mask(bt)); in backtrack_insn()
453 if (bt_stack_mask(bt) != 0) { in backtrack_insn()
456 bt_stack_mask(bt)); in backtrack_insn()
461 if (bt_is_reg_set(bt, i)) { in backtrack_insn()
462 bt_clear_reg(bt, i); in backtrack_insn()
463 bpf_bt_set_frame_reg(bt, bt->frame - 1, i); in backtrack_insn()
466 if (bt_stack_arg_mask(bt)) { in backtrack_insn()
469 bt_stack_arg_mask(bt)); in backtrack_insn()
472 if (bt_subprog_exit(bt)) in backtrack_insn()
484 if (bt_reg_mask(bt) & ~BPF_REGMASK_ARGS) { in backtrack_insn()
486 bt_reg_mask(bt)); in backtrack_insn()
489 if (bt_stack_mask(bt) != 0) { in backtrack_insn()
491 bt_stack_mask(bt)); in backtrack_insn()
496 bt_clear_reg(bt, i); in backtrack_insn()
497 if (bt_subprog_exit(bt)) in backtrack_insn()
508 bt_clear_reg(bt, BPF_REG_0); in backtrack_insn()
509 if (bt_reg_mask(bt) & BPF_REGMASK_ARGS) { in backtrack_insn()
514 bt_reg_mask(bt)); in backtrack_insn()
519 if (bt_subprog_enter(bt)) in backtrack_insn()
535 bt_clear_reg(bt, i); in backtrack_insn()
536 if (bt_reg_mask(bt) & BPF_REGMASK_ARGS) { in backtrack_insn()
538 bt_reg_mask(bt)); in backtrack_insn()
552 bt_is_reg_set(bt, BPF_REG_0); in backtrack_insn()
554 bt_clear_reg(bt, BPF_REG_0); in backtrack_insn()
555 if (bt_subprog_enter(bt)) in backtrack_insn()
559 bt_set_reg(bt, BPF_REG_0); in backtrack_insn()
565 if (!bt_is_reg_set(bt, dreg) && !bt_is_reg_set(bt, sreg)) in backtrack_insn()
574 bt_set_reg(bt, sreg); in backtrack_insn()
576 bt_set_reg(bt, dreg); in backtrack_insn()
585 if (!bt_is_reg_set(bt, dreg)) in backtrack_insn()
587 bt_clear_reg(bt, dreg); in backtrack_insn()
599 bpf_bt_sync_linked_regs(bt, hist); in backtrack_insn()
795 struct backtrack_state *bt = &env->bt; in bpf_mark_chain_precision() local
809 bt_init(bt, starting_state->curframe); in bpf_mark_chain_precision()
815 func = st->frame[bt->frame]; in bpf_mark_chain_precision()
822 bt_set_reg(bt, regno); in bpf_mark_chain_precision()
825 if (bt_empty(bt)) in bpf_mark_chain_precision()
835 bt->frame, last_idx, first_idx, subseq_idx); in bpf_mark_chain_precision()
847 bt_stack_mask(bt) == 0 && in bpf_mark_chain_precision()
848 (bt_reg_mask(bt) & ~BPF_REGMASK_ARGS) == 0) { in bpf_mark_chain_precision()
849 bitmap_from_u64(mask, bt_reg_mask(bt)); in bpf_mark_chain_precision()
852 bt_clear_reg(bt, i); in bpf_mark_chain_precision()
862 st->frame[0]->subprogno, bt_reg_mask(bt), bt_stack_mask(bt)); in bpf_mark_chain_precision()
872 err = backtrack_insn(env, i, subseq_idx, hist, bt); in bpf_mark_chain_precision()
876 bt_reset(bt); in bpf_mark_chain_precision()
881 if (bt_empty(bt)) in bpf_mark_chain_precision()
906 for (fr = bt->frame; fr >= 0; fr--) { in bpf_mark_chain_precision()
908 bitmap_from_u64(mask, bt_frame_reg_mask(bt, fr)); in bpf_mark_chain_precision()
912 bt_clear_frame_reg(bt, fr, i); in bpf_mark_chain_precision()
916 bt_clear_frame_reg(bt, fr, i); in bpf_mark_chain_precision()
923 bitmap_from_u64(mask, bt_frame_stack_mask(bt, fr)); in bpf_mark_chain_precision()
931 bt_clear_frame_slot(bt, fr, i); in bpf_mark_chain_precision()
936 bt_clear_frame_slot(bt, fr, i); in bpf_mark_chain_precision()
943 if (!bt_is_frame_stack_arg_slot_set(bt, fr, i)) in bpf_mark_chain_precision()
947 bt_clear_frame_stack_arg_slot(bt, fr, i); in bpf_mark_chain_precision()
955 bt_frame_reg_mask(bt, fr)); in bpf_mark_chain_precision()
959 bt_frame_stack_mask(bt, fr)); in bpf_mark_chain_precision()
965 if (bt_empty(bt)) in bpf_mark_chain_precision()
977 if (!bt_empty(bt)) { in bpf_mark_chain_precision()
979 bt_reset(bt); in bpf_mark_chain_precision()