]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
arm32, bpf: add support for unconditional bswap instruction
authorPuranjay Mohan <puranjay12@gmail.com>
Thu, 7 Sep 2023 23:05:45 +0000 (23:05 +0000)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 16 Sep 2023 00:16:56 +0000 (17:16 -0700)
The cpuv4 added a new unconditional bswap instruction with following
behaviour:

BPF_ALU64 | BPF_TO_LE | BPF_END with imm = 16/32/64 means:
dst = bswap16(dst)
dst = bswap32(dst)
dst = bswap64(dst)

As we already support converting to big-endian from little-endian we can
use the same for unconditional bswap. just treat the unconditional scenario
the same as big-endian conversion.

Signed-off-by: Puranjay Mohan <puranjay12@gmail.com>
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://lore.kernel.org/r/20230907230550.1417590-5-puranjay12@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
arch/arm/net/bpf_jit_32.c

index 29a1ccf761fd88130f578bb49e102661e8b9c422..a08eba850ddf18e4515156e52897946b153e7c9d 100644 (file)
@@ -1635,10 +1635,12 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
                break;
        /* dst = htole(dst) */
        /* dst = htobe(dst) */
-       case BPF_ALU | BPF_END | BPF_FROM_LE:
-       case BPF_ALU | BPF_END | BPF_FROM_BE:
+       case BPF_ALU | BPF_END | BPF_FROM_LE: /* also BPF_TO_LE */
+       case BPF_ALU | BPF_END | BPF_FROM_BE: /* also BPF_TO_BE */
+       /* dst = bswap(dst) */
+       case BPF_ALU64 | BPF_END | BPF_FROM_LE: /* also BPF_TO_LE */
                rd = arm_bpf_get_reg64(dst, tmp, ctx);
-               if (BPF_SRC(code) == BPF_FROM_LE)
+               if (BPF_SRC(code) == BPF_FROM_LE && BPF_CLASS(code) != BPF_ALU64)
                        goto emit_bswap_uxt;
                switch (imm) {
                case 16: