bpf: Small BPF verifier log improvements
In particular these include: 1) Remove output of inv for scalars in print_verifier_state 2) Replace inv with scalar in verifier error messages 3) Remove _value suffixes for umin/umax/s32_min/etc (except map_value) 4) Remove output of id=0 5) Remove output of ref_obj_id=0 Signed-off-by: Mykola Lysenko <mykolal@fb.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20220301222745.1667206-1-mykolal@fb.com
This commit is contained in:
parent
41332d6e3a
commit
7df5072cc0
20 changed files with 203 additions and 197 deletions
|
|
@ -539,7 +539,7 @@ static const char *reg_type_str(struct bpf_verifier_env *env,
|
|||
char postfix[16] = {0}, prefix[32] = {0};
|
||||
static const char * const str[] = {
|
||||
[NOT_INIT] = "?",
|
||||
[SCALAR_VALUE] = "inv",
|
||||
[SCALAR_VALUE] = "scalar",
|
||||
[PTR_TO_CTX] = "ctx",
|
||||
[CONST_PTR_TO_MAP] = "map_ptr",
|
||||
[PTR_TO_MAP_VALUE] = "map_value",
|
||||
|
|
@ -685,74 +685,80 @@ static void print_verifier_state(struct bpf_verifier_env *env,
|
|||
continue;
|
||||
verbose(env, " R%d", i);
|
||||
print_liveness(env, reg->live);
|
||||
verbose(env, "=%s", reg_type_str(env, t));
|
||||
verbose(env, "=");
|
||||
if (t == SCALAR_VALUE && reg->precise)
|
||||
verbose(env, "P");
|
||||
if ((t == SCALAR_VALUE || t == PTR_TO_STACK) &&
|
||||
tnum_is_const(reg->var_off)) {
|
||||
/* reg->off should be 0 for SCALAR_VALUE */
|
||||
verbose(env, "%s", t == SCALAR_VALUE ? "" : reg_type_str(env, t));
|
||||
verbose(env, "%lld", reg->var_off.value + reg->off);
|
||||
} else {
|
||||
const char *sep = "";
|
||||
|
||||
verbose(env, "%s", reg_type_str(env, t));
|
||||
if (base_type(t) == PTR_TO_BTF_ID ||
|
||||
base_type(t) == PTR_TO_PERCPU_BTF_ID)
|
||||
verbose(env, "%s", kernel_type_name(reg->btf, reg->btf_id));
|
||||
verbose(env, "(id=%d", reg->id);
|
||||
if (reg_type_may_be_refcounted_or_null(t))
|
||||
verbose(env, ",ref_obj_id=%d", reg->ref_obj_id);
|
||||
verbose(env, "(");
|
||||
/*
|
||||
* _a stands for append, was shortened to avoid multiline statements below.
|
||||
* This macro is used to output a comma separated list of attributes.
|
||||
*/
|
||||
#define verbose_a(fmt, ...) ({ verbose(env, "%s" fmt, sep, __VA_ARGS__); sep = ","; })
|
||||
|
||||
if (reg->id)
|
||||
verbose_a("id=%d", reg->id);
|
||||
if (reg_type_may_be_refcounted_or_null(t) && reg->ref_obj_id)
|
||||
verbose_a("ref_obj_id=%d", reg->ref_obj_id);
|
||||
if (t != SCALAR_VALUE)
|
||||
verbose(env, ",off=%d", reg->off);
|
||||
verbose_a("off=%d", reg->off);
|
||||
if (type_is_pkt_pointer(t))
|
||||
verbose(env, ",r=%d", reg->range);
|
||||
verbose_a("r=%d", reg->range);
|
||||
else if (base_type(t) == CONST_PTR_TO_MAP ||
|
||||
base_type(t) == PTR_TO_MAP_KEY ||
|
||||
base_type(t) == PTR_TO_MAP_VALUE)
|
||||
verbose(env, ",ks=%d,vs=%d",
|
||||
reg->map_ptr->key_size,
|
||||
reg->map_ptr->value_size);
|
||||
verbose_a("ks=%d,vs=%d",
|
||||
reg->map_ptr->key_size,
|
||||
reg->map_ptr->value_size);
|
||||
if (tnum_is_const(reg->var_off)) {
|
||||
/* Typically an immediate SCALAR_VALUE, but
|
||||
* could be a pointer whose offset is too big
|
||||
* for reg->off
|
||||
*/
|
||||
verbose(env, ",imm=%llx", reg->var_off.value);
|
||||
verbose_a("imm=%llx", reg->var_off.value);
|
||||
} else {
|
||||
if (reg->smin_value != reg->umin_value &&
|
||||
reg->smin_value != S64_MIN)
|
||||
verbose(env, ",smin_value=%lld",
|
||||
(long long)reg->smin_value);
|
||||
verbose_a("smin=%lld", (long long)reg->smin_value);
|
||||
if (reg->smax_value != reg->umax_value &&
|
||||
reg->smax_value != S64_MAX)
|
||||
verbose(env, ",smax_value=%lld",
|
||||
(long long)reg->smax_value);
|
||||
verbose_a("smax=%lld", (long long)reg->smax_value);
|
||||
if (reg->umin_value != 0)
|
||||
verbose(env, ",umin_value=%llu",
|
||||
(unsigned long long)reg->umin_value);
|
||||
verbose_a("umin=%llu", (unsigned long long)reg->umin_value);
|
||||
if (reg->umax_value != U64_MAX)
|
||||
verbose(env, ",umax_value=%llu",
|
||||
(unsigned long long)reg->umax_value);
|
||||
verbose_a("umax=%llu", (unsigned long long)reg->umax_value);
|
||||
if (!tnum_is_unknown(reg->var_off)) {
|
||||
char tn_buf[48];
|
||||
|
||||
tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
|
||||
verbose(env, ",var_off=%s", tn_buf);
|
||||
verbose_a("var_off=%s", tn_buf);
|
||||
}
|
||||
if (reg->s32_min_value != reg->smin_value &&
|
||||
reg->s32_min_value != S32_MIN)
|
||||
verbose(env, ",s32_min_value=%d",
|
||||
(int)(reg->s32_min_value));
|
||||
verbose_a("s32_min=%d", (int)(reg->s32_min_value));
|
||||
if (reg->s32_max_value != reg->smax_value &&
|
||||
reg->s32_max_value != S32_MAX)
|
||||
verbose(env, ",s32_max_value=%d",
|
||||
(int)(reg->s32_max_value));
|
||||
verbose_a("s32_max=%d", (int)(reg->s32_max_value));
|
||||
if (reg->u32_min_value != reg->umin_value &&
|
||||
reg->u32_min_value != U32_MIN)
|
||||
verbose(env, ",u32_min_value=%d",
|
||||
(int)(reg->u32_min_value));
|
||||
verbose_a("u32_min=%d", (int)(reg->u32_min_value));
|
||||
if (reg->u32_max_value != reg->umax_value &&
|
||||
reg->u32_max_value != U32_MAX)
|
||||
verbose(env, ",u32_max_value=%d",
|
||||
(int)(reg->u32_max_value));
|
||||
verbose_a("u32_max=%d", (int)(reg->u32_max_value));
|
||||
}
|
||||
#undef verbose_a
|
||||
|
||||
verbose(env, ")");
|
||||
}
|
||||
}
|
||||
|
|
@ -777,7 +783,7 @@ static void print_verifier_state(struct bpf_verifier_env *env,
|
|||
if (is_spilled_reg(&state->stack[i])) {
|
||||
reg = &state->stack[i].spilled_ptr;
|
||||
t = reg->type;
|
||||
verbose(env, "=%s", reg_type_str(env, t));
|
||||
verbose(env, "=%s", t == SCALAR_VALUE ? "" : reg_type_str(env, t));
|
||||
if (t == SCALAR_VALUE && reg->precise)
|
||||
verbose(env, "P");
|
||||
if (t == SCALAR_VALUE && tnum_is_const(reg->var_off))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue