From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: [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]
Date: Fri, 17 Sep 2021 16:16:02 +0800 [thread overview]
Message-ID: <202109171655.eFNA5lKx-lkp@intel.com> (raw)
[-- 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 --]
reply other threads:[~2021-09-17 8:16 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202109171655.eFNA5lKx-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.