From 4d63efb9ae67783d184a924bb73b38745c9a1119 Mon Sep 17 00:00:00 2001 From: Kuan-Ying Lee Date: Mon, 22 Feb 2021 16:40:22 +0800 Subject: [PATCH] ANDROID: module: Add vendor hook Add vendor hook for module init, so we can get memory type and use it to do memory type check for architecture dependent page table setting. Bug: 181639260 Signed-off-by: Kuan-Ying Lee Change-Id: I95b70d7a57994f2548fddfb2290d4c9136f58785 --- drivers/android/vendor_hooks.c | 3 +++ include/trace/hooks/module.h | 25 +++++++++++++++++++++++++ kernel/module.c | 26 ++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 include/trace/hooks/module.h diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 369ad757d040..88b46f8172a5 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -43,6 +43,7 @@ #include #include #include +#include #include /* @@ -198,3 +199,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_memory_x); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_memory_nx); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_memory_ro); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_memory_rw); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_module_permit_before_init); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_module_permit_after_init); diff --git a/include/trace/hooks/module.h b/include/trace/hooks/module.h new file mode 100644 index 000000000000..281cb0d37c12 --- /dev/null +++ b/include/trace/hooks/module.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM module + +#define TRACE_INCLUDE_PATH trace/hooks +#if !defined(_TRACE_HOOK_MODULE_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_MODULE_H +#include +#include +/* + * Following tracepoints are not exported in tracefs and provide a + * mechanism for vendor modules to hook and extend functionality + */ +struct module; +DECLARE_HOOK(android_vh_set_module_permit_before_init, + TP_PROTO(const struct module *mod), + TP_ARGS(mod)); + +DECLARE_HOOK(android_vh_set_module_permit_after_init, + TP_PROTO(const struct module *mod), + TP_ARGS(mod)); + +#endif /* _TRACE_HOOK_MODULE_H */ +/* This part must be outside protection */ +#include diff --git a/kernel/module.c b/kernel/module.c index 972ef24295a4..a0b99cd4cef7 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -63,6 +63,10 @@ #define CREATE_TRACE_POINTS #include +#undef CREATE_TRACE_POINTS +#include +#include + #ifndef ARCH_SHF_SMALL #define ARCH_SHF_SMALL 0 #endif @@ -2257,6 +2261,10 @@ static void free_module(struct module *mod) /* This may be empty, but that's OK */ module_arch_freeing_init(mod); + trace_android_vh_set_memory_rw((unsigned long)mod->init_layout.base, + (mod->init_layout.size)>>PAGE_SHIFT); + trace_android_vh_set_memory_nx((unsigned long)mod->init_layout.base, + (mod->init_layout.size)>>PAGE_SHIFT); module_memfree(mod->init_layout.base); kfree(mod->args); percpu_modfree(mod); @@ -2265,6 +2273,10 @@ static void free_module(struct module *mod) lockdep_free_key_range(mod->core_layout.base, mod->core_layout.size); /* Finally, free the core (containing the module structure) */ + trace_android_vh_set_memory_rw((unsigned long)mod->core_layout.base, + (mod->core_layout.size)>>PAGE_SHIFT); + trace_android_vh_set_memory_nx((unsigned long)mod->core_layout.base, + (mod->core_layout.size)>>PAGE_SHIFT); module_memfree(mod->core_layout.base); } @@ -3537,7 +3549,15 @@ static void module_deallocate(struct module *mod, struct load_info *info) { percpu_modfree(mod); module_arch_freeing_init(mod); + trace_android_vh_set_memory_rw((unsigned long)mod->init_layout.base, + (mod->init_layout.size)>>PAGE_SHIFT); + trace_android_vh_set_memory_nx((unsigned long)mod->init_layout.base, + (mod->init_layout.size)>>PAGE_SHIFT); module_memfree(mod->init_layout.base); + trace_android_vh_set_memory_rw((unsigned long)mod->core_layout.base, + (mod->core_layout.size)>>PAGE_SHIFT); + trace_android_vh_set_memory_nx((unsigned long)mod->core_layout.base, + (mod->core_layout.size)>>PAGE_SHIFT); module_memfree(mod->core_layout.base); } @@ -3695,8 +3715,13 @@ static noinline int do_init_module(struct module *mod) rcu_assign_pointer(mod->kallsyms, &mod->core_kallsyms); #endif module_enable_ro(mod, true); + trace_android_vh_set_module_permit_after_init(mod); mod_tree_remove_init(mod); module_arch_freeing_init(mod); + trace_android_vh_set_memory_rw((unsigned long)mod->init_layout.base, + (mod->init_layout.size)>>PAGE_SHIFT); + trace_android_vh_set_memory_nx((unsigned long)mod->init_layout.base, + (mod->init_layout.size)>>PAGE_SHIFT); mod->init_layout.base = NULL; mod->init_layout.size = 0; mod->init_layout.ro_size = 0; @@ -3803,6 +3828,7 @@ static int complete_formation(struct module *mod, struct load_info *info) module_enable_ro(mod, false); module_enable_nx(mod); module_enable_x(mod); + trace_android_vh_set_module_permit_before_init(mod); /* Mark state as coming so strong_try_module_get() ignores us, * but kallsyms etc. can see us. */