@@ -937,13 +937,19 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, u32 *fimage, struct code
937
937
*/
938
938
/* dst = *(u8 *)(ul) (src + off) */
939
939
case BPF_LDX | BPF_MEM | BPF_B :
940
+ case BPF_LDX | BPF_MEMSX | BPF_B :
940
941
case BPF_LDX | BPF_PROBE_MEM | BPF_B :
942
+ case BPF_LDX | BPF_PROBE_MEMSX | BPF_B :
941
943
/* dst = *(u16 *)(ul) (src + off) */
942
944
case BPF_LDX | BPF_MEM | BPF_H :
945
+ case BPF_LDX | BPF_MEMSX | BPF_H :
943
946
case BPF_LDX | BPF_PROBE_MEM | BPF_H :
947
+ case BPF_LDX | BPF_PROBE_MEMSX | BPF_H :
944
948
/* dst = *(u32 *)(ul) (src + off) */
945
949
case BPF_LDX | BPF_MEM | BPF_W :
950
+ case BPF_LDX | BPF_MEMSX | BPF_W :
946
951
case BPF_LDX | BPF_PROBE_MEM | BPF_W :
952
+ case BPF_LDX | BPF_PROBE_MEMSX | BPF_W :
947
953
/* dst = *(u64 *)(ul) (src + off) */
948
954
case BPF_LDX | BPF_MEM | BPF_DW :
949
955
case BPF_LDX | BPF_PROBE_MEM | BPF_DW :
@@ -953,7 +959,7 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, u32 *fimage, struct code
953
959
* load only if addr is kernel address (see is_kernel_addr()), otherwise
954
960
* set dst_reg=0 and move on.
955
961
*/
956
- if (BPF_MODE (code ) == BPF_PROBE_MEM ) {
962
+ if (BPF_MODE (code ) == BPF_PROBE_MEM || BPF_MODE ( code ) == BPF_PROBE_MEMSX ) {
957
963
EMIT (PPC_RAW_ADDI (tmp1_reg , src_reg , off ));
958
964
if (IS_ENABLED (CONFIG_PPC_BOOK3E_64 ))
959
965
PPC_LI64 (tmp2_reg , 0x8000000000000000ul );
@@ -966,30 +972,47 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, u32 *fimage, struct code
966
972
* Check if 'off' is word aligned for BPF_DW, because
967
973
* we might generate two instructions.
968
974
*/
969
- if (BPF_SIZE (code ) == BPF_DW && (off & 3 ))
975
+ if ((BPF_SIZE (code ) == BPF_DW ||
976
+ (BPF_SIZE (code ) == BPF_B && BPF_MODE (code ) == BPF_PROBE_MEMSX )) &&
977
+ (off & 3 ))
970
978
PPC_JMP ((ctx -> idx + 3 ) * 4 );
971
979
else
972
980
PPC_JMP ((ctx -> idx + 2 ) * 4 );
973
981
}
974
982
975
- switch (size ) {
976
- case BPF_B :
977
- EMIT (PPC_RAW_LBZ (dst_reg , src_reg , off ));
978
- break ;
979
- case BPF_H :
980
- EMIT (PPC_RAW_LHZ (dst_reg , src_reg , off ));
981
- break ;
982
- case BPF_W :
983
- EMIT (PPC_RAW_LWZ (dst_reg , src_reg , off ));
984
- break ;
985
- case BPF_DW :
986
- if (off % 4 ) {
987
- EMIT (PPC_RAW_LI (tmp1_reg , off ));
988
- EMIT (PPC_RAW_LDX (dst_reg , src_reg , tmp1_reg ));
989
- } else {
990
- EMIT (PPC_RAW_LD (dst_reg , src_reg , off ));
983
+ if (BPF_MODE (code ) == BPF_MEMSX || BPF_MODE (code ) == BPF_PROBE_MEMSX ) {
984
+ switch (size ) {
985
+ case BPF_B :
986
+ EMIT (PPC_RAW_LBZ (dst_reg , src_reg , off ));
987
+ EMIT (PPC_RAW_EXTSB (dst_reg , dst_reg ));
988
+ break ;
989
+ case BPF_H :
990
+ EMIT (PPC_RAW_LHA (dst_reg , src_reg , off ));
991
+ break ;
992
+ case BPF_W :
993
+ EMIT (PPC_RAW_LWA (dst_reg , src_reg , off ));
994
+ break ;
995
+ }
996
+ } else {
997
+ switch (size ) {
998
+ case BPF_B :
999
+ EMIT (PPC_RAW_LBZ (dst_reg , src_reg , off ));
1000
+ break ;
1001
+ case BPF_H :
1002
+ EMIT (PPC_RAW_LHZ (dst_reg , src_reg , off ));
1003
+ break ;
1004
+ case BPF_W :
1005
+ EMIT (PPC_RAW_LWZ (dst_reg , src_reg , off ));
1006
+ break ;
1007
+ case BPF_DW :
1008
+ if (off % 4 ) {
1009
+ EMIT (PPC_RAW_LI (tmp1_reg , off ));
1010
+ EMIT (PPC_RAW_LDX (dst_reg , src_reg , tmp1_reg ));
1011
+ } else {
1012
+ EMIT (PPC_RAW_LD (dst_reg , src_reg , off ));
1013
+ }
1014
+ break ;
991
1015
}
992
- break ;
993
1016
}
994
1017
995
1018
if (size != BPF_DW && insn_is_zext (& insn [i + 1 ]))
0 commit comments