尝试修复
This commit is contained in:
@@ -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 {
|
struct CompactAddressSymbol {
|
||||||
const char* symbol_name;
|
const char* symbol_name;
|
||||||
@@ -45,18 +45,18 @@ struct CompactAliasSymbol {
|
|||||||
|
|
||||||
struct CompactAddressSymbol address_symbol [] = {
|
struct CompactAddressSymbol address_symbol [] = {
|
||||||
{ "kallsyms_lookup_name", &kallsyms_lookup_name },
|
{ "kallsyms_lookup_name", &kallsyms_lookup_name },
|
||||||
{ "compat_find_symbol", &sukisu_compact_find_symbol },
|
{ "compact_find_symbol", &sukisu_compact_find_symbol },
|
||||||
{ "compat_copy_to_user", ©_to_user },
|
{ "compact_copy_to_user", ©_to_user },
|
||||||
{ "compat_strncpy_from_user", &strncpy_from_user },
|
{ "compact_strncpy_from_user", &strncpy_from_user },
|
||||||
{ "kpver", &kpver },
|
{ "kver", &kver },
|
||||||
{ "is_run_in_sukisu_ultra", (void*)1 }
|
{ "is_run_in_sukisu_ultra", (void*)1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CompactAliasSymbol alias_symbol[] = {
|
struct CompactAliasSymbol alias_symbol[] = {
|
||||||
{"kf_strncat", "strncat"},
|
{"kf__strncat", "strncat"},
|
||||||
{"kf_strlen", "strlen" },
|
{"kf__strlen", "strlen" },
|
||||||
{"kf_strcpy", "strcpy"},
|
{"kf__strcpy", "strcpy"},
|
||||||
{"compat_copy_to_user", "__arch_copy_to_user"}
|
{"compact_copy_to_user", "__arch_copy_to_user"}
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned long sukisu_compact_find_symbol(const char* name) {
|
unsigned long sukisu_compact_find_symbol(const char* name) {
|
||||||
|
|||||||
@@ -598,36 +598,47 @@ static int kpm_setup_load_info(struct kpm_load_info *info)
|
|||||||
* KPM 模块加载主流程
|
* KPM 模块加载主流程
|
||||||
*----------------------------------------------------------*/
|
*----------------------------------------------------------*/
|
||||||
/* 注意:接口名称改为 kpm_load_module,避免与内核原有 load_module 冲突 */
|
/* 注意:接口名称改为 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 };
|
struct kpm_load_info load_info = { .hdr = data, .len = len };
|
||||||
long rc = 0;
|
long rc = 0;
|
||||||
struct kpm_module *mod;
|
struct kpm_module *mod;
|
||||||
|
|
||||||
|
/* 检查 ELF 头 */
|
||||||
rc = kpm_elf_header_check(&load_info);
|
rc = kpm_elf_header_check(&load_info);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
rc = kpm_setup_load_info(&load_info);
|
rc = kpm_setup_load_info(&load_info);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out;
|
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");
|
printk(KERN_ERR "ARM64 KPM Loader: Required sections missing\n");
|
||||||
rc = -ENOEXEC;
|
rc = -ENOEXEC;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 检查模块是否已经加载 */
|
||||||
if (find_module(load_info.info.name)) {
|
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;
|
rc = -EEXIST;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
mod = vmalloc(sizeof(struct kpm_module));
|
mod = vmalloc(sizeof(struct kpm_module));
|
||||||
if (!mod)
|
if (!mod) {
|
||||||
return -ENOMEM;
|
rc = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
memset(mod, 0, sizeof(struct kpm_module));
|
memset(mod, 0, sizeof(struct kpm_module));
|
||||||
|
|
||||||
if (args) {
|
if (args) {
|
||||||
mod->args = (typeof(mod->args)) vmalloc(strlen(args) + 1);
|
mod->args = vmalloc(strlen(args) + 1);
|
||||||
if (!mod->args) {
|
if (!mod->args) {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
goto free_mod;
|
goto free_mod;
|
||||||
@@ -648,17 +659,21 @@ long kpm_load_module(const void *data, int len, const char *args, const char *ev
|
|||||||
if (rc)
|
if (rc)
|
||||||
goto free_mod;
|
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);
|
rc = mod->init(mod->args, event, reserved);
|
||||||
if (!rc) {
|
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);
|
spin_lock(&kpm_module_lock);
|
||||||
list_add_tail(&mod->list, &kpm_module_list);
|
list_add_tail(&mod->list, &kpm_module_list);
|
||||||
spin_unlock(&kpm_module_lock);
|
spin_unlock(&kpm_module_lock);
|
||||||
goto out;
|
goto out;
|
||||||
} else {
|
} 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);
|
mod->exit(reserved);
|
||||||
}
|
}
|
||||||
free_mod:
|
free_mod:
|
||||||
|
|||||||
Reference in New Issue
Block a user