From a54b8a7d7dadafef1c4a8c7384e3184a5cd00f4e Mon Sep 17 00:00:00 2001 From: Elliot Berman Date: Tue, 3 Dec 2019 09:39:59 -0800 Subject: [PATCH] power: reset: qcom-dload-mode: Store KASLR offset when available Store KASLR offset in imem property when requested by devicetree. Change-Id: I4f5f359fadab413db6bc5e80799a445218251872 Signed-off-by: Elliot Berman --- drivers/power/reset/qcom-dload-mode.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/power/reset/qcom-dload-mode.c b/drivers/power/reset/qcom-dload-mode.c index 863f42b7e1a0..791088887e37 100644 --- a/drivers/power/reset/qcom-dload-mode.c +++ b/drivers/power/reset/qcom-dload-mode.c @@ -213,6 +213,27 @@ static void __iomem *map_prop_mem(const char *propname) return addr; } +#ifdef CONFIG_RANDOMIZE_BASE +#define KASLR_OFFSET_MASK 0x00000000FFFFFFFF +static void store_kaslr_offset(void) +{ + void __iomem *mem = map_prop_mem("qcom,msm-imem-kaslr_offset"); + + if (!mem) + return; + + __raw_writel(0xdead4ead, mem); + __raw_writel((kimage_vaddr - KIMAGE_VADDR) & KASLR_OFFSET_MASK, + mem + 4); + __raw_writel(((kimage_vaddr - KIMAGE_VADDR) >> 32) & KASLR_OFFSET_MASK, + mem + 8); + + iounmap(mem); +} +#else +static void store_kaslr_offset(void) {} +#endif /* CONFIG_RANDOMIZE_BASE */ + static int qcom_dload_probe(struct platform_device *pdev) { struct qcom_dload *poweroff; @@ -238,6 +259,7 @@ static int qcom_dload_probe(struct platform_device *pdev) } poweroff->dload_dest_addr = map_prop_mem("qcom,msm-imem-dload-type"); + store_kaslr_offset(); if (enable_dump) set_download_mode(QCOM_DOWNLOAD_FULLDUMP);