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 <Kuan-Ying.Lee@mediatek.com> Change-Id: I95b70d7a57994f2548fddfb2290d4c9136f58785
This commit is contained in:
@@ -43,6 +43,7 @@
|
||||
#include <trace/hooks/traps.h>
|
||||
#include <trace/hooks/avc.h>
|
||||
#include <trace/hooks/creds.h>
|
||||
#include <trace/hooks/module.h>
|
||||
#include <trace/hooks/memory.h>
|
||||
|
||||
/*
|
||||
@@ -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);
|
||||
|
25
include/trace/hooks/module.h
Normal file
25
include/trace/hooks/module.h
Normal file
@@ -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 <linux/tracepoint.h>
|
||||
#include <trace/hooks/vendor_hooks.h>
|
||||
/*
|
||||
* 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 <trace/define_trace.h>
|
@@ -63,6 +63,10 @@
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/module.h>
|
||||
|
||||
#undef CREATE_TRACE_POINTS
|
||||
#include <trace/hooks/module.h>
|
||||
#include <trace/hooks/memory.h>
|
||||
|
||||
#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. */
|
||||
|
Reference in New Issue
Block a user