Add support to fastboot using virtual addresses.
Change-Id: Iee873f4eb3dc3d136ec9430d41262802d3d394c5
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index f6d6e50..701095a 100644
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -366,12 +366,14 @@
ptr = atag_end(ptr);
}
+typedef void entry_func_ptr(unsigned, unsigned, unsigned*);
void boot_linux(void *kernel, unsigned *tags,
const char *cmdline, unsigned machtype,
void *ramdisk, unsigned ramdisk_size)
{
int ret = 0;
- void (*entry)(unsigned, unsigned, unsigned*) = kernel;
+ void (*entry)(unsigned, unsigned, unsigned*) = (entry_func_ptr*)(PA((addr_t)kernel));
+ uint32_t tags_phys = platform_get_virt_to_phys_mapping((addr_t)tags);
#if DEVICE_TREE
/* Update the Device Tree */
@@ -399,7 +401,8 @@
#if ARM_WITH_MMU
arch_disable_mmu();
#endif
- entry(0, machtype, tags);
+
+ entry(0, machtype, (unsigned*)tags_phys);
}
unsigned page_size = 0;
@@ -425,7 +428,6 @@
unsigned ramdisk_actual;
unsigned imagesize_actual;
unsigned second_actual = 0;
- unsigned dt_actual = 0;
#if DEVICE_TREE
struct dt_table *table;
@@ -471,6 +473,11 @@
page_mask = page_size - 1;
}
+ /* Get virtual addresses since the hdr saves physical addresses. */
+ hdr->kernel_addr = VA((addr_t)(hdr->kernel_addr));
+ hdr->ramdisk_addr = VA((addr_t)(hdr->ramdisk_addr));
+ hdr->tags_addr = VA((addr_t)(hdr->tags_addr));
+
/* Authenticate Kernel */
if(target_use_signed_kernel() && (!device.is_unlocked) && (!device.is_tampered))
{
@@ -703,6 +710,11 @@
return -1;
}
+ /* Get virtual addresses since the hdr saves physical addresses. */
+ hdr->kernel_addr = VA(hdr->kernel_addr);
+ hdr->ramdisk_addr = VA(hdr->ramdisk_addr);
+ hdr->tags_addr = VA(hdr->tags_addr);
+
/* Authenticate Kernel */
if(target_use_signed_kernel() && (!device.is_unlocked) && (!device.is_tampered))
{
@@ -1048,7 +1060,9 @@
}
/* Read device device tree in the "tags_add */
- memmove((void*) hdr->tags_addr, boot_image_start + dt_image_offset + dt_entry_ptr->offset, dt_entry_ptr->size);
+ memmove((void*) hdr->tags_addr,
+ boot_image_start + dt_image_offset + dt_entry_ptr->offset,
+ dt_entry_ptr->size);
}
/* Everything looks fine. Return success. */
@@ -1060,7 +1074,7 @@
{
unsigned kernel_actual;
unsigned ramdisk_actual;
- static struct boot_img_hdr hdr;
+ struct boot_img_hdr *hdr;
char *ptr = ((char*) data);
if (sz < sizeof(hdr)) {
@@ -1068,18 +1082,23 @@
return;
}
- memcpy(&hdr, data, sizeof(hdr));
+ hdr = (struct boot_img_hdr *)data;
/* ensure commandline is terminated */
- hdr.cmdline[BOOT_ARGS_SIZE-1] = 0;
+ hdr->cmdline[BOOT_ARGS_SIZE-1] = 0;
- if(target_is_emmc_boot() && hdr.page_size) {
- page_size = hdr.page_size;
+ if(target_is_emmc_boot() && hdr->page_size) {
+ page_size = hdr->page_size;
page_mask = page_size - 1;
}
- kernel_actual = ROUND_TO_PAGE(hdr.kernel_size, page_mask);
- ramdisk_actual = ROUND_TO_PAGE(hdr.ramdisk_size, page_mask);
+ kernel_actual = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
+ ramdisk_actual = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask);
+
+ /* Get virtual addresses since the hdr saves physical addresses. */
+ hdr->kernel_addr = VA(hdr->kernel_addr);
+ hdr->ramdisk_addr = VA(hdr->ramdisk_addr);
+ hdr->tags_addr = VA(hdr->tags_addr);
/* sz should have atleast raw boot image */
if (page_size + kernel_actual + ramdisk_actual > sz) {
@@ -1099,12 +1118,12 @@
fastboot_okay("");
udc_stop();
- memmove((void*) hdr.ramdisk_addr, ptr + page_size + kernel_actual, hdr.ramdisk_size);
- memmove((void*) hdr.kernel_addr, ptr + page_size, hdr.kernel_size);
+ memmove((void*) hdr->ramdisk_addr, ptr + page_size + kernel_actual, hdr->ramdisk_size);
+ memmove((void*) hdr->kernel_addr, ptr + page_size, hdr->kernel_size);
- boot_linux((void*) hdr.kernel_addr, (void*) hdr.tags_addr,
- (const char*) hdr.cmdline, board_machtype(),
- (void*) hdr.ramdisk_addr, hdr.ramdisk_size);
+ boot_linux((void*) hdr->kernel_addr, (void*) hdr->tags_addr,
+ (const char*) hdr->cmdline, board_machtype(),
+ (void*) hdr->ramdisk_addr, hdr->ramdisk_size);
}
void cmd_erase(const char *arg, void *data, unsigned sz)