ANDROID: module: Add vendor hooks
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. To make sure the architecture dependent tables are created correctly, we need to know when module parts are initialized and their attributes. For releasing modules, corresponding tables and attributes should be destroyed and restored. These hooks may be invoked in non-atomic context, so it's necessary to use restricted ones. Bug: 248994334 Change-Id: Ie9f415c36bca1fb98e021522b627e562d27cdef4 Signed-off-by: Kuan-Ying Lee <Kuan-Ying.Lee@mediatek.com>
This commit is contained in:
parent
05b36413b6
commit
b28620e7db
@ -37,6 +37,7 @@
|
||||
#include <trace/hooks/vmscan.h>
|
||||
#include <trace/hooks/avc.h>
|
||||
#include <trace/hooks/creds.h>
|
||||
#include <trace/hooks/module.h>
|
||||
#include <trace/hooks/selinux.h>
|
||||
#include <trace/hooks/syscall_check.h>
|
||||
#include <trace/hooks/remoteproc.h>
|
||||
@ -136,6 +137,10 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_commit_creds);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_exit_creds);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_override_creds);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_revert_creds);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_module_core_rw_nx);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_module_init_rw_nx);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_module_permit_before_init);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_module_permit_after_init);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_selinux_is_initialized);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_shmem_get_folio);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_mmap_file);
|
||||
|
32
include/trace/hooks/module.h
Normal file
32
include/trace/hooks/module.h
Normal file
@ -0,0 +1,32 @@
|
||||
/* 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 <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_RESTRICTED_HOOK(android_rvh_set_module_permit_before_init,
|
||||
TP_PROTO(const struct module *mod),
|
||||
TP_ARGS(mod), 1);
|
||||
|
||||
DECLARE_RESTRICTED_HOOK(android_rvh_set_module_permit_after_init,
|
||||
TP_PROTO(const struct module *mod),
|
||||
TP_ARGS(mod), 1);
|
||||
|
||||
DECLARE_RESTRICTED_HOOK(android_rvh_set_module_core_rw_nx,
|
||||
TP_PROTO(const struct module *mod),
|
||||
TP_ARGS(mod), 1);
|
||||
|
||||
DECLARE_RESTRICTED_HOOK(android_rvh_set_module_init_rw_nx,
|
||||
TP_PROTO(const struct module *mod),
|
||||
TP_ARGS(mod), 1);
|
||||
|
||||
#endif /* _TRACE_HOOK_MODULE_H */
|
||||
/* This part must be outside protection */
|
||||
#include <trace/define_trace.h>
|
@ -60,6 +60,9 @@
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/module.h>
|
||||
|
||||
#undef CREATE_TRACE_POINTS
|
||||
#include <trace/hooks/module.h>
|
||||
|
||||
/*
|
||||
* Mutex protects:
|
||||
* 1) List of modules (also safely readable with preempt_disable),
|
||||
@ -1208,6 +1211,7 @@ static void free_module(struct module *mod)
|
||||
|
||||
/* This may be empty, but that's OK */
|
||||
module_arch_freeing_init(mod);
|
||||
trace_android_rvh_set_module_init_rw_nx(mod);
|
||||
module_memfree(mod->init_layout.base);
|
||||
kfree(mod->args);
|
||||
percpu_modfree(mod);
|
||||
@ -1216,6 +1220,7 @@ static void free_module(struct module *mod)
|
||||
lockdep_free_key_range(mod->data_layout.base, mod->data_layout.size);
|
||||
|
||||
/* Finally, free the core (containing the module structure) */
|
||||
trace_android_rvh_set_module_core_rw_nx(mod);
|
||||
module_memfree(mod->core_layout.base);
|
||||
#ifdef CONFIG_ARCH_WANTS_MODULES_DATA_IN_VMALLOC
|
||||
vfree(mod->data_layout.base);
|
||||
@ -2373,7 +2378,9 @@ static void module_deallocate(struct module *mod, struct load_info *info)
|
||||
{
|
||||
percpu_modfree(mod);
|
||||
module_arch_freeing_init(mod);
|
||||
trace_android_rvh_set_module_init_rw_nx(mod);
|
||||
module_memfree(mod->init_layout.base);
|
||||
trace_android_rvh_set_module_core_rw_nx(mod);
|
||||
module_memfree(mod->core_layout.base);
|
||||
#ifdef CONFIG_ARCH_WANTS_MODULES_DATA_IN_VMALLOC
|
||||
vfree(mod->data_layout.base);
|
||||
@ -2526,8 +2533,10 @@ 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_rvh_set_module_permit_after_init(mod);
|
||||
mod_tree_remove_init(mod);
|
||||
module_arch_freeing_init(mod);
|
||||
trace_android_rvh_set_module_init_rw_nx(mod);
|
||||
mod->init_layout.base = NULL;
|
||||
mod->init_layout.size = 0;
|
||||
mod->init_layout.ro_size = 0;
|
||||
@ -2657,6 +2666,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_rvh_set_module_permit_before_init(mod);
|
||||
|
||||
/*
|
||||
* Mark state as coming so strong_try_module_get() ignores us,
|
||||
|
Loading…
Reference in New Issue
Block a user