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 <a17671@motorola.com>
Reviewed-on: https://gerrit.mot.com/1975101
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Xiangpo Zhao <zhaoxp3@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
a17671 2021-06-09 22:31:32 +08:00 committed by Zonghua Liu
parent 640eeca03d
commit d6e8b815d3
6 changed files with 57 additions and 6 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
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

View file

@ -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)<<VA_BITS) + 1)
#endif
#define MSMDBG(fmt, args...) mmi_annotate(fmt, ##args)
@ -212,9 +216,21 @@ static void msm_wdog_ctx_lnx_arch(struct msm_wdog_lnx_info *lnx)
lnx->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);