]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
SoC: sdm845: find and save KASLR to env variables
authorDzmitry Sankouski <dsankouski@gmail.com>
Tue, 27 Dec 2022 19:47:09 +0000 (22:47 +0300)
committerTom Rini <trini@konsulko.com>
Tue, 10 Jan 2023 20:39:07 +0000 (15:39 -0500)
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>
arch/arm/mach-snapdragon/init_sdm845.c

index 5f53c2194715b26e1b9ffec31bc5fa2f61deb61d..1f8850239437f7f37f0a62b1d64f9441befae496 100644 (file)
@@ -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;
 }