• Martin KaFai Lau's avatar
    bpf: Adjust BPF_JMP that jumps to the 1st insn of the prologue · d5c47719
    Martin KaFai Lau authored
    The next patch will add a ctx ptr saving instruction
    "(r1 = *(u64 *)(r10 -8)" at the beginning for the main prog
    when there is an epilogue patch (by the .gen_epilogue() verifier
    ops added in the next patch).
    
    There is one corner case if the bpf prog has a BPF_JMP that jumps
    to the 1st instruction. It needs an adjustment such that
    those BPF_JMP instructions won't jump to the newly added
    ctx saving instruction.
    The commit 5337ac4c ("bpf: Fix the corner case with may_goto and jump to the 1st insn.")
    has the details on this case.
    
    Note that the jump back to 1st instruction is not limited to the
    ctx ptr saving instruction. The same also applies to the prologue.
    A later test, pro_epilogue_goto_start.c, has a test for the prologue
    only case.
    
    Thus, this patch does one adjustment after gen_prologue and
    the future ctx ptr saving. It is done by
    adjust_jmp_off(env->prog, 0, delta) where delta has the total
    number of instructions in the prologue and
    the future ctx ptr saving instruction.
    
    The adjust_jmp_off(env->prog, 0, delta) assumes that the
    prologue does not have a goto 1st instruction itself.
    To accommodate the prologue might have a goto 1st insn itself,
    this patch changes the adjust_jmp_off() to skip considering
    the instructions between [tgt_idx, tgt_idx + delta).
    Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
    Link: https://lore.kernel.org/r/20240829210833.388152-3-martin.lau@linux.devSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    d5c47719
verifier.c 670 KB