CC: [email protected]
CC: [email protected]
CC: [email protected]
TO: Alexei Starovoitov <[email protected]>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/ast/bpf.git relo_core
head:   b59680f8f85fc73f14859ee02567897309ba8f65
commit: 28e76eb078b4674fecfda090ee4cbd80340a1d71 [2/12] bpf: Prepare 
relo_core.c for kernel duty.
:::::: branch date: 2 days ago
:::::: commit date: 2 days ago
config: x86_64-randconfig-c007-20210930 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 
28981015526f2192440c18f18e8a20cd11b0779c)
reproduce (this is a W=1 build):
        wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
        chmod +x ~/bin/make.cross
        # 
https://git.kernel.org/pub/scm/linux/kernel/git/ast/bpf.git/commit/?id=28e76eb078b4674fecfda090ee4cbd80340a1d71
        git remote add ast-bpf 
https://git.kernel.org/pub/scm/linux/kernel/git/ast/bpf.git
        git fetch --no-tags ast-bpf relo_core
        git checkout 28e76eb078b4674fecfda090ee4cbd80340a1d71
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 
clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>


clang-analyzer warnings: (new ones prefixed by >>)
            ^
   include/linux/list.h:282:9: note: Left side of '||' is false
           return READ_ONCE(head->next) == head;
                  ^
   include/asm-generic/rwonce.h:49:2: note: expanded from macro 'READ_ONCE'
           compiletime_assert_rwonce_type(x);                              \
           ^
   include/asm-generic/rwonce.h:36:21: note: expanded from macro 
'compiletime_assert_rwonce_type'
           compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long 
long),  \
                              ^
   include/linux/compiler_types.h:290:3: note: expanded from macro 
'__native_word'
           (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
            ^
   include/linux/list.h:282:9: note: Left side of '||' is false
           return READ_ONCE(head->next) == head;
                  ^
   include/asm-generic/rwonce.h:49:2: note: expanded from macro 'READ_ONCE'
           compiletime_assert_rwonce_type(x);                              \
           ^
   include/asm-generic/rwonce.h:36:21: note: expanded from macro 
'compiletime_assert_rwonce_type'
           compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long 
long),  \
                              ^
   include/linux/compiler_types.h:290:3: note: expanded from macro 
'__native_word'
           (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
            ^
   include/linux/list.h:282:9: note: Left side of '||' is true
           return READ_ONCE(head->next) == head;
                  ^
   include/asm-generic/rwonce.h:49:2: note: expanded from macro 'READ_ONCE'
           compiletime_assert_rwonce_type(x);                              \
           ^
   include/asm-generic/rwonce.h:36:38: note: expanded from macro 
'compiletime_assert_rwonce_type'
           compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long 
long),  \
                                               ^
   include/linux/list.h:282:9: note: Taking false branch
           return READ_ONCE(head->next) == head;
                  ^
   include/asm-generic/rwonce.h:49:2: note: expanded from macro 'READ_ONCE'
           compiletime_assert_rwonce_type(x);                              \
           ^
   include/asm-generic/rwonce.h:36:2: note: expanded from macro 
'compiletime_assert_rwonce_type'
           compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long 
long),  \
           ^
   include/linux/compiler_types.h:322:2: note: expanded from macro 
'compiletime_assert'
           _compiletime_assert(condition, msg, __compiletime_assert_, 
__COUNTER__)
           ^
   include/linux/compiler_types.h:310:2: note: expanded from macro 
'_compiletime_assert'
           __compiletime_assert(condition, msg, prefix, suffix)
           ^
   include/linux/compiler_types.h:302:3: note: expanded from macro 
'__compiletime_assert'
                   if (!(condition))                                       \
                   ^
   include/linux/list.h:282:9: note: Loop condition is false.  Exiting loop
           return READ_ONCE(head->next) == head;
                  ^
   include/asm-generic/rwonce.h:49:2: note: expanded from macro 'READ_ONCE'
           compiletime_assert_rwonce_type(x);                              \
           ^
   include/asm-generic/rwonce.h:36:2: note: expanded from macro 
'compiletime_assert_rwonce_type'
           compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long 
long),  \
           ^
   include/linux/compiler_types.h:322:2: note: expanded from macro 
'compiletime_assert'
           _compiletime_assert(condition, msg, __compiletime_assert_, 
__COUNTER__)
           ^
   include/linux/compiler_types.h:310:2: note: expanded from macro 
'_compiletime_assert'
           __compiletime_assert(condition, msg, prefix, suffix)
           ^
   include/linux/compiler_types.h:300:2: note: expanded from macro 
'__compiletime_assert'
           do {                                                            \
           ^
   include/linux/list.h:282:9: note: Dereference of null pointer
           return READ_ONCE(head->next) == head;
                  ^
   include/asm-generic/rwonce.h:50:2: note: expanded from macro 'READ_ONCE'
           __READ_ONCE(x);                                                 \
           ^~~~~~~~~~~~~~
   include/asm-generic/rwonce.h:44:24: note: expanded from macro '__READ_ONCE'
   #define __READ_ONCE(x)  (*(const volatile __unqual_scalar_typeof(x) *)&(x))
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   kernel/gcov/fs.c:532:3: warning: Call to function 'strcpy' is insecure as it 
does not provide bounding of the memory buffer. Replace unbounded copy 
functions with analogous functions that support length arguments such as 
'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]
                   strcpy(node->name, name);
                   ^~~~~~
   kernel/gcov/fs.c:532:3: note: Call to function 'strcpy' is insecure as it 
does not provide bounding of the memory buffer. Replace unbounded copy 
functions with analogous functions that support length arguments such as 
'strlcpy'. CWE-119
                   strcpy(node->name, name);
                   ^~~~~~
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   8 warnings generated.
   Suppressed 8 warnings (8 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   8 warnings generated.
   Suppressed 8 warnings (8 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   8 warnings generated.
   Suppressed 8 warnings (8 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (9 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   6 warnings generated.
>> tools/lib/bpf/relo_core.c:1040:7: warning: Branch condition evaluates to a 
>> garbage value [clang-analyzer-core.uninitialized.Branch]
                   if (res->fail_memsz_adjust) {
                       ^
   tools/lib/bpf/relo_core.c:1230:6: note: Assuming 'local_type' is non-null
           if (!local_type)
               ^~~~~~~~~~~
   tools/lib/bpf/relo_core.c:1230:2: note: Taking false branch
           if (!local_type)
           ^
   tools/lib/bpf/relo_core.c:1234:6: note: Assuming 'local_name' is non-null
           if (!local_name)
               ^~~~~~~~~~~
   tools/lib/bpf/relo_core.c:1234:2: note: Taking false branch
           if (!local_name)
           ^
   tools/lib/bpf/relo_core.c:1238:6: note: Calling 'str_is_empty'
           if (str_is_empty(spec_str))
               ^~~~~~~~~~~~~~~~~~~~~~
   include/linux/btf.h:148:9: note: Assuming 's' is non-null
           return !s || !s[0];
                  ^~
   include/linux/btf.h:148:9: note: Left side of '||' is false
   include/linux/btf.h:148:15: note: Assuming the condition is false
           return !s || !s[0];
                        ^~~~~
   include/linux/btf.h:148:2: note: Returning zero, which participates in a 
condition later
           return !s || !s[0];
           ^~~~~~~~~~~~~~~~~~
   tools/lib/bpf/relo_core.c:1238:6: note: Returning from 'str_is_empty'
           if (str_is_empty(spec_str))
               ^~~~~~~~~~~~~~~~~~~~~~
   tools/lib/bpf/relo_core.c:1238:2: note: Taking false branch
           if (str_is_empty(spec_str))
           ^
   tools/lib/bpf/relo_core.c:1242:6: note: Assuming 'err' is 0
           if (err) {
               ^~~
   tools/lib/bpf/relo_core.c:1242:2: note: Taking false branch
           if (err) {
           ^
   tools/lib/bpf/relo_core.c:1250:2: note: Loop condition is false.  Exiting 
loop
           pr_debug("prog '%s': relo #%d: kind <%s> (%d), spec is ", prog_name,
           ^
   tools/lib/bpf/relo_core.c:69:28: note: expanded from macro 'pr_debug'
   #define pr_debug(fmt, ...)      __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__)
                                   ^
   tools/lib/bpf/relo_core.c:59:31: note: expanded from macro '__pr'
   #define __pr(level, fmt, ...)   \
                                   ^
   tools/lib/bpf/relo_core.c:1256:12: note: Field 'kind' is equal to 
BPF_TYPE_ID_LOCAL
           if (relo->kind == BPF_TYPE_ID_LOCAL) {
                     ^
   tools/lib/bpf/relo_core.c:1256:2: note: Taking true branch
           if (relo->kind == BPF_TYPE_ID_LOCAL) {
           ^
   tools/lib/bpf/relo_core.c:1261:3: note: Control jumps to line 1355
                   goto patch_insn;
                   ^
   tools/lib/bpf/relo_core.c:1355:8: note: Calling 'bpf_core_patch_insn'
           err = bpf_core_patch_insn(prog_name, insn, insn_idx, relo, relo_idx, 
&targ_res);
                 
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   tools/lib/bpf/relo_core.c:996:11: note: Field 'poison' is false
           if (res->poison) {
                    ^
   tools/lib/bpf/relo_core.c:996:2: note: Taking false branch
           if (res->poison) {
           ^
   tools/lib/bpf/relo_core.c:1010:2: note: Control jumps to 'case 3:'  at line 
1029
           switch (class) {
           ^
   tools/lib/bpf/relo_core.c:1030:12: note: Field 'validate' is true
                   if (res->validate && insn->off != orig_val) {
                            ^
   tools/lib/bpf/relo_core.c:1030:7: note: Left side of '&&' is true
                   if (res->validate && insn->off != orig_val) {
                       ^
   tools/lib/bpf/relo_core.c:1030:24: note: Assuming 'orig_val' is equal to 
field 'off'
                   if (res->validate && insn->off != orig_val) {
                                        ^~~~~~~~~~~~~~~~~~~~~
   tools/lib/bpf/relo_core.c:1030:3: note: Taking false branch
                   if (res->validate && insn->off != orig_val) {
                   ^
   tools/lib/bpf/relo_core.c:1035:7: note: Assuming the condition is false
                   if (new_val > SHRT_MAX) {
                       ^~~~~~~~~~~~~~~~~~
   tools/lib/bpf/relo_core.c:1035:3: note: Taking false branch
                   if (new_val > SHRT_MAX) {
                   ^
   tools/lib/bpf/relo_core.c:1040:7: note: Branch condition evaluates to a 
garbage value
                   if (res->fail_memsz_adjust) {
                       ^~~~~~~~~~~~~~~~~~~~~~
   Suppressed 5 warnings (4 in non-user code, 1 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   3 warnings generated.
   Suppressed 3 warnings (3 in non-user code).

vim +1040 tools/lib/bpf/relo_core.c

b0588390dbcedc Alexei Starovoitov 2021-07-20   969  
b0588390dbcedc Alexei Starovoitov 2021-07-20   970  /*
b0588390dbcedc Alexei Starovoitov 2021-07-20   971   * Patch relocatable BPF 
instruction.
b0588390dbcedc Alexei Starovoitov 2021-07-20   972   *
b0588390dbcedc Alexei Starovoitov 2021-07-20   973   * Patched value is 
determined by relocation kind and target specification.
b0588390dbcedc Alexei Starovoitov 2021-07-20   974   * For existence 
relocations target spec will be NULL if field/type is not found.
b0588390dbcedc Alexei Starovoitov 2021-07-20   975   * Expected insn->imm value 
is determined using relocation kind and local
b0588390dbcedc Alexei Starovoitov 2021-07-20   976   * spec, and is checked 
before patching instruction. If actual insn->imm value
b0588390dbcedc Alexei Starovoitov 2021-07-20   977   * is wrong, bail out with 
error.
b0588390dbcedc Alexei Starovoitov 2021-07-20   978   *
b0588390dbcedc Alexei Starovoitov 2021-07-20   979   * Currently supported 
classes of BPF instruction are:
b0588390dbcedc Alexei Starovoitov 2021-07-20   980   * 1. rX = <imm> 
(assignment with immediate operand);
b0588390dbcedc Alexei Starovoitov 2021-07-20   981   * 2. rX += <imm> 
(arithmetic operations with immediate operand);
b0588390dbcedc Alexei Starovoitov 2021-07-20   982   * 3. rX = <imm64> (load 
with 64-bit immediate value);
b0588390dbcedc Alexei Starovoitov 2021-07-20   983   * 4. rX = *(T *)(rY + 
<off>), where T is one of {u8, u16, u32, u64};
b0588390dbcedc Alexei Starovoitov 2021-07-20   984   * 5. *(T *)(rX + <off>) = 
rY, where T is one of {u8, u16, u32, u64};
b0588390dbcedc Alexei Starovoitov 2021-07-20   985   * 6. *(T *)(rX + <off>) = 
<imm>, where T is one of {u8, u16, u32, u64}.
b0588390dbcedc Alexei Starovoitov 2021-07-20   986   */
b0588390dbcedc Alexei Starovoitov 2021-07-20   987  static int 
bpf_core_patch_insn(const char *prog_name, struct bpf_insn *insn,
b0588390dbcedc Alexei Starovoitov 2021-07-20   988                             
int insn_idx, const struct bpf_core_relo *relo,
b0588390dbcedc Alexei Starovoitov 2021-07-20   989                             
int relo_idx, const struct bpf_core_relo_res *res)
b0588390dbcedc Alexei Starovoitov 2021-07-20   990  {
b0588390dbcedc Alexei Starovoitov 2021-07-20   991      __u32 orig_val, new_val;
b0588390dbcedc Alexei Starovoitov 2021-07-20   992      __u8 class;
b0588390dbcedc Alexei Starovoitov 2021-07-20   993  
b0588390dbcedc Alexei Starovoitov 2021-07-20   994      class = 
BPF_CLASS(insn->code);
b0588390dbcedc Alexei Starovoitov 2021-07-20   995  
b0588390dbcedc Alexei Starovoitov 2021-07-20   996      if (res->poison) {
b0588390dbcedc Alexei Starovoitov 2021-07-20   997  poison:
b0588390dbcedc Alexei Starovoitov 2021-07-20   998              /* poison 
second part of ldimm64 to avoid confusing error from
b0588390dbcedc Alexei Starovoitov 2021-07-20   999               * verifier 
about "unknown opcode 00"
b0588390dbcedc Alexei Starovoitov 2021-07-20  1000               */
b0588390dbcedc Alexei Starovoitov 2021-07-20  1001              if 
(is_ldimm64_insn(insn))
b0588390dbcedc Alexei Starovoitov 2021-07-20  1002                      
bpf_core_poison_insn(prog_name, relo_idx, insn_idx + 1, insn + 1);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1003              
bpf_core_poison_insn(prog_name, relo_idx, insn_idx, insn);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1004              return 0;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1005      }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1006  
b0588390dbcedc Alexei Starovoitov 2021-07-20  1007      orig_val = 
res->orig_val;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1008      new_val = res->new_val;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1009  
b0588390dbcedc Alexei Starovoitov 2021-07-20  1010      switch (class) {
b0588390dbcedc Alexei Starovoitov 2021-07-20  1011      case BPF_ALU:
b0588390dbcedc Alexei Starovoitov 2021-07-20  1012      case BPF_ALU64:
b0588390dbcedc Alexei Starovoitov 2021-07-20  1013              if 
(BPF_SRC(insn->code) != BPF_K)
b0588390dbcedc Alexei Starovoitov 2021-07-20  1014                      return 
-EINVAL;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1015              if 
(res->validate && insn->imm != orig_val) {
b0588390dbcedc Alexei Starovoitov 2021-07-20  1016                      
pr_warn("prog '%s': relo #%d: unexpected insn #%d (ALU/ALU64) value: got %u, 
exp %u -> %u\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1017                              
prog_name, relo_idx,
b0588390dbcedc Alexei Starovoitov 2021-07-20  1018                              
insn_idx, insn->imm, orig_val, new_val);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1019                      return 
-EINVAL;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1020              }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1021              orig_val = 
insn->imm;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1022              insn->imm = 
new_val;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1023              pr_debug("prog 
'%s': relo #%d: patched insn #%d (ALU/ALU64) imm %u -> %u\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1024                       
prog_name, relo_idx, insn_idx,
b0588390dbcedc Alexei Starovoitov 2021-07-20  1025                       
orig_val, new_val);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1026              break;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1027      case BPF_LDX:
b0588390dbcedc Alexei Starovoitov 2021-07-20  1028      case BPF_ST:
b0588390dbcedc Alexei Starovoitov 2021-07-20  1029      case BPF_STX:
b0588390dbcedc Alexei Starovoitov 2021-07-20  1030              if 
(res->validate && insn->off != orig_val) {
b0588390dbcedc Alexei Starovoitov 2021-07-20  1031                      
pr_warn("prog '%s': relo #%d: unexpected insn #%d (LDX/ST/STX) value: got %u, 
exp %u -> %u\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1032                              
prog_name, relo_idx, insn_idx, insn->off, orig_val, new_val);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1033                      return 
-EINVAL;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1034              }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1035              if (new_val > 
SHRT_MAX) {
b0588390dbcedc Alexei Starovoitov 2021-07-20  1036                      
pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) value too big: %u\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1037                              
prog_name, relo_idx, insn_idx, new_val);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1038                      return 
-ERANGE;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1039              }
b0588390dbcedc Alexei Starovoitov 2021-07-20 @1040              if 
(res->fail_memsz_adjust) {
b0588390dbcedc Alexei Starovoitov 2021-07-20  1041                      
pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) accesses field incorrectly. 
"
b0588390dbcedc Alexei Starovoitov 2021-07-20  1042                              
"Make sure you are accessing pointers, unsigned integers, or fields of matching 
type and size.\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1043                              
prog_name, relo_idx, insn_idx);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1044                      goto 
poison;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1045              }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1046  
b0588390dbcedc Alexei Starovoitov 2021-07-20  1047              orig_val = 
insn->off;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1048              insn->off = 
new_val;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1049              pr_debug("prog 
'%s': relo #%d: patched insn #%d (LDX/ST/STX) off %u -> %u\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1050                       
prog_name, relo_idx, insn_idx, orig_val, new_val);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1051  
b0588390dbcedc Alexei Starovoitov 2021-07-20  1052              if (res->new_sz 
!= res->orig_sz) {
b0588390dbcedc Alexei Starovoitov 2021-07-20  1053                      int 
insn_bytes_sz, insn_bpf_sz;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1054  
b0588390dbcedc Alexei Starovoitov 2021-07-20  1055                      
insn_bytes_sz = insn_bpf_size_to_bytes(insn);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1056                      if 
(insn_bytes_sz != res->orig_sz) {
b0588390dbcedc Alexei Starovoitov 2021-07-20  1057                              
pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) unexpected mem size: got 
%d, exp %u\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1058                              
        prog_name, relo_idx, insn_idx, insn_bytes_sz, res->orig_sz);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1059                              
return -EINVAL;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1060                      }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1061  
b0588390dbcedc Alexei Starovoitov 2021-07-20  1062                      
insn_bpf_sz = insn_bytes_to_bpf_size(res->new_sz);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1063                      if 
(insn_bpf_sz < 0) {
b0588390dbcedc Alexei Starovoitov 2021-07-20  1064                              
pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) invalid new mem size: %u\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1065                              
        prog_name, relo_idx, insn_idx, res->new_sz);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1066                              
return -EINVAL;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1067                      }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1068  
b0588390dbcedc Alexei Starovoitov 2021-07-20  1069                      
insn->code = BPF_MODE(insn->code) | insn_bpf_sz | BPF_CLASS(insn->code);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1070                      
pr_debug("prog '%s': relo #%d: patched insn #%d (LDX/ST/STX) mem_sz %u -> %u\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1071                              
 prog_name, relo_idx, insn_idx, res->orig_sz, res->new_sz);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1072              }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1073              break;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1074      case BPF_LD: {
b0588390dbcedc Alexei Starovoitov 2021-07-20  1075              __u64 imm;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1076  
b0588390dbcedc Alexei Starovoitov 2021-07-20  1077              if 
(!is_ldimm64_insn(insn) ||
b0588390dbcedc Alexei Starovoitov 2021-07-20  1078                  
insn[0].src_reg != 0 || insn[0].off != 0 ||
b0588390dbcedc Alexei Starovoitov 2021-07-20  1079                  
insn[1].code != 0 || insn[1].dst_reg != 0 ||
b0588390dbcedc Alexei Starovoitov 2021-07-20  1080                  
insn[1].src_reg != 0 || insn[1].off != 0) {
b0588390dbcedc Alexei Starovoitov 2021-07-20  1081                      
pr_warn("prog '%s': relo #%d: insn #%d (LDIMM64) has unexpected form\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1082                              
prog_name, relo_idx, insn_idx);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1083                      return 
-EINVAL;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1084              }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1085  
b0588390dbcedc Alexei Starovoitov 2021-07-20  1086              imm = 
insn[0].imm + ((__u64)insn[1].imm << 32);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1087              if 
(res->validate && imm != orig_val) {
b0588390dbcedc Alexei Starovoitov 2021-07-20  1088                      
pr_warn("prog '%s': relo #%d: unexpected insn #%d (LDIMM64) value: got %llu, 
exp %u -> %u\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1089                              
prog_name, relo_idx,
b0588390dbcedc Alexei Starovoitov 2021-07-20  1090                              
insn_idx, (unsigned long long)imm,
b0588390dbcedc Alexei Starovoitov 2021-07-20  1091                              
orig_val, new_val);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1092                      return 
-EINVAL;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1093              }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1094  
b0588390dbcedc Alexei Starovoitov 2021-07-20  1095              insn[0].imm = 
new_val;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1096              insn[1].imm = 
0; /* currently only 32-bit values are supported */
b0588390dbcedc Alexei Starovoitov 2021-07-20  1097              pr_debug("prog 
'%s': relo #%d: patched insn #%d (LDIMM64) imm64 %llu -> %u\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1098                       
prog_name, relo_idx, insn_idx,
b0588390dbcedc Alexei Starovoitov 2021-07-20  1099                       
(unsigned long long)imm, new_val);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1100              break;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1101      }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1102      default:
b0588390dbcedc Alexei Starovoitov 2021-07-20  1103              pr_warn("prog 
'%s': relo #%d: trying to relocate unrecognized insn #%d, code:0x%x, src:0x%x, 
dst:0x%x, off:0x%x, imm:0x%x\n",
b0588390dbcedc Alexei Starovoitov 2021-07-20  1104                      
prog_name, relo_idx, insn_idx, insn->code,
b0588390dbcedc Alexei Starovoitov 2021-07-20  1105                      
insn->src_reg, insn->dst_reg, insn->off, insn->imm);
b0588390dbcedc Alexei Starovoitov 2021-07-20  1106              return -EINVAL;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1107      }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1108  
b0588390dbcedc Alexei Starovoitov 2021-07-20  1109      return 0;
b0588390dbcedc Alexei Starovoitov 2021-07-20  1110  }
b0588390dbcedc Alexei Starovoitov 2021-07-20  1111  

:::::: The code at line 1040 was first introduced by commit
:::::: b0588390dbcedcd74fab6ffb8afe8d52380fd8b6 libbpf: Split CO-RE logic into 
relo_core.c.

:::::: TO: Alexei Starovoitov <[email protected]>
:::::: CC: Andrii Nakryiko <[email protected]>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]

Attachment: .config.gz
Description: application/gzip

_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to