* [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 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.