Message ID | 20170628145803.24543-1-luc.vanoostenryck@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Jun 28, 2017 at 04:58:03PM +0200, Luc Van Oostenryck wrote: > struct jit_ctx::image is used the store a pointer to the jitted > intructions, which are always little-endian. These instructions > are thus correctly converted from native order to little-endian > before being stored but the pointer 'image' is declared as for > native order values. > > Fix this by declaring the field as __le32* instead of u32*. > Same for the pointer used in jit_fill_hole() to initialize > the image. > > Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> > --- > arch/arm64/net/bpf_jit_comp.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) Happy to take this via the arm64 tree, along with the other sparse fixes (modulo review comments). Ok with you, David? Will
On Thu, Jun 29, 2017 at 11:08:36AM +0100, Will Deacon wrote: > Happy to take this via the arm64 tree, along with the other sparse fixes > (modulo review comments). For info, together with the other endianness fixes I sent, this fixes all the 'easy to fix' endianness annotations. It remains: - 2 or 3 small issues, just needing a cast, maybe with __force. - Problems with probes. Those could probably be fixed by redefining [k]probe_opcode_t as __le32 instead of u32 but I didn't looked at the consequences. - 3 or 4 'impossible to solve properly by design' where things like the following is done: if (kvm_vcpu_is_be(vcpu)) { switch (len) { case 1: return data & 0xff; case 2: return be16_to_cpu(data & 0xffff); case 4: return be32_to_cpu(data & 0xffffffff); default: return be64_to_cpu(data); } } else { ... This is done for kvm emulate & the kvm vgics Cheers, -- Luc
diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c index c870d6f01..8860bb9c3 100644 --- a/arch/arm64/net/bpf_jit_comp.c +++ b/arch/arm64/net/bpf_jit_comp.c @@ -70,7 +70,7 @@ struct jit_ctx { int idx; int epilogue_offset; int *offset; - u32 *image; + __le32 *image; }; static inline void emit(const u32 insn, struct jit_ctx *ctx) @@ -130,7 +130,7 @@ static inline int bpf2a64_offset(int bpf_to, int bpf_from, static void jit_fill_hole(void *area, unsigned int size) { - u32 *ptr; + __le32 *ptr; /* We are guaranteed to have aligned memory. */ for (ptr = area; size >= sizeof(u32); size -= sizeof(u32)) *ptr++ = cpu_to_le32(AARCH64_BREAK_FAULT); @@ -874,7 +874,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog) /* 2. Now, the actual pass. */ - ctx.image = (u32 *)image_ptr; + ctx.image = (__le32 *)image_ptr; ctx.idx = 0; build_prologue(&ctx);
struct jit_ctx::image is used the store a pointer to the jitted intructions, which are always little-endian. These instructions are thus correctly converted from native order to little-endian before being stored but the pointer 'image' is declared as for native order values. Fix this by declaring the field as __le32* instead of u32*. Same for the pointer used in jit_fill_hole() to initialize the image. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> --- arch/arm64/net/bpf_jit_comp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)