diff options
author | 2023-12-02 09:57:05 -0800 | |
---|---|---|
committer | 2023-12-02 11:36:51 -0800 | |
commit | 81eff2e36481c5cf4a2ac906ae56c3fbd3e6f305 (patch) | |
tree | e236cae5c30d8c1f05346f4eb167109a433a1db6 /kernel/bpf/log.c | |
parent | selftests/bpf: adjust global_func15 test to validate prog exit precision (diff) | |
download | wireguard-linux-81eff2e36481c5cf4a2ac906ae56c3fbd3e6f305.tar.xz wireguard-linux-81eff2e36481c5cf4a2ac906ae56c3fbd3e6f305.zip |
bpf: simplify tnum output if a fully known constant
Emit tnum representation as just a constant if all bits are known.
Use decimal-vs-hex logic to determine exact format of emitted
constant value, just like it's done for register range values.
For that move tnum_strn() to kernel/bpf/log.c to reuse decimal-vs-hex
determination logic and constants.
Acked-by: Shung-Hsi Yu <shung-hsi.yu@suse.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20231202175705.885270-12-andrii@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'kernel/bpf/log.c')
-rw-r--r-- | kernel/bpf/log.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/kernel/bpf/log.c b/kernel/bpf/log.c index 3505f3e5ae96..55d019f30e91 100644 --- a/kernel/bpf/log.c +++ b/kernel/bpf/log.c @@ -539,6 +539,19 @@ static void verbose_snum(struct bpf_verifier_env *env, s64 num) verbose(env, "%#llx", num); } +int tnum_strn(char *str, size_t size, struct tnum a) +{ + /* print as a constant, if tnum is fully known */ + if (a.mask == 0) { + if (is_unum_decimal(a.value)) + return snprintf(str, size, "%llu", a.value); + else + return snprintf(str, size, "%#llx", a.value); + } + return snprintf(str, size, "(%#llx; %#llx)", a.value, a.mask); +} +EXPORT_SYMBOL_GPL(tnum_strn); + static void print_scalar_ranges(struct bpf_verifier_env *env, const struct bpf_reg_state *reg, const char **sep) |