* [linux-stable-rc:linux-3.16.y 2872/2959] arch/x86/boot/compressed/../../../../drivers/firmware/efi/efi-stub-helper.c:566:2: warning: implicit declaration of function 'memcpy'
@ 2017-11-13 16:20 kbuild test robot
0 siblings, 0 replies; only message in thread
From: kbuild test robot @ 2017-11-13 16:20 UTC (permalink / raw)
To: Andrey Ryabinin
Cc: kbuild-all, Ben Hutchings, Andrey Konovalov, Andrew Morton,
Linux Memory Management List, Greg Kroah-Hartman, Arnd Bergmann
[-- Attachment #1: Type: text/plain, Size: 17735 bytes --]
Hi Andrey,
First bad commit (maybe != root cause):
tree: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-3.16.y
head: 2447a018c3226c811528bb70024c6ffd83342a70
commit: 3cb0dc19883f0c69225311d4f76aa8128d3681a4 [2872/2959] module: fix types of device tables aliases
config: i386-allmodconfig (attached as .config)
compiler: gcc-6 (Debian 6.4.0-9) 6.4.0 20171026
reproduce:
git checkout 3cb0dc19883f0c69225311d4f76aa8128d3681a4
# save the attached .config to linux build tree
make ARCH=i386
All warnings (new ones prefixed by >>):
In file included from arch/x86/boot/compressed/eboot.c:287:0:
arch/x86/boot/compressed/../../../../drivers/firmware/efi/efi-stub-helper.c: In function 'efi_relocate_kernel':
>> arch/x86/boot/compressed/../../../../drivers/firmware/efi/efi-stub-helper.c:566:2: warning: implicit declaration of function 'memcpy' [-Wimplicit-function-declaration]
memcpy((void *)new_addr, (void *)cur_image_addr, image_size);
^~~~~~
vim +/memcpy +566 arch/x86/boot/compressed/../../../../drivers/firmware/efi/efi-stub-helper.c
7721da4c Roy Franz 2013-09-22 321
7721da4c Roy Franz 2013-09-22 322
7721da4c Roy Franz 2013-09-22 323 /*
36f8961c Roy Franz 2013-09-22 324 * Check the cmdline for a LILO-style file= arguments.
7721da4c Roy Franz 2013-09-22 325 *
36f8961c Roy Franz 2013-09-22 326 * We only support loading a file from the same filesystem as
36f8961c Roy Franz 2013-09-22 327 * the kernel image.
7721da4c Roy Franz 2013-09-22 328 */
46f4582e Roy Franz 2013-09-22 329 static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
876dc36a Roy Franz 2013-09-22 330 efi_loaded_image_t *image,
46f4582e Roy Franz 2013-09-22 331 char *cmd_line, char *option_string,
46f4582e Roy Franz 2013-09-22 332 unsigned long max_addr,
46f4582e Roy Franz 2013-09-22 333 unsigned long *load_addr,
46f4582e Roy Franz 2013-09-22 334 unsigned long *load_size)
7721da4c Roy Franz 2013-09-22 335 {
36f8961c Roy Franz 2013-09-22 336 struct file_info *files;
36f8961c Roy Franz 2013-09-22 337 unsigned long file_addr;
36f8961c Roy Franz 2013-09-22 338 u64 file_size_total;
9403e462 Leif Lindholm 2014-04-04 339 efi_file_handle_t *fh = NULL;
7721da4c Roy Franz 2013-09-22 340 efi_status_t status;
36f8961c Roy Franz 2013-09-22 341 int nr_files;
7721da4c Roy Franz 2013-09-22 342 char *str;
7721da4c Roy Franz 2013-09-22 343 int i, j, k;
7721da4c Roy Franz 2013-09-22 344
36f8961c Roy Franz 2013-09-22 345 file_addr = 0;
36f8961c Roy Franz 2013-09-22 346 file_size_total = 0;
7721da4c Roy Franz 2013-09-22 347
46f4582e Roy Franz 2013-09-22 348 str = cmd_line;
7721da4c Roy Franz 2013-09-22 349
7721da4c Roy Franz 2013-09-22 350 j = 0; /* See close_handles */
7721da4c Roy Franz 2013-09-22 351
46f4582e Roy Franz 2013-09-22 352 if (!load_addr || !load_size)
46f4582e Roy Franz 2013-09-22 353 return EFI_INVALID_PARAMETER;
46f4582e Roy Franz 2013-09-22 354
46f4582e Roy Franz 2013-09-22 355 *load_addr = 0;
46f4582e Roy Franz 2013-09-22 356 *load_size = 0;
46f4582e Roy Franz 2013-09-22 357
7721da4c Roy Franz 2013-09-22 358 if (!str || !*str)
7721da4c Roy Franz 2013-09-22 359 return EFI_SUCCESS;
7721da4c Roy Franz 2013-09-22 360
36f8961c Roy Franz 2013-09-22 361 for (nr_files = 0; *str; nr_files++) {
46f4582e Roy Franz 2013-09-22 362 str = strstr(str, option_string);
7721da4c Roy Franz 2013-09-22 363 if (!str)
7721da4c Roy Franz 2013-09-22 364 break;
7721da4c Roy Franz 2013-09-22 365
46f4582e Roy Franz 2013-09-22 366 str += strlen(option_string);
7721da4c Roy Franz 2013-09-22 367
7721da4c Roy Franz 2013-09-22 368 /* Skip any leading slashes */
7721da4c Roy Franz 2013-09-22 369 while (*str == '/' || *str == '\\')
7721da4c Roy Franz 2013-09-22 370 str++;
7721da4c Roy Franz 2013-09-22 371
7721da4c Roy Franz 2013-09-22 372 while (*str && *str != ' ' && *str != '\n')
7721da4c Roy Franz 2013-09-22 373 str++;
7721da4c Roy Franz 2013-09-22 374 }
7721da4c Roy Franz 2013-09-22 375
36f8961c Roy Franz 2013-09-22 376 if (!nr_files)
7721da4c Roy Franz 2013-09-22 377 return EFI_SUCCESS;
7721da4c Roy Franz 2013-09-22 378
204b0a1a Matt Fleming 2014-03-22 379 status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
54b52d87 Matt Fleming 2014-01-10 380 nr_files * sizeof(*files), (void **)&files);
7721da4c Roy Franz 2013-09-22 381 if (status != EFI_SUCCESS) {
f966ea02 Roy Franz 2013-12-13 382 pr_efi_err(sys_table_arg, "Failed to alloc mem for file handle list\n");
7721da4c Roy Franz 2013-09-22 383 goto fail;
7721da4c Roy Franz 2013-09-22 384 }
7721da4c Roy Franz 2013-09-22 385
46f4582e Roy Franz 2013-09-22 386 str = cmd_line;
36f8961c Roy Franz 2013-09-22 387 for (i = 0; i < nr_files; i++) {
36f8961c Roy Franz 2013-09-22 388 struct file_info *file;
7721da4c Roy Franz 2013-09-22 389 efi_char16_t filename_16[256];
7721da4c Roy Franz 2013-09-22 390 efi_char16_t *p;
7721da4c Roy Franz 2013-09-22 391
46f4582e Roy Franz 2013-09-22 392 str = strstr(str, option_string);
7721da4c Roy Franz 2013-09-22 393 if (!str)
7721da4c Roy Franz 2013-09-22 394 break;
7721da4c Roy Franz 2013-09-22 395
46f4582e Roy Franz 2013-09-22 396 str += strlen(option_string);
7721da4c Roy Franz 2013-09-22 397
36f8961c Roy Franz 2013-09-22 398 file = &files[i];
7721da4c Roy Franz 2013-09-22 399 p = filename_16;
7721da4c Roy Franz 2013-09-22 400
7721da4c Roy Franz 2013-09-22 401 /* Skip any leading slashes */
7721da4c Roy Franz 2013-09-22 402 while (*str == '/' || *str == '\\')
7721da4c Roy Franz 2013-09-22 403 str++;
7721da4c Roy Franz 2013-09-22 404
7721da4c Roy Franz 2013-09-22 405 while (*str && *str != ' ' && *str != '\n') {
7721da4c Roy Franz 2013-09-22 406 if ((u8 *)p >= (u8 *)filename_16 + sizeof(filename_16))
7721da4c Roy Franz 2013-09-22 407 break;
7721da4c Roy Franz 2013-09-22 408
7721da4c Roy Franz 2013-09-22 409 if (*str == '/') {
7721da4c Roy Franz 2013-09-22 410 *p++ = '\\';
4e283088 Roy Franz 2013-09-22 411 str++;
7721da4c Roy Franz 2013-09-22 412 } else {
7721da4c Roy Franz 2013-09-22 413 *p++ = *str++;
7721da4c Roy Franz 2013-09-22 414 }
7721da4c Roy Franz 2013-09-22 415 }
7721da4c Roy Franz 2013-09-22 416
7721da4c Roy Franz 2013-09-22 417 *p = '\0';
7721da4c Roy Franz 2013-09-22 418
7721da4c Roy Franz 2013-09-22 419 /* Only open the volume once. */
7721da4c Roy Franz 2013-09-22 420 if (!i) {
54b52d87 Matt Fleming 2014-01-10 421 status = efi_open_volume(sys_table_arg, image,
54b52d87 Matt Fleming 2014-01-10 422 (void **)&fh);
54b52d87 Matt Fleming 2014-01-10 423 if (status != EFI_SUCCESS)
36f8961c Roy Franz 2013-09-22 424 goto free_files;
7721da4c Roy Franz 2013-09-22 425 }
7721da4c Roy Franz 2013-09-22 426
54b52d87 Matt Fleming 2014-01-10 427 status = efi_file_size(sys_table_arg, fh, filename_16,
54b52d87 Matt Fleming 2014-01-10 428 (void **)&file->handle, &file->size);
54b52d87 Matt Fleming 2014-01-10 429 if (status != EFI_SUCCESS)
7721da4c Roy Franz 2013-09-22 430 goto close_handles;
7721da4c Roy Franz 2013-09-22 431
54b52d87 Matt Fleming 2014-01-10 432 file_size_total += file->size;
7721da4c Roy Franz 2013-09-22 433 }
7721da4c Roy Franz 2013-09-22 434
36f8961c Roy Franz 2013-09-22 435 if (file_size_total) {
7721da4c Roy Franz 2013-09-22 436 unsigned long addr;
7721da4c Roy Franz 2013-09-22 437
7721da4c Roy Franz 2013-09-22 438 /*
36f8961c Roy Franz 2013-09-22 439 * Multiple files need to be at consecutive addresses in memory,
36f8961c Roy Franz 2013-09-22 440 * so allocate enough memory for all the files. This is used
36f8961c Roy Franz 2013-09-22 441 * for loading multiple files.
7721da4c Roy Franz 2013-09-22 442 */
36f8961c Roy Franz 2013-09-22 443 status = efi_high_alloc(sys_table_arg, file_size_total, 0x1000,
36f8961c Roy Franz 2013-09-22 444 &file_addr, max_addr);
7721da4c Roy Franz 2013-09-22 445 if (status != EFI_SUCCESS) {
f966ea02 Roy Franz 2013-12-13 446 pr_efi_err(sys_table_arg, "Failed to alloc highmem for files\n");
7721da4c Roy Franz 2013-09-22 447 goto close_handles;
7721da4c Roy Franz 2013-09-22 448 }
7721da4c Roy Franz 2013-09-22 449
7721da4c Roy Franz 2013-09-22 450 /* We've run out of free low memory. */
36f8961c Roy Franz 2013-09-22 451 if (file_addr > max_addr) {
f966ea02 Roy Franz 2013-12-13 452 pr_efi_err(sys_table_arg, "We've run out of free low memory\n");
7721da4c Roy Franz 2013-09-22 453 status = EFI_INVALID_PARAMETER;
36f8961c Roy Franz 2013-09-22 454 goto free_file_total;
7721da4c Roy Franz 2013-09-22 455 }
7721da4c Roy Franz 2013-09-22 456
36f8961c Roy Franz 2013-09-22 457 addr = file_addr;
36f8961c Roy Franz 2013-09-22 458 for (j = 0; j < nr_files; j++) {
6a5fe770 Roy Franz 2013-09-22 459 unsigned long size;
7721da4c Roy Franz 2013-09-22 460
36f8961c Roy Franz 2013-09-22 461 size = files[j].size;
7721da4c Roy Franz 2013-09-22 462 while (size) {
6a5fe770 Roy Franz 2013-09-22 463 unsigned long chunksize;
7721da4c Roy Franz 2013-09-22 464 if (size > EFI_READ_CHUNK_SIZE)
7721da4c Roy Franz 2013-09-22 465 chunksize = EFI_READ_CHUNK_SIZE;
7721da4c Roy Franz 2013-09-22 466 else
7721da4c Roy Franz 2013-09-22 467 chunksize = size;
54b52d87 Matt Fleming 2014-01-10 468
47514c99 Matt Fleming 2014-04-10 469 status = efi_file_read(files[j].handle,
6a5fe770 Roy Franz 2013-09-22 470 &chunksize,
6a5fe770 Roy Franz 2013-09-22 471 (void *)addr);
7721da4c Roy Franz 2013-09-22 472 if (status != EFI_SUCCESS) {
f966ea02 Roy Franz 2013-12-13 473 pr_efi_err(sys_table_arg, "Failed to read file\n");
36f8961c Roy Franz 2013-09-22 474 goto free_file_total;
7721da4c Roy Franz 2013-09-22 475 }
7721da4c Roy Franz 2013-09-22 476 addr += chunksize;
7721da4c Roy Franz 2013-09-22 477 size -= chunksize;
7721da4c Roy Franz 2013-09-22 478 }
7721da4c Roy Franz 2013-09-22 479
47514c99 Matt Fleming 2014-04-10 480 efi_file_close(files[j].handle);
7721da4c Roy Franz 2013-09-22 481 }
7721da4c Roy Franz 2013-09-22 482
7721da4c Roy Franz 2013-09-22 483 }
7721da4c Roy Franz 2013-09-22 484
204b0a1a Matt Fleming 2014-03-22 485 efi_call_early(free_pool, files);
7721da4c Roy Franz 2013-09-22 486
36f8961c Roy Franz 2013-09-22 487 *load_addr = file_addr;
36f8961c Roy Franz 2013-09-22 488 *load_size = file_size_total;
7721da4c Roy Franz 2013-09-22 489
7721da4c Roy Franz 2013-09-22 490 return status;
7721da4c Roy Franz 2013-09-22 491
36f8961c Roy Franz 2013-09-22 492 free_file_total:
36f8961c Roy Franz 2013-09-22 493 efi_free(sys_table_arg, file_size_total, file_addr);
7721da4c Roy Franz 2013-09-22 494
7721da4c Roy Franz 2013-09-22 495 close_handles:
7721da4c Roy Franz 2013-09-22 496 for (k = j; k < i; k++)
47514c99 Matt Fleming 2014-04-10 497 efi_file_close(files[k].handle);
36f8961c Roy Franz 2013-09-22 498 free_files:
204b0a1a Matt Fleming 2014-03-22 499 efi_call_early(free_pool, files);
7721da4c Roy Franz 2013-09-22 500 fail:
46f4582e Roy Franz 2013-09-22 501 *load_addr = 0;
46f4582e Roy Franz 2013-09-22 502 *load_size = 0;
7721da4c Roy Franz 2013-09-22 503
7721da4c Roy Franz 2013-09-22 504 return status;
7721da4c Roy Franz 2013-09-22 505 }
4a9f3a7c Roy Franz 2013-09-22 506 /*
4a9f3a7c Roy Franz 2013-09-22 507 * Relocate a kernel image, either compressed or uncompressed.
4a9f3a7c Roy Franz 2013-09-22 508 * In the ARM64 case, all kernel images are currently
4a9f3a7c Roy Franz 2013-09-22 509 * uncompressed, and as such when we relocate it we need to
4a9f3a7c Roy Franz 2013-09-22 510 * allocate additional space for the BSS segment. Any low
4a9f3a7c Roy Franz 2013-09-22 511 * memory that this function should avoid needs to be
4a9f3a7c Roy Franz 2013-09-22 512 * unavailable in the EFI memory map, as if the preferred
4a9f3a7c Roy Franz 2013-09-22 513 * address is not available the lowest available address will
4a9f3a7c Roy Franz 2013-09-22 514 * be used.
4a9f3a7c Roy Franz 2013-09-22 515 */
4a9f3a7c Roy Franz 2013-09-22 516 static efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
4a9f3a7c Roy Franz 2013-09-22 517 unsigned long *image_addr,
4a9f3a7c Roy Franz 2013-09-22 518 unsigned long image_size,
4a9f3a7c Roy Franz 2013-09-22 519 unsigned long alloc_size,
4a9f3a7c Roy Franz 2013-09-22 520 unsigned long preferred_addr,
4a9f3a7c Roy Franz 2013-09-22 521 unsigned long alignment)
c6866d72 Roy Franz 2013-09-22 522 {
4a9f3a7c Roy Franz 2013-09-22 523 unsigned long cur_image_addr;
4a9f3a7c Roy Franz 2013-09-22 524 unsigned long new_addr = 0;
c6866d72 Roy Franz 2013-09-22 525 efi_status_t status;
4a9f3a7c Roy Franz 2013-09-22 526 unsigned long nr_pages;
4a9f3a7c Roy Franz 2013-09-22 527 efi_physical_addr_t efi_addr = preferred_addr;
4a9f3a7c Roy Franz 2013-09-22 528
4a9f3a7c Roy Franz 2013-09-22 529 if (!image_addr || !image_size || !alloc_size)
4a9f3a7c Roy Franz 2013-09-22 530 return EFI_INVALID_PARAMETER;
4a9f3a7c Roy Franz 2013-09-22 531 if (alloc_size < image_size)
4a9f3a7c Roy Franz 2013-09-22 532 return EFI_INVALID_PARAMETER;
4a9f3a7c Roy Franz 2013-09-22 533
4a9f3a7c Roy Franz 2013-09-22 534 cur_image_addr = *image_addr;
c6866d72 Roy Franz 2013-09-22 535
c6866d72 Roy Franz 2013-09-22 536 /*
c6866d72 Roy Franz 2013-09-22 537 * The EFI firmware loader could have placed the kernel image
4a9f3a7c Roy Franz 2013-09-22 538 * anywhere in memory, but the kernel has restrictions on the
4a9f3a7c Roy Franz 2013-09-22 539 * max physical address it can run at. Some architectures
4a9f3a7c Roy Franz 2013-09-22 540 * also have a prefered address, so first try to relocate
4a9f3a7c Roy Franz 2013-09-22 541 * to the preferred address. If that fails, allocate as low
4a9f3a7c Roy Franz 2013-09-22 542 * as possible while respecting the required alignment.
c6866d72 Roy Franz 2013-09-22 543 */
4a9f3a7c Roy Franz 2013-09-22 544 nr_pages = round_up(alloc_size, EFI_PAGE_SIZE) / EFI_PAGE_SIZE;
204b0a1a Matt Fleming 2014-03-22 545 status = efi_call_early(allocate_pages,
c6866d72 Roy Franz 2013-09-22 546 EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA,
4a9f3a7c Roy Franz 2013-09-22 547 nr_pages, &efi_addr);
4a9f3a7c Roy Franz 2013-09-22 548 new_addr = efi_addr;
4a9f3a7c Roy Franz 2013-09-22 549 /*
4a9f3a7c Roy Franz 2013-09-22 550 * If preferred address allocation failed allocate as low as
4a9f3a7c Roy Franz 2013-09-22 551 * possible.
4a9f3a7c Roy Franz 2013-09-22 552 */
c6866d72 Roy Franz 2013-09-22 553 if (status != EFI_SUCCESS) {
4a9f3a7c Roy Franz 2013-09-22 554 status = efi_low_alloc(sys_table_arg, alloc_size, alignment,
4a9f3a7c Roy Franz 2013-09-22 555 &new_addr);
4a9f3a7c Roy Franz 2013-09-22 556 }
4a9f3a7c Roy Franz 2013-09-22 557 if (status != EFI_SUCCESS) {
f966ea02 Roy Franz 2013-12-13 558 pr_efi_err(sys_table_arg, "Failed to allocate usable memory for kernel.\n");
4a9f3a7c Roy Franz 2013-09-22 559 return status;
c6866d72 Roy Franz 2013-09-22 560 }
c6866d72 Roy Franz 2013-09-22 561
4a9f3a7c Roy Franz 2013-09-22 562 /*
4a9f3a7c Roy Franz 2013-09-22 563 * We know source/dest won't overlap since both memory ranges
4a9f3a7c Roy Franz 2013-09-22 564 * have been allocated by UEFI, so we can safely use memcpy.
4a9f3a7c Roy Franz 2013-09-22 565 */
4a9f3a7c Roy Franz 2013-09-22 @566 memcpy((void *)new_addr, (void *)cur_image_addr, image_size);
c6866d72 Roy Franz 2013-09-22 567
4a9f3a7c Roy Franz 2013-09-22 568 /* Return the new address of the relocated image. */
4a9f3a7c Roy Franz 2013-09-22 569 *image_addr = new_addr;
c6866d72 Roy Franz 2013-09-22 570
c6866d72 Roy Franz 2013-09-22 571 return status;
c6866d72 Roy Franz 2013-09-22 572 }
5fef3870 Roy Franz 2013-09-22 573
:::::: The code at line 566 was first introduced by commit
:::::: 4a9f3a7c336a6b0ffeef2523bef93e67b0921163 efi: Generalize relocate_kernel() for use by other architectures.
:::::: TO: Roy Franz <roy.franz@linaro.org>
:::::: CC: Matt Fleming <matt.fleming@intel.com>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 46363 bytes --]
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2017-11-13 16:21 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-13 16:20 [linux-stable-rc:linux-3.16.y 2872/2959] arch/x86/boot/compressed/../../../../drivers/firmware/efi/efi-stub-helper.c:566:2: warning: implicit declaration of function 'memcpy' kbuild test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox