CC: [email protected] TO: Atish Patra <[email protected]> CC: Palmer Dabbelt <[email protected]> CC: Ard Biesheuvel <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: d5b2251d63b5344ee827d3680fa79bdb9f9ddfa1 commit: 282048ee6534dc5e218f6957eebe6805b2d0c3df [6149/7089] RISC-V: Add EFI stub support. :::::: branch date: 30 hours ago :::::: commit date: 4 days ago config: riscv-randconfig-m031-20200911 (attached as .config) compiler: riscv32-linux-gcc (GCC) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> smatch warnings: drivers/firmware/efi/capsule.c:171 efi_capsule_update_locked() warn: should '((((sg_pages[0]) - mem_map) + pfn_base)) << (12)' be a 64 bit type? drivers/firmware/efi/capsule.c:266 efi_capsule_update() warn: should '((((sg_pages[i + 1]) - mem_map) + pfn_base)) << (12)' be a 64 bit type? # https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=282048ee6534dc5e218f6957eebe6805b2d0c3df git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git git fetch --no-tags linux-next master git checkout 282048ee6534dc5e218f6957eebe6805b2d0c3df vim +171 drivers/firmware/efi/capsule.c f0133f3c5b8bb3 Matt Fleming 2016-04-25 125 f0133f3c5b8bb3 Matt Fleming 2016-04-25 126 /** f0133f3c5b8bb3 Matt Fleming 2016-04-25 127 * efi_capsule_update_locked - pass a single capsule to the firmware f0133f3c5b8bb3 Matt Fleming 2016-04-25 128 * @capsule: capsule to send to the firmware f0133f3c5b8bb3 Matt Fleming 2016-04-25 129 * @sg_pages: array of scatter gather (block descriptor) pages f0133f3c5b8bb3 Matt Fleming 2016-04-25 130 * @reset: the reset type required for @capsule f0133f3c5b8bb3 Matt Fleming 2016-04-25 131 * f0133f3c5b8bb3 Matt Fleming 2016-04-25 132 * Since this function must be called under capsule_mutex check f0133f3c5b8bb3 Matt Fleming 2016-04-25 133 * whether efi_reset_type will conflict with @reset, and atomically f0133f3c5b8bb3 Matt Fleming 2016-04-25 134 * set it and capsule_pending if a capsule was successfully sent to f0133f3c5b8bb3 Matt Fleming 2016-04-25 135 * the firmware. f0133f3c5b8bb3 Matt Fleming 2016-04-25 136 * f0133f3c5b8bb3 Matt Fleming 2016-04-25 137 * We also check to see if the system is about to restart, and if so, f0133f3c5b8bb3 Matt Fleming 2016-04-25 138 * abort. This avoids races between efi_capsule_update() and f0133f3c5b8bb3 Matt Fleming 2016-04-25 139 * efi_capsule_pending(). f0133f3c5b8bb3 Matt Fleming 2016-04-25 140 */ f0133f3c5b8bb3 Matt Fleming 2016-04-25 141 static int f0133f3c5b8bb3 Matt Fleming 2016-04-25 142 efi_capsule_update_locked(efi_capsule_header_t *capsule, f0133f3c5b8bb3 Matt Fleming 2016-04-25 143 struct page **sg_pages, int reset) f0133f3c5b8bb3 Matt Fleming 2016-04-25 144 { f0133f3c5b8bb3 Matt Fleming 2016-04-25 145 efi_physical_addr_t sglist_phys; f0133f3c5b8bb3 Matt Fleming 2016-04-25 146 efi_status_t status; f0133f3c5b8bb3 Matt Fleming 2016-04-25 147 f0133f3c5b8bb3 Matt Fleming 2016-04-25 148 lockdep_assert_held(&capsule_mutex); f0133f3c5b8bb3 Matt Fleming 2016-04-25 149 f0133f3c5b8bb3 Matt Fleming 2016-04-25 150 /* f0133f3c5b8bb3 Matt Fleming 2016-04-25 151 * If someone has already registered a capsule that requires a f0133f3c5b8bb3 Matt Fleming 2016-04-25 152 * different reset type, we're out of luck and must abort. f0133f3c5b8bb3 Matt Fleming 2016-04-25 153 */ f0133f3c5b8bb3 Matt Fleming 2016-04-25 154 if (efi_reset_type >= 0 && efi_reset_type != reset) { f0133f3c5b8bb3 Matt Fleming 2016-04-25 155 pr_err("Conflicting capsule reset type %d (%d).\n", f0133f3c5b8bb3 Matt Fleming 2016-04-25 156 reset, efi_reset_type); f0133f3c5b8bb3 Matt Fleming 2016-04-25 157 return -EINVAL; f0133f3c5b8bb3 Matt Fleming 2016-04-25 158 } f0133f3c5b8bb3 Matt Fleming 2016-04-25 159 f0133f3c5b8bb3 Matt Fleming 2016-04-25 160 /* f0133f3c5b8bb3 Matt Fleming 2016-04-25 161 * If the system is getting ready to restart it may have f0133f3c5b8bb3 Matt Fleming 2016-04-25 162 * called efi_capsule_pending() to make decisions (such as f0133f3c5b8bb3 Matt Fleming 2016-04-25 163 * whether to force an EFI reboot), and we're racing against f0133f3c5b8bb3 Matt Fleming 2016-04-25 164 * that call. Abort in that case. f0133f3c5b8bb3 Matt Fleming 2016-04-25 165 */ 62075e581802ea Matt Fleming 2016-05-06 166 if (unlikely(stop_capsules)) { f0133f3c5b8bb3 Matt Fleming 2016-04-25 167 pr_warn("Capsule update raced with reboot, aborting.\n"); f0133f3c5b8bb3 Matt Fleming 2016-04-25 168 return -EINVAL; f0133f3c5b8bb3 Matt Fleming 2016-04-25 169 } f0133f3c5b8bb3 Matt Fleming 2016-04-25 170 f0133f3c5b8bb3 Matt Fleming 2016-04-25 @171 sglist_phys = page_to_phys(sg_pages[0]); f0133f3c5b8bb3 Matt Fleming 2016-04-25 172 f0133f3c5b8bb3 Matt Fleming 2016-04-25 173 status = efi.update_capsule(&capsule, 1, sglist_phys); f0133f3c5b8bb3 Matt Fleming 2016-04-25 174 if (status == EFI_SUCCESS) { f0133f3c5b8bb3 Matt Fleming 2016-04-25 175 capsule_pending = true; f0133f3c5b8bb3 Matt Fleming 2016-04-25 176 efi_reset_type = reset; f0133f3c5b8bb3 Matt Fleming 2016-04-25 177 } f0133f3c5b8bb3 Matt Fleming 2016-04-25 178 f0133f3c5b8bb3 Matt Fleming 2016-04-25 179 return efi_status_to_err(status); f0133f3c5b8bb3 Matt Fleming 2016-04-25 180 } f0133f3c5b8bb3 Matt Fleming 2016-04-25 181 f0133f3c5b8bb3 Matt Fleming 2016-04-25 182 /** f0133f3c5b8bb3 Matt Fleming 2016-04-25 183 * efi_capsule_update - send a capsule to the firmware f0133f3c5b8bb3 Matt Fleming 2016-04-25 184 * @capsule: capsule to send to firmware f0133f3c5b8bb3 Matt Fleming 2016-04-25 185 * @pages: an array of capsule data pages f0133f3c5b8bb3 Matt Fleming 2016-04-25 186 * f0133f3c5b8bb3 Matt Fleming 2016-04-25 187 * Build a scatter gather list with EFI capsule block descriptors to f0133f3c5b8bb3 Matt Fleming 2016-04-25 188 * map the capsule described by @capsule with its data in @pages and f0133f3c5b8bb3 Matt Fleming 2016-04-25 189 * send it to the firmware via the UpdateCapsule() runtime service. f0133f3c5b8bb3 Matt Fleming 2016-04-25 190 * 6862e6ad95e984 Austin Christ 2016-08-11 191 * @capsule must be a virtual mapping of the complete capsule update in the 6862e6ad95e984 Austin Christ 2016-08-11 192 * kernel address space, as the capsule can be consumed immediately. 6862e6ad95e984 Austin Christ 2016-08-11 193 * A capsule_header_t that describes the entire contents of the capsule f0133f3c5b8bb3 Matt Fleming 2016-04-25 194 * must be at the start of the first data page. f0133f3c5b8bb3 Matt Fleming 2016-04-25 195 * f0133f3c5b8bb3 Matt Fleming 2016-04-25 196 * Even though this function will validate that the firmware supports f0133f3c5b8bb3 Matt Fleming 2016-04-25 197 * the capsule guid, users will likely want to check that f0133f3c5b8bb3 Matt Fleming 2016-04-25 198 * efi_capsule_supported() returns true before calling this function f0133f3c5b8bb3 Matt Fleming 2016-04-25 199 * because it makes it easier to print helpful error messages. f0133f3c5b8bb3 Matt Fleming 2016-04-25 200 * f0133f3c5b8bb3 Matt Fleming 2016-04-25 201 * If the capsule is successfully submitted to the firmware, any f0133f3c5b8bb3 Matt Fleming 2016-04-25 202 * subsequent calls to efi_capsule_pending() will return true. @pages f0133f3c5b8bb3 Matt Fleming 2016-04-25 203 * must not be released or modified if this function returns f0133f3c5b8bb3 Matt Fleming 2016-04-25 204 * successfully. f0133f3c5b8bb3 Matt Fleming 2016-04-25 205 * f0133f3c5b8bb3 Matt Fleming 2016-04-25 206 * Callers must be prepared for this function to fail, which can f0133f3c5b8bb3 Matt Fleming 2016-04-25 207 * happen if we raced with system reboot or if there is already a f0133f3c5b8bb3 Matt Fleming 2016-04-25 208 * pending capsule that has a reset type that conflicts with the one f0133f3c5b8bb3 Matt Fleming 2016-04-25 209 * required by @capsule. Do NOT use efi_capsule_pending() to detect f0133f3c5b8bb3 Matt Fleming 2016-04-25 210 * this conflict since that would be racy. Instead, submit the capsule f0133f3c5b8bb3 Matt Fleming 2016-04-25 211 * to efi_capsule_update() and check the return value. f0133f3c5b8bb3 Matt Fleming 2016-04-25 212 * f0133f3c5b8bb3 Matt Fleming 2016-04-25 213 * Return 0 on success, a converted EFI status code on failure. f0133f3c5b8bb3 Matt Fleming 2016-04-25 214 */ 2a457fb31df62c Ard Biesheuvel 2017-06-02 215 int efi_capsule_update(efi_capsule_header_t *capsule, phys_addr_t *pages) f0133f3c5b8bb3 Matt Fleming 2016-04-25 216 { f0133f3c5b8bb3 Matt Fleming 2016-04-25 217 u32 imagesize = capsule->imagesize; f0133f3c5b8bb3 Matt Fleming 2016-04-25 218 efi_guid_t guid = capsule->guid; f0133f3c5b8bb3 Matt Fleming 2016-04-25 219 unsigned int count, sg_count; f0133f3c5b8bb3 Matt Fleming 2016-04-25 220 u32 flags = capsule->flags; f0133f3c5b8bb3 Matt Fleming 2016-04-25 221 struct page **sg_pages; f0133f3c5b8bb3 Matt Fleming 2016-04-25 222 int rv, reset_type; f0133f3c5b8bb3 Matt Fleming 2016-04-25 223 int i, j; f0133f3c5b8bb3 Matt Fleming 2016-04-25 224 f0133f3c5b8bb3 Matt Fleming 2016-04-25 225 rv = efi_capsule_supported(guid, flags, imagesize, &reset_type); f0133f3c5b8bb3 Matt Fleming 2016-04-25 226 if (rv) f0133f3c5b8bb3 Matt Fleming 2016-04-25 227 return rv; f0133f3c5b8bb3 Matt Fleming 2016-04-25 228 f0133f3c5b8bb3 Matt Fleming 2016-04-25 229 count = DIV_ROUND_UP(imagesize, PAGE_SIZE); f0133f3c5b8bb3 Matt Fleming 2016-04-25 230 sg_count = sg_pages_num(count); f0133f3c5b8bb3 Matt Fleming 2016-04-25 231 6396bb221514d2 Kees Cook 2018-06-12 232 sg_pages = kcalloc(sg_count, sizeof(*sg_pages), GFP_KERNEL); f0133f3c5b8bb3 Matt Fleming 2016-04-25 233 if (!sg_pages) f0133f3c5b8bb3 Matt Fleming 2016-04-25 234 return -ENOMEM; f0133f3c5b8bb3 Matt Fleming 2016-04-25 235 f0133f3c5b8bb3 Matt Fleming 2016-04-25 236 for (i = 0; i < sg_count; i++) { f0133f3c5b8bb3 Matt Fleming 2016-04-25 237 sg_pages[i] = alloc_page(GFP_KERNEL); f0133f3c5b8bb3 Matt Fleming 2016-04-25 238 if (!sg_pages[i]) { f0133f3c5b8bb3 Matt Fleming 2016-04-25 239 rv = -ENOMEM; f0133f3c5b8bb3 Matt Fleming 2016-04-25 240 goto out; f0133f3c5b8bb3 Matt Fleming 2016-04-25 241 } f0133f3c5b8bb3 Matt Fleming 2016-04-25 242 } f0133f3c5b8bb3 Matt Fleming 2016-04-25 243 f0133f3c5b8bb3 Matt Fleming 2016-04-25 244 for (i = 0; i < sg_count; i++) { f0133f3c5b8bb3 Matt Fleming 2016-04-25 245 efi_capsule_block_desc_t *sglist; f0133f3c5b8bb3 Matt Fleming 2016-04-25 246 f0133f3c5b8bb3 Matt Fleming 2016-04-25 247 sglist = kmap(sg_pages[i]); f0133f3c5b8bb3 Matt Fleming 2016-04-25 248 f0133f3c5b8bb3 Matt Fleming 2016-04-25 249 for (j = 0; j < SGLIST_PER_PAGE && count > 0; j++) { 2a457fb31df62c Ard Biesheuvel 2017-06-02 250 u64 sz = min_t(u64, imagesize, 2a457fb31df62c Ard Biesheuvel 2017-06-02 251 PAGE_SIZE - (u64)*pages % PAGE_SIZE); f0133f3c5b8bb3 Matt Fleming 2016-04-25 252 f0133f3c5b8bb3 Matt Fleming 2016-04-25 253 sglist[j].length = sz; 2a457fb31df62c Ard Biesheuvel 2017-06-02 254 sglist[j].data = *pages++; f0133f3c5b8bb3 Matt Fleming 2016-04-25 255 f0133f3c5b8bb3 Matt Fleming 2016-04-25 256 imagesize -= sz; f0133f3c5b8bb3 Matt Fleming 2016-04-25 257 count--; f0133f3c5b8bb3 Matt Fleming 2016-04-25 258 } f0133f3c5b8bb3 Matt Fleming 2016-04-25 259 f0133f3c5b8bb3 Matt Fleming 2016-04-25 260 /* Continuation pointer */ f0133f3c5b8bb3 Matt Fleming 2016-04-25 261 sglist[j].length = 0; f0133f3c5b8bb3 Matt Fleming 2016-04-25 262 f0133f3c5b8bb3 Matt Fleming 2016-04-25 263 if (i + 1 == sg_count) f0133f3c5b8bb3 Matt Fleming 2016-04-25 264 sglist[j].data = 0; f0133f3c5b8bb3 Matt Fleming 2016-04-25 265 else f0133f3c5b8bb3 Matt Fleming 2016-04-25 @266 sglist[j].data = page_to_phys(sg_pages[i + 1]); f0133f3c5b8bb3 Matt Fleming 2016-04-25 267 f0133f3c5b8bb3 Matt Fleming 2016-04-25 268 kunmap(sg_pages[i]); f0133f3c5b8bb3 Matt Fleming 2016-04-25 269 } f0133f3c5b8bb3 Matt Fleming 2016-04-25 270 f0133f3c5b8bb3 Matt Fleming 2016-04-25 271 mutex_lock(&capsule_mutex); f0133f3c5b8bb3 Matt Fleming 2016-04-25 272 rv = efi_capsule_update_locked(capsule, sg_pages, reset_type); f0133f3c5b8bb3 Matt Fleming 2016-04-25 273 mutex_unlock(&capsule_mutex); f0133f3c5b8bb3 Matt Fleming 2016-04-25 274 f0133f3c5b8bb3 Matt Fleming 2016-04-25 275 out: f0133f3c5b8bb3 Matt Fleming 2016-04-25 276 for (i = 0; rv && i < sg_count; i++) { f0133f3c5b8bb3 Matt Fleming 2016-04-25 277 if (sg_pages[i]) f0133f3c5b8bb3 Matt Fleming 2016-04-25 278 __free_page(sg_pages[i]); f0133f3c5b8bb3 Matt Fleming 2016-04-25 279 } f0133f3c5b8bb3 Matt Fleming 2016-04-25 280 f0133f3c5b8bb3 Matt Fleming 2016-04-25 281 kfree(sg_pages); f0133f3c5b8bb3 Matt Fleming 2016-04-25 282 return rv; f0133f3c5b8bb3 Matt Fleming 2016-04-25 283 } f0133f3c5b8bb3 Matt Fleming 2016-04-25 284 EXPORT_SYMBOL_GPL(efi_capsule_update); 62075e581802ea Matt Fleming 2016-05-06 285 :::::: The code at line 171 was first introduced by commit :::::: f0133f3c5b8bb34ec4dec50c27e7a655aeee8935 efi: Add 'capsule' update support :::::: TO: Matt Fleming <[email protected]> :::::: CC: Ingo Molnar <[email protected]> --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected]
.config.gz
Description: application/gzip
_______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
