All of lore.kernel.org
 help / color / mirror / Atom feed
* [ast-bpf:relo_core 6/12] tools/lib/bpf/relo_core.c:1045:7: warning: Branch condition evaluates to a garbage value [clang-analyzer-core.uninitialized.Branch]
@ 2021-09-17  8:16 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2021-09-17  8:16 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 27203 bytes --]

CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Alexei Starovoitov <ast@kernel.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/ast/bpf.git relo_core
head:   bfeace99ce76472f92786d795eae779e8598e0e8
commit: 4b90a10711faf2b6751abe62a88422411c054c80 [6/12] bpf: Prepare relo_core.c for kernel duty.
:::::: branch date: 7 hours ago
:::::: commit date: 9 hours ago
config: riscv-randconfig-c006-20210916 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project c8b3d7d6d6de37af68b2f379d0e37304f78e115f)
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
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # https://git.kernel.org/pub/scm/linux/kernel/git/ast/bpf.git/commit/?id=4b90a10711faf2b6751abe62a88422411c054c80
        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 4b90a10711faf2b6751abe62a88422411c054c80
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
   Suppressed 14 warnings (7 in non-user code, 7 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.
   18 warnings generated.
   Suppressed 18 warnings (11 in non-user code, 7 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.
   18 warnings generated.
   Suppressed 18 warnings (11 in non-user code, 7 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.
   2 warnings generated.
   Suppressed 2 warnings (2 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.
   18 warnings generated.
   Suppressed 18 warnings (11 in non-user code, 7 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.
   18 warnings generated.
   Suppressed 18 warnings (11 in non-user code, 7 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.
   13 warnings generated.
   Suppressed 13 warnings (6 in non-user code, 7 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.
   5 warnings generated.
   Suppressed 5 warnings (5 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.
   5 warnings generated.
   Suppressed 5 warnings (5 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.
   5 warnings generated.
   Suppressed 5 warnings (5 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.
   13 warnings generated.
   Suppressed 13 warnings (6 in non-user code, 7 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.
   16 warnings generated.
   Suppressed 16 warnings (9 in non-user code, 7 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.
   15 warnings generated.
   Suppressed 15 warnings (8 in non-user code, 7 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.
   14 warnings generated.
   Suppressed 14 warnings (7 in non-user code, 7 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.
   16 warnings generated.
   drivers/iio/accel/bma220_spi.c:63:8: warning: Excessive padding in 'struct bma220_data' (86 padding bytes, where 22 is optimal). 
   Optimal fields order: 
   tx_buf, 
   spi_device, 
   scan, 
   lock, 
   consider reordering the fields or adding explicit padding members [clang-analyzer-optin.performance.Padding]
   struct bma220_data {
   ~~~~~~~^~~~~~~~~~~~~
   drivers/iio/accel/bma220_spi.c:63:8: note: Excessive padding in 'struct bma220_data' (86 padding bytes, where 22 is optimal). Optimal fields order: tx_buf, spi_device, scan, lock, consider reordering the fields or adding explicit padding members
   struct bma220_data {
   ~~~~~~~^~~~~~~~~~~~~
   Suppressed 15 warnings (8 in non-user code, 7 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.
   6 warnings generated.
   Suppressed 6 warnings (6 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.
   Suppressed 6 warnings (6 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.
   13 warnings generated.
   Suppressed 13 warnings (6 in non-user code, 7 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.
   5 warnings generated.
   Suppressed 5 warnings (5 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.
   5 warnings generated.
   Suppressed 5 warnings (5 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.
   5 warnings generated.
   Suppressed 5 warnings (5 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.
   5 warnings generated.
   Suppressed 5 warnings (5 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.
   12 warnings generated.
   Suppressed 12 warnings (5 in non-user code, 7 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.
   6 warnings generated.
   Suppressed 6 warnings (6 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.
   12 warnings generated.
   Suppressed 12 warnings (5 in non-user code, 7 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.
   15 warnings generated.
   drivers/clocksource/timer-of.c:191:3: warning: Value stored to 'flags' is never read [clang-analyzer-deadcode.DeadStores]
                   flags |= TIMER_OF_IRQ;
                   ^
   drivers/clocksource/timer-of.c:191:3: note: Value stored to 'flags' is never read
   Suppressed 14 warnings (7 in non-user code, 7 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.
   12 warnings generated.
   Suppressed 12 warnings (5 in non-user code, 7 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.
   16 warnings generated.
   Suppressed 16 warnings (8 in non-user code, 8 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.
   8 warnings generated.
>> tools/lib/bpf/relo_core.c:1045: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:1235:6: note: Assuming 'local_type' is non-null
           if (!local_type)
               ^~~~~~~~~~~
   tools/lib/bpf/relo_core.c:1235:2: note: Taking false branch
           if (!local_type)
           ^
   tools/lib/bpf/relo_core.c:1239:6: note: Assuming 'local_name' is non-null
           if (!local_name)
               ^~~~~~~~~~~
   tools/lib/bpf/relo_core.c:1239:2: note: Taking false branch
           if (!local_name)
           ^
   tools/lib/bpf/relo_core.c:1243: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:1243:6: note: Returning from 'str_is_empty'
           if (str_is_empty(spec_str))
               ^~~~~~~~~~~~~~~~~~~~~~
   tools/lib/bpf/relo_core.c:1243:2: note: Taking false branch
           if (str_is_empty(spec_str))
           ^
   tools/lib/bpf/relo_core.c:1247:6: note: Assuming 'err' is 0
           if (err) {
               ^~~
   tools/lib/bpf/relo_core.c:1247:2: note: Taking false branch
           if (err) {
           ^
   tools/lib/bpf/relo_core.c:1255: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:1261:12: note: Field 'kind' is equal to BPF_TYPE_ID_LOCAL
           if (relo->kind == BPF_TYPE_ID_LOCAL) {
                     ^
   tools/lib/bpf/relo_core.c:1261:2: note: Taking true branch
           if (relo->kind == BPF_TYPE_ID_LOCAL) {
           ^
   tools/lib/bpf/relo_core.c:1266:3: note: Control jumps to line 1360
                   goto patch_insn;
                   ^
   tools/lib/bpf/relo_core.c:1360: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:1001:11: note: Field 'poison' is false
           if (res->poison) {
                    ^
   tools/lib/bpf/relo_core.c:1001:2: note: Taking false branch
           if (res->poison) {
           ^
   tools/lib/bpf/relo_core.c:1015:2: note: Control jumps to 'case 3:'  at line 1034
           switch (class) {
           ^
   tools/lib/bpf/relo_core.c:1035:12: note: Field 'validate' is true
                   if (res->validate && insn->off != orig_val) {
                            ^
   tools/lib/bpf/relo_core.c:1035:7: note: Left side of '&&' is true
                   if (res->validate && insn->off != orig_val) {
                       ^
   tools/lib/bpf/relo_core.c:1035:24: note: Assuming 'orig_val' is equal to field 'off'
                   if (res->validate && insn->off != orig_val) {
                                        ^~~~~~~~~~~~~~~~~~~~~
   tools/lib/bpf/relo_core.c:1035:3: note: Taking false branch
                   if (res->validate && insn->off != orig_val) {
                   ^
   tools/lib/bpf/relo_core.c:1040:7: note: Assuming the condition is false
                   if (new_val > SHRT_MAX) {
                       ^~~~~~~~~~~~~~~~~~
   tools/lib/bpf/relo_core.c:1040:3: note: Taking false branch
                   if (new_val > SHRT_MAX) {
                   ^
   tools/lib/bpf/relo_core.c:1045:7: note: Branch condition evaluates to a garbage value
                   if (res->fail_memsz_adjust) {
                       ^~~~~~~~~~~~~~~~~~~~~~
   Suppressed 7 warnings (6 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.
   18 warnings generated.
   drivers/misc/habanalabs/gaudi/gaudi.c:1111:2: warning: Value stored to 'cb_size' is never read [clang-analyzer-deadcode.DeadStores]
           cb_size += gaudi_gen_wait_cb(hdev, &wait_prop);
           ^          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/misc/habanalabs/gaudi/gaudi.c:1111:2: note: Value stored to 'cb_size' is never read
           cb_size += gaudi_gen_wait_cb(hdev, &wait_prop);
           ^          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/misc/habanalabs/gaudi/gaudi.c:1144:2: warning: Value stored to 'cb_size' is never read [clang-analyzer-deadcode.DeadStores]

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

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

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

:::::: TO: Alexei Starovoitov <ast@kernel.org>
:::::: CC: Andrii Nakryiko <andrii@kernel.org>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 36133 bytes --]

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-09-17  8:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-17  8:16 [ast-bpf:relo_core 6/12] tools/lib/bpf/relo_core.c:1045:7: warning: Branch condition evaluates to a garbage value [clang-analyzer-core.uninitialized.Branch] kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.