Message ID | 20220125105707.292449-3-houtao1@huawei.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | bpf, arm64: fix bpf line info | expand |
Context | Check | Description |
---|---|---|
bpf/vmtest-bpf-next-PR | success | PR summary |
bpf/vmtest-bpf-next | success | VM_Test |
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@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. > } > > 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.
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@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. >
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; } 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; return 0; }
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@huawei.com> --- arch/arm64/net/bpf_jit_comp.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)