Add events notifying validate debug client of instructions that may change program counter. This is particularly useful to an interactive debugger to track conditional and unconditional jumps without trying to parse the program and interpret instructions independently.
Signed-off-by: Marat Khalili <[email protected]> --- lib/bpf/bpf_validate.c | 10 ++++++++-- lib/bpf/bpf_validate_debug.c | 2 ++ lib/bpf/rte_bpf_validate_debug.h | 5 +++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/bpf/bpf_validate.c b/lib/bpf/bpf_validate.c index f4258c2fb54f..d503db836105 100644 --- a/lib/bpf/bpf_validate.c +++ b/lib/bpf/bpf_validate.c @@ -2899,13 +2899,19 @@ is_branch_start(const struct inst_node *node) } static uint64_t -step_events(const struct inst_node *node) +step_events(const struct inst_node *node, uint8_t op) { uint64_t events = RTE_BIT64(RTE_BPF_VALIDATE_DEBUG_EVENT_STEP); if (is_branch_start(node)) events |= RTE_BIT64(RTE_BPF_VALIDATE_DEBUG_EVENT_BRANCH_ENTER); + if (op == (BPF_JMP | BPF_JA)) + events |= RTE_BIT64(RTE_BPF_VALIDATE_DEBUG_EVENT_JUMP_ALWAYS); + + if (node->nb_edge > 1) + events |= RTE_BIT64(RTE_BPF_VALIDATE_DEBUG_EVENT_JUMP_CONDITIONAL); + return events; } @@ -3005,7 +3011,7 @@ evaluate(struct bpf_verifier *bvf) } rc = __rte_bpf_validate_debug_evaluate_update(debug, idx, - step_events(node)); + step_events(node, op)); if (rc < 0) break; diff --git a/lib/bpf/bpf_validate_debug.c b/lib/bpf/bpf_validate_debug.c index db6d13f9cb22..098a88026d6d 100644 --- a/lib/bpf/bpf_validate_debug.c +++ b/lib/bpf/bpf_validate_debug.c @@ -600,6 +600,8 @@ __rte_bpf_validate_debug_evaluate_update(struct rte_bpf_validate_debug *debug, RTE_BPF_VALIDATE_DEBUG_EVENT_BRANCH_PRUNE, RTE_BPF_VALIDATE_DEBUG_EVENT_BRANCH_RETURN, RTE_BPF_VALIDATE_DEBUG_EVENT_BRANCH_UNREACHABLE, + RTE_BPF_VALIDATE_DEBUG_EVENT_JUMP_ALWAYS, + RTE_BPF_VALIDATE_DEBUG_EVENT_JUMP_CONDITIONAL, RTE_BPF_VALIDATE_DEBUG_EVENT_STEP, RTE_BPF_VALIDATE_DEBUG_EVENT_VALIDATION_SUCCESS, RTE_BPF_VALIDATE_DEBUG_EVENT_VALIDATION_FAILURE, diff --git a/lib/bpf/rte_bpf_validate_debug.h b/lib/bpf/rte_bpf_validate_debug.h index b3fedd5428bc..f1ee8769d06a 100644 --- a/lib/bpf/rte_bpf_validate_debug.h +++ b/lib/bpf/rte_bpf_validate_debug.h @@ -35,6 +35,7 @@ extern "C" { * At any given evaluation step, callbacks are fired in the following order: * - Validation start event; * - Branching and invalid-state events (can be interleaved); + * - Jump-instruction events (before evaluating jump instruction); * - Instruction breakpoints (before evaluating instruction); * - Step (before evaluating instruction) or validation result (if done) event; */ @@ -57,6 +58,10 @@ enum rte_bpf_validate_debug_event { RTE_BPF_VALIDATE_DEBUG_EVENT_BRANCH_RETURN, /* Pruning branch as dynamically unreachable (pc points to branch start). */ RTE_BPF_VALIDATE_DEBUG_EVENT_BRANCH_UNREACHABLE, + /* Program counter points to a jump-always instruction. */ + RTE_BPF_VALIDATE_DEBUG_EVENT_JUMP_ALWAYS, + /* Program counter points to a conditional jump instruction. */ + RTE_BPF_VALIDATE_DEBUG_EVENT_JUMP_CONDITIONAL, /* Number of valid event values. */ RTE_BPF_VALIDATE_DEBUG_EVENT_END, }; -- 2.43.0

