summaryrefslogtreecommitdiff
path: root/kernel/bpf
diff options
context:
space:
mode:
authorEduard Zingerman <eddyz87@gmail.com>2026-10-26 16:38:26 -0700
committerAlexei Starovoitov <ast@kernel.org>2026-10-27 16:26:21 +0000
commit899cbaae6e4c6f0a1dee01426b53e71c58d396c4 (patch)
tree2bd74da55bb602f2e64821a447d283bacc03ca4d /kernel/bpf
parentabc9a76a888f813b698f5e2a0166ace6a0d976c6 (diff)
bpf: Print 32-bit SCEV bounds as 32-bit numbers
- Print large 32-bit bounds without sign extension. - Omit 32-bit bounds when they coincide with 64-bit bounds. Before: loop header at ..., widening r0 to 0x80000000..0xffffffff (s32 0xffffffff80000000..-1) step 1 loop header at ..., widening r0 to 0..3 (s32 0..3) step 1 After: loop header at ..., widening r0 to 0x80000000..0xffffffff (s32 0x80000000..-1) step 1 loop header at ..., widening r0 to 0..3 step 1 Signed-off-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://patch.msgid.link/20261026-scev-simpler-clamp-v2-6-f373aec9825f@gmail.com
Diffstat (limited to 'kernel/bpf')
-rw-r--r--kernel/bpf/log.c8
-rw-r--r--kernel/bpf/scev.c8
2 files changed, 13 insertions, 3 deletions
diff --git a/kernel/bpf/log.c b/kernel/bpf/log.c
index 5432c0fc442b..fa29d9b994e4 100644
--- a/kernel/bpf/log.c
+++ b/kernel/bpf/log.c
@@ -535,6 +535,14 @@ void bpf_verbose_snum(struct bpf_verifier_env *env, s64 num)
verbose(env, "%#llx", num);
}
+void bpf_verbose_snum32(struct bpf_verifier_env *env, s32 num)
+{
+ if (is_snum_decimal(num))
+ verbose(env, "%d", num);
+ else
+ verbose(env, "%#x", (u32)num);
+}
+
int tnum_strn(char *str, size_t size, struct tnum a)
{
/* print as a constant, if tnum is fully known */
diff --git a/kernel/bpf/scev.c b/kernel/bpf/scev.c
index 12b147faa32a..04d4962448e2 100644
--- a/kernel/bpf/scev.c
+++ b/kernel/bpf/scev.c
@@ -2456,11 +2456,13 @@ static void log_bounds(struct bpf_verifier_env *env, const struct bounds *bounds
bpf_verbose_snum(env, cnum64_smin(bounds->r64));
bpf_log(log, "..");
bpf_verbose_snum(env, cnum64_smax(bounds->r64));
- if (bounds->r32.size < U32_MAX) {
+ if (bounds->r32.size < U32_MAX &&
+ (cnum32_smin(bounds->r32) != cnum64_smin(bounds->r64) ||
+ cnum32_smax(bounds->r32) != cnum64_smax(bounds->r64))) {
bpf_log(log, " (s32 ");
- bpf_verbose_snum(env, cnum32_smin(bounds->r32));
+ bpf_verbose_snum32(env, cnum32_smin(bounds->r32));
bpf_log(log, "..");
- bpf_verbose_snum(env, cnum32_smax(bounds->r32));
+ bpf_verbose_snum32(env, cnum32_smax(bounds->r32));
bpf_log(log, ")");
}
bpf_log(log, " step %u", bounds->step);