[PATCH bpf-next v2 2/2] bpf, arm64: calculate offset as byte-offset for bpf line info
Hou Tao
hotforest at gmail.com
Wed Feb 2 20:54:51 PST 2022
Hi,
>
> On Tue, Jan 25, 2022 at 06:57:07PM +0800, Hou Tao wrote:
> > insn_to_jit_off passed to bpf_prog_fill_jited_linfo() is calculated
> > in instruction granularity instead of bytes granularity, but bpf
> > line info requires byte offset, so fixing it by calculating offset
> > as byte-offset.
> >
> > Signed-off-by: Hou Tao <houtao1 at huawei.com>
> > ---
> > arch/arm64/net/bpf_jit_comp.c | 13 ++++++++-----
> > 1 file changed, 8 insertions(+), 5 deletions(-)
> >
> > diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c
> > index 6a83f3070985..7b94e0c5e134 100644
> > --- a/arch/arm64/net/bpf_jit_comp.c
> > +++ b/arch/arm64/net/bpf_jit_comp.c
> > @@ -152,10 +152,12 @@ static inline int bpf2a64_offset(int bpf_insn, int off,
> > bpf_insn++;
> > /*
> > * Whereas arm64 branch instructions encode the offset
> > - * from the branch itself, so we must subtract 1 from the
> > + * from the branch itself, so we must subtract 4 from the
> > * instruction offset.
> > */
> > - return ctx->offset[bpf_insn + off] - (ctx->offset[bpf_insn] - 1);
> > + return (ctx->offset[bpf_insn + off] -
> > + (ctx->offset[bpf_insn] - AARCH64_INSN_SIZE)) /
> > + AARCH64_INSN_SIZE;
> Is it another bug fix? It does not seem to be related
> to the change described in the commit message.
>
No, because ctx->offset is byte-offset now, but bpf2a64_offset()
needs to return instruction offset instead of byte offset, so the
calculation needs update. But i should not update the comment because
it is right. Will post v3 to fix it.
> > }
> >
> > static void jit_fill_hole(void *area, unsigned int size)
> > @@ -946,13 +948,14 @@ static int build_body(struct jit_ctx *ctx, bool extra_pass)
> > const struct bpf_insn *insn = &prog->insnsi[i];
> > int ret;
> >
> > + /* BPF line info needs byte-offset instead of insn-offset */
> > if (ctx->image == NULL)
> > - ctx->offset[i] = ctx->idx;
> > + ctx->offset[i] = ctx->idx * AARCH64_INSN_SIZE;
> > ret = build_insn(insn, ctx, extra_pass);
> > if (ret > 0) {
> > i++;
> > if (ctx->image == NULL)
> > - ctx->offset[i] = ctx->idx;
> > + ctx->offset[i] = ctx->idx * AARCH64_INSN_SIZE;
> > continue;
> > }
> > if (ret)
> > @@ -964,7 +967,7 @@ static int build_body(struct jit_ctx *ctx, bool extra_pass)
> > * instruction (end of program)
> > */
> > if (ctx->image == NULL)
> > - ctx->offset[i] = ctx->idx;
> > + ctx->offset[i] = ctx->idx * AARCH64_INSN_SIZE;
> Changes in this function makes sense.
>
More information about the linux-arm-kernel
mailing list