linux/arch/powerpc/net/bpf_jit_comp32.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * eBPF JIT compiler for PPC32
   4 *
   5 * Copyright 2020 Christophe Leroy <christophe.leroy@csgroup.eu>
   6 *                CS GROUP France
   7 *
   8 * Based on PPC64 eBPF JIT compiler by Naveen N. Rao
   9 */
  10#include <linux/moduleloader.h>
  11#include <asm/cacheflush.h>
  12#include <asm/asm-compat.h>
  13#include <linux/netdevice.h>
  14#include <linux/filter.h>
  15#include <linux/if_vlan.h>
  16#include <asm/kprobes.h>
  17#include <linux/bpf.h>
  18
  19#include "bpf_jit.h"
  20
  21/*
  22 * Stack layout:
  23 *
  24 *              [       prev sp         ] <-------------
  25 *              [   nv gpr save area    ] 16 * 4        |
  26 * fp (r31) --> [   ebpf stack space    ] upto 512      |
  27 *              [     frame header      ] 16            |
  28 * sp (r1) ---> [    stack pointer      ] --------------
  29 */
  30
  31/* for gpr non volatile registers r17 to r31 (14) + tail call */
  32#define BPF_PPC_STACK_SAVE      (15 * 4 + 4)
  33/* stack frame, ensure this is quadword aligned */
  34#define BPF_PPC_STACKFRAME(ctx) (STACK_FRAME_MIN_SIZE + BPF_PPC_STACK_SAVE + (ctx)->stack_size)
  35
  36#define PPC_EX32(r, i)          EMIT(PPC_RAW_LI((r), (i) < 0 ? -1 : 0))
  37
  38/* PPC NVR range -- update this if we ever use NVRs below r17 */
  39#define BPF_PPC_NVR_MIN         _R17
  40#define BPF_PPC_TC              _R16
  41
  42/* BPF register usage */
  43#define TMP_REG                 (MAX_BPF_JIT_REG + 0)
  44
  45/* BPF to ppc register mappings */
  46void bpf_jit_init_reg_mapping(struct codegen_context *ctx)
  47{
  48        /* function return value */
  49        ctx->b2p[BPF_REG_0] = _R12;
  50        /* function arguments */
  51        ctx->b2p[BPF_REG_1] = _R4;
  52        ctx->b2p[BPF_REG_2] = _R6;
  53        ctx->b2p[BPF_REG_3] = _R8;
  54        ctx->b2p[BPF_REG_4] = _R10;
  55        ctx->b2p[BPF_REG_5] = _R22;
  56        /* non volatile registers */
  57        ctx->b2p[BPF_REG_6] = _R24;
  58        ctx->b2p[BPF_REG_7] = _R26;
  59        ctx->b2p[BPF_REG_8] = _R28;
  60        ctx->b2p[BPF_REG_9] = _R30;
  61        /* frame pointer aka BPF_REG_10 */
  62        ctx->b2p[BPF_REG_FP] = _R18;
  63        /* eBPF jit internal registers */
  64        ctx->b2p[BPF_REG_AX] = _R20;
  65        ctx->b2p[TMP_REG] = _R31;               /* 32 bits */
  66}
  67
  68static int bpf_jit_stack_offsetof(struct codegen_context *ctx, int reg)
  69{
  70        if ((reg >= BPF_PPC_NVR_MIN && reg < 32) || reg == BPF_PPC_TC)
  71                return BPF_PPC_STACKFRAME(ctx) - 4 * (32 - reg);
  72
  73        WARN(true, "BPF JIT is asking about unknown registers, will crash the stack");
  74        /* Use the hole we have left for alignment */
  75        return BPF_PPC_STACKFRAME(ctx) - 4;
  76}
  77
  78#define SEEN_VREG_MASK          0x1ff80000 /* Volatile registers r3-r12 */
  79#define SEEN_NVREG_FULL_MASK    0x0003ffff /* Non volatile registers r14-r31 */
  80#define SEEN_NVREG_TEMP_MASK    0x00001e01 /* BPF_REG_5, BPF_REG_AX, TMP_REG */
  81
  82void bpf_jit_realloc_regs(struct codegen_context *ctx)
  83{
  84        unsigned int nvreg_mask;
  85
  86        if (ctx->seen & SEEN_FUNC)
  87                nvreg_mask = SEEN_NVREG_TEMP_MASK;
  88        else
  89                nvreg_mask = SEEN_NVREG_FULL_MASK;
  90
  91        while (ctx->seen & nvreg_mask &&
  92              (ctx->seen & SEEN_VREG_MASK) != SEEN_VREG_MASK) {
  93                int old = 32 - fls(ctx->seen & (nvreg_mask & 0xaaaaaaab));
  94                int new = 32 - fls(~ctx->seen & (SEEN_VREG_MASK & 0xaaaaaaaa));
  95                int i;
  96
  97                for (i = BPF_REG_0; i <= TMP_REG; i++) {
  98                        if (ctx->b2p[i] != old)
  99                                continue;
 100                        ctx->b2p[i] = new;
 101                        bpf_set_seen_register(ctx, new);
 102                        bpf_clear_seen_register(ctx, old);
 103                        if (i != TMP_REG) {
 104                                bpf_set_seen_register(ctx, new - 1);
 105                                bpf_clear_seen_register(ctx, old - 1);
 106                        }
 107                        break;
 108                }
 109        }
 110}
 111
 112void bpf_jit_build_prologue(u32 *image, struct codegen_context *ctx)
 113{
 114        int i;
 115
 116        /* First arg comes in as a 32 bits pointer. */
 117        EMIT(PPC_RAW_MR(bpf_to_ppc(BPF_REG_1), _R3));
 118        EMIT(PPC_RAW_LI(bpf_to_ppc(BPF_REG_1) - 1, 0));
 119        EMIT(PPC_RAW_STWU(_R1, _R1, -BPF_PPC_STACKFRAME(ctx)));
 120
 121        /*
 122         * Initialize tail_call_cnt in stack frame if we do tail calls.
 123         * Otherwise, put in NOPs so that it can be skipped when we are
 124         * invoked through a tail call.
 125         */
 126        if (ctx->seen & SEEN_TAILCALL)
 127                EMIT(PPC_RAW_STW(bpf_to_ppc(BPF_REG_1) - 1, _R1,
 128                                 bpf_jit_stack_offsetof(ctx, BPF_PPC_TC)));
 129        else
 130                EMIT(PPC_RAW_NOP());
 131
 132#define BPF_TAILCALL_PROLOGUE_SIZE      16
 133
 134        /*
 135         * We need a stack frame, but we don't necessarily need to
 136         * save/restore LR unless we call other functions
 137         */
 138        if (ctx->seen & SEEN_FUNC)
 139                EMIT(PPC_RAW_MFLR(_R0));
 140
 141        /*
 142         * Back up non-volatile regs -- registers r18-r31
 143         */
 144        for (i = BPF_PPC_NVR_MIN; i <= 31; i++)
 145                if (bpf_is_seen_register(ctx, i))
 146                        EMIT(PPC_RAW_STW(i, _R1, bpf_jit_stack_offsetof(ctx, i)));
 147
 148        /* If needed retrieve arguments 9 and 10, ie 5th 64 bits arg.*/
 149        if (bpf_is_seen_register(ctx, bpf_to_ppc(BPF_REG_5))) {
 150                EMIT(PPC_RAW_LWZ(bpf_to_ppc(BPF_REG_5) - 1, _R1, BPF_PPC_STACKFRAME(ctx)) + 8);
 151                EMIT(PPC_RAW_LWZ(bpf_to_ppc(BPF_REG_5), _R1, BPF_PPC_STACKFRAME(ctx)) + 12);
 152        }
 153
 154        /* Setup frame pointer to point to the bpf stack area */
 155        if (bpf_is_seen_register(ctx, bpf_to_ppc(BPF_REG_FP))) {
 156                EMIT(PPC_RAW_LI(bpf_to_ppc(BPF_REG_FP) - 1, 0));
 157                EMIT(PPC_RAW_ADDI(bpf_to_ppc(BPF_REG_FP), _R1,
 158                                  STACK_FRAME_MIN_SIZE + ctx->stack_size));
 159        }
 160
 161        if (ctx->seen & SEEN_FUNC)
 162                EMIT(PPC_RAW_STW(_R0, _R1, BPF_PPC_STACKFRAME(ctx) + PPC_LR_STKOFF));
 163}
 164
 165static void bpf_jit_emit_common_epilogue(u32 *image, struct codegen_context *ctx)
 166{
 167        int i;
 168
 169        /* Restore NVRs */
 170        for (i = BPF_PPC_NVR_MIN; i <= 31; i++)
 171                if (bpf_is_seen_register(ctx, i))
 172                        EMIT(PPC_RAW_LWZ(i, _R1, bpf_jit_stack_offsetof(ctx, i)));
 173}
 174
 175void bpf_jit_build_epilogue(u32 *image, struct codegen_context *ctx)
 176{
 177        EMIT(PPC_RAW_MR(_R3, bpf_to_ppc(BPF_REG_0)));
 178
 179        bpf_jit_emit_common_epilogue(image, ctx);
 180
 181        /* Tear down our stack frame */
 182
 183        if (ctx->seen & SEEN_FUNC)
 184                EMIT(PPC_RAW_LWZ(_R0, _R1, BPF_PPC_STACKFRAME(ctx) + PPC_LR_STKOFF));
 185
 186        EMIT(PPC_RAW_ADDI(_R1, _R1, BPF_PPC_STACKFRAME(ctx)));
 187
 188        if (ctx->seen & SEEN_FUNC)
 189                EMIT(PPC_RAW_MTLR(_R0));
 190
 191        EMIT(PPC_RAW_BLR());
 192}
 193
 194int bpf_jit_emit_func_call_rel(u32 *image, struct codegen_context *ctx, u64 func)
 195{
 196        s32 rel = (s32)func - (s32)(image + ctx->idx);
 197
 198        if (image && rel < 0x2000000 && rel >= -0x2000000) {
 199                PPC_BL(func);
 200                EMIT(PPC_RAW_NOP());
 201                EMIT(PPC_RAW_NOP());
 202                EMIT(PPC_RAW_NOP());
 203        } else {
 204                /* Load function address into r0 */
 205                EMIT(PPC_RAW_LIS(_R0, IMM_H(func)));
 206                EMIT(PPC_RAW_ORI(_R0, _R0, IMM_L(func)));
 207                EMIT(PPC_RAW_MTCTR(_R0));
 208                EMIT(PPC_RAW_BCTRL());
 209        }
 210
 211        return 0;
 212}
 213
 214static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 out)
 215{
 216        /*
 217         * By now, the eBPF program has already setup parameters in r3-r6
 218         * r3-r4/BPF_REG_1 - pointer to ctx -- passed as is to the next bpf program
 219         * r5-r6/BPF_REG_2 - pointer to bpf_array
 220         * r7-r8/BPF_REG_3 - index in bpf_array
 221         */
 222        int b2p_bpf_array = bpf_to_ppc(BPF_REG_2);
 223        int b2p_index = bpf_to_ppc(BPF_REG_3);
 224
 225        /*
 226         * if (index >= array->map.max_entries)
 227         *   goto out;
 228         */
 229        EMIT(PPC_RAW_LWZ(_R0, b2p_bpf_array, offsetof(struct bpf_array, map.max_entries)));
 230        EMIT(PPC_RAW_CMPLW(b2p_index, _R0));
 231        EMIT(PPC_RAW_LWZ(_R0, _R1, bpf_jit_stack_offsetof(ctx, BPF_PPC_TC)));
 232        PPC_BCC_SHORT(COND_GE, out);
 233
 234        /*
 235         * if (tail_call_cnt >= MAX_TAIL_CALL_CNT)
 236         *   goto out;
 237         */
 238        EMIT(PPC_RAW_CMPLWI(_R0, MAX_TAIL_CALL_CNT));
 239        /* tail_call_cnt++; */
 240        EMIT(PPC_RAW_ADDIC(_R0, _R0, 1));
 241        PPC_BCC_SHORT(COND_GE, out);
 242
 243        /* prog = array->ptrs[index]; */
 244        EMIT(PPC_RAW_RLWINM(_R3, b2p_index, 2, 0, 29));
 245        EMIT(PPC_RAW_ADD(_R3, _R3, b2p_bpf_array));
 246        EMIT(PPC_RAW_LWZ(_R3, _R3, offsetof(struct bpf_array, ptrs)));
 247        EMIT(PPC_RAW_STW(_R0, _R1, bpf_jit_stack_offsetof(ctx, BPF_PPC_TC)));
 248
 249        /*
 250         * if (prog == NULL)
 251         *   goto out;
 252         */
 253        EMIT(PPC_RAW_CMPLWI(_R3, 0));
 254        PPC_BCC_SHORT(COND_EQ, out);
 255
 256        /* goto *(prog->bpf_func + prologue_size); */
 257        EMIT(PPC_RAW_LWZ(_R3, _R3, offsetof(struct bpf_prog, bpf_func)));
 258
 259        if (ctx->seen & SEEN_FUNC)
 260                EMIT(PPC_RAW_LWZ(_R0, _R1, BPF_PPC_STACKFRAME(ctx) + PPC_LR_STKOFF));
 261
 262        EMIT(PPC_RAW_ADDIC(_R3, _R3, BPF_TAILCALL_PROLOGUE_SIZE));
 263
 264        if (ctx->seen & SEEN_FUNC)
 265                EMIT(PPC_RAW_MTLR(_R0));
 266
 267        EMIT(PPC_RAW_MTCTR(_R3));
 268
 269        EMIT(PPC_RAW_MR(_R3, bpf_to_ppc(BPF_REG_1)));
 270
 271        /* tear restore NVRs, ... */
 272        bpf_jit_emit_common_epilogue(image, ctx);
 273
 274        EMIT(PPC_RAW_BCTR());
 275
 276        /* out: */
 277        return 0;
 278}
 279
 280/* Assemble the body code between the prologue & epilogue */
 281int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, struct codegen_context *ctx,
 282                       u32 *addrs, int pass)
 283{
 284        const struct bpf_insn *insn = fp->insnsi;
 285        int flen = fp->len;
 286        int i, ret;
 287
 288        /* Start of epilogue code - will only be valid 2nd pass onwards */
 289        u32 exit_addr = addrs[flen];
 290
 291        for (i = 0; i < flen; i++) {
 292                u32 code = insn[i].code;
 293                u32 dst_reg = bpf_to_ppc(insn[i].dst_reg);
 294                u32 dst_reg_h = dst_reg - 1;
 295                u32 src_reg = bpf_to_ppc(insn[i].src_reg);
 296                u32 src_reg_h = src_reg - 1;
 297                u32 tmp_reg = bpf_to_ppc(TMP_REG);
 298                u32 size = BPF_SIZE(code);
 299                s16 off = insn[i].off;
 300                s32 imm = insn[i].imm;
 301                bool func_addr_fixed;
 302                u64 func_addr;
 303                u32 true_cond;
 304                u32 tmp_idx;
 305                int j;
 306
 307                /*
 308                 * addrs[] maps a BPF bytecode address into a real offset from
 309                 * the start of the body code.
 310                 */
 311                addrs[i] = ctx->idx * 4;
 312
 313                /*
 314                 * As an optimization, we note down which registers
 315                 * are used so that we can only save/restore those in our
 316                 * prologue and epilogue. We do this here regardless of whether
 317                 * the actual BPF instruction uses src/dst registers or not
 318                 * (for instance, BPF_CALL does not use them). The expectation
 319                 * is that those instructions will have src_reg/dst_reg set to
 320                 * 0. Even otherwise, we just lose some prologue/epilogue
 321                 * optimization but everything else should work without
 322                 * any issues.
 323                 */
 324                if (dst_reg >= 3 && dst_reg < 32) {
 325                        bpf_set_seen_register(ctx, dst_reg);
 326                        bpf_set_seen_register(ctx, dst_reg_h);
 327                }
 328
 329                if (src_reg >= 3 && src_reg < 32) {
 330                        bpf_set_seen_register(ctx, src_reg);
 331                        bpf_set_seen_register(ctx, src_reg_h);
 332                }
 333
 334                switch (code) {
 335                /*
 336                 * Arithmetic operations: ADD/SUB/MUL/DIV/MOD/NEG
 337                 */
 338                case BPF_ALU | BPF_ADD | BPF_X: /* (u32) dst += (u32) src */
 339                        EMIT(PPC_RAW_ADD(dst_reg, dst_reg, src_reg));
 340                        break;
 341                case BPF_ALU64 | BPF_ADD | BPF_X: /* dst += src */
 342                        EMIT(PPC_RAW_ADDC(dst_reg, dst_reg, src_reg));
 343                        EMIT(PPC_RAW_ADDE(dst_reg_h, dst_reg_h, src_reg_h));
 344                        break;
 345                case BPF_ALU | BPF_SUB | BPF_X: /* (u32) dst -= (u32) src */
 346                        EMIT(PPC_RAW_SUB(dst_reg, dst_reg, src_reg));
 347                        break;
 348                case BPF_ALU64 | BPF_SUB | BPF_X: /* dst -= src */
 349                        EMIT(PPC_RAW_SUBFC(dst_reg, src_reg, dst_reg));
 350                        EMIT(PPC_RAW_SUBFE(dst_reg_h, src_reg_h, dst_reg_h));
 351                        break;
 352                case BPF_ALU | BPF_SUB | BPF_K: /* (u32) dst -= (u32) imm */
 353                        imm = -imm;
 354                        fallthrough;
 355                case BPF_ALU | BPF_ADD | BPF_K: /* (u32) dst += (u32) imm */
 356                        if (IMM_HA(imm) & 0xffff)
 357                                EMIT(PPC_RAW_ADDIS(dst_reg, dst_reg, IMM_HA(imm)));
 358                        if (IMM_L(imm))
 359                                EMIT(PPC_RAW_ADDI(dst_reg, dst_reg, IMM_L(imm)));
 360                        break;
 361                case BPF_ALU64 | BPF_SUB | BPF_K: /* dst -= imm */
 362                        imm = -imm;
 363                        fallthrough;
 364                case BPF_ALU64 | BPF_ADD | BPF_K: /* dst += imm */
 365                        if (!imm)
 366                                break;
 367
 368                        if (imm >= -32768 && imm < 32768) {
 369                                EMIT(PPC_RAW_ADDIC(dst_reg, dst_reg, imm));
 370                        } else {
 371                                PPC_LI32(_R0, imm);
 372                                EMIT(PPC_RAW_ADDC(dst_reg, dst_reg, _R0));
 373                        }
 374                        if (imm >= 0 || (BPF_OP(code) == BPF_SUB && imm == 0x80000000))
 375                                EMIT(PPC_RAW_ADDZE(dst_reg_h, dst_reg_h));
 376                        else
 377                                EMIT(PPC_RAW_ADDME(dst_reg_h, dst_reg_h));
 378                        break;
 379                case BPF_ALU64 | BPF_MUL | BPF_X: /* dst *= src */
 380                        bpf_set_seen_register(ctx, tmp_reg);
 381                        EMIT(PPC_RAW_MULW(_R0, dst_reg, src_reg_h));
 382                        EMIT(PPC_RAW_MULW(dst_reg_h, dst_reg_h, src_reg));
 383                        EMIT(PPC_RAW_MULHWU(tmp_reg, dst_reg, src_reg));
 384                        EMIT(PPC_RAW_MULW(dst_reg, dst_reg, src_reg));
 385                        EMIT(PPC_RAW_ADD(dst_reg_h, dst_reg_h, _R0));
 386                        EMIT(PPC_RAW_ADD(dst_reg_h, dst_reg_h, tmp_reg));
 387                        break;
 388                case BPF_ALU | BPF_MUL | BPF_X: /* (u32) dst *= (u32) src */
 389                        EMIT(PPC_RAW_MULW(dst_reg, dst_reg, src_reg));
 390                        break;
 391                case BPF_ALU | BPF_MUL | BPF_K: /* (u32) dst *= (u32) imm */
 392                        if (imm >= -32768 && imm < 32768) {
 393                                EMIT(PPC_RAW_MULI(dst_reg, dst_reg, imm));
 394                        } else {
 395                                PPC_LI32(_R0, imm);
 396                                EMIT(PPC_RAW_MULW(dst_reg, dst_reg, _R0));
 397                        }
 398                        break;
 399                case BPF_ALU64 | BPF_MUL | BPF_K: /* dst *= imm */
 400                        if (!imm) {
 401                                PPC_LI32(dst_reg, 0);
 402                                PPC_LI32(dst_reg_h, 0);
 403                                break;
 404                        }
 405                        if (imm == 1)
 406                                break;
 407                        if (imm == -1) {
 408                                EMIT(PPC_RAW_SUBFIC(dst_reg, dst_reg, 0));
 409                                EMIT(PPC_RAW_SUBFZE(dst_reg_h, dst_reg_h));
 410                                break;
 411                        }
 412                        bpf_set_seen_register(ctx, tmp_reg);
 413                        PPC_LI32(tmp_reg, imm);
 414                        EMIT(PPC_RAW_MULW(dst_reg_h, dst_reg_h, tmp_reg));
 415                        if (imm < 0)
 416                                EMIT(PPC_RAW_SUB(dst_reg_h, dst_reg_h, dst_reg));
 417                        EMIT(PPC_RAW_MULHWU(_R0, dst_reg, tmp_reg));
 418                        EMIT(PPC_RAW_MULW(dst_reg, dst_reg, tmp_reg));
 419                        EMIT(PPC_RAW_ADD(dst_reg_h, dst_reg_h, _R0));
 420                        break;
 421                case BPF_ALU | BPF_DIV | BPF_X: /* (u32) dst /= (u32) src */
 422                        EMIT(PPC_RAW_DIVWU(dst_reg, dst_reg, src_reg));
 423                        break;
 424                case BPF_ALU | BPF_MOD | BPF_X: /* (u32) dst %= (u32) src */
 425                        EMIT(PPC_RAW_DIVWU(_R0, dst_reg, src_reg));
 426                        EMIT(PPC_RAW_MULW(_R0, src_reg, _R0));
 427                        EMIT(PPC_RAW_SUB(dst_reg, dst_reg, _R0));
 428                        break;
 429                case BPF_ALU64 | BPF_DIV | BPF_X: /* dst /= src */
 430                        return -EOPNOTSUPP;
 431                case BPF_ALU64 | BPF_MOD | BPF_X: /* dst %= src */
 432                        return -EOPNOTSUPP;
 433                case BPF_ALU | BPF_DIV | BPF_K: /* (u32) dst /= (u32) imm */
 434                        if (!imm)
 435                                return -EINVAL;
 436                        if (imm == 1)
 437                                break;
 438
 439                        PPC_LI32(_R0, imm);
 440                        EMIT(PPC_RAW_DIVWU(dst_reg, dst_reg, _R0));
 441                        break;
 442                case BPF_ALU | BPF_MOD | BPF_K: /* (u32) dst %= (u32) imm */
 443                        if (!imm)
 444                                return -EINVAL;
 445
 446                        if (!is_power_of_2((u32)imm)) {
 447                                bpf_set_seen_register(ctx, tmp_reg);
 448                                PPC_LI32(tmp_reg, imm);
 449                                EMIT(PPC_RAW_DIVWU(_R0, dst_reg, tmp_reg));
 450                                EMIT(PPC_RAW_MULW(_R0, tmp_reg, _R0));
 451                                EMIT(PPC_RAW_SUB(dst_reg, dst_reg, _R0));
 452                                break;
 453                        }
 454                        if (imm == 1)
 455                                EMIT(PPC_RAW_LI(dst_reg, 0));
 456                        else
 457                                EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 0, 32 - ilog2((u32)imm), 31));
 458
 459                        break;
 460                case BPF_ALU64 | BPF_MOD | BPF_K: /* dst %= imm */
 461                        if (!imm)
 462                                return -EINVAL;
 463                        if (imm < 0)
 464                                imm = -imm;
 465                        if (!is_power_of_2(imm))
 466                                return -EOPNOTSUPP;
 467                        if (imm == 1)
 468                                EMIT(PPC_RAW_LI(dst_reg, 0));
 469                        else
 470                                EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 0, 32 - ilog2(imm), 31));
 471                        EMIT(PPC_RAW_LI(dst_reg_h, 0));
 472                        break;
 473                case BPF_ALU64 | BPF_DIV | BPF_K: /* dst /= imm */
 474                        if (!imm)
 475                                return -EINVAL;
 476                        if (!is_power_of_2(abs(imm)))
 477                                return -EOPNOTSUPP;
 478
 479                        if (imm < 0) {
 480                                EMIT(PPC_RAW_SUBFIC(dst_reg, dst_reg, 0));
 481                                EMIT(PPC_RAW_SUBFZE(dst_reg_h, dst_reg_h));
 482                                imm = -imm;
 483                        }
 484                        if (imm == 1)
 485                                break;
 486                        imm = ilog2(imm);
 487                        EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 32 - imm, imm, 31));
 488                        EMIT(PPC_RAW_RLWIMI(dst_reg, dst_reg_h, 32 - imm, 0, imm - 1));
 489                        EMIT(PPC_RAW_SRAWI(dst_reg_h, dst_reg_h, imm));
 490                        break;
 491                case BPF_ALU | BPF_NEG: /* (u32) dst = -dst */
 492                        EMIT(PPC_RAW_NEG(dst_reg, dst_reg));
 493                        break;
 494                case BPF_ALU64 | BPF_NEG: /* dst = -dst */
 495                        EMIT(PPC_RAW_SUBFIC(dst_reg, dst_reg, 0));
 496                        EMIT(PPC_RAW_SUBFZE(dst_reg_h, dst_reg_h));
 497                        break;
 498
 499                /*
 500                 * Logical operations: AND/OR/XOR/[A]LSH/[A]RSH
 501                 */
 502                case BPF_ALU64 | BPF_AND | BPF_X: /* dst = dst & src */
 503                        EMIT(PPC_RAW_AND(dst_reg, dst_reg, src_reg));
 504                        EMIT(PPC_RAW_AND(dst_reg_h, dst_reg_h, src_reg_h));
 505                        break;
 506                case BPF_ALU | BPF_AND | BPF_X: /* (u32) dst = dst & src */
 507                        EMIT(PPC_RAW_AND(dst_reg, dst_reg, src_reg));
 508                        break;
 509                case BPF_ALU64 | BPF_AND | BPF_K: /* dst = dst & imm */
 510                        if (imm >= 0)
 511                                EMIT(PPC_RAW_LI(dst_reg_h, 0));
 512                        fallthrough;
 513                case BPF_ALU | BPF_AND | BPF_K: /* (u32) dst = dst & imm */
 514                        if (!IMM_H(imm)) {
 515                                EMIT(PPC_RAW_ANDI(dst_reg, dst_reg, IMM_L(imm)));
 516                        } else if (!IMM_L(imm)) {
 517                                EMIT(PPC_RAW_ANDIS(dst_reg, dst_reg, IMM_H(imm)));
 518                        } else if (imm == (((1 << fls(imm)) - 1) ^ ((1 << (ffs(i) - 1)) - 1))) {
 519                                EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 0,
 520                                                    32 - fls(imm), 32 - ffs(imm)));
 521                        } else {
 522                                PPC_LI32(_R0, imm);
 523                                EMIT(PPC_RAW_AND(dst_reg, dst_reg, _R0));
 524                        }
 525                        break;
 526                case BPF_ALU64 | BPF_OR | BPF_X: /* dst = dst | src */
 527                        EMIT(PPC_RAW_OR(dst_reg, dst_reg, src_reg));
 528                        EMIT(PPC_RAW_OR(dst_reg_h, dst_reg_h, src_reg_h));
 529                        break;
 530                case BPF_ALU | BPF_OR | BPF_X: /* dst = (u32) dst | (u32) src */
 531                        EMIT(PPC_RAW_OR(dst_reg, dst_reg, src_reg));
 532                        break;
 533                case BPF_ALU64 | BPF_OR | BPF_K:/* dst = dst | imm */
 534                        /* Sign-extended */
 535                        if (imm < 0)
 536                                EMIT(PPC_RAW_LI(dst_reg_h, -1));
 537                        fallthrough;
 538                case BPF_ALU | BPF_OR | BPF_K:/* dst = (u32) dst | (u32) imm */
 539                        if (IMM_L(imm))
 540                                EMIT(PPC_RAW_ORI(dst_reg, dst_reg, IMM_L(imm)));
 541                        if (IMM_H(imm))
 542                                EMIT(PPC_RAW_ORIS(dst_reg, dst_reg, IMM_H(imm)));
 543                        break;
 544                case BPF_ALU64 | BPF_XOR | BPF_X: /* dst ^= src */
 545                        if (dst_reg == src_reg) {
 546                                EMIT(PPC_RAW_LI(dst_reg, 0));
 547                                EMIT(PPC_RAW_LI(dst_reg_h, 0));
 548                        } else {
 549                                EMIT(PPC_RAW_XOR(dst_reg, dst_reg, src_reg));
 550                                EMIT(PPC_RAW_XOR(dst_reg_h, dst_reg_h, src_reg_h));
 551                        }
 552                        break;
 553                case BPF_ALU | BPF_XOR | BPF_X: /* (u32) dst ^= src */
 554                        if (dst_reg == src_reg)
 555                                EMIT(PPC_RAW_LI(dst_reg, 0));
 556                        else
 557                                EMIT(PPC_RAW_XOR(dst_reg, dst_reg, src_reg));
 558                        break;
 559                case BPF_ALU64 | BPF_XOR | BPF_K: /* dst ^= imm */
 560                        if (imm < 0)
 561                                EMIT(PPC_RAW_NOR(dst_reg_h, dst_reg_h, dst_reg_h));
 562                        fallthrough;
 563                case BPF_ALU | BPF_XOR | BPF_K: /* (u32) dst ^= (u32) imm */
 564                        if (IMM_L(imm))
 565                                EMIT(PPC_RAW_XORI(dst_reg, dst_reg, IMM_L(imm)));
 566                        if (IMM_H(imm))
 567                                EMIT(PPC_RAW_XORIS(dst_reg, dst_reg, IMM_H(imm)));
 568                        break;
 569                case BPF_ALU | BPF_LSH | BPF_X: /* (u32) dst <<= (u32) src */
 570                        EMIT(PPC_RAW_SLW(dst_reg, dst_reg, src_reg));
 571                        break;
 572                case BPF_ALU64 | BPF_LSH | BPF_X: /* dst <<= src; */
 573                        bpf_set_seen_register(ctx, tmp_reg);
 574                        EMIT(PPC_RAW_SUBFIC(_R0, src_reg, 32));
 575                        EMIT(PPC_RAW_SLW(dst_reg_h, dst_reg_h, src_reg));
 576                        EMIT(PPC_RAW_ADDI(tmp_reg, src_reg, 32));
 577                        EMIT(PPC_RAW_SRW(_R0, dst_reg, _R0));
 578                        EMIT(PPC_RAW_SLW(tmp_reg, dst_reg, tmp_reg));
 579                        EMIT(PPC_RAW_OR(dst_reg_h, dst_reg_h, _R0));
 580                        EMIT(PPC_RAW_SLW(dst_reg, dst_reg, src_reg));
 581                        EMIT(PPC_RAW_OR(dst_reg_h, dst_reg_h, tmp_reg));
 582                        break;
 583                case BPF_ALU | BPF_LSH | BPF_K: /* (u32) dst <<= (u32) imm */
 584                        if (!imm)
 585                                break;
 586                        EMIT(PPC_RAW_SLWI(dst_reg, dst_reg, imm));
 587                        break;
 588                case BPF_ALU64 | BPF_LSH | BPF_K: /* dst <<= imm */
 589                        if (imm < 0)
 590                                return -EINVAL;
 591                        if (!imm)
 592                                break;
 593                        if (imm < 32) {
 594                                EMIT(PPC_RAW_RLWINM(dst_reg_h, dst_reg_h, imm, 0, 31 - imm));
 595                                EMIT(PPC_RAW_RLWIMI(dst_reg_h, dst_reg, imm, 32 - imm, 31));
 596                                EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, imm, 0, 31 - imm));
 597                                break;
 598                        }
 599                        if (imm < 64)
 600                                EMIT(PPC_RAW_RLWINM(dst_reg_h, dst_reg, imm, 0, 31 - imm));
 601                        else
 602                                EMIT(PPC_RAW_LI(dst_reg_h, 0));
 603                        EMIT(PPC_RAW_LI(dst_reg, 0));
 604                        break;
 605                case BPF_ALU | BPF_RSH | BPF_X: /* (u32) dst >>= (u32) src */
 606                        EMIT(PPC_RAW_SRW(dst_reg, dst_reg, src_reg));
 607                        break;
 608                case BPF_ALU64 | BPF_RSH | BPF_X: /* dst >>= src */
 609                        bpf_set_seen_register(ctx, tmp_reg);
 610                        EMIT(PPC_RAW_SUBFIC(_R0, src_reg, 32));
 611                        EMIT(PPC_RAW_SRW(dst_reg, dst_reg, src_reg));
 612                        EMIT(PPC_RAW_ADDI(tmp_reg, src_reg, 32));
 613                        EMIT(PPC_RAW_SLW(_R0, dst_reg_h, _R0));
 614                        EMIT(PPC_RAW_SRW(tmp_reg, dst_reg_h, tmp_reg));
 615                        EMIT(PPC_RAW_OR(dst_reg, dst_reg, _R0));
 616                        EMIT(PPC_RAW_SRW(dst_reg_h, dst_reg_h, src_reg));
 617                        EMIT(PPC_RAW_OR(dst_reg, dst_reg, tmp_reg));
 618                        break;
 619                case BPF_ALU | BPF_RSH | BPF_K: /* (u32) dst >>= (u32) imm */
 620                        if (!imm)
 621                                break;
 622                        EMIT(PPC_RAW_SRWI(dst_reg, dst_reg, imm));
 623                        break;
 624                case BPF_ALU64 | BPF_RSH | BPF_K: /* dst >>= imm */
 625                        if (imm < 0)
 626                                return -EINVAL;
 627                        if (!imm)
 628                                break;
 629                        if (imm < 32) {
 630                                EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 32 - imm, imm, 31));
 631                                EMIT(PPC_RAW_RLWIMI(dst_reg, dst_reg_h, 32 - imm, 0, imm - 1));
 632                                EMIT(PPC_RAW_RLWINM(dst_reg_h, dst_reg_h, 32 - imm, imm, 31));
 633                                break;
 634                        }
 635                        if (imm < 64)
 636                                EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg_h, 64 - imm, imm - 32, 31));
 637                        else
 638                                EMIT(PPC_RAW_LI(dst_reg, 0));
 639                        EMIT(PPC_RAW_LI(dst_reg_h, 0));
 640                        break;
 641                case BPF_ALU | BPF_ARSH | BPF_X: /* (s32) dst >>= src */
 642                        EMIT(PPC_RAW_SRAW(dst_reg, dst_reg, src_reg));
 643                        break;
 644                case BPF_ALU64 | BPF_ARSH | BPF_X: /* (s64) dst >>= src */
 645                        bpf_set_seen_register(ctx, tmp_reg);
 646                        EMIT(PPC_RAW_SUBFIC(_R0, src_reg, 32));
 647                        EMIT(PPC_RAW_SRW(dst_reg, dst_reg, src_reg));
 648                        EMIT(PPC_RAW_SLW(_R0, dst_reg_h, _R0));
 649                        EMIT(PPC_RAW_ADDI(tmp_reg, src_reg, 32));
 650                        EMIT(PPC_RAW_OR(dst_reg, dst_reg, _R0));
 651                        EMIT(PPC_RAW_RLWINM(_R0, tmp_reg, 0, 26, 26));
 652                        EMIT(PPC_RAW_SRAW(tmp_reg, dst_reg_h, tmp_reg));
 653                        EMIT(PPC_RAW_SRAW(dst_reg_h, dst_reg_h, src_reg));
 654                        EMIT(PPC_RAW_SLW(tmp_reg, tmp_reg, _R0));
 655                        EMIT(PPC_RAW_OR(dst_reg, dst_reg, tmp_reg));
 656                        break;
 657                case BPF_ALU | BPF_ARSH | BPF_K: /* (s32) dst >>= imm */
 658                        if (!imm)
 659                                break;
 660                        EMIT(PPC_RAW_SRAWI(dst_reg, dst_reg, imm));
 661                        break;
 662                case BPF_ALU64 | BPF_ARSH | BPF_K: /* (s64) dst >>= imm */
 663                        if (imm < 0)
 664                                return -EINVAL;
 665                        if (!imm)
 666                                break;
 667                        if (imm < 32) {
 668                                EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 32 - imm, imm, 31));
 669                                EMIT(PPC_RAW_RLWIMI(dst_reg, dst_reg_h, 32 - imm, 0, imm - 1));
 670                                EMIT(PPC_RAW_SRAWI(dst_reg_h, dst_reg_h, imm));
 671                                break;
 672                        }
 673                        if (imm < 64)
 674                                EMIT(PPC_RAW_SRAWI(dst_reg, dst_reg_h, imm - 32));
 675                        else
 676                                EMIT(PPC_RAW_SRAWI(dst_reg, dst_reg_h, 31));
 677                        EMIT(PPC_RAW_SRAWI(dst_reg_h, dst_reg_h, 31));
 678                        break;
 679
 680                /*
 681                 * MOV
 682                 */
 683                case BPF_ALU64 | BPF_MOV | BPF_X: /* dst = src */
 684                        if (dst_reg == src_reg)
 685                                break;
 686                        EMIT(PPC_RAW_MR(dst_reg, src_reg));
 687                        EMIT(PPC_RAW_MR(dst_reg_h, src_reg_h));
 688                        break;
 689                case BPF_ALU | BPF_MOV | BPF_X: /* (u32) dst = src */
 690                        /* special mov32 for zext */
 691                        if (imm == 1)
 692                                EMIT(PPC_RAW_LI(dst_reg_h, 0));
 693                        else if (dst_reg != src_reg)
 694                                EMIT(PPC_RAW_MR(dst_reg, src_reg));
 695                        break;
 696                case BPF_ALU64 | BPF_MOV | BPF_K: /* dst = (s64) imm */
 697                        PPC_LI32(dst_reg, imm);
 698                        PPC_EX32(dst_reg_h, imm);
 699                        break;
 700                case BPF_ALU | BPF_MOV | BPF_K: /* (u32) dst = imm */
 701                        PPC_LI32(dst_reg, imm);
 702                        break;
 703
 704                /*
 705                 * BPF_FROM_BE/LE
 706                 */
 707                case BPF_ALU | BPF_END | BPF_FROM_LE:
 708                        switch (imm) {
 709                        case 16:
 710                                /* Copy 16 bits to upper part */
 711                                EMIT(PPC_RAW_RLWIMI(dst_reg, dst_reg, 16, 0, 15));
 712                                /* Rotate 8 bits right & mask */
 713                                EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 24, 16, 31));
 714                                break;
 715                        case 32:
 716                                /*
 717                                 * Rotate word left by 8 bits:
 718                                 * 2 bytes are already in their final position
 719                                 * -- byte 2 and 4 (of bytes 1, 2, 3 and 4)
 720                                 */
 721                                EMIT(PPC_RAW_RLWINM(_R0, dst_reg, 8, 0, 31));
 722                                /* Rotate 24 bits and insert byte 1 */
 723                                EMIT(PPC_RAW_RLWIMI(_R0, dst_reg, 24, 0, 7));
 724                                /* Rotate 24 bits and insert byte 3 */
 725                                EMIT(PPC_RAW_RLWIMI(_R0, dst_reg, 24, 16, 23));
 726                                EMIT(PPC_RAW_MR(dst_reg, _R0));
 727                                break;
 728                        case 64:
 729                                bpf_set_seen_register(ctx, tmp_reg);
 730                                EMIT(PPC_RAW_RLWINM(tmp_reg, dst_reg, 8, 0, 31));
 731                                EMIT(PPC_RAW_RLWINM(_R0, dst_reg_h, 8, 0, 31));
 732                                /* Rotate 24 bits and insert byte 1 */
 733                                EMIT(PPC_RAW_RLWIMI(tmp_reg, dst_reg, 24, 0, 7));
 734                                EMIT(PPC_RAW_RLWIMI(_R0, dst_reg_h, 24, 0, 7));
 735                                /* Rotate 24 bits and insert byte 3 */
 736                                EMIT(PPC_RAW_RLWIMI(tmp_reg, dst_reg, 24, 16, 23));
 737                                EMIT(PPC_RAW_RLWIMI(_R0, dst_reg_h, 24, 16, 23));
 738                                EMIT(PPC_RAW_MR(dst_reg, _R0));
 739                                EMIT(PPC_RAW_MR(dst_reg_h, tmp_reg));
 740                                break;
 741                        }
 742                        break;
 743                case BPF_ALU | BPF_END | BPF_FROM_BE:
 744                        switch (imm) {
 745                        case 16:
 746                                /* zero-extend 16 bits into 32 bits */
 747                                EMIT(PPC_RAW_RLWINM(dst_reg, dst_reg, 0, 16, 31));
 748                                break;
 749                        case 32:
 750                        case 64:
 751                                /* nop */
 752                                break;
 753                        }
 754                        break;
 755
 756                /*
 757                 * BPF_ST NOSPEC (speculation barrier)
 758                 */
 759                case BPF_ST | BPF_NOSPEC:
 760                        break;
 761
 762                /*
 763                 * BPF_ST(X)
 764                 */
 765                case BPF_STX | BPF_MEM | BPF_B: /* *(u8 *)(dst + off) = src */
 766                        EMIT(PPC_RAW_STB(src_reg, dst_reg, off));
 767                        break;
 768                case BPF_ST | BPF_MEM | BPF_B: /* *(u8 *)(dst + off) = imm */
 769                        PPC_LI32(_R0, imm);
 770                        EMIT(PPC_RAW_STB(_R0, dst_reg, off));
 771                        break;
 772                case BPF_STX | BPF_MEM | BPF_H: /* (u16 *)(dst + off) = src */
 773                        EMIT(PPC_RAW_STH(src_reg, dst_reg, off));
 774                        break;
 775                case BPF_ST | BPF_MEM | BPF_H: /* (u16 *)(dst + off) = imm */
 776                        PPC_LI32(_R0, imm);
 777                        EMIT(PPC_RAW_STH(_R0, dst_reg, off));
 778                        break;
 779                case BPF_STX | BPF_MEM | BPF_W: /* *(u32 *)(dst + off) = src */
 780                        EMIT(PPC_RAW_STW(src_reg, dst_reg, off));
 781                        break;
 782                case BPF_ST | BPF_MEM | BPF_W: /* *(u32 *)(dst + off) = imm */
 783                        PPC_LI32(_R0, imm);
 784                        EMIT(PPC_RAW_STW(_R0, dst_reg, off));
 785                        break;
 786                case BPF_STX | BPF_MEM | BPF_DW: /* (u64 *)(dst + off) = src */
 787                        EMIT(PPC_RAW_STW(src_reg_h, dst_reg, off));
 788                        EMIT(PPC_RAW_STW(src_reg, dst_reg, off + 4));
 789                        break;
 790                case BPF_ST | BPF_MEM | BPF_DW: /* *(u64 *)(dst + off) = imm */
 791                        PPC_LI32(_R0, imm);
 792                        EMIT(PPC_RAW_STW(_R0, dst_reg, off + 4));
 793                        PPC_EX32(_R0, imm);
 794                        EMIT(PPC_RAW_STW(_R0, dst_reg, off));
 795                        break;
 796
 797                /*
 798                 * BPF_STX ATOMIC (atomic ops)
 799                 */
 800                case BPF_STX | BPF_ATOMIC | BPF_W:
 801                        if (imm != BPF_ADD) {
 802                                pr_err_ratelimited("eBPF filter atomic op code %02x (@%d) unsupported\n",
 803                                                   code, i);
 804                                return -ENOTSUPP;
 805                        }
 806
 807                        /* *(u32 *)(dst + off) += src */
 808
 809                        bpf_set_seen_register(ctx, tmp_reg);
 810                        /* Get offset into TMP_REG */
 811                        EMIT(PPC_RAW_LI(tmp_reg, off));
 812                        /* load value from memory into r0 */
 813                        EMIT(PPC_RAW_LWARX(_R0, tmp_reg, dst_reg, 0));
 814                        /* add value from src_reg into this */
 815                        EMIT(PPC_RAW_ADD(_R0, _R0, src_reg));
 816                        /* store result back */
 817                        EMIT(PPC_RAW_STWCX(_R0, tmp_reg, dst_reg));
 818                        /* we're done if this succeeded */
 819                        PPC_BCC_SHORT(COND_NE, (ctx->idx - 3) * 4);
 820                        break;
 821
 822                case BPF_STX | BPF_ATOMIC | BPF_DW: /* *(u64 *)(dst + off) += src */
 823                        return -EOPNOTSUPP;
 824
 825                /*
 826                 * BPF_LDX
 827                 */
 828                case BPF_LDX | BPF_MEM | BPF_B: /* dst = *(u8 *)(ul) (src + off) */
 829                case BPF_LDX | BPF_PROBE_MEM | BPF_B:
 830                case BPF_LDX | BPF_MEM | BPF_H: /* dst = *(u16 *)(ul) (src + off) */
 831                case BPF_LDX | BPF_PROBE_MEM | BPF_H:
 832                case BPF_LDX | BPF_MEM | BPF_W: /* dst = *(u32 *)(ul) (src + off) */
 833                case BPF_LDX | BPF_PROBE_MEM | BPF_W:
 834                case BPF_LDX | BPF_MEM | BPF_DW: /* dst = *(u64 *)(ul) (src + off) */
 835                case BPF_LDX | BPF_PROBE_MEM | BPF_DW:
 836                        /*
 837                         * As PTR_TO_BTF_ID that uses BPF_PROBE_MEM mode could either be a valid
 838                         * kernel pointer or NULL but not a userspace address, execute BPF_PROBE_MEM
 839                         * load only if addr is kernel address (see is_kernel_addr()), otherwise
 840                         * set dst_reg=0 and move on.
 841                         */
 842                        if (BPF_MODE(code) == BPF_PROBE_MEM) {
 843                                PPC_LI32(_R0, TASK_SIZE - off);
 844                                EMIT(PPC_RAW_CMPLW(src_reg, _R0));
 845                                PPC_BCC_SHORT(COND_GT, (ctx->idx + 4) * 4);
 846                                EMIT(PPC_RAW_LI(dst_reg, 0));
 847                                /*
 848                                 * For BPF_DW case, "li reg_h,0" would be needed when
 849                                 * !fp->aux->verifier_zext. Emit NOP otherwise.
 850                                 *
 851                                 * Note that "li reg_h,0" is emitted for BPF_B/H/W case,
 852                                 * if necessary. So, jump there insted of emitting an
 853                                 * additional "li reg_h,0" instruction.
 854                                 */
 855                                if (size == BPF_DW && !fp->aux->verifier_zext)
 856                                        EMIT(PPC_RAW_LI(dst_reg_h, 0));
 857                                else
 858                                        EMIT(PPC_RAW_NOP());
 859                                /*
 860                                 * Need to jump two instructions instead of one for BPF_DW case
 861                                 * as there are two load instructions for dst_reg_h & dst_reg
 862                                 * respectively.
 863                                 */
 864                                if (size == BPF_DW)
 865                                        PPC_JMP((ctx->idx + 3) * 4);
 866                                else
 867                                        PPC_JMP((ctx->idx + 2) * 4);
 868                        }
 869
 870                        switch (size) {
 871                        case BPF_B:
 872                                EMIT(PPC_RAW_LBZ(dst_reg, src_reg, off));
 873                                break;
 874                        case BPF_H:
 875                                EMIT(PPC_RAW_LHZ(dst_reg, src_reg, off));
 876                                break;
 877                        case BPF_W:
 878                                EMIT(PPC_RAW_LWZ(dst_reg, src_reg, off));
 879                                break;
 880                        case BPF_DW:
 881                                EMIT(PPC_RAW_LWZ(dst_reg_h, src_reg, off));
 882                                EMIT(PPC_RAW_LWZ(dst_reg, src_reg, off + 4));
 883                                break;
 884                        }
 885
 886                        if (size != BPF_DW && !fp->aux->verifier_zext)
 887                                EMIT(PPC_RAW_LI(dst_reg_h, 0));
 888
 889                        if (BPF_MODE(code) == BPF_PROBE_MEM) {
 890                                int insn_idx = ctx->idx - 1;
 891                                int jmp_off = 4;
 892
 893                                /*
 894                                 * In case of BPF_DW, two lwz instructions are emitted, one
 895                                 * for higher 32-bit and another for lower 32-bit. So, set
 896                                 * ex->insn to the first of the two and jump over both
 897                                 * instructions in fixup.
 898                                 *
 899                                 * Similarly, with !verifier_zext, two instructions are
 900                                 * emitted for BPF_B/H/W case. So, set ex->insn to the
 901                                 * instruction that could fault and skip over both
 902                                 * instructions.
 903                                 */
 904                                if (size == BPF_DW || !fp->aux->verifier_zext) {
 905                                        insn_idx -= 1;
 906                                        jmp_off += 4;
 907                                }
 908
 909                                ret = bpf_add_extable_entry(fp, image, pass, ctx, insn_idx,
 910                                                            jmp_off, dst_reg);
 911                                if (ret)
 912                                        return ret;
 913                        }
 914                        break;
 915
 916                /*
 917                 * Doubleword load
 918                 * 16 byte instruction that uses two 'struct bpf_insn'
 919                 */
 920                case BPF_LD | BPF_IMM | BPF_DW: /* dst = (u64) imm */
 921                        tmp_idx = ctx->idx;
 922                        PPC_LI32(dst_reg_h, (u32)insn[i + 1].imm);
 923                        PPC_LI32(dst_reg, (u32)insn[i].imm);
 924                        /* padding to allow full 4 instructions for later patching */
 925                        for (j = ctx->idx - tmp_idx; j < 4; j++)
 926                                EMIT(PPC_RAW_NOP());
 927                        /* Adjust for two bpf instructions */
 928                        addrs[++i] = ctx->idx * 4;
 929                        break;
 930
 931                /*
 932                 * Return/Exit
 933                 */
 934                case BPF_JMP | BPF_EXIT:
 935                        /*
 936                         * If this isn't the very last instruction, branch to
 937                         * the epilogue. If we _are_ the last instruction,
 938                         * we'll just fall through to the epilogue.
 939                         */
 940                        if (i != flen - 1) {
 941                                ret = bpf_jit_emit_exit_insn(image, ctx, _R0, exit_addr);
 942                                if (ret)
 943                                        return ret;
 944                        }
 945                        /* else fall through to the epilogue */
 946                        break;
 947
 948                /*
 949                 * Call kernel helper or bpf function
 950                 */
 951                case BPF_JMP | BPF_CALL:
 952                        ctx->seen |= SEEN_FUNC;
 953
 954                        ret = bpf_jit_get_func_addr(fp, &insn[i], false,
 955                                                    &func_addr, &func_addr_fixed);
 956                        if (ret < 0)
 957                                return ret;
 958
 959                        if (bpf_is_seen_register(ctx, bpf_to_ppc(BPF_REG_5))) {
 960                                EMIT(PPC_RAW_STW(bpf_to_ppc(BPF_REG_5) - 1, _R1, 8));
 961                                EMIT(PPC_RAW_STW(bpf_to_ppc(BPF_REG_5), _R1, 12));
 962                        }
 963
 964                        ret = bpf_jit_emit_func_call_rel(image, ctx, func_addr);
 965                        if (ret)
 966                                return ret;
 967
 968                        EMIT(PPC_RAW_MR(bpf_to_ppc(BPF_REG_0) - 1, _R3));
 969                        EMIT(PPC_RAW_MR(bpf_to_ppc(BPF_REG_0), _R4));
 970                        break;
 971
 972                /*
 973                 * Jumps and branches
 974                 */
 975                case BPF_JMP | BPF_JA:
 976                        PPC_JMP(addrs[i + 1 + off]);
 977                        break;
 978
 979                case BPF_JMP | BPF_JGT | BPF_K:
 980                case BPF_JMP | BPF_JGT | BPF_X:
 981                case BPF_JMP | BPF_JSGT | BPF_K:
 982                case BPF_JMP | BPF_JSGT | BPF_X:
 983                case BPF_JMP32 | BPF_JGT | BPF_K:
 984                case BPF_JMP32 | BPF_JGT | BPF_X:
 985                case BPF_JMP32 | BPF_JSGT | BPF_K:
 986                case BPF_JMP32 | BPF_JSGT | BPF_X:
 987                        true_cond = COND_GT;
 988                        goto cond_branch;
 989                case BPF_JMP | BPF_JLT | BPF_K:
 990                case BPF_JMP | BPF_JLT | BPF_X:
 991                case BPF_JMP | BPF_JSLT | BPF_K:
 992                case BPF_JMP | BPF_JSLT | BPF_X:
 993                case BPF_JMP32 | BPF_JLT | BPF_K:
 994                case BPF_JMP32 | BPF_JLT | BPF_X:
 995                case BPF_JMP32 | BPF_JSLT | BPF_K:
 996                case BPF_JMP32 | BPF_JSLT | BPF_X:
 997                        true_cond = COND_LT;
 998                        goto cond_branch;
 999                case BPF_JMP | BPF_JGE | BPF_K:
1000                case BPF_JMP | BPF_JGE | BPF_X:
1001                case BPF_JMP | BPF_JSGE | BPF_K:
1002                case BPF_JMP | BPF_JSGE | BPF_X:
1003                case BPF_JMP32 | BPF_JGE | BPF_K:
1004                case BPF_JMP32 | BPF_JGE | BPF_X:
1005                case BPF_JMP32 | BPF_JSGE | BPF_K:
1006                case BPF_JMP32 | BPF_JSGE | BPF_X:
1007                        true_cond = COND_GE;
1008                        goto cond_branch;
1009                case BPF_JMP | BPF_JLE | BPF_K:
1010                case BPF_JMP | BPF_JLE | BPF_X:
1011                case BPF_JMP | BPF_JSLE | BPF_K:
1012                case BPF_JMP | BPF_JSLE | BPF_X:
1013                case BPF_JMP32 | BPF_JLE | BPF_K:
1014                case BPF_JMP32 | BPF_JLE | BPF_X:
1015                case BPF_JMP32 | BPF_JSLE | BPF_K:
1016                case BPF_JMP32 | BPF_JSLE | BPF_X:
1017                        true_cond = COND_LE;
1018                        goto cond_branch;
1019                case BPF_JMP | BPF_JEQ | BPF_K:
1020                case BPF_JMP | BPF_JEQ | BPF_X:
1021                case BPF_JMP32 | BPF_JEQ | BPF_K:
1022                case BPF_JMP32 | BPF_JEQ | BPF_X:
1023                        true_cond = COND_EQ;
1024                        goto cond_branch;
1025                case BPF_JMP | BPF_JNE | BPF_K:
1026                case BPF_JMP | BPF_JNE | BPF_X:
1027                case BPF_JMP32 | BPF_JNE | BPF_K:
1028                case BPF_JMP32 | BPF_JNE | BPF_X:
1029                        true_cond = COND_NE;
1030                        goto cond_branch;
1031                case BPF_JMP | BPF_JSET | BPF_K:
1032                case BPF_JMP | BPF_JSET | BPF_X:
1033                case BPF_JMP32 | BPF_JSET | BPF_K:
1034                case BPF_JMP32 | BPF_JSET | BPF_X:
1035                        true_cond = COND_NE;
1036                        /* fallthrough; */
1037
1038cond_branch:
1039                        switch (code) {
1040                        case BPF_JMP | BPF_JGT | BPF_X:
1041                        case BPF_JMP | BPF_JLT | BPF_X:
1042                        case BPF_JMP | BPF_JGE | BPF_X:
1043                        case BPF_JMP | BPF_JLE | BPF_X:
1044                        case BPF_JMP | BPF_JEQ | BPF_X:
1045                        case BPF_JMP | BPF_JNE | BPF_X:
1046                                /* unsigned comparison */
1047                                EMIT(PPC_RAW_CMPLW(dst_reg_h, src_reg_h));
1048                                PPC_BCC_SHORT(COND_NE, (ctx->idx + 2) * 4);
1049                                EMIT(PPC_RAW_CMPLW(dst_reg, src_reg));
1050                                break;
1051                        case BPF_JMP32 | BPF_JGT | BPF_X:
1052                        case BPF_JMP32 | BPF_JLT | BPF_X:
1053                        case BPF_JMP32 | BPF_JGE | BPF_X:
1054                        case BPF_JMP32 | BPF_JLE | BPF_X:
1055                        case BPF_JMP32 | BPF_JEQ | BPF_X:
1056                        case BPF_JMP32 | BPF_JNE | BPF_X:
1057                                /* unsigned comparison */
1058                                EMIT(PPC_RAW_CMPLW(dst_reg, src_reg));
1059                                break;
1060                        case BPF_JMP | BPF_JSGT | BPF_X:
1061                        case BPF_JMP | BPF_JSLT | BPF_X:
1062                        case BPF_JMP | BPF_JSGE | BPF_X:
1063                        case BPF_JMP | BPF_JSLE | BPF_X:
1064                                /* signed comparison */
1065                                EMIT(PPC_RAW_CMPW(dst_reg_h, src_reg_h));
1066                                PPC_BCC_SHORT(COND_NE, (ctx->idx + 2) * 4);
1067                                EMIT(PPC_RAW_CMPLW(dst_reg, src_reg));
1068                                break;
1069                        case BPF_JMP32 | BPF_JSGT | BPF_X:
1070                        case BPF_JMP32 | BPF_JSLT | BPF_X:
1071                        case BPF_JMP32 | BPF_JSGE | BPF_X:
1072                        case BPF_JMP32 | BPF_JSLE | BPF_X:
1073                                /* signed comparison */
1074                                EMIT(PPC_RAW_CMPW(dst_reg, src_reg));
1075                                break;
1076                        case BPF_JMP | BPF_JSET | BPF_X:
1077                                EMIT(PPC_RAW_AND_DOT(_R0, dst_reg_h, src_reg_h));
1078                                PPC_BCC_SHORT(COND_NE, (ctx->idx + 2) * 4);
1079                                EMIT(PPC_RAW_AND_DOT(_R0, dst_reg, src_reg));
1080                                break;
1081                        case BPF_JMP32 | BPF_JSET | BPF_X: {
1082                                EMIT(PPC_RAW_AND_DOT(_R0, dst_reg, src_reg));
1083                                break;
1084                        case BPF_JMP | BPF_JNE | BPF_K:
1085                        case BPF_JMP | BPF_JEQ | BPF_K:
1086                        case BPF_JMP | BPF_JGT | BPF_K:
1087                        case BPF_JMP | BPF_JLT | BPF_K:
1088                        case BPF_JMP | BPF_JGE | BPF_K:
1089                        case BPF_JMP | BPF_JLE | BPF_K:
1090                                /*
1091                                 * Need sign-extended load, so only positive
1092                                 * values can be used as imm in cmplwi
1093                                 */
1094                                if (imm >= 0 && imm < 32768) {
1095                                        EMIT(PPC_RAW_CMPLWI(dst_reg_h, 0));
1096                                        PPC_BCC_SHORT(COND_NE, (ctx->idx + 2) * 4);
1097                                        EMIT(PPC_RAW_CMPLWI(dst_reg, imm));
1098                                } else {
1099                                        /* sign-extending load ... but unsigned comparison */
1100                                        PPC_EX32(_R0, imm);
1101                                        EMIT(PPC_RAW_CMPLW(dst_reg_h, _R0));
1102                                        PPC_LI32(_R0, imm);
1103                                        PPC_BCC_SHORT(COND_NE, (ctx->idx + 2) * 4);
1104                                        EMIT(PPC_RAW_CMPLW(dst_reg, _R0));
1105                                }
1106                                break;
1107                        case BPF_JMP32 | BPF_JNE | BPF_K:
1108                        case BPF_JMP32 | BPF_JEQ | BPF_K:
1109                        case BPF_JMP32 | BPF_JGT | BPF_K:
1110                        case BPF_JMP32 | BPF_JLT | BPF_K:
1111                        case BPF_JMP32 | BPF_JGE | BPF_K:
1112                        case BPF_JMP32 | BPF_JLE | BPF_K:
1113                                if (imm >= 0 && imm < 65536) {
1114                                        EMIT(PPC_RAW_CMPLWI(dst_reg, imm));
1115                                } else {
1116                                        PPC_LI32(_R0, imm);
1117                                        EMIT(PPC_RAW_CMPLW(dst_reg, _R0));
1118                                }
1119                                break;
1120                        }
1121                        case BPF_JMP | BPF_JSGT | BPF_K:
1122                        case BPF_JMP | BPF_JSLT | BPF_K:
1123                        case BPF_JMP | BPF_JSGE | BPF_K:
1124                        case BPF_JMP | BPF_JSLE | BPF_K:
1125                                if (imm >= 0 && imm < 65536) {
1126                                        EMIT(PPC_RAW_CMPWI(dst_reg_h, imm < 0 ? -1 : 0));
1127                                        PPC_BCC_SHORT(COND_NE, (ctx->idx + 2) * 4);
1128                                        EMIT(PPC_RAW_CMPLWI(dst_reg, imm));
1129                                } else {
1130                                        /* sign-extending load */
1131                                        EMIT(PPC_RAW_CMPWI(dst_reg_h, imm < 0 ? -1 : 0));
1132                                        PPC_LI32(_R0, imm);
1133                                        PPC_BCC_SHORT(COND_NE, (ctx->idx + 2) * 4);
1134                                        EMIT(PPC_RAW_CMPLW(dst_reg, _R0));
1135                                }
1136                                break;
1137                        case BPF_JMP32 | BPF_JSGT | BPF_K:
1138                        case BPF_JMP32 | BPF_JSLT | BPF_K:
1139                        case BPF_JMP32 | BPF_JSGE | BPF_K:
1140                        case BPF_JMP32 | BPF_JSLE | BPF_K:
1141                                /*
1142                                 * signed comparison, so any 16-bit value
1143                                 * can be used in cmpwi
1144                                 */
1145                                if (imm >= -32768 && imm < 32768) {
1146                                        EMIT(PPC_RAW_CMPWI(dst_reg, imm));
1147                                } else {
1148                                        /* sign-extending load */
1149                                        PPC_LI32(_R0, imm);
1150                                        EMIT(PPC_RAW_CMPW(dst_reg, _R0));
1151                                }
1152                                break;
1153                        case BPF_JMP | BPF_JSET | BPF_K:
1154                                /* andi does not sign-extend the immediate */
1155                                if (imm >= 0 && imm < 32768) {
1156                                        /* PPC_ANDI is _only/always_ dot-form */
1157                                        EMIT(PPC_RAW_ANDI(_R0, dst_reg, imm));
1158                                } else {
1159                                        PPC_LI32(_R0, imm);
1160                                        if (imm < 0) {
1161                                                EMIT(PPC_RAW_CMPWI(dst_reg_h, 0));
1162                                                PPC_BCC_SHORT(COND_NE, (ctx->idx + 2) * 4);
1163                                        }
1164                                        EMIT(PPC_RAW_AND_DOT(_R0, dst_reg, _R0));
1165                                }
1166                                break;
1167                        case BPF_JMP32 | BPF_JSET | BPF_K:
1168                                /* andi does not sign-extend the immediate */
1169                                if (imm >= 0 && imm < 32768) {
1170                                        /* PPC_ANDI is _only/always_ dot-form */
1171                                        EMIT(PPC_RAW_ANDI(_R0, dst_reg, imm));
1172                                } else {
1173                                        PPC_LI32(_R0, imm);
1174                                        EMIT(PPC_RAW_AND_DOT(_R0, dst_reg, _R0));
1175                                }
1176                                break;
1177                        }
1178                        PPC_BCC(true_cond, addrs[i + 1 + off]);
1179                        break;
1180
1181                /*
1182                 * Tail call
1183                 */
1184                case BPF_JMP | BPF_TAIL_CALL:
1185                        ctx->seen |= SEEN_TAILCALL;
1186                        ret = bpf_jit_emit_tail_call(image, ctx, addrs[i + 1]);
1187                        if (ret < 0)
1188                                return ret;
1189                        break;
1190
1191                default:
1192                        /*
1193                         * The filter contains something cruel & unusual.
1194                         * We don't handle it, but also there shouldn't be
1195                         * anything missing from our list.
1196                         */
1197                        pr_err_ratelimited("eBPF filter opcode %04x (@%d) unsupported\n", code, i);
1198                        return -EOPNOTSUPP;
1199                }
1200                if (BPF_CLASS(code) == BPF_ALU && !fp->aux->verifier_zext &&
1201                    !insn_is_zext(&insn[i + 1]) && !(BPF_OP(code) == BPF_END && imm == 64))
1202                        EMIT(PPC_RAW_LI(dst_reg_h, 0));
1203        }
1204
1205        /* Set end-of-body-code address for exit. */
1206        addrs[i] = ctx->idx * 4;
1207
1208        return 0;
1209}
1210