@@ -1133,12 +1133,14 @@ static int add_exception_handler(const struct bpf_insn *insn,
11331133 return 0 ;
11341134
11351135 if (BPF_MODE (insn -> code ) != BPF_PROBE_MEM &&
1136- BPF_MODE (insn -> code ) != BPF_PROBE_MEMSX &&
1137- BPF_MODE (insn -> code ) != BPF_PROBE_MEM32 &&
1138- BPF_MODE (insn -> code ) != BPF_PROBE_ATOMIC )
1136+ BPF_MODE (insn -> code ) != BPF_PROBE_MEMSX &&
1137+ BPF_MODE (insn -> code ) != BPF_PROBE_MEM32 &&
1138+ BPF_MODE (insn -> code ) != BPF_PROBE_MEM32SX &&
1139+ BPF_MODE (insn -> code ) != BPF_PROBE_ATOMIC )
11391140 return 0 ;
11401141
11411142 is_arena = (BPF_MODE (insn -> code ) == BPF_PROBE_MEM32 ) ||
1143+ (BPF_MODE (insn -> code ) == BPF_PROBE_MEM32SX ) ||
11421144 (BPF_MODE (insn -> code ) == BPF_PROBE_ATOMIC );
11431145
11441146 if (!ctx -> prog -> aux -> extable ||
@@ -1659,7 +1661,11 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
16591661 case BPF_LDX | BPF_PROBE_MEM32 | BPF_H :
16601662 case BPF_LDX | BPF_PROBE_MEM32 | BPF_W :
16611663 case BPF_LDX | BPF_PROBE_MEM32 | BPF_DW :
1662- if (BPF_MODE (insn -> code ) == BPF_PROBE_MEM32 ) {
1664+ case BPF_LDX | BPF_PROBE_MEM32SX | BPF_B :
1665+ case BPF_LDX | BPF_PROBE_MEM32SX | BPF_H :
1666+ case BPF_LDX | BPF_PROBE_MEM32SX | BPF_W :
1667+ if (BPF_MODE (insn -> code ) == BPF_PROBE_MEM32 ||
1668+ BPF_MODE (insn -> code ) == BPF_PROBE_MEM32SX ) {
16631669 emit (A64_ADD (1 , tmp2 , src , arena_vm_base ), ctx );
16641670 src = tmp2 ;
16651671 }
@@ -1671,7 +1677,8 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
16711677 off_adj = off ;
16721678 }
16731679 sign_extend = (BPF_MODE (insn -> code ) == BPF_MEMSX ||
1674- BPF_MODE (insn -> code ) == BPF_PROBE_MEMSX );
1680+ BPF_MODE (insn -> code ) == BPF_PROBE_MEMSX ||
1681+ BPF_MODE (insn -> code ) == BPF_PROBE_MEM32SX );
16751682 switch (BPF_SIZE (code )) {
16761683 case BPF_W :
16771684 if (is_lsi_offset (off_adj , 2 )) {
@@ -1879,9 +1886,11 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
18791886 if (ret )
18801887 return ret ;
18811888
1882- ret = add_exception_handler (insn , ctx , dst );
1883- if (ret )
1884- return ret ;
1889+ if (BPF_MODE (insn -> code ) == BPF_PROBE_ATOMIC ) {
1890+ ret = add_exception_handler (insn , ctx , dst );
1891+ if (ret )
1892+ return ret ;
1893+ }
18851894 break ;
18861895
18871896 default :
@@ -3064,11 +3073,6 @@ bool bpf_jit_supports_insn(struct bpf_insn *insn, bool in_arena)
30643073 if (!bpf_atomic_is_load_store (insn ) &&
30653074 !cpus_have_cap (ARM64_HAS_LSE_ATOMICS ))
30663075 return false;
3067- break ;
3068- case BPF_LDX | BPF_MEMSX | BPF_B :
3069- case BPF_LDX | BPF_MEMSX | BPF_H :
3070- case BPF_LDX | BPF_MEMSX | BPF_W :
3071- return false;
30723076 }
30733077 return true;
30743078}
0 commit comments