Skip to contentSkip to conversation

arm64: fix endianness annotation for 'struct jit_ctx' and friends

PATCH New Luc Van Oostenryck 2 participants 3 messages Jun 28, 2017 – Jun 29, 2017

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 arm64: fix endianness annotation for 'struct jit_ctx' and friends

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.

---
 arch/arm64/net/bpf_jit_comp.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/net/bpf_jit_comp.c +3 -3
index c870d6f01..8860bb9c3 100644
@@ -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);
Signature · 1 line
2.13.0
#1 lore raw

PATCH 1/1 arm64: fix endianness annotation for 'struct jit_ctx' and friends

Quoted 6 lines · Luc Van Oostenryck

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.

Quoted 8 lines

Fix this by declaring the field as __le32* instead of u32*. Same for the pointer used in jit_fill_hole() to initialize the image.

---
 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

#2 lore raw

PATCH 1/1 arm64: fix endianness annotation for 'struct jit_ctx' and friends

Quoted 2 lines · Will Deacon

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