summaryrefslogtreecommitdiff
path: root/SOURCE
diff options
context:
space:
mode:
authorWen Yang <[email protected]>2021-10-21 01:04:25 +0800
committerWen Yang <[email protected]>2021-10-21 01:06:51 +0800
commitd82e7b89061d3fa297e37a927c036bda1371679f (patch)
tree01a1496fc431fc3b94f55463256679246b4a370b /SOURCE
parent7ca582193ba134026b3a40b31bc36a1f1b060ff6 (diff)
diagnose-tools: 支持阿里ARM芯片+5.10内核
Diffstat (limited to 'SOURCE')
-rw-r--r--SOURCE/module/entry.c40
-rw-r--r--SOURCE/module/kernel/kern_entry.c114
-rw-r--r--SOURCE/module/kernel/mutex.c2
-rwxr-xr-xSOURCE/module/misc.c10
-rw-r--r--SOURCE/module/mm_tree.c5
-rw-r--r--SOURCE/module/pub/stack.c2
-rwxr-xr-xSOURCE/module/symbol.c12
7 files changed, 145 insertions, 40 deletions
diff --git a/SOURCE/module/entry.c b/SOURCE/module/entry.c
index 2f3719c..1c3809b 100644
--- a/SOURCE/module/entry.c
+++ b/SOURCE/module/entry.c
@@ -491,44 +491,64 @@ static int __init diagnosis_init(void)
}
ret = diag_linux_proc_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_linux_proc_init failed.\n");
goto out_proc;
+ }
ret = diag_kernel_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_kernel_init failed.\n");
goto out_kern;
+ }
ret = diag_net_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_net_init failed.\n");
goto out_net;
+ }
ret = diag_io_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_io_init failed.\n");
goto out_io;
+ }
ret = diag_stack_trace_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_stack_trace_init failed.\n");
goto out_stack_trace;
+ }
ret = diag_mm_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_mm_init failed.\n");
goto out_mm;
+ }
ret = diag_pupil_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_pupil_init failed.\n");
goto out_pupil;
+ }
ret = diag_fs_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_fs_init failed.\n");
goto out_fs;
+ }
ret = diag_xby_test_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_xhy_test_init failed.\n");
goto out_xby_test;
+ }
ret = diag_dev_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_dev_init failed.\n");
goto out_dev;
+ }
if (orig_kptr_restrict) {
*orig_kptr_restrict = 0;
diff --git a/SOURCE/module/kernel/kern_entry.c b/SOURCE/module/kernel/kern_entry.c
index cd3851f..80ce206 100644
--- a/SOURCE/module/kernel/kern_entry.c
+++ b/SOURCE/module/kernel/kern_entry.c
@@ -144,116 +144,172 @@ int diag_kernel_init(void)
pe = diag_proc_mkdir("ali-linux/diagnose/kern", NULL);
ret = diag_irq_stats_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_irq_stats_init failed, ret=%d\n", ret);
goto out;
+ }
ret = diag_irq_delay_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_irq_delay_init failed, ret=%d\n", ret);
goto out_irq_delay;
+ }
ret = diag_sched_delay_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_sched_delay_init failed, ret=%d\n", ret);
goto out_sched;
+ }
ret = diag_rcu_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_rcu_init failed, ret=%d\n", ret);
goto out_rcu;
+ }
ret = diag_sys_loop_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_sys_loop_init failed, ret=%d\n", ret);
goto out_sys_loop;
+ }
ret = diag_mutex_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_mutex_init failed, ret=%d\n", ret);
goto out_mutex;
+ }
ret = diag_load_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_load_init failed, ret=%d\n", ret);
goto out_load;
+ }
ret = diag_exit_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_exit_init failed, ret=%d\n", ret);
goto out_exit;
+ }
ret = diag_sys_cost_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_sys_cost_init failed, ret=%d\n", ret);
goto out_syscall_cpu_cost;
+ }
ret = diag_task_time_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_task_time_init failed, ret=%d\n", ret);
goto out_task_time;
+ }
ret = diag_sys_delay_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_sys_delay_init failed, ret=%d\n", ret);
goto out_syscall;
+ }
ret = diag_timer_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_time_init failed, ret=%d\n", ret);
goto out_timer;
+ }
ret = diag_exec_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_exec_init failed, ret=%d\n", ret);
goto out_exec;
+ }
ret = diag_runq_info_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_runq_info_init failed, ret=%d\n", ret);
goto out_runq_info;
+ }
ret = diag_kern_demo_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_kern_demo_init failed, ret=%d\n", ret);
goto out_kern_demo;
+ }
ret = diag_task_runs_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_task_runs_init failed, ret=%d\n", ret);
goto out_task_runs;
+ }
ret = diag_kern_perf_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_kern_perf_init failed, ret=%d\n", ret);
goto out_perf;
+ }
ret = diag_run_trace_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_run_trace_init failed, ret=%d\n", ret);
goto out_run_trace;
+ }
ret = diag_lock_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_lock_init failed, ret=%d\n", ret);
goto out_lock;
+ }
ret = diag_irq_trace_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_irq_trace_init failed, ret=%d\n", ret);
goto out_irq_trace;
+ }
ret = diag_sys_broken_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_sys_broken_init failed, ret=%d\n", ret);
goto out_sys_broken;
+ }
ret = diag_kprobe_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_kprobe_init failed, ret=%d\n", ret);
goto out_kprobe;
+ }
ret = diag_utilization_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_utilization_init failed, ret=%d\n", ret);
goto out_utilization;
+ }
ret = diag_reboot_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_reboot_init failed, ret=%d\n", ret);
goto out_reboot;
+ }
ret = diag_uprobe_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_uprobe_init failed, ret=%d\n", ret);
goto out_uprobe;
+ }
ret = diag_sig_info_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_sig_info_init failed, ret=%d\n", ret);
goto out_sig_info;
+ }
ret = diag_task_monitor_init();
- if (ret)
+ if (ret) {
+ pr_err("diag_task_monitor_init failed, ret=%d\n", ret);
goto out_task_monitor;
+ }
ret = diag_rw_sem_init();
- if (ret)
- goto out_rw_sem;
+ if (ret) {
+ pr_err("diag_rw_sem_init failed, ret=%d\n", ret);
+ goto out_rw_sem;
+ }
on_each_cpu(start_timer, NULL, 1);
diff --git a/SOURCE/module/kernel/mutex.c b/SOURCE/module/kernel/mutex.c
index 7384abd..8ee8b97 100644
--- a/SOURCE/module/kernel/mutex.c
+++ b/SOURCE/module/kernel/mutex.c
@@ -635,6 +635,8 @@ static int lookup_syms(void)
if (orig___mutex_unlock_slowpath == NULL)
orig___mutex_unlock_slowpath = (void *)diag_kallsyms_lookup_name("__mutex_unlock_slowpath");
if (orig___mutex_unlock_slowpath == NULL)
+ orig___mutex_unlock_slowpath = (void *)diag_kallsyms_lookup_name("__mutex_unlock_slowpath.constprop.0");
+ if (orig___mutex_unlock_slowpath == NULL)
return -EINVAL;
LOOKUP_SYMS(mutex_lock);
diff --git a/SOURCE/module/misc.c b/SOURCE/module/misc.c
index 3070d22..f9d535f 100755
--- a/SOURCE/module/misc.c
+++ b/SOURCE/module/misc.c
@@ -107,6 +107,14 @@ static char *bdevt_str(dev_t devt, char *buf)
* filesystem can't be mounted and thus to give the victim some idea of what
* went wrong
*/
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(5,10,0)
+
+void diag_printk_all_partitions(void)
+{
+}
+
+#else
void diag_printk_all_partitions(void)
{
struct class_dev_iter iter;
@@ -174,6 +182,8 @@ void diag_printk_all_partitions(void)
class_dev_iter_exit(&iter);
}
+#endif
+
struct proc_dir_entry *diag_proc_mkdir(const char *name,
struct proc_dir_entry *parent)
{
diff --git a/SOURCE/module/mm_tree.c b/SOURCE/module/mm_tree.c
index c4fa779..70f83b8 100644
--- a/SOURCE/module/mm_tree.c
+++ b/SOURCE/module/mm_tree.c
@@ -234,7 +234,10 @@ int get_argv_from_mm(struct mm_struct *mm, char *buf, size_t size)
if (offset + len >= PAGE_SIZE)
len = PAGE_SIZE - offset;
-#if KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE
+#if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE
+ ret = get_user_pages_remote(mm, pos, 1, FOLL_FORCE,
+ &page, NULL, NULL);
+#elif KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE
ret = get_user_pages_remote(current, mm, pos, 1, FOLL_FORCE,
&page, NULL, NULL);
#elif KERNEL_VERSION(4, 9, 0) <= LINUX_VERSION_CODE
diff --git a/SOURCE/module/pub/stack.c b/SOURCE/module/pub/stack.c
index 860815b..3aea59a 100644
--- a/SOURCE/module/pub/stack.c
+++ b/SOURCE/module/pub/stack.c
@@ -44,7 +44,9 @@
#include "pub/trace_file.h"
#include "pub/stack.h"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,10,0)
#include <asm/msr.h>
+#endif
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 33)
#include "pub/perf_event.h"
diff --git a/SOURCE/module/symbol.c b/SOURCE/module/symbol.c
index fc2306f..a566c1f 100755
--- a/SOURCE/module/symbol.c
+++ b/SOURCE/module/symbol.c
@@ -126,7 +126,17 @@ static int lookup_syms(void)
#if defined(DIAG_ARM64)
LOOKUP_SYMS(__flush_dcache_area);
LOOKUP_SYMS(aarch64_insn_patch_text);
+#if LINUX_VERSION_CODE > KERNEL_VERSION(5, 0, 0) || defined(CENTOS_4_18_193)
+ LOOKUP_SYMS(stack_trace_save_tsk);
+#ifdef CONFIG_USER_STACKTRACE_SUPPORT
+ LOOKUP_SYMS(stack_trace_save_user);
+#endif
+#else
+ LOOKUP_SYMS(save_stack_trace_user);
+#ifdef CONFIG_USER_STACKTRACE_SUPPORT
LOOKUP_SYMS(save_stack_trace_tsk);
+#endif
+#endif
#else
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0)
LOOKUP_SYMS(text_poke_smp);
@@ -181,7 +191,9 @@ static int lookup_syms(void)
LOOKUP_SYMS_NORET(css_next_descendant_pre);
LOOKUP_SYMS_NORET(cpuacct_subsys);
LOOKUP_SYMS_NORET(css_get_next);
+#if !defined(DIAG_ARM64)
LOOKUP_SYMS_NORET(x86_pmu);
+#endif
return 0;
}