diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-12-22 18:50:24 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-12-22 18:50:24 -0800 |
| commit | cc2de045394e31efeff2f9d55128380ca55c8cc4 (patch) | |
| tree | 1cd22c2cab244b268260698014791c862ad7b361 | |
| parent | 2e2825f85a80b400d743691f617c2fcc7d5030e0 (diff) | |
| parent | 4f22b257513b89e51c583962197ff2f25b5f1f64 (diff) | |
Merge "ARM: dts: msm: Add kaslr offset IMEM entry for msm8998"
| -rw-r--r-- | Documentation/devicetree/bindings/arm/msm/imem.txt | 11 | ||||
| -rw-r--r-- | arch/arm/boot/dts/qcom/msm8998.dtsi | 5 | ||||
| -rw-r--r-- | drivers/power/reset/msm-poweroff.c | 31 |
3 files changed, 46 insertions, 1 deletions
diff --git a/Documentation/devicetree/bindings/arm/msm/imem.txt b/Documentation/devicetree/bindings/arm/msm/imem.txt index a9d2a2456cfd..2989fbfe7972 100644 --- a/Documentation/devicetree/bindings/arm/msm/imem.txt +++ b/Documentation/devicetree/bindings/arm/msm/imem.txt @@ -63,6 +63,11 @@ Emergency Download Mode: -compatible: "qcom,msm-imem-emergency_download_mode" -reg: start address and size of emergency_download_mode region in imem +Kaslr Offset: +------------------------ +-compatible: "qcom,msm-imem-kaslr_offset" +-reg: start address and size of kaslr_offset region in imem + USB Diag Cookies: ----------------- Memory region used to store USB PID and serial numbers to be used by @@ -101,6 +106,12 @@ Example: reg = <0x6b0 32>; }; + kaslr_offset@6d0 { + compatible = "qcom,msm-imem-kaslr_offset"; + reg = <0x6d0 12>; + }; + + pil@94c { compatible = "qcom,msm-imem-pil"; reg = <0x94c 200>; diff --git a/arch/arm/boot/dts/qcom/msm8998.dtsi b/arch/arm/boot/dts/qcom/msm8998.dtsi index 8ce9e7c22761..ab835bf3aba1 100644 --- a/arch/arm/boot/dts/qcom/msm8998.dtsi +++ b/arch/arm/boot/dts/qcom/msm8998.dtsi @@ -2825,6 +2825,11 @@ reg = <0x6b0 32>; }; + kaslr_offset@6d0 { + compatible = "qcom,msm-imem-kaslr_offset"; + reg = <0x6d0 12>; + }; + pil@94c { compatible = "qcom,msm-imem-pil"; reg = <0x94c 200>; diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-poweroff.c index d32f293695bb..267df592ba8a 100644 --- a/drivers/power/reset/msm-poweroff.c +++ b/drivers/power/reset/msm-poweroff.c @@ -28,6 +28,7 @@ #include <asm/cacheflush.h> #include <asm/system_misc.h> +#include <asm/memory.h> #include <soc/qcom/scm.h> #include <soc/qcom/restart.h> @@ -65,11 +66,17 @@ static struct kobject dload_kobj; #ifdef CONFIG_QCOM_DLOAD_MODE #define EDL_MODE_PROP "qcom,msm-imem-emergency_download_mode" #define DL_MODE_PROP "qcom,msm-imem-download_mode" +#ifdef CONFIG_RANDOMIZE_BASE +#define KASLR_OFFSET_PROP "qcom,msm-imem-kaslr_offset" +#endif static int in_panic; static void *dload_mode_addr; static bool dload_mode_enabled; static void *emergency_dload_mode_addr; +#ifdef CONFIG_RANDOMIZE_BASE +static void *kaslr_imem_addr; +#endif static bool scm_dload_supported; static int dload_set(const char *val, struct kernel_param *kp); @@ -510,6 +517,28 @@ static int msm_restart_probe(struct platform_device *pdev) pr_err("unable to map imem EDLOAD mode offset\n"); } +#ifdef CONFIG_RANDOMIZE_BASE +#define KASLR_OFFSET_BIT_MASK 0x00000000FFFFFFFF + np = of_find_compatible_node(NULL, NULL, KASLR_OFFSET_PROP); + if (!np) { + pr_err("unable to find DT imem KASLR_OFFSET node\n"); + } else { + kaslr_imem_addr = of_iomap(np, 0); + if (!kaslr_imem_addr) + pr_err("unable to map imem KASLR offset\n"); + } + + if (kaslr_imem_addr && scm_is_secure_device()) { + __raw_writel(0xdead4ead, kaslr_imem_addr); + __raw_writel(KASLR_OFFSET_BIT_MASK & + (kimage_vaddr - KIMAGE_VADDR), kaslr_imem_addr + 4); + __raw_writel(KASLR_OFFSET_BIT_MASK & + ((kimage_vaddr - KIMAGE_VADDR) >> 32), + kaslr_imem_addr + 8); + iounmap(kaslr_imem_addr); + } +#endif + np = of_find_compatible_node(NULL, NULL, "qcom,msm-imem-dload-type"); if (!np) { @@ -603,4 +632,4 @@ static int __init msm_restart_init(void) { return platform_driver_register(&msm_restart_driver); } -device_initcall(msm_restart_init); +pure_initcall(msm_restart_init); |
