bpf/verifier: more concise register state logs for constant var_off
authorEdward Cree <ecree@solarflare.com>
Mon, 7 Aug 2017 14:26:56 +0000 (15:26 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 9 Aug 2017 00:51:34 +0000 (17:51 -0700)
Signed-off-by: Edward Cree <ecree@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
kernel/bpf/verifier.c

index 7557800..08a6fa0 100644 (file)
@@ -234,25 +234,33 @@ static void print_verifier_state(struct bpf_verifier_state *state)
                                verbose(",ks=%d,vs=%d",
                                        reg->map_ptr->key_size,
                                        reg->map_ptr->value_size);
-                       if (reg->smin_value != reg->umin_value &&
-                           reg->smin_value != S64_MIN)
-                               verbose(",smin_value=%lld",
-                                       (long long)reg->smin_value);
-                       if (reg->smax_value != reg->umax_value &&
-                           reg->smax_value != S64_MAX)
-                               verbose(",smax_value=%lld",
-                                       (long long)reg->smax_value);
-                       if (reg->umin_value != 0)
-                               verbose(",umin_value=%llu",
-                                       (unsigned long long)reg->umin_value);
-                       if (reg->umax_value != U64_MAX)
-                               verbose(",umax_value=%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(",var_off=%s", tn_buf);
+                       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(",imm=%llx", reg->var_off.value);
+                       } else {
+                               if (reg->smin_value != reg->umin_value &&
+                                   reg->smin_value != S64_MIN)
+                                       verbose(",smin_value=%lld",
+                                               (long long)reg->smin_value);
+                               if (reg->smax_value != reg->umax_value &&
+                                   reg->smax_value != S64_MAX)
+                                       verbose(",smax_value=%lld",
+                                               (long long)reg->smax_value);
+                               if (reg->umin_value != 0)
+                                       verbose(",umin_value=%llu",
+                                               (unsigned long long)reg->umin_value);
+                               if (reg->umax_value != U64_MAX)
+                                       verbose(",umax_value=%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(",var_off=%s", tn_buf);
+                               }
                        }
                        verbose(")");
                }