Merge "ANDROID: fix overwrite and increase the memory gap for kernel and initramfs" into main
diff --git a/boot/android_bootloader.c b/boot/android_bootloader.c
index f4a1ab4..614d92c 100644
--- a/boot/android_bootloader.c
+++ b/boot/android_bootloader.c
@@ -423,10 +423,10 @@
 		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 3350ee1..4016208 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -289,9 +289,17 @@
 		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;