From f11d57d2bd1241a6e7035c4c5ea53b74c2f9cbbc Mon Sep 17 00:00:00 2001 From: liankong Date: Sat, 29 Mar 2025 22:32:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/kpm/compact.c | 18 +++++++++--------- kernel/kpm/kpm.c | 33 ++++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/kernel/kpm/compact.c b/kernel/kpm/compact.c index 2c2ac533..d6f69705 100644 --- a/kernel/kpm/compact.c +++ b/kernel/kpm/compact.c @@ -31,7 +31,7 @@ unsigned long sukisu_compact_find_symbol(const char* name); // ====================================================================== -const char* kpver = "0.10"; +const char* kver = "0.10"; struct CompactAddressSymbol { const char* symbol_name; @@ -45,18 +45,18 @@ struct CompactAliasSymbol { struct CompactAddressSymbol address_symbol [] = { { "kallsyms_lookup_name", &kallsyms_lookup_name }, - { "compat_find_symbol", &sukisu_compact_find_symbol }, - { "compat_copy_to_user", ©_to_user }, - { "compat_strncpy_from_user", &strncpy_from_user }, - { "kpver", &kpver }, + { "compact_find_symbol", &sukisu_compact_find_symbol }, + { "compact_copy_to_user", ©_to_user }, + { "compact_strncpy_from_user", &strncpy_from_user }, + { "kver", &kver }, { "is_run_in_sukisu_ultra", (void*)1 } }; struct CompactAliasSymbol alias_symbol[] = { - {"kf_strncat", "strncat"}, - {"kf_strlen", "strlen" }, - {"kf_strcpy", "strcpy"}, - {"compat_copy_to_user", "__arch_copy_to_user"} + {"kf__strncat", "strncat"}, + {"kf__strlen", "strlen" }, + {"kf__strcpy", "strcpy"}, + {"compact_copy_to_user", "__arch_copy_to_user"} }; unsigned long sukisu_compact_find_symbol(const char* name) { diff --git a/kernel/kpm/kpm.c b/kernel/kpm/kpm.c index 0f9cc3dd..1b84cbf6 100644 --- a/kernel/kpm/kpm.c +++ b/kernel/kpm/kpm.c @@ -598,36 +598,47 @@ static int kpm_setup_load_info(struct kpm_load_info *info) * KPM 模块加载主流程 *----------------------------------------------------------*/ /* 注意:接口名称改为 kpm_load_module,避免与内核原有 load_module 冲突 */ -long kpm_load_module(const void *data, int len, const char *args, const char *event, void *__user reserved) +long kpm_load_module(const void *data, int len, const char *args, + const char *event, void *__user reserved) { struct kpm_load_info load_info = { .hdr = data, .len = len }; long rc = 0; struct kpm_module *mod; + /* 检查 ELF 头 */ rc = kpm_elf_header_check(&load_info); if (rc) goto out; + rc = kpm_setup_load_info(&load_info); if (rc) goto out; - if (find_sec_num(&load_info, ".kpm.init") == -1 || find_sec_num(&load_info, ".kpm.exit") == -1) { + + /* 检查必须存在的模块初始化/退出段 */ + if (find_sec_num(&load_info, ".kpm.init") == -1 || + find_sec_num(&load_info, ".kpm.exit") == -1) { printk(KERN_ERR "ARM64 KPM Loader: Required sections missing\n"); rc = -ENOEXEC; goto out; } + + /* 检查模块是否已经加载 */ if (find_module(load_info.info.name)) { - printk(KERN_ERR "ARM64 KPM Loader: Module %s already loaded\n", load_info.info.name); + printk(KERN_ERR "ARM64 KPM Loader: Module %s already loaded\n", + load_info.info.name); rc = -EEXIST; goto out; } mod = vmalloc(sizeof(struct kpm_module)); - if (!mod) - return -ENOMEM; + if (!mod) { + rc = -ENOMEM; + goto out; + } memset(mod, 0, sizeof(struct kpm_module)); if (args) { - mod->args = (typeof(mod->args)) vmalloc(strlen(args) + 1); + mod->args = vmalloc(strlen(args) + 1); if (!mod->args) { rc = -ENOMEM; goto free_mod; @@ -648,17 +659,21 @@ long kpm_load_module(const void *data, int len, const char *args, const char *ev if (rc) goto free_mod; - flush_icache_all(); + /* 替换 flush_icache_all() 为 flush_icache_range() */ + flush_icache_range((unsigned long)mod->start, + (unsigned long)mod->start + mod->size); rc = mod->init(mod->args, event, reserved); if (!rc) { - printk(KERN_INFO "ARM64 KPM Loader: Module [%s] loaded successfully with args [%s]\n", mod->info.name, args ? args : ""); + printk(KERN_INFO "ARM64 KPM Loader: Module [%s] loaded successfully with args [%s]\n", + mod->info.name, args ? args : ""); spin_lock(&kpm_module_lock); list_add_tail(&mod->list, &kpm_module_list); spin_unlock(&kpm_module_lock); goto out; } else { - printk(KERN_ERR "ARM64 KPM Loader: Module [%s] init failed with error %ld\n", mod->info.name, rc); + printk(KERN_ERR "ARM64 KPM Loader: Module [%s] init failed with error %ld\n", + mod->info.name, rc); mod->exit(reserved); } free_mod: