.. | .. |
---|
18 | 18 | #include <dt_table.h> |
---|
19 | 19 | #include <image-android-dt.h> |
---|
20 | 20 | #include <malloc.h> |
---|
| 21 | +#include <mp_boot.h> |
---|
21 | 22 | #include <fdt_support.h> |
---|
22 | 23 | #include <fs.h> |
---|
23 | 24 | #include <boot_rkimg.h> |
---|
.. | .. |
---|
462 | 463 | slot->successful_boot = 0; |
---|
463 | 464 | } |
---|
464 | 465 | |
---|
| 466 | +static char *join_str(const char *a, const char *b) |
---|
| 467 | +{ |
---|
| 468 | + size_t len = strlen(a) + strlen(b) + 1 /* null term */; |
---|
| 469 | + char *ret = (char *)malloc(len); |
---|
| 470 | + |
---|
| 471 | + if (!ret) { |
---|
| 472 | + debug("failed to alloc %zu\n", len); |
---|
| 473 | + return NULL; |
---|
| 474 | + } |
---|
| 475 | + strcpy(ret, a); |
---|
| 476 | + strcat(ret, b); |
---|
| 477 | + |
---|
| 478 | + return ret; |
---|
| 479 | +} |
---|
| 480 | + |
---|
| 481 | +static size_t get_partition_size(AvbOps *ops, char *name, |
---|
| 482 | + const char *slot_suffix) |
---|
| 483 | +{ |
---|
| 484 | + char *partition_name = join_str(name, slot_suffix); |
---|
| 485 | + uint64_t size = 0; |
---|
| 486 | + AvbIOResult res; |
---|
| 487 | + |
---|
| 488 | + if (partition_name == NULL) |
---|
| 489 | + goto bail; |
---|
| 490 | + |
---|
| 491 | + res = ops->get_size_of_partition(ops, partition_name, &size); |
---|
| 492 | + if (res != AVB_IO_RESULT_OK && res != AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION) |
---|
| 493 | + size = 0; |
---|
| 494 | +bail: |
---|
| 495 | + if (partition_name) |
---|
| 496 | + free(partition_name); |
---|
| 497 | + |
---|
| 498 | + return size; |
---|
| 499 | +} |
---|
| 500 | + |
---|
| 501 | +static struct AvbOpsData preload_user_data; |
---|
| 502 | + |
---|
| 503 | +static int avb_image_distribute_prepare(AvbSlotVerifyData *slot_data, |
---|
| 504 | + AvbOps *ops, char *slot_suffix) |
---|
| 505 | +{ |
---|
| 506 | + struct AvbOpsData *data = (struct AvbOpsData *)(ops->user_data); |
---|
| 507 | + size_t vendor_boot_size; |
---|
| 508 | + size_t init_boot_size; |
---|
| 509 | + size_t resource_size; |
---|
| 510 | + size_t boot_size; |
---|
| 511 | + void *image_buf; |
---|
| 512 | + |
---|
| 513 | + boot_size = max(get_partition_size(ops, ANDROID_PARTITION_BOOT, slot_suffix), |
---|
| 514 | + get_partition_size(ops, ANDROID_PARTITION_RECOVERY, slot_suffix)); |
---|
| 515 | + init_boot_size = get_partition_size(ops, |
---|
| 516 | + ANDROID_PARTITION_INIT_BOOT, slot_suffix); |
---|
| 517 | + vendor_boot_size = get_partition_size(ops, |
---|
| 518 | + ANDROID_PARTITION_VENDOR_BOOT, slot_suffix); |
---|
| 519 | + resource_size = get_partition_size(ops, |
---|
| 520 | + ANDROID_PARTITION_RESOURCE, slot_suffix); |
---|
| 521 | + image_buf = sysmem_alloc(MEM_AVB_ANDROID, |
---|
| 522 | + boot_size + init_boot_size + |
---|
| 523 | + vendor_boot_size + resource_size); |
---|
| 524 | + if (!image_buf) { |
---|
| 525 | + printf("avb: sysmem alloc failed\n"); |
---|
| 526 | + return -ENOMEM; |
---|
| 527 | + } |
---|
| 528 | + |
---|
| 529 | + /* layout: | boot/recovery | vendor_boot | init_boot | resource | */ |
---|
| 530 | + data->slot_suffix = slot_suffix; |
---|
| 531 | + data->boot.addr = image_buf; |
---|
| 532 | + data->boot.size = 0; |
---|
| 533 | + data->vendor_boot.addr = data->boot.addr + boot_size; |
---|
| 534 | + data->vendor_boot.size = 0; |
---|
| 535 | + data->init_boot.addr = data->vendor_boot.addr + vendor_boot_size; |
---|
| 536 | + data->init_boot.size = 0; |
---|
| 537 | + data->resource.addr = data->init_boot.addr + init_boot_size; |
---|
| 538 | + data->resource.size = 0; |
---|
| 539 | + |
---|
| 540 | + return 0; |
---|
| 541 | +} |
---|
| 542 | + |
---|
| 543 | +static int avb_image_distribute_finish(AvbSlotVerifyData *slot_data, |
---|
| 544 | + AvbSlotVerifyFlags flags, |
---|
| 545 | + ulong *load_address) |
---|
| 546 | +{ |
---|
| 547 | + struct andr_img_hdr *hdr; |
---|
| 548 | + ulong load_addr = *load_address; |
---|
| 549 | + void *vendor_boot_hdr = NULL; |
---|
| 550 | + void *init_boot_hdr = NULL; |
---|
| 551 | + void *boot_hdr = NULL; |
---|
| 552 | + char *part_name; |
---|
| 553 | + int i, ret; |
---|
| 554 | + |
---|
| 555 | + for (i = 0; i < slot_data->num_loaded_partitions; i++) { |
---|
| 556 | + part_name = slot_data->loaded_partitions[i].partition_name; |
---|
| 557 | + if (!strncmp(ANDROID_PARTITION_BOOT, part_name, 4) || |
---|
| 558 | + !strncmp(ANDROID_PARTITION_RECOVERY, part_name, 8)) { |
---|
| 559 | + boot_hdr = slot_data->loaded_partitions[i].data; |
---|
| 560 | + } else if (!strncmp(ANDROID_PARTITION_INIT_BOOT, part_name, 9)) { |
---|
| 561 | + init_boot_hdr = slot_data->loaded_partitions[i].data; |
---|
| 562 | + } else if (!strncmp(ANDROID_PARTITION_VENDOR_BOOT, part_name, 11)) { |
---|
| 563 | + vendor_boot_hdr = slot_data->loaded_partitions[i].data; |
---|
| 564 | + } |
---|
| 565 | + } |
---|
| 566 | + |
---|
| 567 | + /* |
---|
| 568 | + * populate boot_img_hdr_v34 |
---|
| 569 | + * |
---|
| 570 | + * If allow verification error: the images are loaded by |
---|
| 571 | + * ops->get_preloaded_partition() which auto populates |
---|
| 572 | + * boot_img_hdr_v34. |
---|
| 573 | + * |
---|
| 574 | + * If not allow verification error: the images are full loaded |
---|
| 575 | + * by ops->read_from_partition() which doesn't populate |
---|
| 576 | + * boot_img_hdr_v34, we need to fix it here for bootm and |
---|
| 577 | + */ |
---|
| 578 | + |
---|
| 579 | + hdr = boot_hdr; |
---|
| 580 | + if (hdr->header_version >= 3 && |
---|
| 581 | + !(flags & AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR)) { |
---|
| 582 | + hdr = malloc(sizeof(struct andr_img_hdr)); |
---|
| 583 | + if (!hdr) |
---|
| 584 | + return -ENOMEM; |
---|
| 585 | + |
---|
| 586 | + ret = populate_boot_info(boot_hdr, vendor_boot_hdr, |
---|
| 587 | + init_boot_hdr, hdr, true); |
---|
| 588 | + if (ret < 0) { |
---|
| 589 | + printf("avb: populate boot info failed, ret=%d\n", ret); |
---|
| 590 | + return ret; |
---|
| 591 | + } |
---|
| 592 | + memcpy(boot_hdr, hdr, sizeof(*hdr)); |
---|
| 593 | + } |
---|
| 594 | + |
---|
| 595 | + /* distribute ! */ |
---|
| 596 | + load_addr -= hdr->page_size; |
---|
| 597 | + if (android_image_memcpy_separate(boot_hdr, &load_addr)) { |
---|
| 598 | + printf("Failed to separate copy android image\n"); |
---|
| 599 | + return AVB_SLOT_VERIFY_RESULT_ERROR_IO; |
---|
| 600 | + } |
---|
| 601 | + |
---|
| 602 | + *load_address = load_addr; |
---|
| 603 | + |
---|
| 604 | + return 0; |
---|
| 605 | +} |
---|
| 606 | + |
---|
| 607 | +int android_image_verify_resource(const char *boot_part, ulong *resc_buf) |
---|
| 608 | +{ |
---|
| 609 | + const char *requested_partitions[] = { |
---|
| 610 | + NULL, |
---|
| 611 | + NULL, |
---|
| 612 | + }; |
---|
| 613 | + struct AvbOpsData *data; |
---|
| 614 | + uint8_t unlocked = true; |
---|
| 615 | + AvbOps *ops; |
---|
| 616 | + AvbSlotVerifyFlags flags; |
---|
| 617 | + AvbSlotVerifyData *slot_data = {NULL}; |
---|
| 618 | + AvbSlotVerifyResult verify_result; |
---|
| 619 | + char slot_suffix[3] = {0}; |
---|
| 620 | + char *part_name; |
---|
| 621 | + void *image_buf = NULL; |
---|
| 622 | + int retry_no_vbmeta_partition = 1; |
---|
| 623 | + int i, ret; |
---|
| 624 | + |
---|
| 625 | + ops = avb_ops_user_new(); |
---|
| 626 | + if (ops == NULL) { |
---|
| 627 | + printf("avb_ops_user_new() failed!\n"); |
---|
| 628 | + return -AVB_SLOT_VERIFY_RESULT_ERROR_OOM; |
---|
| 629 | + } |
---|
| 630 | + |
---|
| 631 | + if (ops->read_is_device_unlocked(ops, (bool *)&unlocked) != AVB_IO_RESULT_OK) |
---|
| 632 | + printf("Error determining whether device is unlocked.\n"); |
---|
| 633 | + |
---|
| 634 | + printf("Device is: %s\n", (unlocked & LOCK_MASK)? "UNLOCKED" : "LOCKED"); |
---|
| 635 | + |
---|
| 636 | + if (unlocked & LOCK_MASK) { |
---|
| 637 | + *resc_buf = 0; |
---|
| 638 | + return 0; |
---|
| 639 | + } |
---|
| 640 | + |
---|
| 641 | + flags = AVB_SLOT_VERIFY_FLAGS_NONE; |
---|
| 642 | + if (strcmp(boot_part, ANDROID_PARTITION_RECOVERY) == 0) |
---|
| 643 | + flags |= AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION; |
---|
| 644 | + |
---|
| 645 | +#ifdef CONFIG_ANDROID_AB |
---|
| 646 | + part_name = strdup(boot_part); |
---|
| 647 | + *(part_name + strlen(boot_part) - 2) = '\0'; |
---|
| 648 | + requested_partitions[0] = part_name; |
---|
| 649 | + |
---|
| 650 | + ret = rk_avb_get_current_slot(slot_suffix); |
---|
| 651 | + if (ret) { |
---|
| 652 | + printf("Failed to get slot suffix, ret=%d\n", ret); |
---|
| 653 | + return ret; |
---|
| 654 | + } |
---|
| 655 | +#else |
---|
| 656 | + requested_partitions[0] = boot_part; |
---|
| 657 | +#endif |
---|
| 658 | + data = (struct AvbOpsData *)(ops->user_data); |
---|
| 659 | + ret = avb_image_distribute_prepare(slot_data, ops, slot_suffix); |
---|
| 660 | + if (ret) { |
---|
| 661 | + printf("avb image distribute prepare failed %d\n", ret); |
---|
| 662 | + return ret; |
---|
| 663 | + } |
---|
| 664 | + |
---|
| 665 | +retry_verify: |
---|
| 666 | + verify_result = |
---|
| 667 | + avb_slot_verify(ops, |
---|
| 668 | + requested_partitions, |
---|
| 669 | + slot_suffix, |
---|
| 670 | + flags, |
---|
| 671 | + AVB_HASHTREE_ERROR_MODE_RESTART, |
---|
| 672 | + &slot_data); |
---|
| 673 | + if (verify_result != AVB_SLOT_VERIFY_RESULT_OK && |
---|
| 674 | + verify_result != AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED) { |
---|
| 675 | + if (retry_no_vbmeta_partition && strcmp(boot_part, ANDROID_PARTITION_RECOVERY) == 0) { |
---|
| 676 | + printf("Verify recovery with vbmeta.\n"); |
---|
| 677 | + flags &= ~AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION; |
---|
| 678 | + retry_no_vbmeta_partition = 0; |
---|
| 679 | + goto retry_verify; |
---|
| 680 | + } |
---|
| 681 | + } |
---|
| 682 | + |
---|
| 683 | + if (verify_result != AVB_SLOT_VERIFY_RESULT_OK || !slot_data) { |
---|
| 684 | + sysmem_free((ulong)data->boot.addr); |
---|
| 685 | + return verify_result; |
---|
| 686 | + } |
---|
| 687 | + |
---|
| 688 | + for (i = 0; i < slot_data->num_loaded_partitions; i++) { |
---|
| 689 | + part_name = slot_data->loaded_partitions[i].partition_name; |
---|
| 690 | + if (!strncmp(ANDROID_PARTITION_RESOURCE, part_name, 8)) { |
---|
| 691 | + image_buf = slot_data->loaded_partitions[i].data; |
---|
| 692 | + break; |
---|
| 693 | + } else if (!strncmp(ANDROID_PARTITION_BOOT, part_name, 4) || |
---|
| 694 | + !strncmp(ANDROID_PARTITION_RECOVERY, part_name, 8)) { |
---|
| 695 | + struct andr_img_hdr *hdr; |
---|
| 696 | + |
---|
| 697 | + hdr = (void *)slot_data->loaded_partitions[i].data; |
---|
| 698 | + if (android_image_check_header(hdr)) |
---|
| 699 | + continue; |
---|
| 700 | + |
---|
| 701 | + if (hdr->header_version <= 2) { |
---|
| 702 | + image_buf = (void *)hdr + hdr->page_size + |
---|
| 703 | + ALIGN(hdr->kernel_size, hdr->page_size) + |
---|
| 704 | + ALIGN(hdr->ramdisk_size, hdr->page_size); |
---|
| 705 | + break; |
---|
| 706 | + } |
---|
| 707 | + } |
---|
| 708 | + } |
---|
| 709 | + |
---|
| 710 | + if (image_buf) { |
---|
| 711 | + memcpy((char *)&preload_user_data, (char *)data, sizeof(*data)); |
---|
| 712 | + *resc_buf = (ulong)image_buf; |
---|
| 713 | + } |
---|
| 714 | + |
---|
| 715 | + return 0; |
---|
| 716 | +} |
---|
| 717 | + |
---|
| 718 | +/* |
---|
| 719 | + * AVB Policy. |
---|
| 720 | + * |
---|
| 721 | + * == avb with unlock: |
---|
| 722 | + * Don't process hash verify. |
---|
| 723 | + * Go pre-loaded path: Loading vendor_boot and init_boot |
---|
| 724 | + * directly to where they should be, while loading the |
---|
| 725 | + * boot/recovery. The boot message tells like: |
---|
| 726 | + * ··· |
---|
| 727 | + * preloaded: distribute image from 'boot_a' |
---|
| 728 | + * preloaded: distribute image from 'init_boot_a' |
---|
| 729 | + * preloaded: distribute image from 'vendor_boot_a' |
---|
| 730 | + * ··· |
---|
| 731 | + * |
---|
| 732 | + * == avb with lock: |
---|
| 733 | + * Process hash verify. |
---|
| 734 | + * Go pre-loaded path: Loading full vendor_boot, init_boot and |
---|
| 735 | + * boot/recovery one by one to verify, and distributing them to |
---|
| 736 | + * where they should be by memcpy at last. |
---|
| 737 | + * |
---|
| 738 | + * The three images share a large memory buffer that allocated |
---|
| 739 | + * by sysmem_alloc(), it locate at high memory address that |
---|
| 740 | + * just lower than SP bottom. The boot message tells like: |
---|
| 741 | + * ··· |
---|
| 742 | + * preloaded: full image from 'boot_a' at 0xe47f90c0 - 0xe7a4b0c0 |
---|
| 743 | + * preloaded: full image from 'init_boot_a' at 0xeaff90c0 - 0xeb2950c0 |
---|
| 744 | + * preloaded: full image from 'vendor_boot_a' at 0xe87f90c0 - 0xe9f6e0c0 |
---|
| 745 | + * ··· |
---|
| 746 | + */ |
---|
465 | 747 | static AvbSlotVerifyResult android_slot_verify(char *boot_partname, |
---|
466 | 748 | unsigned long *android_load_address, |
---|
467 | 749 | char *slot_suffix) |
---|
468 | 750 | { |
---|
469 | | - const char *requested_partitions[1] = {NULL}; |
---|
| 751 | + const char *requested_partitions[] = { |
---|
| 752 | + boot_partname, |
---|
| 753 | + NULL, |
---|
| 754 | + NULL, |
---|
| 755 | + NULL, |
---|
| 756 | + }; |
---|
| 757 | + struct AvbOpsData *data; |
---|
| 758 | + struct blk_desc *dev_desc; |
---|
| 759 | + struct andr_img_hdr *hdr; |
---|
| 760 | + disk_partition_t part_info; |
---|
470 | 761 | uint8_t unlocked = true; |
---|
471 | 762 | AvbOps *ops; |
---|
472 | 763 | AvbSlotVerifyFlags flags; |
---|
473 | | - AvbSlotVerifyData *slot_data[1] = {NULL}; |
---|
| 764 | + AvbSlotVerifyData *slot_data = {NULL}; |
---|
474 | 765 | AvbSlotVerifyResult verify_result; |
---|
475 | 766 | AvbABData ab_data, ab_data_orig; |
---|
476 | 767 | size_t slot_index_to_boot = 0; |
---|
.. | .. |
---|
478 | 769 | char can_boot = 1; |
---|
479 | 770 | char retry_no_vbmeta_partition = 1; |
---|
480 | 771 | unsigned long load_address = *android_load_address; |
---|
481 | | - struct andr_img_hdr *hdr; |
---|
| 772 | + int ret; |
---|
482 | 773 | |
---|
483 | | - requested_partitions[0] = boot_partname; |
---|
| 774 | + dev_desc = rockchip_get_bootdev(); |
---|
| 775 | + if (!dev_desc) |
---|
| 776 | + return AVB_IO_RESULT_ERROR_IO; |
---|
| 777 | + |
---|
| 778 | + if (part_get_info_by_name(dev_desc, boot_partname, &part_info) < 0) { |
---|
| 779 | + printf("Could not find \"%s\" partition\n", boot_partname); |
---|
| 780 | + return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; |
---|
| 781 | + } |
---|
| 782 | + |
---|
| 783 | + hdr = populate_andr_img_hdr(dev_desc, &part_info); |
---|
| 784 | + if (!hdr) { |
---|
| 785 | + printf("No valid android hdr\n"); |
---|
| 786 | + return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE; |
---|
| 787 | + } |
---|
| 788 | + |
---|
| 789 | + if (hdr->header_version >= 4) { |
---|
| 790 | + requested_partitions[1] = ANDROID_PARTITION_VENDOR_BOOT; |
---|
| 791 | + if (((hdr->os_version >> 25) & 0x7f) >= 13) |
---|
| 792 | + requested_partitions[2] = ANDROID_PARTITION_INIT_BOOT; |
---|
| 793 | + } |
---|
| 794 | + |
---|
484 | 795 | ops = avb_ops_user_new(); |
---|
485 | 796 | if (ops == NULL) { |
---|
486 | 797 | printf("avb_ops_user_new() failed!\n"); |
---|
.. | .. |
---|
497 | 808 | if (unlocked & LOCK_MASK) |
---|
498 | 809 | flags |= AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR; |
---|
499 | 810 | |
---|
500 | | - if(load_metadata(ops->ab_ops, &ab_data, &ab_data_orig)) { |
---|
| 811 | + if (load_metadata(ops->ab_ops, &ab_data, &ab_data_orig)) { |
---|
501 | 812 | printf("Can not load metadata\n"); |
---|
502 | 813 | return AVB_SLOT_VERIFY_RESULT_ERROR_IO; |
---|
503 | 814 | } |
---|
.. | .. |
---|
509 | 820 | else |
---|
510 | 821 | slot_index_to_boot = 0; |
---|
511 | 822 | |
---|
512 | | - if (strcmp(boot_partname, "recovery") == 0) |
---|
| 823 | + if (strcmp(boot_partname, ANDROID_PARTITION_RECOVERY) == 0) |
---|
513 | 824 | flags |= AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION; |
---|
| 825 | + |
---|
| 826 | +#ifdef CONFIG_MP_BOOT |
---|
| 827 | + preload_user_data.boot.addr = (void *)mpb_post(1); |
---|
| 828 | + preload_user_data.boot.size = (size_t)mpb_post(2); |
---|
| 829 | +#endif |
---|
| 830 | + |
---|
| 831 | + /* use preload one if available */ |
---|
| 832 | + if (preload_user_data.boot.addr) { |
---|
| 833 | + data = (struct AvbOpsData *)(ops->user_data); |
---|
| 834 | + |
---|
| 835 | + data->slot_suffix = slot_suffix; |
---|
| 836 | + data->boot = preload_user_data.boot; |
---|
| 837 | + data->vendor_boot = preload_user_data.vendor_boot; |
---|
| 838 | + data->init_boot = preload_user_data.init_boot; |
---|
| 839 | + data->resource = preload_user_data.resource; |
---|
| 840 | + } else { |
---|
| 841 | + ret = avb_image_distribute_prepare(slot_data, ops, slot_suffix); |
---|
| 842 | + if (ret < 0) { |
---|
| 843 | + printf("avb image distribute prepare failed %d\n", ret); |
---|
| 844 | + return AVB_SLOT_VERIFY_RESULT_ERROR_OOM; |
---|
| 845 | + } |
---|
| 846 | + } |
---|
514 | 847 | |
---|
515 | 848 | retry_verify: |
---|
516 | 849 | verify_result = |
---|
.. | .. |
---|
519 | 852 | slot_suffix, |
---|
520 | 853 | flags, |
---|
521 | 854 | AVB_HASHTREE_ERROR_MODE_RESTART, |
---|
522 | | - &slot_data[0]); |
---|
| 855 | + &slot_data); |
---|
523 | 856 | if (verify_result != AVB_SLOT_VERIFY_RESULT_OK && |
---|
524 | 857 | verify_result != AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED) { |
---|
525 | | - if (retry_no_vbmeta_partition && strcmp(boot_partname, "recovery") == 0) { |
---|
| 858 | + if (retry_no_vbmeta_partition && strcmp(boot_partname, ANDROID_PARTITION_RECOVERY) == 0) { |
---|
526 | 859 | printf("Verify recovery with vbmeta.\n"); |
---|
527 | 860 | flags &= ~AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION; |
---|
528 | 861 | retry_no_vbmeta_partition = 0; |
---|
.. | .. |
---|
558 | 891 | break; |
---|
559 | 892 | } |
---|
560 | 893 | |
---|
561 | | - if (!slot_data[0]) { |
---|
| 894 | + if (!slot_data) { |
---|
562 | 895 | can_boot = 0; |
---|
563 | 896 | goto out; |
---|
564 | 897 | } |
---|
.. | .. |
---|
569 | 902 | int len = 0; |
---|
570 | 903 | char *bootargs, *newbootargs; |
---|
571 | 904 | #ifdef CONFIG_ANDROID_AVB_ROLLBACK_INDEX |
---|
572 | | - if (rk_avb_update_stored_rollback_indexes_for_slot(ops, slot_data[0])) |
---|
| 905 | + if (rk_avb_update_stored_rollback_indexes_for_slot(ops, slot_data)) |
---|
573 | 906 | printf("Fail to update the rollback indexes.\n"); |
---|
574 | 907 | #endif |
---|
575 | | - if (*slot_data[0]->cmdline) { |
---|
576 | | - debug("Kernel command line: %s\n", slot_data[0]->cmdline); |
---|
577 | | - len += strlen(slot_data[0]->cmdline); |
---|
| 908 | + if (slot_data->cmdline) { |
---|
| 909 | + debug("Kernel command line: %s\n", slot_data->cmdline); |
---|
| 910 | + len += strlen(slot_data->cmdline); |
---|
578 | 911 | } |
---|
579 | 912 | |
---|
580 | 913 | bootargs = env_get("bootargs"); |
---|
.. | .. |
---|
593 | 926 | strcpy(newbootargs, bootargs); |
---|
594 | 927 | strcat(newbootargs, " "); |
---|
595 | 928 | } |
---|
596 | | - if (*slot_data[0]->cmdline) |
---|
597 | | - strcat(newbootargs, slot_data[0]->cmdline); |
---|
| 929 | + if (slot_data->cmdline) |
---|
| 930 | + strcat(newbootargs, slot_data->cmdline); |
---|
598 | 931 | env_set("bootargs", newbootargs); |
---|
599 | 932 | |
---|
600 | | - hdr = (void *)slot_data[0]->loaded_partitions->data; |
---|
601 | | - |
---|
602 | | - /* |
---|
603 | | - * populate boot_img_hdr_v34 |
---|
604 | | - * |
---|
605 | | - * If allow verification error: the image is loaded by |
---|
606 | | - * ops->get_preloaded_partition() which auto populates |
---|
607 | | - * boot_img_hdr_v34. |
---|
608 | | - * |
---|
609 | | - * If not allow verification error: the image is full loaded |
---|
610 | | - * by ops->read_from_partition() which doesn't populate |
---|
611 | | - * boot_img_hdr_v34, we need to fix it here. |
---|
612 | | - */ |
---|
613 | | - if (hdr->header_version >= 3 && |
---|
614 | | - !(flags & AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR)) { |
---|
615 | | - struct andr_img_hdr *v3hdr; |
---|
616 | | - struct blk_desc *dev_desc; |
---|
617 | | - disk_partition_t part; |
---|
618 | | - |
---|
619 | | - dev_desc = rockchip_get_bootdev(); |
---|
620 | | - if (!dev_desc) |
---|
621 | | - return -1; |
---|
622 | | - |
---|
623 | | - if (part_get_info_by_name(dev_desc, |
---|
624 | | - boot_partname, &part) < 0) |
---|
625 | | - return -1; |
---|
626 | | - |
---|
627 | | - v3hdr = populate_andr_img_hdr(dev_desc, &part); |
---|
628 | | - if (v3hdr) { |
---|
629 | | - memcpy(hdr, v3hdr, sizeof(*v3hdr)); |
---|
630 | | - free(v3hdr); |
---|
631 | | - } |
---|
632 | | - } |
---|
633 | | - |
---|
634 | | - /* Reserve page_size */ |
---|
635 | | - load_address -= hdr->page_size; |
---|
636 | | - if (android_image_memcpy_separate(hdr, &load_address)) { |
---|
637 | | - printf("Failed to separate copy android image\n"); |
---|
638 | | - return AVB_SLOT_VERIFY_RESULT_ERROR_IO; |
---|
| 933 | + /* if need, distribute full image to where they should be */ |
---|
| 934 | + ret = avb_image_distribute_finish(slot_data, flags, &load_address); |
---|
| 935 | + if (ret) { |
---|
| 936 | + printf("avb image distribute finish failed %d\n", ret); |
---|
| 937 | + return ret; |
---|
639 | 938 | } |
---|
640 | 939 | *android_load_address = load_address; |
---|
641 | 940 | } else { |
---|
.. | .. |
---|
649 | 948 | verify_result = AVB_SLOT_VERIFY_RESULT_ERROR_IO; |
---|
650 | 949 | } |
---|
651 | 950 | |
---|
652 | | - if (slot_data[0] != NULL) |
---|
653 | | - avb_slot_verify_data_free(slot_data[0]); |
---|
| 951 | + if (slot_data != NULL) |
---|
| 952 | + avb_slot_verify_data_free(slot_data); |
---|
654 | 953 | |
---|
655 | 954 | if ((unlocked & LOCK_MASK) && can_boot) |
---|
656 | 955 | return 0; |
---|
.. | .. |
---|
1047 | 1346 | printf("Android image load failed\n"); |
---|
1048 | 1347 | return -1; |
---|
1049 | 1348 | } |
---|
1050 | | -#endif |
---|
1051 | | - |
---|
1052 | | -#ifdef CONFIG_ANDROID_AB |
---|
1053 | | - ab_update_root_uuid(); |
---|
1054 | 1349 | #endif |
---|
1055 | 1350 | |
---|
1056 | 1351 | /* Set Android root variables. */ |
---|