@@ -599,10 +599,9 @@ static int emit_atomic_ld_st(u8 rd, u8 rs, const struct bpf_insn *insn,
599
599
static int emit_atomic_rmw (u8 rd , u8 rs , const struct bpf_insn * insn ,
600
600
struct rv_jit_context * ctx )
601
601
{
602
- u8 r0 , code = insn -> code ;
602
+ u8 code = insn -> code ;
603
603
s16 off = insn -> off ;
604
604
s32 imm = insn -> imm ;
605
- int jmp_offset ;
606
605
bool is64 ;
607
606
608
607
if (BPF_SIZE (code ) != BPF_W && BPF_SIZE (code ) != BPF_DW ) {
@@ -673,20 +672,7 @@ static int emit_atomic_rmw(u8 rd, u8 rs, const struct bpf_insn *insn,
673
672
break ;
674
673
/* r0 = atomic_cmpxchg(dst_reg + off16, r0, src_reg); */
675
674
case BPF_CMPXCHG :
676
- r0 = bpf_to_rv_reg (BPF_REG_0 , ctx );
677
- if (is64 )
678
- emit_mv (RV_REG_T2 , r0 , ctx );
679
- else
680
- emit_addiw (RV_REG_T2 , r0 , 0 , ctx );
681
- emit (is64 ? rv_lr_d (r0 , 0 , rd , 0 , 0 ) :
682
- rv_lr_w (r0 , 0 , rd , 0 , 0 ), ctx );
683
- jmp_offset = ninsns_rvoff (8 );
684
- emit (rv_bne (RV_REG_T2 , r0 , jmp_offset >> 1 ), ctx );
685
- emit (is64 ? rv_sc_d (RV_REG_T3 , rs , rd , 0 , 1 ) :
686
- rv_sc_w (RV_REG_T3 , rs , rd , 0 , 1 ), ctx );
687
- jmp_offset = ninsns_rvoff (-6 );
688
- emit (rv_bne (RV_REG_T3 , 0 , jmp_offset >> 1 ), ctx );
689
- emit_fence_rw_rw (ctx );
675
+ emit_cmpxchg (rd , rs , regmap [BPF_REG_0 ], is64 , ctx );
690
676
break ;
691
677
default :
692
678
pr_err_once ("bpf-jit: invalid atomic RMW opcode %02x\n" , imm );
0 commit comments