linux/arch/mips/net/ebpf_jit.c
<<
>>
Prefs
   1/*
   2 * Just-In-Time compiler for eBPF filters on MIPS
   3 *
   4 * Copyright (c) 2017 Cavium, Inc.
   5 *
   6 * Based on code from:
   7 *
   8 * Copyright (c) 2014 Imagination Technologies Ltd.
   9 * Author: Markos Chandras <markos.chandras@imgtec.com>
  10 *
  11 * This program is free software; you can redistribute it and/or modify it
  12 * under the terms of the GNU General Public License as published by the
  13 * Free Software Foundation; version 2 of the License.
  14 */
  15
  16#include <linux/bitops.h>
  17#include <linux/errno.h>
  18#include <linux/filter.h>
  19#include <linux/bpf.h>
  20#include <linux/slab.h>
  21#include <asm/bitops.h>
  22#include <asm/byteorder.h>
  23#include <asm/cacheflush.h>
  24#include <asm/cpu-features.h>
  25#include <asm/uasm.h>
  26
  27/* Registers used by JIT */
  28#define MIPS_R_ZERO     0
  29#define MIPS_R_AT       1
  30#define MIPS_R_V0       2       /* BPF_R0 */
  31#define MIPS_R_V1       3
  32#define MIPS_R_A0       4       /* BPF_R1 */
  33#define MIPS_R_A1       5       /* BPF_R2 */
  34#define MIPS_R_A2       6       /* BPF_R3 */
  35#define MIPS_R_A3       7       /* BPF_R4 */
  36#define MIPS_R_A4       8       /* BPF_R5 */
  37#define MIPS_R_T4       12      /* BPF_AX */
  38#define MIPS_R_T5       13
  39#define MIPS_R_T6       14
  40#define MIPS_R_T7       15
  41#define MIPS_R_S0       16      /* BPF_R6 */
  42#define MIPS_R_S1       17      /* BPF_R7 */
  43#define MIPS_R_S2       18      /* BPF_R8 */
  44#define MIPS_R_S3       19      /* BPF_R9 */
  45#define MIPS_R_S4       20      /* BPF_TCC */
  46#define MIPS_R_S5       21
  47#define MIPS_R_S6       22
  48#define MIPS_R_S7       23
  49#define MIPS_R_T8       24
  50#define MIPS_R_T9       25
  51#define MIPS_R_SP       29
  52#define MIPS_R_RA       31
  53
  54/* eBPF flags */
  55#define EBPF_SAVE_S0    BIT(0)
  56#define EBPF_SAVE_S1    BIT(1)
  57#define EBPF_SAVE_S2    BIT(2)
  58#define EBPF_SAVE_S3    BIT(3)
  59#define EBPF_SAVE_S4    BIT(4)
  60#define EBPF_SAVE_RA    BIT(5)
  61#define EBPF_SEEN_FP    BIT(6)
  62#define EBPF_SEEN_TC    BIT(7)
  63#define EBPF_TCC_IN_V1  BIT(8)
  64
  65/*
  66 * For the mips64 ISA, we need to track the value range or type for
  67 * each JIT register.  The BPF machine requires zero extended 32-bit
  68 * values, but the mips64 ISA requires sign extended 32-bit values.
  69 * At each point in the BPF program we track the state of every
  70 * register so that we can zero extend or sign extend as the BPF
  71 * semantics require.
  72 */
  73enum reg_val_type {
  74        /* uninitialized */
  75        REG_UNKNOWN,
  76        /* not known to be 32-bit compatible. */
  77        REG_64BIT,
  78        /* 32-bit compatible, no truncation needed for 64-bit ops. */
  79        REG_64BIT_32BIT,
  80        /* 32-bit compatible, need truncation for 64-bit ops. */
  81        REG_32BIT,
  82        /* 32-bit zero extended. */
  83        REG_32BIT_ZERO_EX,
  84        /* 32-bit no sign/zero extension needed. */
  85        REG_32BIT_POS
  86};
  87
  88/*
  89 * high bit of offsets indicates if long branch conversion done at
  90 * this insn.
  91 */
  92#define OFFSETS_B_CONV  BIT(31)
  93
  94/**
  95 * struct jit_ctx - JIT context
  96 * @skf:                The sk_filter
  97 * @stack_size:         eBPF stack size
  98 * @tmp_offset:         eBPF $sp offset to 8-byte temporary memory
  99 * @idx:                Instruction index
 100 * @flags:              JIT flags
 101 * @offsets:            Instruction offsets
 102 * @target:             Memory location for the compiled filter
 103 * @reg_val_types       Packed enum reg_val_type for each register.
 104 */
 105struct jit_ctx {
 106        const struct bpf_prog *skf;
 107        int stack_size;
 108        int tmp_offset;
 109        u32 idx;
 110        u32 flags;
 111        u32 *offsets;
 112        u32 *target;
 113        u64 *reg_val_types;
 114        unsigned int long_b_conversion:1;
 115        unsigned int gen_b_offsets:1;
 116        unsigned int use_bbit_insns:1;
 117};
 118
 119static void set_reg_val_type(u64 *rvt, int reg, enum reg_val_type type)
 120{
 121        *rvt &= ~(7ull << (reg * 3));
 122        *rvt |= ((u64)type << (reg * 3));
 123}
 124
 125static enum reg_val_type get_reg_val_type(const struct jit_ctx *ctx,
 126                                          int index, int reg)
 127{
 128        return (ctx->reg_val_types[index] >> (reg * 3)) & 7;
 129}
 130
 131/* Simply emit the instruction if the JIT memory space has been allocated */
 132#define emit_instr(ctx, func, ...)                      \
 133do {                                                    \
 134        if ((ctx)->target != NULL) {                    \
 135                u32 *p = &(ctx)->target[ctx->idx];      \
 136                uasm_i_##func(&p, ##__VA_ARGS__);       \
 137        }                                               \
 138        (ctx)->idx++;                                   \
 139} while (0)
 140
 141static unsigned int j_target(struct jit_ctx *ctx, int target_idx)
 142{
 143        unsigned long target_va, base_va;
 144        unsigned int r;
 145
 146        if (!ctx->target)
 147                return 0;
 148
 149        base_va = (unsigned long)ctx->target;
 150        target_va = base_va + (ctx->offsets[target_idx] & ~OFFSETS_B_CONV);
 151
 152        if ((base_va & ~0x0ffffffful) != (target_va & ~0x0ffffffful))
 153                return (unsigned int)-1;
 154        r = target_va & 0x0ffffffful;
 155        return r;
 156}
 157
 158/* Compute the immediate value for PC-relative branches. */
 159static u32 b_imm(unsigned int tgt, struct jit_ctx *ctx)
 160{
 161        if (!ctx->gen_b_offsets)
 162                return 0;
 163
 164        /*
 165         * We want a pc-relative branch.  tgt is the instruction offset
 166         * we want to jump to.
 167
 168         * Branch on MIPS:
 169         * I: target_offset <- sign_extend(offset)
 170         * I+1: PC += target_offset (delay slot)
 171         *
 172         * ctx->idx currently points to the branch instruction
 173         * but the offset is added to the delay slot so we need
 174         * to subtract 4.
 175         */
 176        return (ctx->offsets[tgt] & ~OFFSETS_B_CONV) -
 177                (ctx->idx * 4) - 4;
 178}
 179
 180enum which_ebpf_reg {
 181        src_reg,
 182        src_reg_no_fp,
 183        dst_reg,
 184        dst_reg_fp_ok
 185};
 186
 187/*
 188 * For eBPF, the register mapping naturally falls out of the
 189 * requirements of eBPF and the MIPS n64 ABI.  We don't maintain a
 190 * separate frame pointer, so BPF_REG_10 relative accesses are
 191 * adjusted to be $sp relative.
 192 */
 193int ebpf_to_mips_reg(struct jit_ctx *ctx, const struct bpf_insn *insn,
 194                     enum which_ebpf_reg w)
 195{
 196        int ebpf_reg = (w == src_reg || w == src_reg_no_fp) ?
 197                insn->src_reg : insn->dst_reg;
 198
 199        switch (ebpf_reg) {
 200        case BPF_REG_0:
 201                return MIPS_R_V0;
 202        case BPF_REG_1:
 203                return MIPS_R_A0;
 204        case BPF_REG_2:
 205                return MIPS_R_A1;
 206        case BPF_REG_3:
 207                return MIPS_R_A2;
 208        case BPF_REG_4:
 209                return MIPS_R_A3;
 210        case BPF_REG_5:
 211                return MIPS_R_A4;
 212        case BPF_REG_6:
 213                ctx->flags |= EBPF_SAVE_S0;
 214                return MIPS_R_S0;
 215        case BPF_REG_7:
 216                ctx->flags |= EBPF_SAVE_S1;
 217                return MIPS_R_S1;
 218        case BPF_REG_8:
 219                ctx->flags |= EBPF_SAVE_S2;
 220                return MIPS_R_S2;
 221        case BPF_REG_9:
 222                ctx->flags |= EBPF_SAVE_S3;
 223                return MIPS_R_S3;
 224        case BPF_REG_10:
 225                if (w == dst_reg || w == src_reg_no_fp)
 226                        goto bad_reg;
 227                ctx->flags |= EBPF_SEEN_FP;
 228                /*
 229                 * Needs special handling, return something that
 230                 * cannot be clobbered just in case.
 231                 */
 232                return MIPS_R_ZERO;
 233        case BPF_REG_AX:
 234                return MIPS_R_T4;
 235        default:
 236bad_reg:
 237                WARN(1, "Illegal bpf reg: %d\n", ebpf_reg);
 238                return -EINVAL;
 239        }
 240}
 241/*
 242 * eBPF stack frame will be something like:
 243 *
 244 *  Entry $sp ------>   +--------------------------------+
 245 *                      |   $ra  (optional)              |
 246 *                      +--------------------------------+
 247 *                      |   $s0  (optional)              |
 248 *                      +--------------------------------+
 249 *                      |   $s1  (optional)              |
 250 *                      +--------------------------------+
 251 *                      |   $s2  (optional)              |
 252 *                      +--------------------------------+
 253 *                      |   $s3  (optional)              |
 254 *                      +--------------------------------+
 255 *                      |   $s4  (optional)              |
 256 *                      +--------------------------------+
 257 *                      |   tmp-storage  (if $ra saved)  |
 258 * $sp + tmp_offset --> +--------------------------------+ <--BPF_REG_10
 259 *                      |   BPF_REG_10 relative storage  |
 260 *                      |    MAX_BPF_STACK (optional)    |
 261 *                      |      .                         |
 262 *                      |      .                         |
 263 *                      |      .                         |
 264 *     $sp -------->    +--------------------------------+
 265 *
 266 * If BPF_REG_10 is never referenced, then the MAX_BPF_STACK sized
 267 * area is not allocated.
 268 */
 269static int gen_int_prologue(struct jit_ctx *ctx)
 270{
 271        int stack_adjust = 0;
 272        int store_offset;
 273        int locals_size;
 274
 275        if (ctx->flags & EBPF_SAVE_RA)
 276                /*
 277                 * If RA we are doing a function call and may need
 278                 * extra 8-byte tmp area.
 279                 */
 280                stack_adjust += 16;
 281        if (ctx->flags & EBPF_SAVE_S0)
 282                stack_adjust += 8;
 283        if (ctx->flags & EBPF_SAVE_S1)
 284                stack_adjust += 8;
 285        if (ctx->flags & EBPF_SAVE_S2)
 286                stack_adjust += 8;
 287        if (ctx->flags & EBPF_SAVE_S3)
 288                stack_adjust += 8;
 289        if (ctx->flags & EBPF_SAVE_S4)
 290                stack_adjust += 8;
 291
 292        BUILD_BUG_ON(MAX_BPF_STACK & 7);
 293        locals_size = (ctx->flags & EBPF_SEEN_FP) ? MAX_BPF_STACK : 0;
 294
 295        stack_adjust += locals_size;
 296        ctx->tmp_offset = locals_size;
 297
 298        ctx->stack_size = stack_adjust;
 299
 300        /*
 301         * First instruction initializes the tail call count (TCC).
 302         * On tail call we skip this instruction, and the TCC is
 303         * passed in $v1 from the caller.
 304         */
 305        emit_instr(ctx, daddiu, MIPS_R_V1, MIPS_R_ZERO, MAX_TAIL_CALL_CNT);
 306        if (stack_adjust)
 307                emit_instr(ctx, daddiu, MIPS_R_SP, MIPS_R_SP, -stack_adjust);
 308        else
 309                return 0;
 310
 311        store_offset = stack_adjust - 8;
 312
 313        if (ctx->flags & EBPF_SAVE_RA) {
 314                emit_instr(ctx, sd, MIPS_R_RA, store_offset, MIPS_R_SP);
 315                store_offset -= 8;
 316        }
 317        if (ctx->flags & EBPF_SAVE_S0) {
 318                emit_instr(ctx, sd, MIPS_R_S0, store_offset, MIPS_R_SP);
 319                store_offset -= 8;
 320        }
 321        if (ctx->flags & EBPF_SAVE_S1) {
 322                emit_instr(ctx, sd, MIPS_R_S1, store_offset, MIPS_R_SP);
 323                store_offset -= 8;
 324        }
 325        if (ctx->flags & EBPF_SAVE_S2) {
 326                emit_instr(ctx, sd, MIPS_R_S2, store_offset, MIPS_R_SP);
 327                store_offset -= 8;
 328        }
 329        if (ctx->flags & EBPF_SAVE_S3) {
 330                emit_instr(ctx, sd, MIPS_R_S3, store_offset, MIPS_R_SP);
 331                store_offset -= 8;
 332        }
 333        if (ctx->flags & EBPF_SAVE_S4) {
 334                emit_instr(ctx, sd, MIPS_R_S4, store_offset, MIPS_R_SP);
 335                store_offset -= 8;
 336        }
 337
 338        if ((ctx->flags & EBPF_SEEN_TC) && !(ctx->flags & EBPF_TCC_IN_V1))
 339                emit_instr(ctx, daddu, MIPS_R_S4, MIPS_R_V1, MIPS_R_ZERO);
 340
 341        return 0;
 342}
 343
 344static int build_int_epilogue(struct jit_ctx *ctx, int dest_reg)
 345{
 346        const struct bpf_prog *prog = ctx->skf;
 347        int stack_adjust = ctx->stack_size;
 348        int store_offset = stack_adjust - 8;
 349        int r0 = MIPS_R_V0;
 350
 351        if (dest_reg == MIPS_R_RA &&
 352            get_reg_val_type(ctx, prog->len, BPF_REG_0) == REG_32BIT_ZERO_EX)
 353                /* Don't let zero extended value escape. */
 354                emit_instr(ctx, sll, r0, r0, 0);
 355
 356        if (ctx->flags & EBPF_SAVE_RA) {
 357                emit_instr(ctx, ld, MIPS_R_RA, store_offset, MIPS_R_SP);
 358                store_offset -= 8;
 359        }
 360        if (ctx->flags & EBPF_SAVE_S0) {
 361                emit_instr(ctx, ld, MIPS_R_S0, store_offset, MIPS_R_SP);
 362                store_offset -= 8;
 363        }
 364        if (ctx->flags & EBPF_SAVE_S1) {
 365                emit_instr(ctx, ld, MIPS_R_S1, store_offset, MIPS_R_SP);
 366                store_offset -= 8;
 367        }
 368        if (ctx->flags & EBPF_SAVE_S2) {
 369                emit_instr(ctx, ld, MIPS_R_S2, store_offset, MIPS_R_SP);
 370                store_offset -= 8;
 371        }
 372        if (ctx->flags & EBPF_SAVE_S3) {
 373                emit_instr(ctx, ld, MIPS_R_S3, store_offset, MIPS_R_SP);
 374                store_offset -= 8;
 375        }
 376        if (ctx->flags & EBPF_SAVE_S4) {
 377                emit_instr(ctx, ld, MIPS_R_S4, store_offset, MIPS_R_SP);
 378                store_offset -= 8;
 379        }
 380        emit_instr(ctx, jr, dest_reg);
 381
 382        if (stack_adjust)
 383                emit_instr(ctx, daddiu, MIPS_R_SP, MIPS_R_SP, stack_adjust);
 384        else
 385                emit_instr(ctx, nop);
 386
 387        return 0;
 388}
 389
 390static void gen_imm_to_reg(const struct bpf_insn *insn, int reg,
 391                           struct jit_ctx *ctx)
 392{
 393        if (insn->imm >= S16_MIN && insn->imm <= S16_MAX) {
 394                emit_instr(ctx, addiu, reg, MIPS_R_ZERO, insn->imm);
 395        } else {
 396                int lower = (s16)(insn->imm & 0xffff);
 397                int upper = insn->imm - lower;
 398
 399                emit_instr(ctx, lui, reg, upper >> 16);
 400                emit_instr(ctx, addiu, reg, reg, lower);
 401        }
 402
 403}
 404
 405static int gen_imm_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
 406                        int idx)
 407{
 408        int upper_bound, lower_bound;
 409        int dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
 410
 411        if (dst < 0)
 412                return dst;
 413
 414        switch (BPF_OP(insn->code)) {
 415        case BPF_MOV:
 416        case BPF_ADD:
 417                upper_bound = S16_MAX;
 418                lower_bound = S16_MIN;
 419                break;
 420        case BPF_SUB:
 421                upper_bound = -(int)S16_MIN;
 422                lower_bound = -(int)S16_MAX;
 423                break;
 424        case BPF_AND:
 425        case BPF_OR:
 426        case BPF_XOR:
 427                upper_bound = 0xffff;
 428                lower_bound = 0;
 429                break;
 430        case BPF_RSH:
 431        case BPF_LSH:
 432        case BPF_ARSH:
 433                /* Shift amounts are truncated, no need for bounds */
 434                upper_bound = S32_MAX;
 435                lower_bound = S32_MIN;
 436                break;
 437        default:
 438                return -EINVAL;
 439        }
 440
 441        /*
 442         * Immediate move clobbers the register, so no sign/zero
 443         * extension needed.
 444         */
 445        if (BPF_CLASS(insn->code) == BPF_ALU64 &&
 446            BPF_OP(insn->code) != BPF_MOV &&
 447            get_reg_val_type(ctx, idx, insn->dst_reg) == REG_32BIT)
 448                emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
 449        /* BPF_ALU | BPF_LSH doesn't need separate sign extension */
 450        if (BPF_CLASS(insn->code) == BPF_ALU &&
 451            BPF_OP(insn->code) != BPF_LSH &&
 452            BPF_OP(insn->code) != BPF_MOV &&
 453            get_reg_val_type(ctx, idx, insn->dst_reg) != REG_32BIT)
 454                emit_instr(ctx, sll, dst, dst, 0);
 455
 456        if (insn->imm >= lower_bound && insn->imm <= upper_bound) {
 457                /* single insn immediate case */
 458                switch (BPF_OP(insn->code) | BPF_CLASS(insn->code)) {
 459                case BPF_ALU64 | BPF_MOV:
 460                        emit_instr(ctx, daddiu, dst, MIPS_R_ZERO, insn->imm);
 461                        break;
 462                case BPF_ALU64 | BPF_AND:
 463                case BPF_ALU | BPF_AND:
 464                        emit_instr(ctx, andi, dst, dst, insn->imm);
 465                        break;
 466                case BPF_ALU64 | BPF_OR:
 467                case BPF_ALU | BPF_OR:
 468                        emit_instr(ctx, ori, dst, dst, insn->imm);
 469                        break;
 470                case BPF_ALU64 | BPF_XOR:
 471                case BPF_ALU | BPF_XOR:
 472                        emit_instr(ctx, xori, dst, dst, insn->imm);
 473                        break;
 474                case BPF_ALU64 | BPF_ADD:
 475                        emit_instr(ctx, daddiu, dst, dst, insn->imm);
 476                        break;
 477                case BPF_ALU64 | BPF_SUB:
 478                        emit_instr(ctx, daddiu, dst, dst, -insn->imm);
 479                        break;
 480                case BPF_ALU64 | BPF_RSH:
 481                        emit_instr(ctx, dsrl_safe, dst, dst, insn->imm & 0x3f);
 482                        break;
 483                case BPF_ALU | BPF_RSH:
 484                        emit_instr(ctx, srl, dst, dst, insn->imm & 0x1f);
 485                        break;
 486                case BPF_ALU64 | BPF_LSH:
 487                        emit_instr(ctx, dsll_safe, dst, dst, insn->imm & 0x3f);
 488                        break;
 489                case BPF_ALU | BPF_LSH:
 490                        emit_instr(ctx, sll, dst, dst, insn->imm & 0x1f);
 491                        break;
 492                case BPF_ALU64 | BPF_ARSH:
 493                        emit_instr(ctx, dsra_safe, dst, dst, insn->imm & 0x3f);
 494                        break;
 495                case BPF_ALU | BPF_ARSH:
 496                        emit_instr(ctx, sra, dst, dst, insn->imm & 0x1f);
 497                        break;
 498                case BPF_ALU | BPF_MOV:
 499                        emit_instr(ctx, addiu, dst, MIPS_R_ZERO, insn->imm);
 500                        break;
 501                case BPF_ALU | BPF_ADD:
 502                        emit_instr(ctx, addiu, dst, dst, insn->imm);
 503                        break;
 504                case BPF_ALU | BPF_SUB:
 505                        emit_instr(ctx, addiu, dst, dst, -insn->imm);
 506                        break;
 507                default:
 508                        return -EINVAL;
 509                }
 510        } else {
 511                /* multi insn immediate case */
 512                if (BPF_OP(insn->code) == BPF_MOV) {
 513                        gen_imm_to_reg(insn, dst, ctx);
 514                } else {
 515                        gen_imm_to_reg(insn, MIPS_R_AT, ctx);
 516                        switch (BPF_OP(insn->code) | BPF_CLASS(insn->code)) {
 517                        case BPF_ALU64 | BPF_AND:
 518                        case BPF_ALU | BPF_AND:
 519                                emit_instr(ctx, and, dst, dst, MIPS_R_AT);
 520                                break;
 521                        case BPF_ALU64 | BPF_OR:
 522                        case BPF_ALU | BPF_OR:
 523                                emit_instr(ctx, or, dst, dst, MIPS_R_AT);
 524                                break;
 525                        case BPF_ALU64 | BPF_XOR:
 526                        case BPF_ALU | BPF_XOR:
 527                                emit_instr(ctx, xor, dst, dst, MIPS_R_AT);
 528                                break;
 529                        case BPF_ALU64 | BPF_ADD:
 530                                emit_instr(ctx, daddu, dst, dst, MIPS_R_AT);
 531                                break;
 532                        case BPF_ALU64 | BPF_SUB:
 533                                emit_instr(ctx, dsubu, dst, dst, MIPS_R_AT);
 534                                break;
 535                        case BPF_ALU | BPF_ADD:
 536                                emit_instr(ctx, addu, dst, dst, MIPS_R_AT);
 537                                break;
 538                        case BPF_ALU | BPF_SUB:
 539                                emit_instr(ctx, subu, dst, dst, MIPS_R_AT);
 540                                break;
 541                        default:
 542                                return -EINVAL;
 543                        }
 544                }
 545        }
 546
 547        return 0;
 548}
 549
 550static void * __must_check
 551ool_skb_header_pointer(const struct sk_buff *skb, int offset,
 552                       int len, void *buffer)
 553{
 554        return skb_header_pointer(skb, offset, len, buffer);
 555}
 556
 557static int size_to_len(const struct bpf_insn *insn)
 558{
 559        switch (BPF_SIZE(insn->code)) {
 560        case BPF_B:
 561                return 1;
 562        case BPF_H:
 563                return 2;
 564        case BPF_W:
 565                return 4;
 566        case BPF_DW:
 567                return 8;
 568        }
 569        return 0;
 570}
 571
 572static void emit_const_to_reg(struct jit_ctx *ctx, int dst, u64 value)
 573{
 574        if (value >= 0xffffffffffff8000ull || value < 0x8000ull) {
 575                emit_instr(ctx, daddiu, dst, MIPS_R_ZERO, (int)value);
 576        } else if (value >= 0xffffffff80000000ull ||
 577                   (value < 0x80000000 && value > 0xffff)) {
 578                emit_instr(ctx, lui, dst, (s32)(s16)(value >> 16));
 579                emit_instr(ctx, ori, dst, dst, (unsigned int)(value & 0xffff));
 580        } else {
 581                int i;
 582                bool seen_part = false;
 583                int needed_shift = 0;
 584
 585                for (i = 0; i < 4; i++) {
 586                        u64 part = (value >> (16 * (3 - i))) & 0xffff;
 587
 588                        if (seen_part && needed_shift > 0 && (part || i == 3)) {
 589                                emit_instr(ctx, dsll_safe, dst, dst, needed_shift);
 590                                needed_shift = 0;
 591                        }
 592                        if (part) {
 593                                if (i == 0 || (!seen_part && i < 3 && part < 0x8000)) {
 594                                        emit_instr(ctx, lui, dst, (s32)(s16)part);
 595                                        needed_shift = -16;
 596                                } else {
 597                                        emit_instr(ctx, ori, dst,
 598                                                   seen_part ? dst : MIPS_R_ZERO,
 599                                                   (unsigned int)part);
 600                                }
 601                                seen_part = true;
 602                        }
 603                        if (seen_part)
 604                                needed_shift += 16;
 605                }
 606        }
 607}
 608
 609static int emit_bpf_tail_call(struct jit_ctx *ctx, int this_idx)
 610{
 611        int off, b_off;
 612
 613        ctx->flags |= EBPF_SEEN_TC;
 614        /*
 615         * if (index >= array->map.max_entries)
 616         *     goto out;
 617         */
 618        off = offsetof(struct bpf_array, map.max_entries);
 619        emit_instr(ctx, lwu, MIPS_R_T5, off, MIPS_R_A1);
 620        emit_instr(ctx, sltu, MIPS_R_AT, MIPS_R_T5, MIPS_R_A2);
 621        b_off = b_imm(this_idx + 1, ctx);
 622        emit_instr(ctx, bne, MIPS_R_AT, MIPS_R_ZERO, b_off);
 623        /*
 624         * if (--TCC < 0)
 625         *     goto out;
 626         */
 627        /* Delay slot */
 628        emit_instr(ctx, daddiu, MIPS_R_T5,
 629                   (ctx->flags & EBPF_TCC_IN_V1) ? MIPS_R_V1 : MIPS_R_S4, -1);
 630        b_off = b_imm(this_idx + 1, ctx);
 631        emit_instr(ctx, bltz, MIPS_R_T5, b_off);
 632        /*
 633         * prog = array->ptrs[index];
 634         * if (prog == NULL)
 635         *     goto out;
 636         */
 637        /* Delay slot */
 638        emit_instr(ctx, dsll, MIPS_R_T8, MIPS_R_A2, 3);
 639        emit_instr(ctx, daddu, MIPS_R_T8, MIPS_R_T8, MIPS_R_A1);
 640        off = offsetof(struct bpf_array, ptrs);
 641        emit_instr(ctx, ld, MIPS_R_AT, off, MIPS_R_T8);
 642        b_off = b_imm(this_idx + 1, ctx);
 643        emit_instr(ctx, beq, MIPS_R_AT, MIPS_R_ZERO, b_off);
 644        /* Delay slot */
 645        emit_instr(ctx, nop);
 646
 647        /* goto *(prog->bpf_func + 4); */
 648        off = offsetof(struct bpf_prog, bpf_func);
 649        emit_instr(ctx, ld, MIPS_R_T9, off, MIPS_R_AT);
 650        /* All systems are go... propagate TCC */
 651        emit_instr(ctx, daddu, MIPS_R_V1, MIPS_R_T5, MIPS_R_ZERO);
 652        /* Skip first instruction (TCC initialization) */
 653        emit_instr(ctx, daddiu, MIPS_R_T9, MIPS_R_T9, 4);
 654        return build_int_epilogue(ctx, MIPS_R_T9);
 655}
 656
 657static bool is_bad_offset(int b_off)
 658{
 659        return b_off > 0x1ffff || b_off < -0x20000;
 660}
 661
 662/* Returns the number of insn slots consumed. */
 663static int build_one_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
 664                          int this_idx, int exit_idx)
 665{
 666        int src, dst, r, td, ts, mem_off, b_off;
 667        bool need_swap, did_move, cmp_eq;
 668        unsigned int target = 0;
 669        u64 t64;
 670        s64 t64s;
 671        int bpf_op = BPF_OP(insn->code);
 672
 673        switch (insn->code) {
 674        case BPF_ALU64 | BPF_ADD | BPF_K: /* ALU64_IMM */
 675        case BPF_ALU64 | BPF_SUB | BPF_K: /* ALU64_IMM */
 676        case BPF_ALU64 | BPF_OR | BPF_K: /* ALU64_IMM */
 677        case BPF_ALU64 | BPF_AND | BPF_K: /* ALU64_IMM */
 678        case BPF_ALU64 | BPF_LSH | BPF_K: /* ALU64_IMM */
 679        case BPF_ALU64 | BPF_RSH | BPF_K: /* ALU64_IMM */
 680        case BPF_ALU64 | BPF_XOR | BPF_K: /* ALU64_IMM */
 681        case BPF_ALU64 | BPF_ARSH | BPF_K: /* ALU64_IMM */
 682        case BPF_ALU64 | BPF_MOV | BPF_K: /* ALU64_IMM */
 683        case BPF_ALU | BPF_MOV | BPF_K: /* ALU32_IMM */
 684        case BPF_ALU | BPF_ADD | BPF_K: /* ALU32_IMM */
 685        case BPF_ALU | BPF_SUB | BPF_K: /* ALU32_IMM */
 686        case BPF_ALU | BPF_OR | BPF_K: /* ALU64_IMM */
 687        case BPF_ALU | BPF_AND | BPF_K: /* ALU64_IMM */
 688        case BPF_ALU | BPF_LSH | BPF_K: /* ALU64_IMM */
 689        case BPF_ALU | BPF_RSH | BPF_K: /* ALU64_IMM */
 690        case BPF_ALU | BPF_XOR | BPF_K: /* ALU64_IMM */
 691        case BPF_ALU | BPF_ARSH | BPF_K: /* ALU64_IMM */
 692                r = gen_imm_insn(insn, ctx, this_idx);
 693                if (r < 0)
 694                        return r;
 695                break;
 696        case BPF_ALU64 | BPF_MUL | BPF_K: /* ALU64_IMM */
 697                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
 698                if (dst < 0)
 699                        return dst;
 700                if (get_reg_val_type(ctx, this_idx, insn->dst_reg) == REG_32BIT)
 701                        emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
 702                if (insn->imm == 1) /* Mult by 1 is a nop */
 703                        break;
 704                gen_imm_to_reg(insn, MIPS_R_AT, ctx);
 705                emit_instr(ctx, dmultu, MIPS_R_AT, dst);
 706                emit_instr(ctx, mflo, dst);
 707                break;
 708        case BPF_ALU64 | BPF_NEG | BPF_K: /* ALU64_IMM */
 709                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
 710                if (dst < 0)
 711                        return dst;
 712                if (get_reg_val_type(ctx, this_idx, insn->dst_reg) == REG_32BIT)
 713                        emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
 714                emit_instr(ctx, dsubu, dst, MIPS_R_ZERO, dst);
 715                break;
 716        case BPF_ALU | BPF_MUL | BPF_K: /* ALU_IMM */
 717                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
 718                if (dst < 0)
 719                        return dst;
 720                td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
 721                if (td == REG_64BIT || td == REG_32BIT_ZERO_EX) {
 722                        /* sign extend */
 723                        emit_instr(ctx, sll, dst, dst, 0);
 724                }
 725                if (insn->imm == 1) /* Mult by 1 is a nop */
 726                        break;
 727                gen_imm_to_reg(insn, MIPS_R_AT, ctx);
 728                emit_instr(ctx, multu, dst, MIPS_R_AT);
 729                emit_instr(ctx, mflo, dst);
 730                break;
 731        case BPF_ALU | BPF_NEG | BPF_K: /* ALU_IMM */
 732                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
 733                if (dst < 0)
 734                        return dst;
 735                td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
 736                if (td == REG_64BIT || td == REG_32BIT_ZERO_EX) {
 737                        /* sign extend */
 738                        emit_instr(ctx, sll, dst, dst, 0);
 739                }
 740                emit_instr(ctx, subu, dst, MIPS_R_ZERO, dst);
 741                break;
 742        case BPF_ALU | BPF_DIV | BPF_K: /* ALU_IMM */
 743        case BPF_ALU | BPF_MOD | BPF_K: /* ALU_IMM */
 744                if (insn->imm == 0)
 745                        return -EINVAL;
 746                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
 747                if (dst < 0)
 748                        return dst;
 749                td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
 750                if (td == REG_64BIT || td == REG_32BIT_ZERO_EX)
 751                        /* sign extend */
 752                        emit_instr(ctx, sll, dst, dst, 0);
 753                if (insn->imm == 1) {
 754                        /* div by 1 is a nop, mod by 1 is zero */
 755                        if (bpf_op == BPF_MOD)
 756                                emit_instr(ctx, addu, dst, MIPS_R_ZERO, MIPS_R_ZERO);
 757                        break;
 758                }
 759                gen_imm_to_reg(insn, MIPS_R_AT, ctx);
 760                emit_instr(ctx, divu, dst, MIPS_R_AT);
 761                if (bpf_op == BPF_DIV)
 762                        emit_instr(ctx, mflo, dst);
 763                else
 764                        emit_instr(ctx, mfhi, dst);
 765                break;
 766        case BPF_ALU64 | BPF_DIV | BPF_K: /* ALU_IMM */
 767        case BPF_ALU64 | BPF_MOD | BPF_K: /* ALU_IMM */
 768                if (insn->imm == 0)
 769                        return -EINVAL;
 770                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
 771                if (dst < 0)
 772                        return dst;
 773                if (get_reg_val_type(ctx, this_idx, insn->dst_reg) == REG_32BIT)
 774                        emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
 775                if (insn->imm == 1) {
 776                        /* div by 1 is a nop, mod by 1 is zero */
 777                        if (bpf_op == BPF_MOD)
 778                                emit_instr(ctx, addu, dst, MIPS_R_ZERO, MIPS_R_ZERO);
 779                        break;
 780                }
 781                gen_imm_to_reg(insn, MIPS_R_AT, ctx);
 782                emit_instr(ctx, ddivu, dst, MIPS_R_AT);
 783                if (bpf_op == BPF_DIV)
 784                        emit_instr(ctx, mflo, dst);
 785                else
 786                        emit_instr(ctx, mfhi, dst);
 787                break;
 788        case BPF_ALU64 | BPF_MOV | BPF_X: /* ALU64_REG */
 789        case BPF_ALU64 | BPF_ADD | BPF_X: /* ALU64_REG */
 790        case BPF_ALU64 | BPF_SUB | BPF_X: /* ALU64_REG */
 791        case BPF_ALU64 | BPF_XOR | BPF_X: /* ALU64_REG */
 792        case BPF_ALU64 | BPF_OR | BPF_X: /* ALU64_REG */
 793        case BPF_ALU64 | BPF_AND | BPF_X: /* ALU64_REG */
 794        case BPF_ALU64 | BPF_MUL | BPF_X: /* ALU64_REG */
 795        case BPF_ALU64 | BPF_DIV | BPF_X: /* ALU64_REG */
 796        case BPF_ALU64 | BPF_MOD | BPF_X: /* ALU64_REG */
 797        case BPF_ALU64 | BPF_LSH | BPF_X: /* ALU64_REG */
 798        case BPF_ALU64 | BPF_RSH | BPF_X: /* ALU64_REG */
 799        case BPF_ALU64 | BPF_ARSH | BPF_X: /* ALU64_REG */
 800                src = ebpf_to_mips_reg(ctx, insn, src_reg);
 801                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
 802                if (src < 0 || dst < 0)
 803                        return -EINVAL;
 804                if (get_reg_val_type(ctx, this_idx, insn->dst_reg) == REG_32BIT)
 805                        emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
 806                did_move = false;
 807                if (insn->src_reg == BPF_REG_10) {
 808                        if (bpf_op == BPF_MOV) {
 809                                emit_instr(ctx, daddiu, dst, MIPS_R_SP, MAX_BPF_STACK);
 810                                did_move = true;
 811                        } else {
 812                                emit_instr(ctx, daddiu, MIPS_R_AT, MIPS_R_SP, MAX_BPF_STACK);
 813                                src = MIPS_R_AT;
 814                        }
 815                } else if (get_reg_val_type(ctx, this_idx, insn->src_reg) == REG_32BIT) {
 816                        int tmp_reg = MIPS_R_AT;
 817
 818                        if (bpf_op == BPF_MOV) {
 819                                tmp_reg = dst;
 820                                did_move = true;
 821                        }
 822                        emit_instr(ctx, daddu, tmp_reg, src, MIPS_R_ZERO);
 823                        emit_instr(ctx, dinsu, tmp_reg, MIPS_R_ZERO, 32, 32);
 824                        src = MIPS_R_AT;
 825                }
 826                switch (bpf_op) {
 827                case BPF_MOV:
 828                        if (!did_move)
 829                                emit_instr(ctx, daddu, dst, src, MIPS_R_ZERO);
 830                        break;
 831                case BPF_ADD:
 832                        emit_instr(ctx, daddu, dst, dst, src);
 833                        break;
 834                case BPF_SUB:
 835                        emit_instr(ctx, dsubu, dst, dst, src);
 836                        break;
 837                case BPF_XOR:
 838                        emit_instr(ctx, xor, dst, dst, src);
 839                        break;
 840                case BPF_OR:
 841                        emit_instr(ctx, or, dst, dst, src);
 842                        break;
 843                case BPF_AND:
 844                        emit_instr(ctx, and, dst, dst, src);
 845                        break;
 846                case BPF_MUL:
 847                        emit_instr(ctx, dmultu, dst, src);
 848                        emit_instr(ctx, mflo, dst);
 849                        break;
 850                case BPF_DIV:
 851                case BPF_MOD:
 852                        emit_instr(ctx, ddivu, dst, src);
 853                        if (bpf_op == BPF_DIV)
 854                                emit_instr(ctx, mflo, dst);
 855                        else
 856                                emit_instr(ctx, mfhi, dst);
 857                        break;
 858                case BPF_LSH:
 859                        emit_instr(ctx, dsllv, dst, dst, src);
 860                        break;
 861                case BPF_RSH:
 862                        emit_instr(ctx, dsrlv, dst, dst, src);
 863                        break;
 864                case BPF_ARSH:
 865                        emit_instr(ctx, dsrav, dst, dst, src);
 866                        break;
 867                default:
 868                        pr_err("ALU64_REG NOT HANDLED\n");
 869                        return -EINVAL;
 870                }
 871                break;
 872        case BPF_ALU | BPF_MOV | BPF_X: /* ALU_REG */
 873        case BPF_ALU | BPF_ADD | BPF_X: /* ALU_REG */
 874        case BPF_ALU | BPF_SUB | BPF_X: /* ALU_REG */
 875        case BPF_ALU | BPF_XOR | BPF_X: /* ALU_REG */
 876        case BPF_ALU | BPF_OR | BPF_X: /* ALU_REG */
 877        case BPF_ALU | BPF_AND | BPF_X: /* ALU_REG */
 878        case BPF_ALU | BPF_MUL | BPF_X: /* ALU_REG */
 879        case BPF_ALU | BPF_DIV | BPF_X: /* ALU_REG */
 880        case BPF_ALU | BPF_MOD | BPF_X: /* ALU_REG */
 881        case BPF_ALU | BPF_LSH | BPF_X: /* ALU_REG */
 882        case BPF_ALU | BPF_RSH | BPF_X: /* ALU_REG */
 883                src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp);
 884                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
 885                if (src < 0 || dst < 0)
 886                        return -EINVAL;
 887                td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
 888                if (td == REG_64BIT || td == REG_32BIT_ZERO_EX) {
 889                        /* sign extend */
 890                        emit_instr(ctx, sll, dst, dst, 0);
 891                }
 892                did_move = false;
 893                ts = get_reg_val_type(ctx, this_idx, insn->src_reg);
 894                if (ts == REG_64BIT || ts == REG_32BIT_ZERO_EX) {
 895                        int tmp_reg = MIPS_R_AT;
 896
 897                        if (bpf_op == BPF_MOV) {
 898                                tmp_reg = dst;
 899                                did_move = true;
 900                        }
 901                        /* sign extend */
 902                        emit_instr(ctx, sll, tmp_reg, src, 0);
 903                        src = MIPS_R_AT;
 904                }
 905                switch (bpf_op) {
 906                case BPF_MOV:
 907                        if (!did_move)
 908                                emit_instr(ctx, addu, dst, src, MIPS_R_ZERO);
 909                        break;
 910                case BPF_ADD:
 911                        emit_instr(ctx, addu, dst, dst, src);
 912                        break;
 913                case BPF_SUB:
 914                        emit_instr(ctx, subu, dst, dst, src);
 915                        break;
 916                case BPF_XOR:
 917                        emit_instr(ctx, xor, dst, dst, src);
 918                        break;
 919                case BPF_OR:
 920                        emit_instr(ctx, or, dst, dst, src);
 921                        break;
 922                case BPF_AND:
 923                        emit_instr(ctx, and, dst, dst, src);
 924                        break;
 925                case BPF_MUL:
 926                        emit_instr(ctx, mul, dst, dst, src);
 927                        break;
 928                case BPF_DIV:
 929                case BPF_MOD:
 930                        emit_instr(ctx, divu, dst, src);
 931                        if (bpf_op == BPF_DIV)
 932                                emit_instr(ctx, mflo, dst);
 933                        else
 934                                emit_instr(ctx, mfhi, dst);
 935                        break;
 936                case BPF_LSH:
 937                        emit_instr(ctx, sllv, dst, dst, src);
 938                        break;
 939                case BPF_RSH:
 940                        emit_instr(ctx, srlv, dst, dst, src);
 941                        break;
 942                default:
 943                        pr_err("ALU_REG NOT HANDLED\n");
 944                        return -EINVAL;
 945                }
 946                break;
 947        case BPF_JMP | BPF_EXIT:
 948                if (this_idx + 1 < exit_idx) {
 949                        b_off = b_imm(exit_idx, ctx);
 950                        if (is_bad_offset(b_off))
 951                                return -E2BIG;
 952                        emit_instr(ctx, beq, MIPS_R_ZERO, MIPS_R_ZERO, b_off);
 953                        emit_instr(ctx, nop);
 954                }
 955                break;
 956        case BPF_JMP | BPF_JEQ | BPF_K: /* JMP_IMM */
 957        case BPF_JMP | BPF_JNE | BPF_K: /* JMP_IMM */
 958                cmp_eq = (bpf_op == BPF_JEQ);
 959                dst = ebpf_to_mips_reg(ctx, insn, dst_reg_fp_ok);
 960                if (dst < 0)
 961                        return dst;
 962                if (insn->imm == 0) {
 963                        src = MIPS_R_ZERO;
 964                } else {
 965                        gen_imm_to_reg(insn, MIPS_R_AT, ctx);
 966                        src = MIPS_R_AT;
 967                }
 968                goto jeq_common;
 969        case BPF_JMP | BPF_JEQ | BPF_X: /* JMP_REG */
 970        case BPF_JMP | BPF_JNE | BPF_X:
 971        case BPF_JMP | BPF_JSLT | BPF_X:
 972        case BPF_JMP | BPF_JSLE | BPF_X:
 973        case BPF_JMP | BPF_JSGT | BPF_X:
 974        case BPF_JMP | BPF_JSGE | BPF_X:
 975        case BPF_JMP | BPF_JLT | BPF_X:
 976        case BPF_JMP | BPF_JLE | BPF_X:
 977        case BPF_JMP | BPF_JGT | BPF_X:
 978        case BPF_JMP | BPF_JGE | BPF_X:
 979        case BPF_JMP | BPF_JSET | BPF_X:
 980                src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp);
 981                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
 982                if (src < 0 || dst < 0)
 983                        return -EINVAL;
 984                td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
 985                ts = get_reg_val_type(ctx, this_idx, insn->src_reg);
 986                if (td == REG_32BIT && ts != REG_32BIT) {
 987                        emit_instr(ctx, sll, MIPS_R_AT, src, 0);
 988                        src = MIPS_R_AT;
 989                } else if (ts == REG_32BIT && td != REG_32BIT) {
 990                        emit_instr(ctx, sll, MIPS_R_AT, dst, 0);
 991                        dst = MIPS_R_AT;
 992                }
 993                if (bpf_op == BPF_JSET) {
 994                        emit_instr(ctx, and, MIPS_R_AT, dst, src);
 995                        cmp_eq = false;
 996                        dst = MIPS_R_AT;
 997                        src = MIPS_R_ZERO;
 998                } else if (bpf_op == BPF_JSGT || bpf_op == BPF_JSLE) {
 999                        emit_instr(ctx, dsubu, MIPS_R_AT, dst, src);
1000                        if ((insn + 1)->code == (BPF_JMP | BPF_EXIT) && insn->off == 1) {
1001                                b_off = b_imm(exit_idx, ctx);
1002                                if (is_bad_offset(b_off))
1003                                        return -E2BIG;
1004                                if (bpf_op == BPF_JSGT)
1005                                        emit_instr(ctx, blez, MIPS_R_AT, b_off);
1006                                else
1007                                        emit_instr(ctx, bgtz, MIPS_R_AT, b_off);
1008                                emit_instr(ctx, nop);
1009                                return 2; /* We consumed the exit. */
1010                        }
1011                        b_off = b_imm(this_idx + insn->off + 1, ctx);
1012                        if (is_bad_offset(b_off))
1013                                return -E2BIG;
1014                        if (bpf_op == BPF_JSGT)
1015                                emit_instr(ctx, bgtz, MIPS_R_AT, b_off);
1016                        else
1017                                emit_instr(ctx, blez, MIPS_R_AT, b_off);
1018                        emit_instr(ctx, nop);
1019                        break;
1020                } else if (bpf_op == BPF_JSGE || bpf_op == BPF_JSLT) {
1021                        emit_instr(ctx, slt, MIPS_R_AT, dst, src);
1022                        cmp_eq = bpf_op == BPF_JSGE;
1023                        dst = MIPS_R_AT;
1024                        src = MIPS_R_ZERO;
1025                } else if (bpf_op == BPF_JGT || bpf_op == BPF_JLE) {
1026                        /* dst or src could be AT */
1027                        emit_instr(ctx, dsubu, MIPS_R_T8, dst, src);
1028                        emit_instr(ctx, sltu, MIPS_R_AT, dst, src);
1029                        /* SP known to be non-zero, movz becomes boolean not */
1030                        emit_instr(ctx, movz, MIPS_R_T9, MIPS_R_SP, MIPS_R_T8);
1031                        emit_instr(ctx, movn, MIPS_R_T9, MIPS_R_ZERO, MIPS_R_T8);
1032                        emit_instr(ctx, or, MIPS_R_AT, MIPS_R_T9, MIPS_R_AT);
1033                        cmp_eq = bpf_op == BPF_JGT;
1034                        dst = MIPS_R_AT;
1035                        src = MIPS_R_ZERO;
1036                } else if (bpf_op == BPF_JGE || bpf_op == BPF_JLT) {
1037                        emit_instr(ctx, sltu, MIPS_R_AT, dst, src);
1038                        cmp_eq = bpf_op == BPF_JGE;
1039                        dst = MIPS_R_AT;
1040                        src = MIPS_R_ZERO;
1041                } else { /* JNE/JEQ case */
1042                        cmp_eq = (bpf_op == BPF_JEQ);
1043                }
1044jeq_common:
1045                /*
1046                 * If the next insn is EXIT and we are jumping arround
1047                 * only it, invert the sense of the compare and
1048                 * conditionally jump to the exit.  Poor man's branch
1049                 * chaining.
1050                 */
1051                if ((insn + 1)->code == (BPF_JMP | BPF_EXIT) && insn->off == 1) {
1052                        b_off = b_imm(exit_idx, ctx);
1053                        if (is_bad_offset(b_off)) {
1054                                target = j_target(ctx, exit_idx);
1055                                if (target == (unsigned int)-1)
1056                                        return -E2BIG;
1057                                cmp_eq = !cmp_eq;
1058                                b_off = 4 * 3;
1059                                if (!(ctx->offsets[this_idx] & OFFSETS_B_CONV)) {
1060                                        ctx->offsets[this_idx] |= OFFSETS_B_CONV;
1061                                        ctx->long_b_conversion = 1;
1062                                }
1063                        }
1064
1065                        if (cmp_eq)
1066                                emit_instr(ctx, bne, dst, src, b_off);
1067                        else
1068                                emit_instr(ctx, beq, dst, src, b_off);
1069                        emit_instr(ctx, nop);
1070                        if (ctx->offsets[this_idx] & OFFSETS_B_CONV) {
1071                                emit_instr(ctx, j, target);
1072                                emit_instr(ctx, nop);
1073                        }
1074                        return 2; /* We consumed the exit. */
1075                }
1076                b_off = b_imm(this_idx + insn->off + 1, ctx);
1077                if (is_bad_offset(b_off)) {
1078                        target = j_target(ctx, this_idx + insn->off + 1);
1079                        if (target == (unsigned int)-1)
1080                                return -E2BIG;
1081                        cmp_eq = !cmp_eq;
1082                        b_off = 4 * 3;
1083                        if (!(ctx->offsets[this_idx] & OFFSETS_B_CONV)) {
1084                                ctx->offsets[this_idx] |= OFFSETS_B_CONV;
1085                                ctx->long_b_conversion = 1;
1086                        }
1087                }
1088
1089                if (cmp_eq)
1090                        emit_instr(ctx, beq, dst, src, b_off);
1091                else
1092                        emit_instr(ctx, bne, dst, src, b_off);
1093                emit_instr(ctx, nop);
1094                if (ctx->offsets[this_idx] & OFFSETS_B_CONV) {
1095                        emit_instr(ctx, j, target);
1096                        emit_instr(ctx, nop);
1097                }
1098                break;
1099        case BPF_JMP | BPF_JSGT | BPF_K: /* JMP_IMM */
1100        case BPF_JMP | BPF_JSGE | BPF_K: /* JMP_IMM */
1101        case BPF_JMP | BPF_JSLT | BPF_K: /* JMP_IMM */
1102        case BPF_JMP | BPF_JSLE | BPF_K: /* JMP_IMM */
1103                cmp_eq = (bpf_op == BPF_JSGE);
1104                dst = ebpf_to_mips_reg(ctx, insn, dst_reg_fp_ok);
1105                if (dst < 0)
1106                        return dst;
1107
1108                if (insn->imm == 0) {
1109                        if ((insn + 1)->code == (BPF_JMP | BPF_EXIT) && insn->off == 1) {
1110                                b_off = b_imm(exit_idx, ctx);
1111                                if (is_bad_offset(b_off))
1112                                        return -E2BIG;
1113                                switch (bpf_op) {
1114                                case BPF_JSGT:
1115                                        emit_instr(ctx, blez, dst, b_off);
1116                                        break;
1117                                case BPF_JSGE:
1118                                        emit_instr(ctx, bltz, dst, b_off);
1119                                        break;
1120                                case BPF_JSLT:
1121                                        emit_instr(ctx, bgez, dst, b_off);
1122                                        break;
1123                                case BPF_JSLE:
1124                                        emit_instr(ctx, bgtz, dst, b_off);
1125                                        break;
1126                                }
1127                                emit_instr(ctx, nop);
1128                                return 2; /* We consumed the exit. */
1129                        }
1130                        b_off = b_imm(this_idx + insn->off + 1, ctx);
1131                        if (is_bad_offset(b_off))
1132                                return -E2BIG;
1133                        switch (bpf_op) {
1134                        case BPF_JSGT:
1135                                emit_instr(ctx, bgtz, dst, b_off);
1136                                break;
1137                        case BPF_JSGE:
1138                                emit_instr(ctx, bgez, dst, b_off);
1139                                break;
1140                        case BPF_JSLT:
1141                                emit_instr(ctx, bltz, dst, b_off);
1142                                break;
1143                        case BPF_JSLE:
1144                                emit_instr(ctx, blez, dst, b_off);
1145                                break;
1146                        }
1147                        emit_instr(ctx, nop);
1148                        break;
1149                }
1150                /*
1151                 * only "LT" compare available, so we must use imm + 1
1152                 * to generate "GT" and imm -1 to generate LE
1153                 */
1154                if (bpf_op == BPF_JSGT)
1155                        t64s = insn->imm + 1;
1156                else if (bpf_op == BPF_JSLE)
1157                        t64s = insn->imm + 1;
1158                else
1159                        t64s = insn->imm;
1160
1161                cmp_eq = bpf_op == BPF_JSGT || bpf_op == BPF_JSGE;
1162                if (t64s >= S16_MIN && t64s <= S16_MAX) {
1163                        emit_instr(ctx, slti, MIPS_R_AT, dst, (int)t64s);
1164                        src = MIPS_R_AT;
1165                        dst = MIPS_R_ZERO;
1166                        goto jeq_common;
1167                }
1168                emit_const_to_reg(ctx, MIPS_R_AT, (u64)t64s);
1169                emit_instr(ctx, slt, MIPS_R_AT, dst, MIPS_R_AT);
1170                src = MIPS_R_AT;
1171                dst = MIPS_R_ZERO;
1172                goto jeq_common;
1173
1174        case BPF_JMP | BPF_JGT | BPF_K:
1175        case BPF_JMP | BPF_JGE | BPF_K:
1176        case BPF_JMP | BPF_JLT | BPF_K:
1177        case BPF_JMP | BPF_JLE | BPF_K:
1178                cmp_eq = (bpf_op == BPF_JGE);
1179                dst = ebpf_to_mips_reg(ctx, insn, dst_reg_fp_ok);
1180                if (dst < 0)
1181                        return dst;
1182                /*
1183                 * only "LT" compare available, so we must use imm + 1
1184                 * to generate "GT" and imm -1 to generate LE
1185                 */
1186                if (bpf_op == BPF_JGT)
1187                        t64s = (u64)(u32)(insn->imm) + 1;
1188                else if (bpf_op == BPF_JLE)
1189                        t64s = (u64)(u32)(insn->imm) + 1;
1190                else
1191                        t64s = (u64)(u32)(insn->imm);
1192
1193                cmp_eq = bpf_op == BPF_JGT || bpf_op == BPF_JGE;
1194
1195                emit_const_to_reg(ctx, MIPS_R_AT, (u64)t64s);
1196                emit_instr(ctx, sltu, MIPS_R_AT, dst, MIPS_R_AT);
1197                src = MIPS_R_AT;
1198                dst = MIPS_R_ZERO;
1199                goto jeq_common;
1200
1201        case BPF_JMP | BPF_JSET | BPF_K: /* JMP_IMM */
1202                dst = ebpf_to_mips_reg(ctx, insn, dst_reg_fp_ok);
1203                if (dst < 0)
1204                        return dst;
1205
1206                if (ctx->use_bbit_insns && hweight32((u32)insn->imm) == 1) {
1207                        if ((insn + 1)->code == (BPF_JMP | BPF_EXIT) && insn->off == 1) {
1208                                b_off = b_imm(exit_idx, ctx);
1209                                if (is_bad_offset(b_off))
1210                                        return -E2BIG;
1211                                emit_instr(ctx, bbit0, dst, ffs((u32)insn->imm) - 1, b_off);
1212                                emit_instr(ctx, nop);
1213                                return 2; /* We consumed the exit. */
1214                        }
1215                        b_off = b_imm(this_idx + insn->off + 1, ctx);
1216                        if (is_bad_offset(b_off))
1217                                return -E2BIG;
1218                        emit_instr(ctx, bbit1, dst, ffs((u32)insn->imm) - 1, b_off);
1219                        emit_instr(ctx, nop);
1220                        break;
1221                }
1222                t64 = (u32)insn->imm;
1223                emit_const_to_reg(ctx, MIPS_R_AT, t64);
1224                emit_instr(ctx, and, MIPS_R_AT, dst, MIPS_R_AT);
1225                src = MIPS_R_AT;
1226                dst = MIPS_R_ZERO;
1227                cmp_eq = false;
1228                goto jeq_common;
1229
1230        case BPF_JMP | BPF_JA:
1231                /*
1232                 * Prefer relative branch for easier debugging, but
1233                 * fall back if needed.
1234                 */
1235                b_off = b_imm(this_idx + insn->off + 1, ctx);
1236                if (is_bad_offset(b_off)) {
1237                        target = j_target(ctx, this_idx + insn->off + 1);
1238                        if (target == (unsigned int)-1)
1239                                return -E2BIG;
1240                        emit_instr(ctx, j, target);
1241                } else {
1242                        emit_instr(ctx, b, b_off);
1243                }
1244                emit_instr(ctx, nop);
1245                break;
1246        case BPF_LD | BPF_DW | BPF_IMM:
1247                if (insn->src_reg != 0)
1248                        return -EINVAL;
1249                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
1250                if (dst < 0)
1251                        return dst;
1252                t64 = ((u64)(u32)insn->imm) | ((u64)(insn + 1)->imm << 32);
1253                emit_const_to_reg(ctx, dst, t64);
1254                return 2; /* Double slot insn */
1255
1256        case BPF_JMP | BPF_CALL:
1257                ctx->flags |= EBPF_SAVE_RA;
1258                t64s = (s64)insn->imm + (s64)__bpf_call_base;
1259                emit_const_to_reg(ctx, MIPS_R_T9, (u64)t64s);
1260                emit_instr(ctx, jalr, MIPS_R_RA, MIPS_R_T9);
1261                /* delay slot */
1262                emit_instr(ctx, nop);
1263                break;
1264
1265        case BPF_JMP | BPF_TAIL_CALL:
1266                if (emit_bpf_tail_call(ctx, this_idx))
1267                        return -EINVAL;
1268                break;
1269
1270        case BPF_LD | BPF_B | BPF_ABS:
1271        case BPF_LD | BPF_H | BPF_ABS:
1272        case BPF_LD | BPF_W | BPF_ABS:
1273        case BPF_LD | BPF_DW | BPF_ABS:
1274                ctx->flags |= EBPF_SAVE_RA;
1275
1276                gen_imm_to_reg(insn, MIPS_R_A1, ctx);
1277                emit_instr(ctx, addiu, MIPS_R_A2, MIPS_R_ZERO, size_to_len(insn));
1278
1279                if (insn->imm < 0) {
1280                        emit_const_to_reg(ctx, MIPS_R_T9, (u64)bpf_internal_load_pointer_neg_helper);
1281                } else {
1282                        emit_const_to_reg(ctx, MIPS_R_T9, (u64)ool_skb_header_pointer);
1283                        emit_instr(ctx, daddiu, MIPS_R_A3, MIPS_R_SP, ctx->tmp_offset);
1284                }
1285                goto ld_skb_common;
1286
1287        case BPF_LD | BPF_B | BPF_IND:
1288        case BPF_LD | BPF_H | BPF_IND:
1289        case BPF_LD | BPF_W | BPF_IND:
1290        case BPF_LD | BPF_DW | BPF_IND:
1291                ctx->flags |= EBPF_SAVE_RA;
1292                src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp);
1293                if (src < 0)
1294                        return src;
1295                ts = get_reg_val_type(ctx, this_idx, insn->src_reg);
1296                if (ts == REG_32BIT_ZERO_EX) {
1297                        /* sign extend */
1298                        emit_instr(ctx, sll, MIPS_R_A1, src, 0);
1299                        src = MIPS_R_A1;
1300                }
1301                if (insn->imm >= S16_MIN && insn->imm <= S16_MAX) {
1302                        emit_instr(ctx, daddiu, MIPS_R_A1, src, insn->imm);
1303                } else {
1304                        gen_imm_to_reg(insn, MIPS_R_AT, ctx);
1305                        emit_instr(ctx, daddu, MIPS_R_A1, MIPS_R_AT, src);
1306                }
1307                /* truncate to 32-bit int */
1308                emit_instr(ctx, sll, MIPS_R_A1, MIPS_R_A1, 0);
1309                emit_instr(ctx, daddiu, MIPS_R_A3, MIPS_R_SP, ctx->tmp_offset);
1310                emit_instr(ctx, slt, MIPS_R_AT, MIPS_R_A1, MIPS_R_ZERO);
1311
1312                emit_const_to_reg(ctx, MIPS_R_T8, (u64)bpf_internal_load_pointer_neg_helper);
1313                emit_const_to_reg(ctx, MIPS_R_T9, (u64)ool_skb_header_pointer);
1314                emit_instr(ctx, addiu, MIPS_R_A2, MIPS_R_ZERO, size_to_len(insn));
1315                emit_instr(ctx, movn, MIPS_R_T9, MIPS_R_T8, MIPS_R_AT);
1316
1317ld_skb_common:
1318                emit_instr(ctx, jalr, MIPS_R_RA, MIPS_R_T9);
1319                /* delay slot move */
1320                emit_instr(ctx, daddu, MIPS_R_A0, MIPS_R_S0, MIPS_R_ZERO);
1321
1322                /* Check the error value */
1323                b_off = b_imm(exit_idx, ctx);
1324                if (is_bad_offset(b_off)) {
1325                        target = j_target(ctx, exit_idx);
1326                        if (target == (unsigned int)-1)
1327                                return -E2BIG;
1328
1329                        if (!(ctx->offsets[this_idx] & OFFSETS_B_CONV)) {
1330                                ctx->offsets[this_idx] |= OFFSETS_B_CONV;
1331                                ctx->long_b_conversion = 1;
1332                        }
1333                        emit_instr(ctx, bne, MIPS_R_V0, MIPS_R_ZERO, 4 * 3);
1334                        emit_instr(ctx, nop);
1335                        emit_instr(ctx, j, target);
1336                        emit_instr(ctx, nop);
1337                } else {
1338                        emit_instr(ctx, beq, MIPS_R_V0, MIPS_R_ZERO, b_off);
1339                        emit_instr(ctx, nop);
1340                }
1341
1342#ifdef __BIG_ENDIAN
1343                need_swap = false;
1344#else
1345                need_swap = true;
1346#endif
1347                dst = MIPS_R_V0;
1348                switch (BPF_SIZE(insn->code)) {
1349                case BPF_B:
1350                        emit_instr(ctx, lbu, dst, 0, MIPS_R_V0);
1351                        break;
1352                case BPF_H:
1353                        emit_instr(ctx, lhu, dst, 0, MIPS_R_V0);
1354                        if (need_swap)
1355                                emit_instr(ctx, wsbh, dst, dst);
1356                        break;
1357                case BPF_W:
1358                        emit_instr(ctx, lw, dst, 0, MIPS_R_V0);
1359                        if (need_swap) {
1360                                emit_instr(ctx, wsbh, dst, dst);
1361                                emit_instr(ctx, rotr, dst, dst, 16);
1362                        }
1363                        break;
1364                case BPF_DW:
1365                        emit_instr(ctx, ld, dst, 0, MIPS_R_V0);
1366                        if (need_swap) {
1367                                emit_instr(ctx, dsbh, dst, dst);
1368                                emit_instr(ctx, dshd, dst, dst);
1369                        }
1370                        break;
1371                }
1372
1373                break;
1374        case BPF_ALU | BPF_END | BPF_FROM_BE:
1375        case BPF_ALU | BPF_END | BPF_FROM_LE:
1376                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
1377                if (dst < 0)
1378                        return dst;
1379                td = get_reg_val_type(ctx, this_idx, insn->dst_reg);
1380                if (insn->imm == 64 && td == REG_32BIT)
1381                        emit_instr(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
1382
1383                if (insn->imm != 64 &&
1384                    (td == REG_64BIT || td == REG_32BIT_ZERO_EX)) {
1385                        /* sign extend */
1386                        emit_instr(ctx, sll, dst, dst, 0);
1387                }
1388
1389#ifdef __BIG_ENDIAN
1390                need_swap = (BPF_SRC(insn->code) == BPF_FROM_LE);
1391#else
1392                need_swap = (BPF_SRC(insn->code) == BPF_FROM_BE);
1393#endif
1394                if (insn->imm == 16) {
1395                        if (need_swap)
1396                                emit_instr(ctx, wsbh, dst, dst);
1397                        emit_instr(ctx, andi, dst, dst, 0xffff);
1398                } else if (insn->imm == 32) {
1399                        if (need_swap) {
1400                                emit_instr(ctx, wsbh, dst, dst);
1401                                emit_instr(ctx, rotr, dst, dst, 16);
1402                        }
1403                } else { /* 64-bit*/
1404                        if (need_swap) {
1405                                emit_instr(ctx, dsbh, dst, dst);
1406                                emit_instr(ctx, dshd, dst, dst);
1407                        }
1408                }
1409                break;
1410
1411        case BPF_ST | BPF_B | BPF_MEM:
1412        case BPF_ST | BPF_H | BPF_MEM:
1413        case BPF_ST | BPF_W | BPF_MEM:
1414        case BPF_ST | BPF_DW | BPF_MEM:
1415                if (insn->dst_reg == BPF_REG_10) {
1416                        ctx->flags |= EBPF_SEEN_FP;
1417                        dst = MIPS_R_SP;
1418                        mem_off = insn->off + MAX_BPF_STACK;
1419                } else {
1420                        dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
1421                        if (dst < 0)
1422                                return dst;
1423                        mem_off = insn->off;
1424                }
1425                gen_imm_to_reg(insn, MIPS_R_AT, ctx);
1426                switch (BPF_SIZE(insn->code)) {
1427                case BPF_B:
1428                        emit_instr(ctx, sb, MIPS_R_AT, mem_off, dst);
1429                        break;
1430                case BPF_H:
1431                        emit_instr(ctx, sh, MIPS_R_AT, mem_off, dst);
1432                        break;
1433                case BPF_W:
1434                        emit_instr(ctx, sw, MIPS_R_AT, mem_off, dst);
1435                        break;
1436                case BPF_DW:
1437                        emit_instr(ctx, sd, MIPS_R_AT, mem_off, dst);
1438                        break;
1439                }
1440                break;
1441
1442        case BPF_LDX | BPF_B | BPF_MEM:
1443        case BPF_LDX | BPF_H | BPF_MEM:
1444        case BPF_LDX | BPF_W | BPF_MEM:
1445        case BPF_LDX | BPF_DW | BPF_MEM:
1446                if (insn->src_reg == BPF_REG_10) {
1447                        ctx->flags |= EBPF_SEEN_FP;
1448                        src = MIPS_R_SP;
1449                        mem_off = insn->off + MAX_BPF_STACK;
1450                } else {
1451                        src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp);
1452                        if (src < 0)
1453                                return src;
1454                        mem_off = insn->off;
1455                }
1456                dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
1457                if (dst < 0)
1458                        return dst;
1459                switch (BPF_SIZE(insn->code)) {
1460                case BPF_B:
1461                        emit_instr(ctx, lbu, dst, mem_off, src);
1462                        break;
1463                case BPF_H:
1464                        emit_instr(ctx, lhu, dst, mem_off, src);
1465                        break;
1466                case BPF_W:
1467                        emit_instr(ctx, lw, dst, mem_off, src);
1468                        break;
1469                case BPF_DW:
1470                        emit_instr(ctx, ld, dst, mem_off, src);
1471                        break;
1472                }
1473                break;
1474
1475        case BPF_STX | BPF_B | BPF_MEM:
1476        case BPF_STX | BPF_H | BPF_MEM:
1477        case BPF_STX | BPF_W | BPF_MEM:
1478        case BPF_STX | BPF_DW | BPF_MEM:
1479        case BPF_STX | BPF_W | BPF_XADD:
1480        case BPF_STX | BPF_DW | BPF_XADD:
1481                if (insn->dst_reg == BPF_REG_10) {
1482                        ctx->flags |= EBPF_SEEN_FP;
1483                        dst = MIPS_R_SP;
1484                        mem_off = insn->off + MAX_BPF_STACK;
1485                } else {
1486                        dst = ebpf_to_mips_reg(ctx, insn, dst_reg);
1487                        if (dst < 0)
1488                                return dst;
1489                        mem_off = insn->off;
1490                }
1491                src = ebpf_to_mips_reg(ctx, insn, src_reg_no_fp);
1492                if (src < 0)
1493                        return src;
1494                if (BPF_MODE(insn->code) == BPF_XADD) {
1495                        switch (BPF_SIZE(insn->code)) {
1496                        case BPF_W:
1497                                if (get_reg_val_type(ctx, this_idx, insn->src_reg) == REG_32BIT) {
1498                                        emit_instr(ctx, sll, MIPS_R_AT, src, 0);
1499                                        src = MIPS_R_AT;
1500                                }
1501                                emit_instr(ctx, ll, MIPS_R_T8, mem_off, dst);
1502                                emit_instr(ctx, addu, MIPS_R_T8, MIPS_R_T8, src);
1503                                emit_instr(ctx, sc, MIPS_R_T8, mem_off, dst);
1504                                /*
1505                                 * On failure back up to LL (-4
1506                                 * instructions of 4 bytes each
1507                                 */
1508                                emit_instr(ctx, beq, MIPS_R_T8, MIPS_R_ZERO, -4 * 4);
1509                                emit_instr(ctx, nop);
1510                                break;
1511                        case BPF_DW:
1512                                if (get_reg_val_type(ctx, this_idx, insn->src_reg) == REG_32BIT) {
1513                                        emit_instr(ctx, daddu, MIPS_R_AT, src, MIPS_R_ZERO);
1514                                        emit_instr(ctx, dinsu, MIPS_R_AT, MIPS_R_ZERO, 32, 32);
1515                                        src = MIPS_R_AT;
1516                                }
1517                                emit_instr(ctx, lld, MIPS_R_T8, mem_off, dst);
1518                                emit_instr(ctx, daddu, MIPS_R_T8, MIPS_R_T8, src);
1519                                emit_instr(ctx, scd, MIPS_R_T8, mem_off, dst);
1520                                emit_instr(ctx, beq, MIPS_R_T8, MIPS_R_ZERO, -4 * 4);
1521                                emit_instr(ctx, nop);
1522                                break;
1523                        }
1524                } else { /* BPF_MEM */
1525                        switch (BPF_SIZE(insn->code)) {
1526                        case BPF_B:
1527                                emit_instr(ctx, sb, src, mem_off, dst);
1528                                break;
1529                        case BPF_H:
1530                                emit_instr(ctx, sh, src, mem_off, dst);
1531                                break;
1532                        case BPF_W:
1533                                emit_instr(ctx, sw, src, mem_off, dst);
1534                                break;
1535                        case BPF_DW:
1536                                if (get_reg_val_type(ctx, this_idx, insn->src_reg) == REG_32BIT) {
1537                                        emit_instr(ctx, daddu, MIPS_R_AT, src, MIPS_R_ZERO);
1538                                        emit_instr(ctx, dinsu, MIPS_R_AT, MIPS_R_ZERO, 32, 32);
1539                                        src = MIPS_R_AT;
1540                                }
1541                                emit_instr(ctx, sd, src, mem_off, dst);
1542                                break;
1543                        }
1544                }
1545                break;
1546
1547        default:
1548                pr_err("NOT HANDLED %d - (%02x)\n",
1549                       this_idx, (unsigned int)insn->code);
1550                return -EINVAL;
1551        }
1552        return 1;
1553}
1554
1555#define RVT_VISITED_MASK 0xc000000000000000ull
1556#define RVT_FALL_THROUGH 0x4000000000000000ull
1557#define RVT_BRANCH_TAKEN 0x8000000000000000ull
1558#define RVT_DONE (RVT_FALL_THROUGH | RVT_BRANCH_TAKEN)
1559
1560static int build_int_body(struct jit_ctx *ctx)
1561{
1562        const struct bpf_prog *prog = ctx->skf;
1563        const struct bpf_insn *insn;
1564        int i, r;
1565
1566        for (i = 0; i < prog->len; ) {
1567                insn = prog->insnsi + i;
1568                if ((ctx->reg_val_types[i] & RVT_VISITED_MASK) == 0) {
1569                        /* dead instruction, don't emit it. */
1570                        i++;
1571                        continue;
1572                }
1573
1574                if (ctx->target == NULL)
1575                        ctx->offsets[i] = (ctx->offsets[i] & OFFSETS_B_CONV) | (ctx->idx * 4);
1576
1577                r = build_one_insn(insn, ctx, i, prog->len);
1578                if (r < 0)
1579                        return r;
1580                i += r;
1581        }
1582        /* epilogue offset */
1583        if (ctx->target == NULL)
1584                ctx->offsets[i] = ctx->idx * 4;
1585
1586        /*
1587         * All exits have an offset of the epilogue, some offsets may
1588         * not have been set due to banch-around threading, so set
1589         * them now.
1590         */
1591        if (ctx->target == NULL)
1592                for (i = 0; i < prog->len; i++) {
1593                        insn = prog->insnsi + i;
1594                        if (insn->code == (BPF_JMP | BPF_EXIT))
1595                                ctx->offsets[i] = ctx->idx * 4;
1596                }
1597        return 0;
1598}
1599
1600/* return the last idx processed, or negative for error */
1601static int reg_val_propagate_range(struct jit_ctx *ctx, u64 initial_rvt,
1602                                   int start_idx, bool follow_taken)
1603{
1604        const struct bpf_prog *prog = ctx->skf;
1605        const struct bpf_insn *insn;
1606        u64 exit_rvt = initial_rvt;
1607        u64 *rvt = ctx->reg_val_types;
1608        int idx;
1609        int reg;
1610
1611        for (idx = start_idx; idx < prog->len; idx++) {
1612                rvt[idx] = (rvt[idx] & RVT_VISITED_MASK) | exit_rvt;
1613                insn = prog->insnsi + idx;
1614                switch (BPF_CLASS(insn->code)) {
1615                case BPF_ALU:
1616                        switch (BPF_OP(insn->code)) {
1617                        case BPF_ADD:
1618                        case BPF_SUB:
1619                        case BPF_MUL:
1620                        case BPF_DIV:
1621                        case BPF_OR:
1622                        case BPF_AND:
1623                        case BPF_LSH:
1624                        case BPF_RSH:
1625                        case BPF_NEG:
1626                        case BPF_MOD:
1627                        case BPF_XOR:
1628                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1629                                break;
1630                        case BPF_MOV:
1631                                if (BPF_SRC(insn->code)) {
1632                                        set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1633                                } else {
1634                                        /* IMM to REG move*/
1635                                        if (insn->imm >= 0)
1636                                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1637                                        else
1638                                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1639                                }
1640                                break;
1641                        case BPF_END:
1642                                if (insn->imm == 64)
1643                                        set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1644                                else if (insn->imm == 32)
1645                                        set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1646                                else /* insn->imm == 16 */
1647                                        set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1648                                break;
1649                        }
1650                        rvt[idx] |= RVT_DONE;
1651                        break;
1652                case BPF_ALU64:
1653                        switch (BPF_OP(insn->code)) {
1654                        case BPF_MOV:
1655                                if (BPF_SRC(insn->code)) {
1656                                        /* REG to REG move*/
1657                                        set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1658                                } else {
1659                                        /* IMM to REG move*/
1660                                        if (insn->imm >= 0)
1661                                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1662                                        else
1663                                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT_32BIT);
1664                                }
1665                                break;
1666                        default:
1667                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1668                        }
1669                        rvt[idx] |= RVT_DONE;
1670                        break;
1671                case BPF_LD:
1672                        switch (BPF_SIZE(insn->code)) {
1673                        case BPF_DW:
1674                                if (BPF_MODE(insn->code) == BPF_IMM) {
1675                                        s64 val;
1676
1677                                        val = (s64)((u32)insn->imm | ((u64)(insn + 1)->imm << 32));
1678                                        if (val > 0 && val <= S32_MAX)
1679                                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1680                                        else if (val >= S32_MIN && val <= S32_MAX)
1681                                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT_32BIT);
1682                                        else
1683                                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1684                                        rvt[idx] |= RVT_DONE;
1685                                        idx++;
1686                                } else {
1687                                        set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1688                                }
1689                                break;
1690                        case BPF_B:
1691                        case BPF_H:
1692                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1693                                break;
1694                        case BPF_W:
1695                                if (BPF_MODE(insn->code) == BPF_IMM)
1696                                        set_reg_val_type(&exit_rvt, insn->dst_reg,
1697                                                         insn->imm >= 0 ? REG_32BIT_POS : REG_32BIT);
1698                                else
1699                                        set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1700                                break;
1701                        }
1702                        rvt[idx] |= RVT_DONE;
1703                        break;
1704                case BPF_LDX:
1705                        switch (BPF_SIZE(insn->code)) {
1706                        case BPF_DW:
1707                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_64BIT);
1708                                break;
1709                        case BPF_B:
1710                        case BPF_H:
1711                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT_POS);
1712                                break;
1713                        case BPF_W:
1714                                set_reg_val_type(&exit_rvt, insn->dst_reg, REG_32BIT);
1715                                break;
1716                        }
1717                        rvt[idx] |= RVT_DONE;
1718                        break;
1719                case BPF_JMP:
1720                        switch (BPF_OP(insn->code)) {
1721                        case BPF_EXIT:
1722                                rvt[idx] = RVT_DONE | exit_rvt;
1723                                rvt[prog->len] = exit_rvt;
1724                                return idx;
1725                        case BPF_JA:
1726                                rvt[idx] |= RVT_DONE;
1727                                idx += insn->off;
1728                                break;
1729                        case BPF_JEQ:
1730                        case BPF_JGT:
1731                        case BPF_JGE:
1732                        case BPF_JLT:
1733                        case BPF_JLE:
1734                        case BPF_JSET:
1735                        case BPF_JNE:
1736                        case BPF_JSGT:
1737                        case BPF_JSGE:
1738                        case BPF_JSLT:
1739                        case BPF_JSLE:
1740                                if (follow_taken) {
1741                                        rvt[idx] |= RVT_BRANCH_TAKEN;
1742                                        idx += insn->off;
1743                                        follow_taken = false;
1744                                } else {
1745                                        rvt[idx] |= RVT_FALL_THROUGH;
1746                                }
1747                                break;
1748                        case BPF_CALL:
1749                                set_reg_val_type(&exit_rvt, BPF_REG_0, REG_64BIT);
1750                                /* Upon call return, argument registers are clobbered. */
1751                                for (reg = BPF_REG_0; reg <= BPF_REG_5; reg++)
1752                                        set_reg_val_type(&exit_rvt, reg, REG_64BIT);
1753
1754                                rvt[idx] |= RVT_DONE;
1755                                break;
1756                        default:
1757                                WARN(1, "Unhandled BPF_JMP case.\n");
1758                                rvt[idx] |= RVT_DONE;
1759                                break;
1760                        }
1761                        break;
1762                default:
1763                        rvt[idx] |= RVT_DONE;
1764                        break;
1765                }
1766        }
1767        return idx;
1768}
1769
1770/*
1771 * Track the value range (i.e. 32-bit vs. 64-bit) of each register at
1772 * each eBPF insn.  This allows unneeded sign and zero extension
1773 * operations to be omitted.
1774 *
1775 * Doesn't handle yet confluence of control paths with conflicting
1776 * ranges, but it is good enough for most sane code.
1777 */
1778static int reg_val_propagate(struct jit_ctx *ctx)
1779{
1780        const struct bpf_prog *prog = ctx->skf;
1781        u64 exit_rvt;
1782        int reg;
1783        int i;
1784
1785        /*
1786         * 11 registers * 3 bits/reg leaves top bits free for other
1787         * uses.  Bit-62..63 used to see if we have visited an insn.
1788         */
1789        exit_rvt = 0;
1790
1791        /* Upon entry, argument registers are 64-bit. */
1792        for (reg = BPF_REG_1; reg <= BPF_REG_5; reg++)
1793                set_reg_val_type(&exit_rvt, reg, REG_64BIT);
1794
1795        /*
1796         * First follow all conditional branches on the fall-through
1797         * edge of control flow..
1798         */
1799        reg_val_propagate_range(ctx, exit_rvt, 0, false);
1800restart_search:
1801        /*
1802         * Then repeatedly find the first conditional branch where
1803         * both edges of control flow have not been taken, and follow
1804         * the branch taken edge.  We will end up restarting the
1805         * search once per conditional branch insn.
1806         */
1807        for (i = 0; i < prog->len; i++) {
1808                u64 rvt = ctx->reg_val_types[i];
1809
1810                if ((rvt & RVT_VISITED_MASK) == RVT_DONE ||
1811                    (rvt & RVT_VISITED_MASK) == 0)
1812                        continue;
1813                if ((rvt & RVT_VISITED_MASK) == RVT_FALL_THROUGH) {
1814                        reg_val_propagate_range(ctx, rvt & ~RVT_VISITED_MASK, i, true);
1815                } else { /* RVT_BRANCH_TAKEN */
1816                        WARN(1, "Unexpected RVT_BRANCH_TAKEN case.\n");
1817                        reg_val_propagate_range(ctx, rvt & ~RVT_VISITED_MASK, i, false);
1818                }
1819                goto restart_search;
1820        }
1821        /*
1822         * Eventually all conditional branches have been followed on
1823         * both branches and we are done.  Any insn that has not been
1824         * visited at this point is dead.
1825         */
1826
1827        return 0;
1828}
1829
1830static void jit_fill_hole(void *area, unsigned int size)
1831{
1832        u32 *p;
1833
1834        /* We are guaranteed to have aligned memory. */
1835        for (p = area; size >= sizeof(u32); size -= sizeof(u32))
1836                uasm_i_break(&p, BRK_BUG); /* Increments p */
1837}
1838
1839struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
1840{
1841        struct bpf_prog *orig_prog = prog;
1842        bool tmp_blinded = false;
1843        struct bpf_prog *tmp;
1844        struct bpf_binary_header *header = NULL;
1845        struct jit_ctx ctx;
1846        unsigned int image_size;
1847        u8 *image_ptr;
1848
1849        if (!prog->jit_requested || !cpu_has_mips64r2)
1850                return prog;
1851
1852        tmp = bpf_jit_blind_constants(prog);
1853        /* If blinding was requested and we failed during blinding,
1854         * we must fall back to the interpreter.
1855         */
1856        if (IS_ERR(tmp))
1857                return orig_prog;
1858        if (tmp != prog) {
1859                tmp_blinded = true;
1860                prog = tmp;
1861        }
1862
1863        memset(&ctx, 0, sizeof(ctx));
1864
1865        preempt_disable();
1866        switch (current_cpu_type()) {
1867        case CPU_CAVIUM_OCTEON:
1868        case CPU_CAVIUM_OCTEON_PLUS:
1869        case CPU_CAVIUM_OCTEON2:
1870        case CPU_CAVIUM_OCTEON3:
1871                ctx.use_bbit_insns = 1;
1872                break;
1873        default:
1874                ctx.use_bbit_insns = 0;
1875        }
1876        preempt_enable();
1877
1878        ctx.offsets = kcalloc(prog->len + 1, sizeof(*ctx.offsets), GFP_KERNEL);
1879        if (ctx.offsets == NULL)
1880                goto out_err;
1881
1882        ctx.reg_val_types = kcalloc(prog->len + 1, sizeof(*ctx.reg_val_types), GFP_KERNEL);
1883        if (ctx.reg_val_types == NULL)
1884                goto out_err;
1885
1886        ctx.skf = prog;
1887
1888        if (reg_val_propagate(&ctx))
1889                goto out_err;
1890
1891        /*
1892         * First pass discovers used resources and instruction offsets
1893         * assuming short branches are used.
1894         */
1895        if (build_int_body(&ctx))
1896                goto out_err;
1897
1898        /*
1899         * If no calls are made (EBPF_SAVE_RA), then tail call count
1900         * in $v1, else we must save in n$s4.
1901         */
1902        if (ctx.flags & EBPF_SEEN_TC) {
1903                if (ctx.flags & EBPF_SAVE_RA)
1904                        ctx.flags |= EBPF_SAVE_S4;
1905                else
1906                        ctx.flags |= EBPF_TCC_IN_V1;
1907        }
1908
1909        /*
1910         * Second pass generates offsets, if any branches are out of
1911         * range a jump-around long sequence is generated, and we have
1912         * to try again from the beginning to generate the new
1913         * offsets.  This is done until no additional conversions are
1914         * necessary.
1915         */
1916        do {
1917                ctx.idx = 0;
1918                ctx.gen_b_offsets = 1;
1919                ctx.long_b_conversion = 0;
1920                if (gen_int_prologue(&ctx))
1921                        goto out_err;
1922                if (build_int_body(&ctx))
1923                        goto out_err;
1924                if (build_int_epilogue(&ctx, MIPS_R_RA))
1925                        goto out_err;
1926        } while (ctx.long_b_conversion);
1927
1928        image_size = 4 * ctx.idx;
1929
1930        header = bpf_jit_binary_alloc(image_size, &image_ptr,
1931                                      sizeof(u32), jit_fill_hole);
1932        if (header == NULL)
1933                goto out_err;
1934
1935        ctx.target = (u32 *)image_ptr;
1936
1937        /* Third pass generates the code */
1938        ctx.idx = 0;
1939        if (gen_int_prologue(&ctx))
1940                goto out_err;
1941        if (build_int_body(&ctx))
1942                goto out_err;
1943        if (build_int_epilogue(&ctx, MIPS_R_RA))
1944                goto out_err;
1945
1946        /* Update the icache */
1947        flush_icache_range((unsigned long)ctx.target,
1948                           (unsigned long)(ctx.target + ctx.idx * sizeof(u32)));
1949
1950        if (bpf_jit_enable > 1)
1951                /* Dump JIT code */
1952                bpf_jit_dump(prog->len, image_size, 2, ctx.target);
1953
1954        bpf_jit_binary_lock_ro(header);
1955        prog->bpf_func = (void *)ctx.target;
1956        prog->jited = 1;
1957        prog->jited_len = image_size;
1958out_normal:
1959        if (tmp_blinded)
1960                bpf_jit_prog_release_other(prog, prog == orig_prog ?
1961                                           tmp : orig_prog);
1962        kfree(ctx.offsets);
1963        kfree(ctx.reg_val_types);
1964
1965        return prog;
1966
1967out_err:
1968        prog = orig_prog;
1969        if (header)
1970                bpf_jit_binary_free(header);
1971        goto out_normal;
1972}
1973