arg_track
struct arg_track **callsite_at_stack;
struct arg_track *at_out, int reg,
struct arg_track *at_stack_out, u32 sz)
struct arg_track *at_in, struct arg_track *at_stack_in,
struct arg_track *at_out, struct arg_track *at_stack_out)
static bool can_be_local_fp(int depth, int regno, struct arg_track *at)
struct arg_track *at_out, struct arg_track *at_stack_out,
const struct arg_track *at_stack_arg_entry,
struct arg_track *dst = &at_out[insn->dst_reg];
struct arg_track *src = &at_out[insn->src_reg];
struct arg_track none = { .frame = ARG_NONE };
struct arg_track *parent_stack =
const struct arg_track *arg,
struct arg_track *at, int insn_idx)
struct arg_track resolved, *ptr;
struct arg_track *at, int arg_idx,
struct arg_track *at,
struct arg_track (*at_in)[MAX_AT_TRACK_REGS];
struct arg_track (*at_stack_in)[MAX_ARG_SPILL_SLOTS])
struct arg_track *callee_entry,
struct arg_track (*at_in)[MAX_AT_TRACK_REGS] = NULL;
struct arg_track at_out[MAX_AT_TRACK_REGS];
struct arg_track (*at_stack_in)[MAX_ARG_SPILL_SLOTS] = NULL;
struct arg_track *at_stack_out = NULL;
struct arg_track at_stack_arg_entry[MAX_STACK_ARG_SLOTS];
struct arg_track unvisited = { .frame = ARG_UNVISITED };
struct arg_track none = { .frame = ARG_NONE };
at_stack_in[i], sizeof(struct arg_track) * MAX_ARG_SPILL_SLOTS);
static bool has_fp_args(struct arg_track *args)
struct arg_track *entry_args,
struct arg_track callee_args[MAX_AT_TRACK_REGS] = {};
struct arg_track none = { .frame = ARG_NONE };
static bool arg_is_visited(const struct arg_track *at)
static bool arg_is_fp(const struct arg_track *at)
static void verbose_arg_track(struct bpf_verifier_env *env, struct arg_track *at)
static bool arg_track_eq(const struct arg_track *a, const struct arg_track *b)
static struct arg_track arg_single(s8 arg, s16 off)
struct arg_track at = {};
static struct arg_track arg_merge_offsets(struct arg_track a, struct arg_track b)
struct arg_track result = { .frame = a.frame };
struct arg_track imp = { .frame = a.frame };
static struct arg_track arg_join_imprecise(struct arg_track a, struct arg_track b)
return (struct arg_track){ .mask = m, .frame = ARG_IMPRECISE };
static struct arg_track __arg_track_join(struct arg_track a, struct arg_track b)
return (struct arg_track){ .frame = a.frame };
struct arg_track *in, struct arg_track out)
struct arg_track old = *in;
struct arg_track new_val = __arg_track_join(old, out);
static void arg_track_alu64(struct arg_track *dst, const struct arg_track *src)
static void arg_padd(struct arg_track *at, s64 delta)
static struct arg_track fill_from_stack(struct bpf_insn *insn,
struct arg_track *at_out, int reg,
struct arg_track *at_stack_out,
struct arg_track imp = {
struct arg_track result = { .frame = ARG_NONE };
static void spill_to_stack(struct bpf_insn *insn, struct arg_track *at_out,
int reg, struct arg_track *at_stack_out,
struct arg_track *val, u32 sz)
struct arg_track none = { .frame = ARG_NONE };
struct arg_track new_val = sz == 8 ? *val : none;
static void clear_overlapping_stack_slots(struct arg_track *at_stack, s16 off, u32 sz, int cnt)
struct arg_track none = { .frame = ARG_NONE };