On Wed, Mar 11, 2026 at 09:24:22AM +0100, Miroslav Benes wrote:
> On Tue, 10 Mar 2026, Josh Poimboeuf wrote:
> 
> > On Tue, Mar 10, 2026 at 11:47:41AM +0100, Miroslav Benes wrote:
> > > Hi,
> > > 
> > > > @@ -3691,9 +3691,30 @@ static void checksum_update_insn(struct 
> > > > objtool_file *file, struct symbol *func,
> > > >                                  struct instruction *insn)
> > > >  {
> > > >         struct reloc *reloc = insn_reloc(file, insn);
> > > > +       struct alternative *alt;
> > > >         unsigned long offset;
> > > >         struct symbol *sym;
> > > >  
> > > > +       for (alt = insn->alts; alt; alt = alt->next) {
> > > > +               struct alt_group *alt_group = alt->insn->alt_group;
> > > > +
> > > > +               checksum_update(func, insn, &alt->type, 
> > > > sizeof(alt->type));
> > > > +
> > > > +               if (alt_group && alt_group->orig_group) {
> > > > +                       struct instruction *alt_insn;
> > > > +
> > > > +                       checksum_update(func, insn, 
> > > > &alt_group->feature, sizeof(alt_group->feature));
> > > > +
> > > > +                       for (alt_insn = alt->insn; alt_insn; alt_insn = 
> > > > next_insn_same_sec(file, alt_insn)) {
> > > > +                               checksum_update_insn(file, func, 
> > > > alt_insn);
> > > > +                               if (alt_insn == alt_group->last_insn)
> > > > +                                       break;
> > > > +                       }
> > > > +               } else {
> > > > +                       checksum_update(func, insn, &alt->insn->offset, 
> > > > sizeof(alt->insn->offset));
> > > > +               }
> > > > +       }
> > > > +
> > > 
> > > does this hunk belong to the patch? Unless I am missing something, it 
> > > might be worth a separate one.
> > 
> > It belongs, but I should have clarified that in the patch description.
> > 
> > This hunk wasn't needed before because validate_branch() already
> > iterates all the alternatives, so it was calling checksum_update_insn()
> > for every instruction in the function, including the alternatives.
> > 
> > Now that it's no longer called by validate_branch(),
> > checksum_update_insn() has to manually iterate the alternatives.
> 
> After writing the email I had a suspicion it must have been something like 
> above but failed to find it. Now I see that next_insn_to_validate() called 
> in do_validate_branch() handles exactly that. Thanks for the pointer. The 
> patch looks good to me then (and the rest as well as far as I can judge).

Actually, next_insn_to_validate() helps with an edge case for directing
code flow from the end of an alternative back to the original code.

The code which traverses the alternatives is in validate_insn():

        if (insn->alts) {
                for (alt = insn->alts; alt; alt = alt->next) {
                        TRACE_ALT_BEGIN(insn, alt, alt_name);
                        ret = validate_branch(file, func, alt->insn, *statep);
                        TRACE_ALT_END(insn, alt, alt_name);
                        if (ret) {
                                BT_INSN(insn, "(alt)");
                                return ret;
                        }
                }
                TRACE_ALT_INFO_NOADDR(insn, "/ ", "DEFAULT");
        }

> I must admit that objtool has gotten so complex that I have a hard time to 
> track everything in the code :).

The code hasn't changed *too* much, it's just that validate_branch() got
split up more when the tracing code went in, so things are organized a
bit differently.  Most of that code is now in validate_insn().

-- 
Josh

Reply via email to