Re: [PATCH 3/3] soc: qcom: mdt_loader: Read hash from firmware blob
From: kernel test robot
Date: Wed Jan 06 2021 - 18:42:36 EST
Hi Siddharth,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on linus/master]
[also build test WARNING on v5.11-rc2 next-20210104]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Siddharth-Gupta/soc-qcom-mdt_loader-General-improvements/20210107-052704
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git e71ba9452f0b5b2e8dc8aa5445198cd9214a6a62
config: arm64-allyesconfig (attached as .config)
compiler: aarch64-linux-gcc (GCC) 9.3.0
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://github.com/0day-ci/linux/commit/ecd3796eaac75caf4abf7386c0c82546c104511a
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Siddharth-Gupta/soc-qcom-mdt_loader-General-improvements/20210107-052704
git checkout ecd3796eaac75caf4abf7386c0c82546c104511a
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>
All warnings (new ones prefixed by >>):
drivers/soc/qcom/mdt_loader.c: In function 'qcom_mdt_read_metadata':
>> drivers/soc/qcom/mdt_loader.c:152:51: warning: format '%d' expects argument of type 'int', but argument 4 has type 'size_t' {aka 'long unsigned int'} [-Wformat=]
152 | snprintf(fw_name + strlen(fw_name) - 3, 4, "b%02d", hash_index);
| ~~~^ ~~~~~~~~~~
| | |
| int size_t {aka long unsigned int}
| %02ld
vim +152 drivers/soc/qcom/mdt_loader.c
88
89 /**
90 * qcom_mdt_read_metadata() - read header and metadata from mdt or mbn
91 * @fw: firmware of mdt header or mbn
92 * @data_len: length of the read metadata blob
93 *
94 * The mechanism that performs the authentication of the loading firmware
95 * expects an ELF header directly followed by the segment of hashes, with no
96 * padding inbetween. This function allocates a chunk of memory for this pair
97 * and copy the two pieces into the buffer.
98 *
99 * In the case of split firmware the hash is found directly following the ELF
100 * header, rather than at p_offset described by the second program header.
101 *
102 * The caller is responsible to free (kfree()) the returned pointer.
103 *
104 * Return: pointer to data, or ERR_PTR()
105 */
106 void *qcom_mdt_read_metadata(struct device *dev, const struct firmware *fw, const char *firmware,
107 size_t *data_len)
108 {
109 const struct elf32_phdr *phdrs;
110 const struct elf32_hdr *ehdr;
111 const struct firmware *seg_fw;
112 size_t hash_index;
113 size_t hash_size;
114 size_t ehdr_size;
115 char *fw_name;
116 void *data;
117 int ret;
118
119 ehdr = (struct elf32_hdr *)fw->data;
120 phdrs = (struct elf32_phdr *)(ehdr + 1);
121
122 if (ehdr->e_phnum < 2)
123 return ERR_PTR(-EINVAL);
124
125 if (phdrs[0].p_type == PT_LOAD)
126 return ERR_PTR(-EINVAL);
127
128 for (hash_index = 1; hash_index < ehdr->e_phnum; hash_index++) {
129 if (phdrs[hash_index].p_type != PT_LOAD &&
130 (phdrs[hash_index].p_flags & QCOM_MDT_TYPE_MASK) == QCOM_MDT_TYPE_HASH)
131 break;
132 }
133 if (hash_index >= ehdr->e_phnum)
134 return ERR_PTR(-EINVAL);
135
136 ehdr_size = phdrs[0].p_filesz;
137 hash_size = phdrs[hash_index].p_filesz;
138
139 data = kmalloc(ehdr_size + hash_size, GFP_KERNEL);
140 if (!data)
141 return ERR_PTR(-ENOMEM);
142
143 /* copy elf header */
144 memcpy(data, fw->data, ehdr_size);
145
146 if (qcom_mdt_bins_are_split(fw)) {
147 fw_name = kstrdup(firmware, GFP_KERNEL);
148 if (!fw_name) {
149 kfree(data);
150 return ERR_PTR(-ENOMEM);
151 }
> 152 snprintf(fw_name + strlen(fw_name) - 3, 4, "b%02d", hash_index);
153
154 ret = request_firmware_into_buf(&seg_fw, fw_name, dev, data + ehdr_size, hash_size);
155 kfree(fw_name);
156
157 if (ret) {
158 kfree(data);
159 return ERR_PTR(ret);
160 }
161
162 release_firmware(seg_fw);
163 } else {
164 memcpy(data + ehdr_size, fw->data + phdrs[hash_index].p_offset, hash_size);
165 }
166
167 *data_len = ehdr_size + hash_size;
168
169 return data;
170 }
171 EXPORT_SYMBOL_GPL(qcom_mdt_read_metadata);
172
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx
Attachment:
.config.gz
Description: application/gzip