aboutsummaryrefslogtreecommitdiff
path: root/arch/arm
diff options
context:
space:
mode:
authorDzmitry Sankouski <dsankouski@gmail.com>2022-12-27 22:47:09 +0300
committerTom Rini <trini@konsulko.com>2023-01-10 15:39:07 -0500
commit971ccee2fb74a5dad282e230d60de84e1fb6e6dd (patch)
tree9a6bd14a01f9e99c3b483acada8e8df51351958c /arch/arm
parent40c69cc922c7874301bbb543508e5f591f4e30d4 (diff)
SoC: sdm845: find and save KASLR to env variables
KASLR address is needed to boot fully functional Android. KASLR is set by primary bootloader, and since u-boot is used as a secondary bootloader(replacing kernel) on sdm845 platform, KASLR may be found by comparing memory chunks at relocaddr over supposed KASLR range. Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com> Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-snapdragon/init_sdm845.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/arm/mach-snapdragon/init_sdm845.c b/arch/arm/mach-snapdragon/init_sdm845.c
index 5f53c2194715..1f8850239437 100644
--- a/arch/arm/mach-snapdragon/init_sdm845.c
+++ b/arch/arm/mach-snapdragon/init_sdm845.c
@@ -78,5 +78,23 @@ __weak int misc_init_r(void)
env_set("key_power", "0");
}
+ /*
+ * search for kaslr address, set by primary bootloader by searching first
+ * 0x100 relocated bytes at u-boot's initial load address range
+ */
+ uintptr_t start = gd->ram_base;
+ uintptr_t end = start + 0x800000;
+ u8 *addr = (u8 *)start;
+ phys_addr_t *relocaddr = (phys_addr_t *)gd->relocaddr;
+ u32 block_size = 0x1000;
+
+ while (memcmp(addr, relocaddr, 0x100) && (uintptr_t)addr < end)
+ addr += block_size;
+
+ if ((uintptr_t)addr >= end)
+ printf("KASLR not found in range 0x%lx - 0x%lx", start, end);
+ else
+ env_set_addr("KASLR", addr);
+
return 0;
}