aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com>2024-04-22 20:33:19 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-04-22 20:33:19 +0000
commit901bc28475e9a188770901f07b9b286b9c5c38b2 (patch)
treea019ae6d719063a9ab004fd37b04bcba06a21300
parent8275813a474b595a3662c4cbd8aab7530e8238d3 (diff)
parent8dd12a48fe002a47ecf144940ecbc3d23050f0a3 (diff)
downloadu-boot-master.tar.gz
Merge "ANDROID: fix overwrite and increase the memory gap for kernel and initramfs" into mainHEADmastermain
-rw-r--r--boot/android_bootloader.c4
-rw-r--r--boot/image-android.c14
2 files changed, 13 insertions, 5 deletions
diff --git a/boot/android_bootloader.c b/boot/android_bootloader.c
index f4a1ab4d0e..614d92cdb4 100644
--- a/boot/android_bootloader.c
+++ b/boot/android_bootloader.c
@@ -423,10 +423,10 @@ static int do_avb_verify(const char *iface,
data->slot_suffix = slot_suffix;
data->boot.addr = kernel_address;
data->boot.size = 0; // 0 indicates that it hasn't yet been preloaded.
- data->vendor_boot.addr = data->boot.addr + (packed ? boot_size : SZ_64M);
+ data->vendor_boot.addr = data->boot.addr + (packed ? boot_size : ALIGN(boot_size, SZ_64M));
data->vendor_boot.size = 0;
if (init_boot_size != 0) {
- data->init_boot.addr = data->vendor_boot.addr + (packed ? vendor_boot_size : SZ_64M);
+ data->init_boot.addr = data->vendor_boot.addr + (packed ? vendor_boot_size : ALIGN(vendor_boot_size, SZ_64M));
data->init_boot.size = 0;
ret = avb_verify(ops, slot_suffix, out_data, out_cmdline);
} else {
diff --git a/boot/image-android.c b/boot/image-android.c
index 3350ee1ab3..4016208cd4 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -289,9 +289,17 @@ static void _populate_boot_info(const struct boot_img_hdr_v4* boot_hdr,
sizeof(vboot_hdr->cmdline));
boot_info->kernel_addr = (ulong)load_addr;
- /* The "kernel_addr" is already aligned to 2MB */
- boot_info->vendor_ramdisk_addr = boot_info->kernel_addr +
- ALIGN(boot_info->kernel_size, SZ_64M);
+ /* The "kernel_addr" is already aligned to 2MB. */
+ if (IS_ENABLED(CONFIG_X86))
+ /*
+ We multiple the kernel_size by 3 to let it leave
+ some spaces if the kernel is self-decompressed in-place.
+ */
+ boot_info->vendor_ramdisk_addr = boot_info->kernel_addr +
+ ALIGN(boot_info->kernel_size, SZ_64M) * 3;
+ else
+ boot_info->vendor_ramdisk_addr = boot_info->kernel_addr +
+ ALIGN(boot_info->kernel_size, SZ_64M);
boot_info->boot_ramdisk_addr = boot_info->vendor_ramdisk_addr
+ boot_info->vendor_ramdisk_size;