diff options
| author | Wen Yang <[email protected]> | 2021-10-21 01:04:25 +0800 |
|---|---|---|
| committer | Wen Yang <[email protected]> | 2021-10-21 01:06:51 +0800 |
| commit | d82e7b89061d3fa297e37a927c036bda1371679f (patch) | |
| tree | 01a1496fc431fc3b94f55463256679246b4a370b /SOURCE | |
| parent | 7ca582193ba134026b3a40b31bc36a1f1b060ff6 (diff) | |
diagnose-tools: 支持阿里ARM芯片+5.10内核
Diffstat (limited to 'SOURCE')
| -rw-r--r-- | SOURCE/module/entry.c | 40 | ||||
| -rw-r--r-- | SOURCE/module/kernel/kern_entry.c | 114 | ||||
| -rw-r--r-- | SOURCE/module/kernel/mutex.c | 2 | ||||
| -rwxr-xr-x | SOURCE/module/misc.c | 10 | ||||
| -rw-r--r-- | SOURCE/module/mm_tree.c | 5 | ||||
| -rw-r--r-- | SOURCE/module/pub/stack.c | 2 | ||||
| -rwxr-xr-x | SOURCE/module/symbol.c | 12 |
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; } |
