From ece2bbacc3069e6f5ec42c53b1d304bf76c94f67 Mon Sep 17 00:00:00 2001 From: a17671 Date: Wed, 9 Jun 2021 22:31:32 +0800 Subject: [PATCH] Add watchdog_cpu_dump and tzlog_dump support on 5.4 Add watchdog_cpu context and tzlog dump support For 5.4 or later kernel, there is no way to browse the Symbols without breaking the GKI rules So read the ttbl1_el1 to get the init_mm->pgd instead of The old symbols browsing Update module dependencies Change-Id: I26aca73f4a879f9504ecd5443c458e154cf48fe9 Signed-off-by: a17671 Reviewed-on: https://gerrit.mot.com/1975101 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Xiangpo Zhao Submit-Approved: Jira Key --- drivers/mmi_annotate/Android.mk | 4 +++ drivers/mmi_info/Android.mk | 4 +++ drivers/tzlog_dump/Android.mk | 4 +++ drivers/watchdog_cpu_ctx/Android.mk | 5 +++ drivers/watchdog_cpu_ctx/Kbuild | 8 +++-- drivers/watchdog_cpu_ctx/watchdog_cpu_ctx.c | 38 ++++++++++++++++++--- 6 files changed, 57 insertions(+), 6 deletions(-) diff --git a/drivers/mmi_annotate/Android.mk b/drivers/mmi_annotate/Android.mk index 0accb8cfbb1d..2337b1b2d73d 100644 --- a/drivers/mmi_annotate/Android.mk +++ b/drivers/mmi_annotate/Android.mk @@ -4,5 +4,9 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mmi_annotate.ko LOCAL_MODULE_TAGS := optional +ifeq ($(DLKM_INSTALL_TO_VENDOR_OUT),true) +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/lib/modules/ +else LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) +endif include $(DLKM_DIR)/AndroidKernelModule.mk diff --git a/drivers/mmi_info/Android.mk b/drivers/mmi_info/Android.mk index 30ac3683b7be..6146c8aacbae 100644 --- a/drivers/mmi_info/Android.mk +++ b/drivers/mmi_info/Android.mk @@ -4,7 +4,11 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mmi_info.ko LOCAL_MODULE_TAGS := optional +ifeq ($(DLKM_INSTALL_TO_VENDOR_OUT),true) +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/lib/modules/ +else LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) +endif LOCAL_ADDITIONAL_DEPENDENCIES := $(KERNEL_MODULES_OUT)/mmi_annotate.ko KBUILD_OPTIONS_GKI += GKI_OBJ_MODULE_DIR=gki include $(DLKM_DIR)/AndroidKernelModule.mk diff --git a/drivers/tzlog_dump/Android.mk b/drivers/tzlog_dump/Android.mk index b207987f4b37..3a70e6ae6933 100644 --- a/drivers/tzlog_dump/Android.mk +++ b/drivers/tzlog_dump/Android.mk @@ -4,6 +4,10 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := tzlog_dump.ko LOCAL_MODULE_TAGS := optional +ifeq ($(DLKM_INSTALL_TO_VENDOR_OUT),true) +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/lib/modules/ +else LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) +endif LOCAL_ADDITIONAL_DEPENDENCIES := $(KERNEL_MODULES_OUT)/mmi_info.ko include $(DLKM_DIR)/AndroidKernelModule.mk diff --git a/drivers/watchdog_cpu_ctx/Android.mk b/drivers/watchdog_cpu_ctx/Android.mk index 9adfd2643398..3ccc43528d7e 100644 --- a/drivers/watchdog_cpu_ctx/Android.mk +++ b/drivers/watchdog_cpu_ctx/Android.mk @@ -4,5 +4,10 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := watchdog_cpu_ctx.ko LOCAL_MODULE_TAGS := optional +ifeq ($(DLKM_INSTALL_TO_VENDOR_OUT),true) +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/lib/modules/ +else LOCAL_MODULE_PATH := $(KERNEL_MODULES_OUT) +endif +LOCAL_ADDITIONAL_DEPENDENCIES := $(KERNEL_MODULES_OUT)/mmi_info.ko include $(DLKM_DIR)/AndroidKernelModule.mk diff --git a/drivers/watchdog_cpu_ctx/Kbuild b/drivers/watchdog_cpu_ctx/Kbuild index 48830cc18184..7772a58e5a88 100644 --- a/drivers/watchdog_cpu_ctx/Kbuild +++ b/drivers/watchdog_cpu_ctx/Kbuild @@ -1,5 +1,9 @@ # add -Wall to try to catch everything we can. EXTRA_CFLAGS += -Wall -EXTRA_CFLAGS += -I$(TOP)/motorola/kernel/modules/include +EXTRA_CFLAGS += -I$(ANDROID_BUILD_TOP)/motorola/kernel/modules/include -obj-m += watchdog_cpu_ctx.o \ No newline at end of file +obj-m += watchdog_cpu_ctx.o + +KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../mmi_annotate/Module.symvers +KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../mmi_info/Module.symvers +KBUILD_EXTRA_SYMBOLS += $(KBUILD_OUTPUT)/Module.symver diff --git a/drivers/watchdog_cpu_ctx/watchdog_cpu_ctx.c b/drivers/watchdog_cpu_ctx/watchdog_cpu_ctx.c index d77d08854fe8..0db33a27cfb3 100644 --- a/drivers/watchdog_cpu_ctx/watchdog_cpu_ctx.c +++ b/drivers/watchdog_cpu_ctx/watchdog_cpu_ctx.c @@ -40,6 +40,10 @@ #ifndef TASK_STATE_TO_CHAR_STR #define TASK_STATE_TO_CHAR_STR "RSDTtXZxKWPNn" #endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,4,0) + #define VA_START (UL(0xffffffffffffffff) -\ + (UL(1)<kaslr_offset = 0; } #endif - -static void msm_wdog_ctx_lnx(struct msm_wdog_lnx_info *lnx) +static inline uint64_t system_read_TTBR1_EL1(void) { + uint64_t val; + asm volatile("mrs %0, ttbr1_el1": "=r"(val)); + return (val & 0xffffffffffc0) | ((val & 0x3c) << 46); +} +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,4,0) +static void __nocfi msm_wdog_ctx_lnx(struct msm_wdog_lnx_info *lnx) +#else +static void msm_wdog_ctx_lnx(struct msm_wdog_lnx_info *lnx) +#endif +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,4,0) + unsigned long init_mm_addr = 0; +#else /* Since this is a module we cannot link to these symbols * directly, so use kallsyms. kallsyms is needed to find the * names of the stacktrace symbols anyways. @@ -224,6 +240,7 @@ static void msm_wdog_ctx_lnx(struct msm_wdog_lnx_info *lnx) * is not available via kallsyms_lookup_name directly */ unsigned long init_mm_addr = kallsyms_lookup_name("init_mm"); +#endif struct mm_struct *init_mm = NULL; if(init_mm_addr) { init_mm = (struct mm_struct *)init_mm_addr; @@ -237,8 +254,13 @@ static void msm_wdog_ctx_lnx(struct msm_wdog_lnx_info *lnx) lnx->tsk_size = sizeof(struct task_struct); lnx->aa64 = IS_ENABLED(CONFIG_ARM64); lnx->lpae = IS_ENABLED(CONFIG_ARM_LPAE); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,4,0) + lnx->pgd_paddr = system_read_TTBR1_EL1(); + lnx->text_paddr = 0; +#else lnx->text_paddr = _text_addr ? virt_to_phys((void *)_text_addr) : 0; lnx->pgd_paddr = init_mm ? virt_to_phys(init_mm->pgd) : 0; +#endif lnx->page_shift = PAGE_SHIFT; lnx->thread_size = THREAD_SIZE; msm_wdog_ctx_lnx_arch(lnx); @@ -270,11 +292,16 @@ static void msm_wdog_ctx_reset(struct msm_wdog_cpuctx *ctx, size_t ctx_size) #endif msm_wdog_ctx_header_init(ctxi); msm_wdog_ctx_lnx(&ctxi->lnx); - +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,4,0) + if(!ctxi->lnx.pgd_paddr || + (IS_ENABLED(CONFIG_ARM64) && !ctxi->lnx.kaslr_offset)) + ctxi->info.syms_avail = 0; +#else if(!ctxi->lnx.text_paddr || !ctxi->lnx.pgd_paddr || (IS_ENABLED(CONFIG_ARM64) && !ctxi->lnx.kaslr_offset)) ctxi->info.syms_avail = 0; +#endif } } @@ -818,9 +845,12 @@ static int watchdog_cpu_ctx_probe(struct platform_device *pdev) } watchdog_cpu_ctx_table_register(dev, pdata); - +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,4,0) + ctx_vaddr = ioremap_wc(pdata->mem_address, pdata->mem_size); +#else ctx_vaddr = dma_remap(dev, NULL, pdata->mem_address, pdata->mem_size, 0); +#endif if (!ctx_vaddr) { dev_err(dev, "Cannot remap buffer %pa size %zx\n", &pdata->mem_address, pdata->mem_size);