1 // SPDX-License-Identifier: GPL-2.0 2 /* BPF JIT compiler for RV64G 3 * 4 * Copyright(c) 2019 Björn Töpel <bjorn.topel@gmail.com> 5 * 6 */ 7 8 #include <linux/bpf.h> 9 #include <linux/filter.h> 10 #include "bpf_jit.h" 11 12 #define RV_REG_TCC RV_REG_A6 13 #define RV_REG_TCC_SAVED RV_REG_S6 /* Store A6 in S6 if program do calls */ 14 15 static const int regmap[] = { 16 [BPF_REG_0] = RV_REG_A5, 17 [BPF_REG_1] = RV_REG_A0, 18 [BPF_REG_2] = RV_REG_A1, 19 [BPF_REG_3] = RV_REG_A2, 20 [BPF_REG_4] = RV_REG_A3, 21 [BPF_REG_5] = RV_REG_A4, 22 [BPF_REG_6] = RV_REG_S1, 23 [BPF_REG_7] = RV_REG_S2, 24 [BPF_REG_8] = RV_REG_S3, 25 [BPF_REG_9] = RV_REG_S4, 26 [BPF_REG_FP] = RV_REG_S5, 27 [BPF_REG_AX] = RV_REG_T0, 28 }; 29 30 enum { 31 RV_CTX_F_SEEN_TAIL_CALL = 0, 32 RV_CTX_F_SEEN_CALL = RV_REG_RA, 33 RV_CTX_F_SEEN_S1 = RV_REG_S1, 34 RV_CTX_F_SEEN_S2 = RV_REG_S2, 35 RV_CTX_F_SEEN_S3 = RV_REG_S3, 36 RV_CTX_F_SEEN_S4 = RV_REG_S4, 37 RV_CTX_F_SEEN_S5 = RV_REG_S5, 38 RV_CTX_F_SEEN_S6 = RV_REG_S6, 39 }; 40 41 static u8 bpf_to_rv_reg(int bpf_reg, struct rv_jit_context *ctx) 42 { 43 u8 reg = regmap[bpf_reg]; 44 45 switch (reg) { 46 case RV_CTX_F_SEEN_S1: 47 case RV_CTX_F_SEEN_S2: 48 case RV_CTX_F_SEEN_S3: 49 case RV_CTX_F_SEEN_S4: 50 case RV_CTX_F_SEEN_S5: 51 case RV_CTX_F_SEEN_S6: 52 __set_bit(reg, &ctx->flags); 53 } 54 return reg; 55 }; 56 57 static bool seen_reg(int reg, struct rv_jit_context *ctx) 58 { 59 switch (reg) { 60 case RV_CTX_F_SEEN_CALL: 61 case RV_CTX_F_SEEN_S1: 62 case RV_CTX_F_SEEN_S2: 63 case RV_CTX_F_SEEN_S3: 64 case RV_CTX_F_SEEN_S4: 65 case RV_CTX_F_SEEN_S5: 66 case RV_CTX_F_SEEN_S6: 67 return test_bit(reg, &ctx->flags); 68 } 69 return false; 70 } 71 72 static void mark_fp(struct rv_jit_context *ctx) 73 { 74 __set_bit(RV_CTX_F_SEEN_S5, &ctx->flags); 75 } 76 77 static void mark_call(struct rv_jit_context *ctx) 78 { 79 __set_bit(RV_CTX_F_SEEN_CALL, &ctx->flags); 80 } 81 82 static bool seen_call(struct rv_jit_context *ctx) 83 { 84 return test_bit(RV_CTX_F_SEEN_CALL, &ctx->flags); 85 } 86 87 static void mark_tail_call(struct rv_jit_context *ctx) 88 { 89 __set_bit(RV_CTX_F_SEEN_TAIL_CALL, &ctx->flags); 90 } 91 92 static bool seen_tail_call(struct rv_jit_context *ctx) 93 { 94 return test_bit(RV_CTX_F_SEEN_TAIL_CALL, &ctx->flags); 95 } 96 97 static u8 rv_tail_call_reg(struct rv_jit_context *ctx) 98 { 99 mark_tail_call(ctx); 100 101 if (seen_call(ctx)) { 102 __set_bit(RV_CTX_F_SEEN_S6, &ctx->flags); 103 return RV_REG_S6; 104 } 105 return RV_REG_A6; 106 } 107 108 static bool is_32b_int(s64 val) 109 { 110 return -(1L << 31) <= val && val < (1L << 31); 111 } 112 113 static bool in_auipc_jalr_range(s64 val) 114 { 115 /* 116 * auipc+jalr can reach any signed PC-relative offset in the range 117 * [-2^31 - 2^11, 2^31 - 2^11). 118 */ 119 return (-(1L << 31) - (1L << 11)) <= val && 120 val < ((1L << 31) - (1L << 11)); 121 } 122 123 static void emit_imm(u8 rd, s64 val, struct rv_jit_context *ctx) 124 { 125 /* Note that the immediate from the add is sign-extended, 126 * which means that we need to compensate this by adding 2^12, 127 * when the 12th bit is set. A simpler way of doing this, and 128 * getting rid of the check, is to just add 2**11 before the 129 * shift. The "Loading a 32-Bit constant" example from the 130 * "Computer Organization and Design, RISC-V edition" book by 131 * Patterson/Hennessy highlights this fact. 132 * 133 * This also means that we need to process LSB to MSB. 134 */ 135 s64 upper = (val + (1 << 11)) >> 12; 136 /* Sign-extend lower 12 bits to 64 bits since immediates for li, addiw, 137 * and addi are signed and RVC checks will perform signed comparisons. 138 */ 139 s64 lower = ((val & 0xfff) << 52) >> 52; 140 int shift; 141 142 if (is_32b_int(val)) { 143 if (upper) 144 emit_lui(rd, upper, ctx); 145 146 if (!upper) { 147 emit_li(rd, lower, ctx); 148 return; 149 } 150 151 emit_addiw(rd, rd, lower, ctx); 152 return; 153 } 154 155 shift = __ffs(upper); 156 upper >>= shift; 157 shift += 12; 158 159 emit_imm(rd, upper, ctx); 160 161 emit_slli(rd, rd, shift, ctx); 162 if (lower) 163 emit_addi(rd, rd, lower, ctx); 164 } 165 166 static void __build_epilogue(bool is_tail_call, struct rv_jit_context *ctx) 167 { 168 int stack_adjust = ctx->stack_size, store_offset = stack_adjust - 8; 169 170 if (seen_reg(RV_REG_RA, ctx)) { 171 emit_ld(RV_REG_RA, store_offset, RV_REG_SP, ctx); 172 store_offset -= 8; 173 } 174 emit_ld(RV_REG_FP, store_offset, RV_REG_SP, ctx); 175 store_offset -= 8; 176 if (seen_reg(RV_REG_S1, ctx)) { 177 emit_ld(RV_REG_S1, store_offset, RV_REG_SP, ctx); 178 store_offset -= 8; 179 } 180 if (seen_reg(RV_REG_S2, ctx)) { 181 emit_ld(RV_REG_S2, store_offset, RV_REG_SP, ctx); 182 store_offset -= 8; 183 } 184 if (seen_reg(RV_REG_S3, ctx)) { 185 emit_ld(RV_REG_S3, store_offset, RV_REG_SP, ctx); 186 store_offset -= 8; 187 } 188 if (seen_reg(RV_REG_S4, ctx)) { 189 emit_ld(RV_REG_S4, store_offset, RV_REG_SP, ctx); 190 store_offset -= 8; 191 } 192 if (seen_reg(RV_REG_S5, ctx)) { 193 emit_ld(RV_REG_S5, store_offset, RV_REG_SP, ctx); 194 store_offset -= 8; 195 } 196 if (seen_reg(RV_REG_S6, ctx)) { 197 emit_ld(RV_REG_S6, store_offset, RV_REG_SP, ctx); 198 store_offset -= 8; 199 } 200 201 emit_addi(RV_REG_SP, RV_REG_SP, stack_adjust, ctx); 202 /* Set return value. */ 203 if (!is_tail_call) 204 emit_mv(RV_REG_A0, RV_REG_A5, ctx); 205 emit_jalr(RV_REG_ZERO, is_tail_call ? RV_REG_T3 : RV_REG_RA, 206 is_tail_call ? 4 : 0, /* skip TCC init */ 207 ctx); 208 } 209 210 static void emit_bcc(u8 cond, u8 rd, u8 rs, int rvoff, 211 struct rv_jit_context *ctx) 212 { 213 switch (cond) { 214 case BPF_JEQ: 215 emit(rv_beq(rd, rs, rvoff >> 1), ctx); 216 return; 217 case BPF_JGT: 218 emit(rv_bltu(rs, rd, rvoff >> 1), ctx); 219 return; 220 case BPF_JLT: 221 emit(rv_bltu(rd, rs, rvoff >> 1), ctx); 222 return; 223 case BPF_JGE: 224 emit(rv_bgeu(rd, rs, rvoff >> 1), ctx); 225 return; 226 case BPF_JLE: 227 emit(rv_bgeu(rs, rd, rvoff >> 1), ctx); 228 return; 229 case BPF_JNE: 230 emit(rv_bne(rd, rs, rvoff >> 1), ctx); 231 return; 232 case BPF_JSGT: 233 emit(rv_blt(rs, rd, rvoff >> 1), ctx); 234 return; 235 case BPF_JSLT: 236 emit(rv_blt(rd, rs, rvoff >> 1), ctx); 237 return; 238 case BPF_JSGE: 239 emit(rv_bge(rd, rs, rvoff >> 1), ctx); 240 return; 241 case BPF_JSLE: 242 emit(rv_bge(rs, rd, rvoff >> 1), ctx); 243 } 244 } 245 246 static void emit_branch(u8 cond, u8 rd, u8 rs, int rvoff, 247 struct rv_jit_context *ctx) 248 { 249 s64 upper, lower; 250 251 if (is_13b_int(rvoff)) { 252 emit_bcc(cond, rd, rs, rvoff, ctx); 253 return; 254 } 255 256 /* Adjust for jal */ 257 rvoff -= 4; 258 259 /* Transform, e.g.: 260 * bne rd,rs,foo 261 * to 262 * beq rd,rs,<.L1> 263 * (auipc foo) 264 * jal(r) foo 265 * .L1 266 */ 267 cond = invert_bpf_cond(cond); 268 if (is_21b_int(rvoff)) { 269 emit_bcc(cond, rd, rs, 8, ctx); 270 emit(rv_jal(RV_REG_ZERO, rvoff >> 1), ctx); 271 return; 272 } 273 274 /* 32b No need for an additional rvoff adjustment, since we 275 * get that from the auipc at PC', where PC = PC' + 4. 276 */ 277 upper = (rvoff + (1 << 11)) >> 12; 278 lower = rvoff & 0xfff; 279 280 emit_bcc(cond, rd, rs, 12, ctx); 281 emit(rv_auipc(RV_REG_T1, upper), ctx); 282 emit(rv_jalr(RV_REG_ZERO, RV_REG_T1, lower), ctx); 283 } 284 285 static void emit_zext_32(u8 reg, struct rv_jit_context *ctx) 286 { 287 emit_slli(reg, reg, 32, ctx); 288 emit_srli(reg, reg, 32, ctx); 289 } 290 291 static int emit_bpf_tail_call(int insn, struct rv_jit_context *ctx) 292 { 293 int tc_ninsn, off, start_insn = ctx->ninsns; 294 u8 tcc = rv_tail_call_reg(ctx); 295 296 /* a0: &ctx 297 * a1: &array 298 * a2: index 299 * 300 * if (index >= array->map.max_entries) 301 * goto out; 302 */ 303 tc_ninsn = insn ? ctx->offset[insn] - ctx->offset[insn - 1] : 304 ctx->offset[0]; 305 emit_zext_32(RV_REG_A2, ctx); 306 307 off = offsetof(struct bpf_array, map.max_entries); 308 if (is_12b_check(off, insn)) 309 return -1; 310 emit(rv_lwu(RV_REG_T1, off, RV_REG_A1), ctx); 311 off = ninsns_rvoff(tc_ninsn - (ctx->ninsns - start_insn)); 312 emit_branch(BPF_JGE, RV_REG_A2, RV_REG_T1, off, ctx); 313 314 /* if (TCC-- < 0) 315 * goto out; 316 */ 317 emit_addi(RV_REG_T1, tcc, -1, ctx); 318 off = ninsns_rvoff(tc_ninsn - (ctx->ninsns - start_insn)); 319 emit_branch(BPF_JSLT, tcc, RV_REG_ZERO, off, ctx); 320 321 /* prog = array->ptrs[index]; 322 * if (!prog) 323 * goto out; 324 */ 325 emit_slli(RV_REG_T2, RV_REG_A2, 3, ctx); 326 emit_add(RV_REG_T2, RV_REG_T2, RV_REG_A1, ctx); 327 off = offsetof(struct bpf_array, ptrs); 328 if (is_12b_check(off, insn)) 329 return -1; 330 emit_ld(RV_REG_T2, off, RV_REG_T2, ctx); 331 off = ninsns_rvoff(tc_ninsn - (ctx->ninsns - start_insn)); 332 emit_branch(BPF_JEQ, RV_REG_T2, RV_REG_ZERO, off, ctx); 333 334 /* goto *(prog->bpf_func + 4); */ 335 off = offsetof(struct bpf_prog, bpf_func); 336 if (is_12b_check(off, insn)) 337 return -1; 338 emit_ld(RV_REG_T3, off, RV_REG_T2, ctx); 339 emit_mv(RV_REG_TCC, RV_REG_T1, ctx); 340 __build_epilogue(true, ctx); 341 return 0; 342 } 343 344 static void init_regs(u8 *rd, u8 *rs, const struct bpf_insn *insn, 345 struct rv_jit_context *ctx) 346 { 347 u8 code = insn->code; 348 349 switch (code) { 350 case BPF_JMP | BPF_JA: 351 case BPF_JMP | BPF_CALL: 352 case BPF_JMP | BPF_EXIT: 353 case BPF_JMP | BPF_TAIL_CALL: 354 break; 355 default: 356 *rd = bpf_to_rv_reg(insn->dst_reg, ctx); 357 } 358 359 if (code & (BPF_ALU | BPF_X) || code & (BPF_ALU64 | BPF_X) || 360 code & (BPF_JMP | BPF_X) || code & (BPF_JMP32 | BPF_X) || 361 code & BPF_LDX || code & BPF_STX) 362 *rs = bpf_to_rv_reg(insn->src_reg, ctx); 363 } 364 365 static void emit_zext_32_rd_rs(u8 *rd, u8 *rs, struct rv_jit_context *ctx) 366 { 367 emit_mv(RV_REG_T2, *rd, ctx); 368 emit_zext_32(RV_REG_T2, ctx); 369 emit_mv(RV_REG_T1, *rs, ctx); 370 emit_zext_32(RV_REG_T1, ctx); 371 *rd = RV_REG_T2; 372 *rs = RV_REG_T1; 373 } 374 375 static void emit_sext_32_rd_rs(u8 *rd, u8 *rs, struct rv_jit_context *ctx) 376 { 377 emit_addiw(RV_REG_T2, *rd, 0, ctx); 378 emit_addiw(RV_REG_T1, *rs, 0, ctx); 379 *rd = RV_REG_T2; 380 *rs = RV_REG_T1; 381 } 382 383 static void emit_zext_32_rd_t1(u8 *rd, struct rv_jit_context *ctx) 384 { 385 emit_mv(RV_REG_T2, *rd, ctx); 386 emit_zext_32(RV_REG_T2, ctx); 387 emit_zext_32(RV_REG_T1, ctx); 388 *rd = RV_REG_T2; 389 } 390 391 static void emit_sext_32_rd(u8 *rd, struct rv_jit_context *ctx) 392 { 393 emit_addiw(RV_REG_T2, *rd, 0, ctx); 394 *rd = RV_REG_T2; 395 } 396 397 static int emit_jump_and_link(u8 rd, s64 rvoff, bool force_jalr, 398 struct rv_jit_context *ctx) 399 { 400 s64 upper, lower; 401 402 if (rvoff && is_21b_int(rvoff) && !force_jalr) { 403 emit(rv_jal(rd, rvoff >> 1), ctx); 404 return 0; 405 } else if (in_auipc_jalr_range(rvoff)) { 406 upper = (rvoff + (1 << 11)) >> 12; 407 lower = rvoff & 0xfff; 408 emit(rv_auipc(RV_REG_T1, upper), ctx); 409 emit(rv_jalr(rd, RV_REG_T1, lower), ctx); 410 return 0; 411 } 412 413 pr_err("bpf-jit: target offset 0x%llx is out of range\n", rvoff); 414 return -ERANGE; 415 } 416 417 static bool is_signed_bpf_cond(u8 cond) 418 { 419 return cond == BPF_JSGT || cond == BPF_JSLT || 420 cond == BPF_JSGE || cond == BPF_JSLE; 421 } 422 423 static int emit_call(bool fixed, u64 addr, struct rv_jit_context *ctx) 424 { 425 s64 off = 0; 426 u64 ip; 427 u8 rd; 428 int ret; 429 430 if (addr && ctx->insns) { 431 ip = (u64)(long)(ctx->insns + ctx->ninsns); 432 off = addr - ip; 433 } 434 435 ret = emit_jump_and_link(RV_REG_RA, off, !fixed, ctx); 436 if (ret) 437 return ret; 438 rd = bpf_to_rv_reg(BPF_REG_0, ctx); 439 emit_mv(rd, RV_REG_A0, ctx); 440 return 0; 441 } 442 443 int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx, 444 bool extra_pass) 445 { 446 bool is64 = BPF_CLASS(insn->code) == BPF_ALU64 || 447 BPF_CLASS(insn->code) == BPF_JMP; 448 int s, e, rvoff, ret, i = insn - ctx->prog->insnsi; 449 struct bpf_prog_aux *aux = ctx->prog->aux; 450 u8 rd = -1, rs = -1, code = insn->code; 451 s16 off = insn->off; 452 s32 imm = insn->imm; 453 454 init_regs(&rd, &rs, insn, ctx); 455 456 switch (code) { 457 /* dst = src */ 458 case BPF_ALU | BPF_MOV | BPF_X: 459 case BPF_ALU64 | BPF_MOV | BPF_X: 460 if (imm == 1) { 461 /* Special mov32 for zext */ 462 emit_zext_32(rd, ctx); 463 break; 464 } 465 emit_mv(rd, rs, ctx); 466 if (!is64 && !aux->verifier_zext) 467 emit_zext_32(rd, ctx); 468 break; 469 470 /* dst = dst OP src */ 471 case BPF_ALU | BPF_ADD | BPF_X: 472 case BPF_ALU64 | BPF_ADD | BPF_X: 473 emit_add(rd, rd, rs, ctx); 474 if (!is64 && !aux->verifier_zext) 475 emit_zext_32(rd, ctx); 476 break; 477 case BPF_ALU | BPF_SUB | BPF_X: 478 case BPF_ALU64 | BPF_SUB | BPF_X: 479 if (is64) 480 emit_sub(rd, rd, rs, ctx); 481 else 482 emit_subw(rd, rd, rs, ctx); 483 484 if (!is64 && !aux->verifier_zext) 485 emit_zext_32(rd, ctx); 486 break; 487 case BPF_ALU | BPF_AND | BPF_X: 488 case BPF_ALU64 | BPF_AND | BPF_X: 489 emit_and(rd, rd, rs, ctx); 490 if (!is64 && !aux->verifier_zext) 491 emit_zext_32(rd, ctx); 492 break; 493 case BPF_ALU | BPF_OR | BPF_X: 494 case BPF_ALU64 | BPF_OR | BPF_X: 495 emit_or(rd, rd, rs, ctx); 496 if (!is64 && !aux->verifier_zext) 497 emit_zext_32(rd, ctx); 498 break; 499 case BPF_ALU | BPF_XOR | BPF_X: 500 case BPF_ALU64 | BPF_XOR | BPF_X: 501 emit_xor(rd, rd, rs, ctx); 502 if (!is64 && !aux->verifier_zext) 503 emit_zext_32(rd, ctx); 504 break; 505 case BPF_ALU | BPF_MUL | BPF_X: 506 case BPF_ALU64 | BPF_MUL | BPF_X: 507 emit(is64 ? rv_mul(rd, rd, rs) : rv_mulw(rd, rd, rs), ctx); 508 if (!is64 && !aux->verifier_zext) 509 emit_zext_32(rd, ctx); 510 break; 511 case BPF_ALU | BPF_DIV | BPF_X: 512 case BPF_ALU64 | BPF_DIV | BPF_X: 513 emit(is64 ? rv_divu(rd, rd, rs) : rv_divuw(rd, rd, rs), ctx); 514 if (!is64 && !aux->verifier_zext) 515 emit_zext_32(rd, ctx); 516 break; 517 case BPF_ALU | BPF_MOD | BPF_X: 518 case BPF_ALU64 | BPF_MOD | BPF_X: 519 emit(is64 ? rv_remu(rd, rd, rs) : rv_remuw(rd, rd, rs), ctx); 520 if (!is64 && !aux->verifier_zext) 521 emit_zext_32(rd, ctx); 522 break; 523 case BPF_ALU | BPF_LSH | BPF_X: 524 case BPF_ALU64 | BPF_LSH | BPF_X: 525 emit(is64 ? rv_sll(rd, rd, rs) : rv_sllw(rd, rd, rs), ctx); 526 if (!is64 && !aux->verifier_zext) 527 emit_zext_32(rd, ctx); 528 break; 529 case BPF_ALU | BPF_RSH | BPF_X: 530 case BPF_ALU64 | BPF_RSH | BPF_X: 531 emit(is64 ? rv_srl(rd, rd, rs) : rv_srlw(rd, rd, rs), ctx); 532 if (!is64 && !aux->verifier_zext) 533 emit_zext_32(rd, ctx); 534 break; 535 case BPF_ALU | BPF_ARSH | BPF_X: 536 case BPF_ALU64 | BPF_ARSH | BPF_X: 537 emit(is64 ? rv_sra(rd, rd, rs) : rv_sraw(rd, rd, rs), ctx); 538 if (!is64 && !aux->verifier_zext) 539 emit_zext_32(rd, ctx); 540 break; 541 542 /* dst = -dst */ 543 case BPF_ALU | BPF_NEG: 544 case BPF_ALU64 | BPF_NEG: 545 emit_sub(rd, RV_REG_ZERO, rd, ctx); 546 if (!is64 && !aux->verifier_zext) 547 emit_zext_32(rd, ctx); 548 break; 549 550 /* dst = BSWAP##imm(dst) */ 551 case BPF_ALU | BPF_END | BPF_FROM_LE: 552 switch (imm) { 553 case 16: 554 emit_slli(rd, rd, 48, ctx); 555 emit_srli(rd, rd, 48, ctx); 556 break; 557 case 32: 558 if (!aux->verifier_zext) 559 emit_zext_32(rd, ctx); 560 break; 561 case 64: 562 /* Do nothing */ 563 break; 564 } 565 break; 566 567 case BPF_ALU | BPF_END | BPF_FROM_BE: 568 emit_li(RV_REG_T2, 0, ctx); 569 570 emit_andi(RV_REG_T1, rd, 0xff, ctx); 571 emit_add(RV_REG_T2, RV_REG_T2, RV_REG_T1, ctx); 572 emit_slli(RV_REG_T2, RV_REG_T2, 8, ctx); 573 emit_srli(rd, rd, 8, ctx); 574 if (imm == 16) 575 goto out_be; 576 577 emit_andi(RV_REG_T1, rd, 0xff, ctx); 578 emit_add(RV_REG_T2, RV_REG_T2, RV_REG_T1, ctx); 579 emit_slli(RV_REG_T2, RV_REG_T2, 8, ctx); 580 emit_srli(rd, rd, 8, ctx); 581 582 emit_andi(RV_REG_T1, rd, 0xff, ctx); 583 emit_add(RV_REG_T2, RV_REG_T2, RV_REG_T1, ctx); 584 emit_slli(RV_REG_T2, RV_REG_T2, 8, ctx); 585 emit_srli(rd, rd, 8, ctx); 586 if (imm == 32) 587 goto out_be; 588 589 emit_andi(RV_REG_T1, rd, 0xff, ctx); 590 emit_add(RV_REG_T2, RV_REG_T2, RV_REG_T1, ctx); 591 emit_slli(RV_REG_T2, RV_REG_T2, 8, ctx); 592 emit_srli(rd, rd, 8, ctx); 593 594 emit_andi(RV_REG_T1, rd, 0xff, ctx); 595 emit_add(RV_REG_T2, RV_REG_T2, RV_REG_T1, ctx); 596 emit_slli(RV_REG_T2, RV_REG_T2, 8, ctx); 597 emit_srli(rd, rd, 8, ctx); 598 599 emit_andi(RV_REG_T1, rd, 0xff, ctx); 600 emit_add(RV_REG_T2, RV_REG_T2, RV_REG_T1, ctx); 601 emit_slli(RV_REG_T2, RV_REG_T2, 8, ctx); 602 emit_srli(rd, rd, 8, ctx); 603 604 emit_andi(RV_REG_T1, rd, 0xff, ctx); 605 emit_add(RV_REG_T2, RV_REG_T2, RV_REG_T1, ctx); 606 emit_slli(RV_REG_T2, RV_REG_T2, 8, ctx); 607 emit_srli(rd, rd, 8, ctx); 608 out_be: 609 emit_andi(RV_REG_T1, rd, 0xff, ctx); 610 emit_add(RV_REG_T2, RV_REG_T2, RV_REG_T1, ctx); 611 612 emit_mv(rd, RV_REG_T2, ctx); 613 break; 614 615 /* dst = imm */ 616 case BPF_ALU | BPF_MOV | BPF_K: 617 case BPF_ALU64 | BPF_MOV | BPF_K: 618 emit_imm(rd, imm, ctx); 619 if (!is64 && !aux->verifier_zext) 620 emit_zext_32(rd, ctx); 621 break; 622 623 /* dst = dst OP imm */ 624 case BPF_ALU | BPF_ADD | BPF_K: 625 case BPF_ALU64 | BPF_ADD | BPF_K: 626 if (is_12b_int(imm)) { 627 emit_addi(rd, rd, imm, ctx); 628 } else { 629 emit_imm(RV_REG_T1, imm, ctx); 630 emit_add(rd, rd, RV_REG_T1, ctx); 631 } 632 if (!is64 && !aux->verifier_zext) 633 emit_zext_32(rd, ctx); 634 break; 635 case BPF_ALU | BPF_SUB | BPF_K: 636 case BPF_ALU64 | BPF_SUB | BPF_K: 637 if (is_12b_int(-imm)) { 638 emit_addi(rd, rd, -imm, ctx); 639 } else { 640 emit_imm(RV_REG_T1, imm, ctx); 641 emit_sub(rd, rd, RV_REG_T1, ctx); 642 } 643 if (!is64 && !aux->verifier_zext) 644 emit_zext_32(rd, ctx); 645 break; 646 case BPF_ALU | BPF_AND | BPF_K: 647 case BPF_ALU64 | BPF_AND | BPF_K: 648 if (is_12b_int(imm)) { 649 emit_andi(rd, rd, imm, ctx); 650 } else { 651 emit_imm(RV_REG_T1, imm, ctx); 652 emit_and(rd, rd, RV_REG_T1, ctx); 653 } 654 if (!is64 && !aux->verifier_zext) 655 emit_zext_32(rd, ctx); 656 break; 657 case BPF_ALU | BPF_OR | BPF_K: 658 case BPF_ALU64 | BPF_OR | BPF_K: 659 if (is_12b_int(imm)) { 660 emit(rv_ori(rd, rd, imm), ctx); 661 } else { 662 emit_imm(RV_REG_T1, imm, ctx); 663 emit_or(rd, rd, RV_REG_T1, ctx); 664 } 665 if (!is64 && !aux->verifier_zext) 666 emit_zext_32(rd, ctx); 667 break; 668 case BPF_ALU | BPF_XOR | BPF_K: 669 case BPF_ALU64 | BPF_XOR | BPF_K: 670 if (is_12b_int(imm)) { 671 emit(rv_xori(rd, rd, imm), ctx); 672 } else { 673 emit_imm(RV_REG_T1, imm, ctx); 674 emit_xor(rd, rd, RV_REG_T1, ctx); 675 } 676 if (!is64 && !aux->verifier_zext) 677 emit_zext_32(rd, ctx); 678 break; 679 case BPF_ALU | BPF_MUL | BPF_K: 680 case BPF_ALU64 | BPF_MUL | BPF_K: 681 emit_imm(RV_REG_T1, imm, ctx); 682 emit(is64 ? rv_mul(rd, rd, RV_REG_T1) : 683 rv_mulw(rd, rd, RV_REG_T1), ctx); 684 if (!is64 && !aux->verifier_zext) 685 emit_zext_32(rd, ctx); 686 break; 687 case BPF_ALU | BPF_DIV | BPF_K: 688 case BPF_ALU64 | BPF_DIV | BPF_K: 689 emit_imm(RV_REG_T1, imm, ctx); 690 emit(is64 ? rv_divu(rd, rd, RV_REG_T1) : 691 rv_divuw(rd, rd, RV_REG_T1), ctx); 692 if (!is64 && !aux->verifier_zext) 693 emit_zext_32(rd, ctx); 694 break; 695 case BPF_ALU | BPF_MOD | BPF_K: 696 case BPF_ALU64 | BPF_MOD | BPF_K: 697 emit_imm(RV_REG_T1, imm, ctx); 698 emit(is64 ? rv_remu(rd, rd, RV_REG_T1) : 699 rv_remuw(rd, rd, RV_REG_T1), ctx); 700 if (!is64 && !aux->verifier_zext) 701 emit_zext_32(rd, ctx); 702 break; 703 case BPF_ALU | BPF_LSH | BPF_K: 704 case BPF_ALU64 | BPF_LSH | BPF_K: 705 emit_slli(rd, rd, imm, ctx); 706 707 if (!is64 && !aux->verifier_zext) 708 emit_zext_32(rd, ctx); 709 break; 710 case BPF_ALU | BPF_RSH | BPF_K: 711 case BPF_ALU64 | BPF_RSH | BPF_K: 712 if (is64) 713 emit_srli(rd, rd, imm, ctx); 714 else 715 emit(rv_srliw(rd, rd, imm), ctx); 716 717 if (!is64 && !aux->verifier_zext) 718 emit_zext_32(rd, ctx); 719 break; 720 case BPF_ALU | BPF_ARSH | BPF_K: 721 case BPF_ALU64 | BPF_ARSH | BPF_K: 722 if (is64) 723 emit_srai(rd, rd, imm, ctx); 724 else 725 emit(rv_sraiw(rd, rd, imm), ctx); 726 727 if (!is64 && !aux->verifier_zext) 728 emit_zext_32(rd, ctx); 729 break; 730 731 /* JUMP off */ 732 case BPF_JMP | BPF_JA: 733 rvoff = rv_offset(i, off, ctx); 734 ret = emit_jump_and_link(RV_REG_ZERO, rvoff, false, ctx); 735 if (ret) 736 return ret; 737 break; 738 739 /* IF (dst COND src) JUMP off */ 740 case BPF_JMP | BPF_JEQ | BPF_X: 741 case BPF_JMP32 | BPF_JEQ | BPF_X: 742 case BPF_JMP | BPF_JGT | BPF_X: 743 case BPF_JMP32 | BPF_JGT | BPF_X: 744 case BPF_JMP | BPF_JLT | BPF_X: 745 case BPF_JMP32 | BPF_JLT | BPF_X: 746 case BPF_JMP | BPF_JGE | BPF_X: 747 case BPF_JMP32 | BPF_JGE | BPF_X: 748 case BPF_JMP | BPF_JLE | BPF_X: 749 case BPF_JMP32 | BPF_JLE | BPF_X: 750 case BPF_JMP | BPF_JNE | BPF_X: 751 case BPF_JMP32 | BPF_JNE | BPF_X: 752 case BPF_JMP | BPF_JSGT | BPF_X: 753 case BPF_JMP32 | BPF_JSGT | BPF_X: 754 case BPF_JMP | BPF_JSLT | BPF_X: 755 case BPF_JMP32 | BPF_JSLT | BPF_X: 756 case BPF_JMP | BPF_JSGE | BPF_X: 757 case BPF_JMP32 | BPF_JSGE | BPF_X: 758 case BPF_JMP | BPF_JSLE | BPF_X: 759 case BPF_JMP32 | BPF_JSLE | BPF_X: 760 case BPF_JMP | BPF_JSET | BPF_X: 761 case BPF_JMP32 | BPF_JSET | BPF_X: 762 rvoff = rv_offset(i, off, ctx); 763 if (!is64) { 764 s = ctx->ninsns; 765 if (is_signed_bpf_cond(BPF_OP(code))) 766 emit_sext_32_rd_rs(&rd, &rs, ctx); 767 else 768 emit_zext_32_rd_rs(&rd, &rs, ctx); 769 e = ctx->ninsns; 770 771 /* Adjust for extra insns */ 772 rvoff -= ninsns_rvoff(e - s); 773 } 774 775 if (BPF_OP(code) == BPF_JSET) { 776 /* Adjust for and */ 777 rvoff -= 4; 778 emit_and(RV_REG_T1, rd, rs, ctx); 779 emit_branch(BPF_JNE, RV_REG_T1, RV_REG_ZERO, rvoff, 780 ctx); 781 } else { 782 emit_branch(BPF_OP(code), rd, rs, rvoff, ctx); 783 } 784 break; 785 786 /* IF (dst COND imm) JUMP off */ 787 case BPF_JMP | BPF_JEQ | BPF_K: 788 case BPF_JMP32 | BPF_JEQ | BPF_K: 789 case BPF_JMP | BPF_JGT | BPF_K: 790 case BPF_JMP32 | BPF_JGT | BPF_K: 791 case BPF_JMP | BPF_JLT | BPF_K: 792 case BPF_JMP32 | BPF_JLT | BPF_K: 793 case BPF_JMP | BPF_JGE | BPF_K: 794 case BPF_JMP32 | BPF_JGE | BPF_K: 795 case BPF_JMP | BPF_JLE | BPF_K: 796 case BPF_JMP32 | BPF_JLE | BPF_K: 797 case BPF_JMP | BPF_JNE | BPF_K: 798 case BPF_JMP32 | BPF_JNE | BPF_K: 799 case BPF_JMP | BPF_JSGT | BPF_K: 800 case BPF_JMP32 | BPF_JSGT | BPF_K: 801 case BPF_JMP | BPF_JSLT | BPF_K: 802 case BPF_JMP32 | BPF_JSLT | BPF_K: 803 case BPF_JMP | BPF_JSGE | BPF_K: 804 case BPF_JMP32 | BPF_JSGE | BPF_K: 805 case BPF_JMP | BPF_JSLE | BPF_K: 806 case BPF_JMP32 | BPF_JSLE | BPF_K: 807 rvoff = rv_offset(i, off, ctx); 808 s = ctx->ninsns; 809 if (imm) { 810 emit_imm(RV_REG_T1, imm, ctx); 811 rs = RV_REG_T1; 812 } else { 813 /* If imm is 0, simply use zero register. */ 814 rs = RV_REG_ZERO; 815 } 816 if (!is64) { 817 if (is_signed_bpf_cond(BPF_OP(code))) 818 emit_sext_32_rd(&rd, ctx); 819 else 820 emit_zext_32_rd_t1(&rd, ctx); 821 } 822 e = ctx->ninsns; 823 824 /* Adjust for extra insns */ 825 rvoff -= ninsns_rvoff(e - s); 826 emit_branch(BPF_OP(code), rd, rs, rvoff, ctx); 827 break; 828 829 case BPF_JMP | BPF_JSET | BPF_K: 830 case BPF_JMP32 | BPF_JSET | BPF_K: 831 rvoff = rv_offset(i, off, ctx); 832 s = ctx->ninsns; 833 if (is_12b_int(imm)) { 834 emit_andi(RV_REG_T1, rd, imm, ctx); 835 } else { 836 emit_imm(RV_REG_T1, imm, ctx); 837 emit_and(RV_REG_T1, rd, RV_REG_T1, ctx); 838 } 839 /* For jset32, we should clear the upper 32 bits of t1, but 840 * sign-extension is sufficient here and saves one instruction, 841 * as t1 is used only in comparison against zero. 842 */ 843 if (!is64 && imm < 0) 844 emit_addiw(RV_REG_T1, RV_REG_T1, 0, ctx); 845 e = ctx->ninsns; 846 rvoff -= ninsns_rvoff(e - s); 847 emit_branch(BPF_JNE, RV_REG_T1, RV_REG_ZERO, rvoff, ctx); 848 break; 849 850 /* function call */ 851 case BPF_JMP | BPF_CALL: 852 { 853 bool fixed; 854 u64 addr; 855 856 mark_call(ctx); 857 ret = bpf_jit_get_func_addr(ctx->prog, insn, extra_pass, &addr, 858 &fixed); 859 if (ret < 0) 860 return ret; 861 ret = emit_call(fixed, addr, ctx); 862 if (ret) 863 return ret; 864 break; 865 } 866 /* tail call */ 867 case BPF_JMP | BPF_TAIL_CALL: 868 if (emit_bpf_tail_call(i, ctx)) 869 return -1; 870 break; 871 872 /* function return */ 873 case BPF_JMP | BPF_EXIT: 874 if (i == ctx->prog->len - 1) 875 break; 876 877 rvoff = epilogue_offset(ctx); 878 ret = emit_jump_and_link(RV_REG_ZERO, rvoff, false, ctx); 879 if (ret) 880 return ret; 881 break; 882 883 /* dst = imm64 */ 884 case BPF_LD | BPF_IMM | BPF_DW: 885 { 886 struct bpf_insn insn1 = insn[1]; 887 u64 imm64; 888 889 imm64 = (u64)insn1.imm << 32 | (u32)imm; 890 emit_imm(rd, imm64, ctx); 891 return 1; 892 } 893 894 /* LDX: dst = *(size *)(src + off) */ 895 case BPF_LDX | BPF_MEM | BPF_B: 896 if (is_12b_int(off)) { 897 emit(rv_lbu(rd, off, rs), ctx); 898 break; 899 } 900 901 emit_imm(RV_REG_T1, off, ctx); 902 emit_add(RV_REG_T1, RV_REG_T1, rs, ctx); 903 emit(rv_lbu(rd, 0, RV_REG_T1), ctx); 904 if (insn_is_zext(&insn[1])) 905 return 1; 906 break; 907 case BPF_LDX | BPF_MEM | BPF_H: 908 if (is_12b_int(off)) { 909 emit(rv_lhu(rd, off, rs), ctx); 910 break; 911 } 912 913 emit_imm(RV_REG_T1, off, ctx); 914 emit_add(RV_REG_T1, RV_REG_T1, rs, ctx); 915 emit(rv_lhu(rd, 0, RV_REG_T1), ctx); 916 if (insn_is_zext(&insn[1])) 917 return 1; 918 break; 919 case BPF_LDX | BPF_MEM | BPF_W: 920 if (is_12b_int(off)) { 921 emit(rv_lwu(rd, off, rs), ctx); 922 break; 923 } 924 925 emit_imm(RV_REG_T1, off, ctx); 926 emit_add(RV_REG_T1, RV_REG_T1, rs, ctx); 927 emit(rv_lwu(rd, 0, RV_REG_T1), ctx); 928 if (insn_is_zext(&insn[1])) 929 return 1; 930 break; 931 case BPF_LDX | BPF_MEM | BPF_DW: 932 if (is_12b_int(off)) { 933 emit_ld(rd, off, rs, ctx); 934 break; 935 } 936 937 emit_imm(RV_REG_T1, off, ctx); 938 emit_add(RV_REG_T1, RV_REG_T1, rs, ctx); 939 emit_ld(rd, 0, RV_REG_T1, ctx); 940 break; 941 942 /* speculation barrier */ 943 case BPF_ST | BPF_NOSPEC: 944 break; 945 946 /* ST: *(size *)(dst + off) = imm */ 947 case BPF_ST | BPF_MEM | BPF_B: 948 emit_imm(RV_REG_T1, imm, ctx); 949 if (is_12b_int(off)) { 950 emit(rv_sb(rd, off, RV_REG_T1), ctx); 951 break; 952 } 953 954 emit_imm(RV_REG_T2, off, ctx); 955 emit_add(RV_REG_T2, RV_REG_T2, rd, ctx); 956 emit(rv_sb(RV_REG_T2, 0, RV_REG_T1), ctx); 957 break; 958 959 case BPF_ST | BPF_MEM | BPF_H: 960 emit_imm(RV_REG_T1, imm, ctx); 961 if (is_12b_int(off)) { 962 emit(rv_sh(rd, off, RV_REG_T1), ctx); 963 break; 964 } 965 966 emit_imm(RV_REG_T2, off, ctx); 967 emit_add(RV_REG_T2, RV_REG_T2, rd, ctx); 968 emit(rv_sh(RV_REG_T2, 0, RV_REG_T1), ctx); 969 break; 970 case BPF_ST | BPF_MEM | BPF_W: 971 emit_imm(RV_REG_T1, imm, ctx); 972 if (is_12b_int(off)) { 973 emit_sw(rd, off, RV_REG_T1, ctx); 974 break; 975 } 976 977 emit_imm(RV_REG_T2, off, ctx); 978 emit_add(RV_REG_T2, RV_REG_T2, rd, ctx); 979 emit_sw(RV_REG_T2, 0, RV_REG_T1, ctx); 980 break; 981 case BPF_ST | BPF_MEM | BPF_DW: 982 emit_imm(RV_REG_T1, imm, ctx); 983 if (is_12b_int(off)) { 984 emit_sd(rd, off, RV_REG_T1, ctx); 985 break; 986 } 987 988 emit_imm(RV_REG_T2, off, ctx); 989 emit_add(RV_REG_T2, RV_REG_T2, rd, ctx); 990 emit_sd(RV_REG_T2, 0, RV_REG_T1, ctx); 991 break; 992 993 /* STX: *(size *)(dst + off) = src */ 994 case BPF_STX | BPF_MEM | BPF_B: 995 if (is_12b_int(off)) { 996 emit(rv_sb(rd, off, rs), ctx); 997 break; 998 } 999 1000 emit_imm(RV_REG_T1, off, ctx); 1001 emit_add(RV_REG_T1, RV_REG_T1, rd, ctx); 1002 emit(rv_sb(RV_REG_T1, 0, rs), ctx); 1003 break; 1004 case BPF_STX | BPF_MEM | BPF_H: 1005 if (is_12b_int(off)) { 1006 emit(rv_sh(rd, off, rs), ctx); 1007 break; 1008 } 1009 1010 emit_imm(RV_REG_T1, off, ctx); 1011 emit_add(RV_REG_T1, RV_REG_T1, rd, ctx); 1012 emit(rv_sh(RV_REG_T1, 0, rs), ctx); 1013 break; 1014 case BPF_STX | BPF_MEM | BPF_W: 1015 if (is_12b_int(off)) { 1016 emit_sw(rd, off, rs, ctx); 1017 break; 1018 } 1019 1020 emit_imm(RV_REG_T1, off, ctx); 1021 emit_add(RV_REG_T1, RV_REG_T1, rd, ctx); 1022 emit_sw(RV_REG_T1, 0, rs, ctx); 1023 break; 1024 case BPF_STX | BPF_MEM | BPF_DW: 1025 if (is_12b_int(off)) { 1026 emit_sd(rd, off, rs, ctx); 1027 break; 1028 } 1029 1030 emit_imm(RV_REG_T1, off, ctx); 1031 emit_add(RV_REG_T1, RV_REG_T1, rd, ctx); 1032 emit_sd(RV_REG_T1, 0, rs, ctx); 1033 break; 1034 case BPF_STX | BPF_ATOMIC | BPF_W: 1035 case BPF_STX | BPF_ATOMIC | BPF_DW: 1036 if (insn->imm != BPF_ADD) { 1037 pr_err("bpf-jit: not supported: atomic operation %02x ***\n", 1038 insn->imm); 1039 return -EINVAL; 1040 } 1041 1042 /* atomic_add: lock *(u32 *)(dst + off) += src 1043 * atomic_add: lock *(u64 *)(dst + off) += src 1044 */ 1045 1046 if (off) { 1047 if (is_12b_int(off)) { 1048 emit_addi(RV_REG_T1, rd, off, ctx); 1049 } else { 1050 emit_imm(RV_REG_T1, off, ctx); 1051 emit_add(RV_REG_T1, RV_REG_T1, rd, ctx); 1052 } 1053 1054 rd = RV_REG_T1; 1055 } 1056 1057 emit(BPF_SIZE(code) == BPF_W ? 1058 rv_amoadd_w(RV_REG_ZERO, rs, rd, 0, 0) : 1059 rv_amoadd_d(RV_REG_ZERO, rs, rd, 0, 0), ctx); 1060 break; 1061 default: 1062 pr_err("bpf-jit: unknown opcode %02x\n", code); 1063 return -EINVAL; 1064 } 1065 1066 return 0; 1067 } 1068 1069 void bpf_jit_build_prologue(struct rv_jit_context *ctx) 1070 { 1071 int stack_adjust = 0, store_offset, bpf_stack_adjust; 1072 1073 bpf_stack_adjust = round_up(ctx->prog->aux->stack_depth, 16); 1074 if (bpf_stack_adjust) 1075 mark_fp(ctx); 1076 1077 if (seen_reg(RV_REG_RA, ctx)) 1078 stack_adjust += 8; 1079 stack_adjust += 8; /* RV_REG_FP */ 1080 if (seen_reg(RV_REG_S1, ctx)) 1081 stack_adjust += 8; 1082 if (seen_reg(RV_REG_S2, ctx)) 1083 stack_adjust += 8; 1084 if (seen_reg(RV_REG_S3, ctx)) 1085 stack_adjust += 8; 1086 if (seen_reg(RV_REG_S4, ctx)) 1087 stack_adjust += 8; 1088 if (seen_reg(RV_REG_S5, ctx)) 1089 stack_adjust += 8; 1090 if (seen_reg(RV_REG_S6, ctx)) 1091 stack_adjust += 8; 1092 1093 stack_adjust = round_up(stack_adjust, 16); 1094 stack_adjust += bpf_stack_adjust; 1095 1096 store_offset = stack_adjust - 8; 1097 1098 /* First instruction is always setting the tail-call-counter 1099 * (TCC) register. This instruction is skipped for tail calls. 1100 * Force using a 4-byte (non-compressed) instruction. 1101 */ 1102 emit(rv_addi(RV_REG_TCC, RV_REG_ZERO, MAX_TAIL_CALL_CNT), ctx); 1103 1104 emit_addi(RV_REG_SP, RV_REG_SP, -stack_adjust, ctx); 1105 1106 if (seen_reg(RV_REG_RA, ctx)) { 1107 emit_sd(RV_REG_SP, store_offset, RV_REG_RA, ctx); 1108 store_offset -= 8; 1109 } 1110 emit_sd(RV_REG_SP, store_offset, RV_REG_FP, ctx); 1111 store_offset -= 8; 1112 if (seen_reg(RV_REG_S1, ctx)) { 1113 emit_sd(RV_REG_SP, store_offset, RV_REG_S1, ctx); 1114 store_offset -= 8; 1115 } 1116 if (seen_reg(RV_REG_S2, ctx)) { 1117 emit_sd(RV_REG_SP, store_offset, RV_REG_S2, ctx); 1118 store_offset -= 8; 1119 } 1120 if (seen_reg(RV_REG_S3, ctx)) { 1121 emit_sd(RV_REG_SP, store_offset, RV_REG_S3, ctx); 1122 store_offset -= 8; 1123 } 1124 if (seen_reg(RV_REG_S4, ctx)) { 1125 emit_sd(RV_REG_SP, store_offset, RV_REG_S4, ctx); 1126 store_offset -= 8; 1127 } 1128 if (seen_reg(RV_REG_S5, ctx)) { 1129 emit_sd(RV_REG_SP, store_offset, RV_REG_S5, ctx); 1130 store_offset -= 8; 1131 } 1132 if (seen_reg(RV_REG_S6, ctx)) { 1133 emit_sd(RV_REG_SP, store_offset, RV_REG_S6, ctx); 1134 store_offset -= 8; 1135 } 1136 1137 emit_addi(RV_REG_FP, RV_REG_SP, stack_adjust, ctx); 1138 1139 if (bpf_stack_adjust) 1140 emit_addi(RV_REG_S5, RV_REG_SP, bpf_stack_adjust, ctx); 1141 1142 /* Program contains calls and tail calls, so RV_REG_TCC need 1143 * to be saved across calls. 1144 */ 1145 if (seen_tail_call(ctx) && seen_call(ctx)) 1146 emit_mv(RV_REG_TCC_SAVED, RV_REG_TCC, ctx); 1147 1148 ctx->stack_size = stack_adjust; 1149 } 1150 1151 void bpf_jit_build_epilogue(struct rv_jit_context *ctx) 1152 { 1153 __build_epilogue(false, ctx); 1154 } 1155