Lines Matching +full:mode +full:- +full:recovery
4 * SPDX-License-Identifier: BSD-2-Clause
19 #include <image-android-dt.h>
41 part_info->blksz; in android_bootloader_message_load()
42 if (message_blocks > part_info->size) { in android_bootloader_message_load()
44 return -1; in android_bootloader_message_load()
47 if (blk_dread(dev_desc, part_info->start + android_bcb_msg_sector_offset(), in android_bootloader_message_load()
51 return -1; in android_bootloader_message_load()
63 part_info->blksz + android_bcb_msg_sector_offset(); in android_bootloader_message_write()
65 if (message_blocks > part_info->size) { in android_bootloader_message_write()
67 return -1; in android_bootloader_message_write()
70 if (blk_dwrite(dev_desc, part_info->start, message_blocks, message) != in android_bootloader_message_write()
73 return -1; in android_bootloader_message_write()
91 if (!strcmp("reboot-bootloader", bootloader_str)) { in android_bootloader_load_and_clear_mode()
104 if (!strcmp("bootonce-bootloader", bcb.command)) { in android_bootloader_load_and_clear_mode()
114 if (!strcmp("boot-recovery", bcb.command)) in android_bootloader_load_and_clear_mode()
117 if (!strcmp("boot-fastboot", bcb.command)) in android_bootloader_load_and_clear_mode()
131 return -ENOMEM; in android_bcb_write()
134 return -ENOMEM; in android_bcb_write()
139 return -ENODEV; in android_bcb_write()
144 printf("%s: Could not found misc partition, just run recovery\n", in android_bcb_write()
146 return -ENODEV; in android_bcb_write()
154 * Return the reboot reason string for the passed boot mode.
156 * @param mode The Android Boot mode.
157 * @return a pointer to the reboot reason string for mode.
159 static const char *android_boot_mode_str(enum android_boot_mode mode) in android_boot_mode_str() argument
161 switch (mode) { in android_boot_mode_str()
165 return "recovery"; in android_boot_mode_str()
196 int part_num = -1; in android_bootloader_get_fdt()
202 return -1; in android_bootloader_get_fdt()
208 return -1; in android_bootloader_get_fdt()
213 return -1; in android_bootloader_get_fdt()
218 return -1; in android_bootloader_get_fdt()
224 return -1; in android_bootloader_get_fdt()
231 * Test on RK3308 AARCH64 mode (Cortex A35 816 MHZ) boot with eMMC:
233 * |-------------------------------------------------------------------|
235 * |-------------------------------------------------------------------|
237 * |-------------------------------------------------------------------|
239 * |-------------------------------------------------------------------|
241 * |-------------------------------------------------------------------|
243 * |-------------------------------------------------------------------|
245 * |-------------------------------------------------------------------|
247 * |-------------------------------------------------------------------|
260 kaddr -= hdr->page_size; in sysmem_alloc_uncomp_kernel()
262 return -EINVAL; in sysmem_alloc_uncomp_kernel()
271 ksize = hdr->kernel_size * 100 / 45; in sysmem_alloc_uncomp_kernel()
273 ksize = hdr->kernel_size * 100 / 50; in sysmem_alloc_uncomp_kernel()
275 ksize = hdr->kernel_size * 100 / 45; in sysmem_alloc_uncomp_kernel()
277 ksize = hdr->kernel_size * 100 / 40; in sysmem_alloc_uncomp_kernel()
279 ksize = hdr->kernel_size * 100 / 40; in sysmem_alloc_uncomp_kernel()
281 ksize = hdr->kernel_size * 100 / 30; in sysmem_alloc_uncomp_kernel()
283 ksize = hdr->kernel_size; in sysmem_alloc_uncomp_kernel()
289 return -ENOMEM; in sysmem_alloc_uncomp_kernel()
338 * but never return -1. in android_bootloader_boot_kernel()
343 return -1; in android_bootloader_boot_kernel()
385 current[-1] = '\0'; in strjoin()
389 /** android_assemble_cmdline - Assemble the command line to pass to the kernel
440 /* Make sure that the string is null-terminated since the in android_assemble_cmdline()
444 allocated_rootdev[rootdev_len - 1] = '\0'; in android_assemble_cmdline()
461 slot->priority = 0; in slot_set_unbootable()
462 slot->tries_remaining = 0; in slot_set_unbootable()
463 slot->successful_boot = 0; in slot_set_unbootable()
491 res = ops->get_size_of_partition(ops, partition_name, &size); in get_partition_size()
506 struct AvbOpsData *data = (struct AvbOpsData *)(ops->user_data); in avb_image_distribute_prepare()
526 return -ENOMEM; in avb_image_distribute_prepare()
529 /* layout: | boot/recovery | vendor_boot | init_boot | resource | */ in avb_image_distribute_prepare()
530 data->slot_suffix = slot_suffix; in avb_image_distribute_prepare()
531 data->boot.addr = image_buf; in avb_image_distribute_prepare()
532 data->boot.size = 0; in avb_image_distribute_prepare()
533 data->vendor_boot.addr = data->boot.addr + boot_size; in avb_image_distribute_prepare()
534 data->vendor_boot.size = 0; in avb_image_distribute_prepare()
535 data->init_boot.addr = data->vendor_boot.addr + vendor_boot_size; in avb_image_distribute_prepare()
536 data->init_boot.size = 0; in avb_image_distribute_prepare()
537 data->resource.addr = data->init_boot.addr + init_boot_size; in avb_image_distribute_prepare()
538 data->resource.size = 0; in avb_image_distribute_prepare()
555 for (i = 0; i < slot_data->num_loaded_partitions; i++) { in avb_image_distribute_finish()
556 part_name = slot_data->loaded_partitions[i].partition_name; in avb_image_distribute_finish()
559 boot_hdr = slot_data->loaded_partitions[i].data; in avb_image_distribute_finish()
561 init_boot_hdr = slot_data->loaded_partitions[i].data; in avb_image_distribute_finish()
563 vendor_boot_hdr = slot_data->loaded_partitions[i].data; in avb_image_distribute_finish()
571 * ops->get_preloaded_partition() which auto populates in avb_image_distribute_finish()
575 * by ops->read_from_partition() which doesn't populate in avb_image_distribute_finish()
580 if (hdr->header_version >= 3 && in avb_image_distribute_finish()
584 return -ENOMEM; in avb_image_distribute_finish()
596 load_addr -= hdr->page_size; in avb_image_distribute_finish()
628 return -AVB_SLOT_VERIFY_RESULT_ERROR_OOM; in android_image_verify_resource()
631 if (ops->read_is_device_unlocked(ops, (bool *)&unlocked) != AVB_IO_RESULT_OK) in android_image_verify_resource()
647 *(part_name + strlen(boot_part) - 2) = '\0'; in android_image_verify_resource()
658 data = (struct AvbOpsData *)(ops->user_data); in android_image_verify_resource()
676 printf("Verify recovery with vbmeta.\n"); in android_image_verify_resource()
684 sysmem_free((ulong)data->boot.addr); in android_image_verify_resource()
688 for (i = 0; i < slot_data->num_loaded_partitions; i++) { in android_image_verify_resource()
689 part_name = slot_data->loaded_partitions[i].partition_name; in android_image_verify_resource()
691 image_buf = slot_data->loaded_partitions[i].data; in android_image_verify_resource()
697 hdr = (void *)slot_data->loaded_partitions[i].data; in android_image_verify_resource()
701 if (hdr->header_version <= 2) { in android_image_verify_resource()
702 image_buf = (void *)hdr + hdr->page_size + in android_image_verify_resource()
703 ALIGN(hdr->kernel_size, hdr->page_size) + in android_image_verify_resource()
704 ALIGN(hdr->ramdisk_size, hdr->page_size); in android_image_verify_resource()
723 * Go pre-loaded path: Loading vendor_boot and init_boot
725 * boot/recovery. The boot message tells like:
734 * Go pre-loaded path: Loading full vendor_boot, init_boot and
735 * boot/recovery one by one to verify, and distributing them to
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
789 if (hdr->header_version >= 4) { in android_slot_verify()
791 if (((hdr->os_version >> 25) & 0x7f) >= 13) in android_slot_verify()
801 if (ops->read_is_device_unlocked(ops, (bool *)&unlocked) != AVB_IO_RESULT_OK) in android_slot_verify()
811 if (load_metadata(ops->ab_ops, &ab_data, &ab_data_orig)) { in android_slot_verify()
833 data = (struct AvbOpsData *)(ops->user_data); in android_slot_verify()
835 data->slot_suffix = slot_suffix; in android_slot_verify()
836 data->boot = preload_user_data.boot; in android_slot_verify()
837 data->vendor_boot = preload_user_data.vendor_boot; in android_slot_verify()
838 data->init_boot = preload_user_data.init_boot; in android_slot_verify()
839 data->resource = preload_user_data.resource; in android_slot_verify()
859 printf("Verify recovery with vbmeta.\n"); in android_slot_verify()
908 if (slot_data->cmdline) { in android_slot_verify()
909 debug("Kernel command line: %s\n", slot_data->cmdline); in android_slot_verify()
910 len += strlen(slot_data->cmdline); in android_slot_verify()
929 if (slot_data->cmdline) in android_slot_verify()
930 strcat(newbootargs, slot_data->cmdline); in android_slot_verify()
946 if (save_metadata_if_changed(ops->ab_ops, &ab_data, &ab_data_orig)) { in android_slot_verify()
1003 return -ENODEV; in android_get_dtbo()
1014 (hdr->recovery_dtbo_offset / part_info.blksz); in android_get_dtbo()
1020 return -ENOMEM; in android_get_dtbo()
1027 printf("DTBO: invalid dt table header: 0x%x\n", dt_hdr->magic); in android_get_dtbo()
1028 ret = -EINVAL; in android_get_dtbo()
1036 blk_cnt = DIV_ROUND_UP(fdt32_to_cpu(dt_hdr->total_size), in android_get_dtbo()
1041 ret = -ENOMEM; in android_get_dtbo()
1052 ret = -EINVAL; in android_get_dtbo()
1059 ret = -EINVAL; in android_get_dtbo()
1091 ulong fdt_dtbo = -1; in android_fdt_overlay_apply()
1093 int index = -1; in android_fdt_overlay_apply()
1111 return -ENODEV; in android_fdt_overlay_apply()
1119 return -EINVAL; in android_fdt_overlay_apply()
1126 * google authentication, that means there is not recovery. in android_fdt_overlay_apply()
1130 * boot.img(v3+) with recovery(v2). in android_fdt_overlay_apply()
1133 * recovery.img with boot_img_hdr_v1,2: supported in android_fdt_overlay_apply()
1134 * recovery.img with boot_img_hdr_v0,3+: illegal in android_fdt_overlay_apply()
1136 if ((hdr->header_version == 0) || in android_fdt_overlay_apply()
1137 (hdr->header_version >= 3 && !strcmp(part_boot, PART_RECOVERY))) in android_fdt_overlay_apply()
1195 return -1; in android_image_load_by_partname()
1200 ret = android_image_load(dev_desc, &boot_part, *load_address, -1UL); in android_image_load_by_partname()
1214 enum android_boot_mode mode = ANDROID_BOOT_MODE_NORMAL; in android_bootloader_boot_flow() local
1223 * 1. Load MISC partition and determine the boot mode in android_bootloader_boot_flow()
1236 mode = android_bootloader_load_and_clear_mode(dev_desc, in android_bootloader_boot_flow()
1239 if (mode == ANDROID_BOOT_MODE_NORMAL) { in android_bootloader_boot_flow()
1241 mode = ANDROID_BOOT_MODE_RECOVERY; in android_bootloader_boot_flow()
1246 printf("ANDROID: reboot reason: \"%s\"\n", android_boot_mode_str(mode)); in android_bootloader_boot_flow()
1250 return -1; in android_bootloader_boot_flow()
1252 switch (mode) { in android_bootloader_boot_flow()
1254 /* In normal mode, we load the kernel from "boot" but append in android_bootloader_boot_flow()
1256 * recovery initramfs in the boot partition. in android_bootloader_boot_flow()
1259 /* In A/B, the recovery image is built as boot.img, containing the in android_bootloader_boot_flow()
1260 * recovery's ramdisk. Previously, bootloader used the skip_initramfs in android_bootloader_boot_flow()
1261 * kernel command line parameter to decide which mode to boot into. in android_bootloader_boot_flow()
1263 * MUST NOT pass skip_initramfs to the kernel command-line. in android_bootloader_boot_flow()
1265 * and then Android's first-stage init in ramdisk in android_bootloader_boot_flow()
1266 * will skip recovery and boot normal Android. in android_bootloader_boot_flow()
1277 * In recovery mode, if have recovery partition, we still boot the in android_bootloader_boot_flow()
1278 * kernel from "recovery". If not, don't skip the initramfs so it in android_bootloader_boot_flow()
1279 * boots to recovery from image in partition "boot". in android_bootloader_boot_flow()
1289 /* Bootloader mode enters fastboot. If this operation fails we in android_bootloader_boot_flow()
1303 return -1; in android_bootloader_boot_flow()
1312 return -1; in android_bootloader_boot_flow()
1326 return -1; in android_bootloader_boot_flow()
1334 return -1; in android_bootloader_boot_flow()
1340 * 2. Load the boot/recovery from the desired "boot" partition. in android_bootloader_boot_flow()
1347 return -1; in android_bootloader_boot_flow()
1352 env_set_ulong("android_root_devnum", dev_desc->devnum); in android_bootloader_boot_flow()
1392 return -1; in android_bootloader_boot_flow()
1405 return -1; in android_avb_boot_flow()
1417 kernel_address, -1UL); in android_avb_boot_flow()
1426 return -1; in android_avb_boot_flow()
1438 return -1; in android_boot_flow()
1449 -1UL); in android_boot_flow()
1456 return -1; in android_boot_flow()