From 5594a4a4a9ba727fe182df49964cde37093bdb45 Mon Sep 17 00:00:00 2001 From: CGH0S7 <776459475@qq.com> Date: Sat, 23 Aug 2025 12:12:22 +0800 Subject: [PATCH] The build is successful, testing is required --- executer/kernel/mcctrl/arch/x86_64/archdeps.c | 13 ++-- executer/kernel/mcctrl/driver.c | 43 ++++++----- executer/kernel/mcctrl/kallsyms_compat.h | 72 +++++++++++++++++++ executer/kernel/mcctrl/syscall.c | 19 ++++- 4 files changed, 123 insertions(+), 24 deletions(-) create mode 100644 executer/kernel/mcctrl/kallsyms_compat.h diff --git a/executer/kernel/mcctrl/arch/x86_64/archdeps.c b/executer/kernel/mcctrl/arch/x86_64/archdeps.c index 2d9cf9f0..c58e6591 100644 --- a/executer/kernel/mcctrl/arch/x86_64/archdeps.c +++ b/executer/kernel/mcctrl/arch/x86_64/archdeps.c @@ -6,6 +6,7 @@ #include #include "config.h" #include "../../mcctrl.h" +#include "../../kallsyms_compat.h" #if LINUX_VERSION_CODE < KERNEL_VERSION(5,8,0) && defined(CONFIG_X86_VSYSCALL_EMULATION) #define gtod (&VVAR(vsyscall_gtod_data)) @@ -35,19 +36,19 @@ static void **hv_clock; int arch_symbols_init(void) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0) - _vdso_image_64 = (void *) kallsyms_lookup_name("vdso_image_64"); + _vdso_image_64 = (void *) mcctrl_lookup_name("vdso_image_64"); if (WARN_ON(!_vdso_image_64)) return -EFAULT; #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23) - vdso_start = (void *) kallsyms_lookup_name("vdso_start"); + vdso_start = (void *) mcctrl_lookup_name("vdso_start"); if (WARN_ON(!vdso_start)) return -EFAULT; - vdso_end = (void *) kallsyms_lookup_name("vdso_end"); + vdso_end = (void *) mcctrl_lookup_name("vdso_end"); if (WARN_ON(!vdso_end)) return -EFAULT; - vdso_pages = (void *) kallsyms_lookup_name("vdso_pages"); + vdso_pages = (void *) mcctrl_lookup_name("vdso_pages"); if (WARN_ON(!vdso_pages)) return -EFAULT; #endif @@ -56,8 +57,8 @@ int arch_symbols_init(void) if (WARN_ON(!__vvar_page_ptr)) return -EFAULT; - hpet_address = (void *) kallsyms_lookup_name("hpet_address"); - hv_clock = (void *) kallsyms_lookup_name("hv_clock"); + hpet_address = (void *) mcctrl_lookup_name("hpet_address"); + hv_clock = (void *) mcctrl_lookup_name("hv_clock"); return 0; } diff --git a/executer/kernel/mcctrl/driver.c b/executer/kernel/mcctrl/driver.c index 70eac7f2..864cb717 100644 --- a/executer/kernel/mcctrl/driver.c +++ b/executer/kernel/mcctrl/driver.c @@ -34,6 +34,7 @@ #include #include "mcctrl.h" #include +#include "kallsyms_compat.h" #define OS_MAX_MINOR 64 @@ -237,75 +238,84 @@ struct inode_operations *mcctrl_hugetlbfs_inode_operations; static int symbols_init(void) { + int ret; + + /* Initialize kallsyms compatibility layer */ + ret = init_kallsyms_lookup(); + if (ret) { + pr_err("Failed to initialize kallsyms compatibility layer: %d\n", ret); + return ret; + } + #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,17,0) - mcctrl_sys_mount = (void *) kallsyms_lookup_name("ksys_mount"); + mcctrl_sys_mount = (void *) mcctrl_lookup_name("ksys_mount"); #else - mcctrl_sys_mount = (void *) kallsyms_lookup_name("sys_mount"); + mcctrl_sys_mount = (void *) mcctrl_lookup_name("sys_mount"); #if defined(CONFIG_X86_64_SMP) if (!mcctrl_sys_mount) mcctrl_sys_mount = - (void *) kallsyms_lookup_name("__x64_sys_mount"); + (void *) mcctrl_lookup_name("__x64_sys_mount"); #endif #endif if (WARN_ON(!mcctrl_sys_mount)) return -EFAULT; #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,17,0) - mcctrl_sys_umount = (void *) kallsyms_lookup_name("ksys_umount"); + mcctrl_sys_umount = (void *) mcctrl_lookup_name("ksys_umount"); #else - mcctrl_sys_umount = (void *) kallsyms_lookup_name("sys_umount"); + mcctrl_sys_umount = (void *) mcctrl_lookup_name("sys_umount"); #if defined(CONFIG_X86_64_SMP) if (!mcctrl_sys_umount) mcctrl_sys_umount = - (void *) kallsyms_lookup_name("__x64_sys_umount"); + (void *) mcctrl_lookup_name("__x64_sys_umount"); #endif #endif if (WARN_ON(!mcctrl_sys_umount)) return -EFAULT; #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,17,0) - mcctrl_sys_unshare = (void *) kallsyms_lookup_name("ksys_unshare"); + mcctrl_sys_unshare = (void *) mcctrl_lookup_name("ksys_unshare"); #else - mcctrl_sys_unshare = (void *) kallsyms_lookup_name("sys_unshare"); + mcctrl_sys_unshare = (void *) mcctrl_lookup_name("sys_unshare"); #if defined(CONFIG_X86_64_SMP) if (!mcctrl_sys_unshare) mcctrl_sys_unshare = - (void *) kallsyms_lookup_name("__x64_sys_unshare"); + (void *) mcctrl_lookup_name("__x64_sys_unshare"); #endif #endif if (WARN_ON(!mcctrl_sys_unshare)) return -EFAULT; mcctrl_sched_setaffinity = - (void *) kallsyms_lookup_name("sched_setaffinity"); + (void *) mcctrl_lookup_name("sched_setaffinity"); if (WARN_ON(!mcctrl_sched_setaffinity)) return -EFAULT; mcctrl_sched_setscheduler_nocheck = - (void *) kallsyms_lookup_name("sched_setscheduler_nocheck"); + (void *) mcctrl_lookup_name("sched_setscheduler_nocheck"); if (WARN_ON(!mcctrl_sched_setscheduler_nocheck)) return -EFAULT; #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,17,0) - mcctrl_sys_readlinkat = (void *)kallsyms_lookup_name("do_readlinkat"); + mcctrl_sys_readlinkat = (void *)mcctrl_lookup_name("do_readlinkat"); #else - mcctrl_sys_readlinkat = (void *)kallsyms_lookup_name("sys_readlinkat"); + mcctrl_sys_readlinkat = (void *)mcctrl_lookup_name("sys_readlinkat"); #if defined(CONFIG_X86_64_SMP) if (!mcctrl_sys_readlinkat) mcctrl_sys_readlinkat = - (void *) kallsyms_lookup_name("__x64_sys_readlinkat"); + (void *) mcctrl_lookup_name("__x64_sys_readlinkat"); #endif #endif if (WARN_ON(!mcctrl_sys_readlinkat)) return -EFAULT; mcctrl_zap_page_range = - (void *) kallsyms_lookup_name("zap_page_range"); + (void *) mcctrl_lookup_name("zap_page_range"); if (WARN_ON(!mcctrl_zap_page_range)) return -EFAULT; mcctrl_hugetlbfs_inode_operations = - (void *) kallsyms_lookup_name("hugetlbfs_inode_operations"); + (void *) mcctrl_lookup_name("hugetlbfs_inode_operations"); if (WARN_ON(!mcctrl_hugetlbfs_inode_operations)) return -EFAULT; @@ -359,6 +369,7 @@ static void __exit mcctrl_exit(void) binfmt_mcexec_exit(); uti_attr_finalize(); + cleanup_kallsyms_lookup(); #ifdef ENABLE_TOFU mcctrl_tofu_restore_release_handlers(); #endif diff --git a/executer/kernel/mcctrl/kallsyms_compat.h b/executer/kernel/mcctrl/kallsyms_compat.h new file mode 100644 index 00000000..beb522f7 --- /dev/null +++ b/executer/kernel/mcctrl/kallsyms_compat.h @@ -0,0 +1,72 @@ +/* kallsyms_compat.h - Compatibility layer for kallsyms_lookup_name */ + +#ifndef KALLSYMS_COMPAT_H +#define KALLSYMS_COMPAT_H + +#include +#include +#include + +/* kallsyms_lookup_name is no longer exported since kernel 5.7 */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0) + +/* Function pointer for kallsyms_lookup_name */ +static unsigned long (*mcctrl_kallsyms_lookup_name)(const char *name); + +/* Kprobe-based approach to get kallsyms_lookup_name function pointer */ +static struct kprobe kp_kallsyms = { + .symbol_name = "kallsyms_lookup_name" +}; + +static int init_kallsyms_lookup(void) +{ + int ret; + + ret = register_kprobe(&kp_kallsyms); + if (ret < 0) { + pr_err("register_kprobe failed, returned %d\n", ret); + return ret; + } + + mcctrl_kallsyms_lookup_name = (unsigned long (*)(const char *))kp_kallsyms.addr; + unregister_kprobe(&kp_kallsyms); + + if (!mcctrl_kallsyms_lookup_name) { + pr_err("Failed to get kallsyms_lookup_name address\n"); + return -EINVAL; + } + + return 0; +} + +static void cleanup_kallsyms_lookup(void) +{ + mcctrl_kallsyms_lookup_name = NULL; +} + +static inline unsigned long mcctrl_lookup_name(const char *name) +{ + if (mcctrl_kallsyms_lookup_name) + return mcctrl_kallsyms_lookup_name(name); + return 0; +} + +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(5, 7, 0) */ + +static inline int init_kallsyms_lookup(void) +{ + return 0; +} + +static inline void cleanup_kallsyms_lookup(void) +{ +} + +static inline unsigned long mcctrl_lookup_name(const char *name) +{ + return kallsyms_lookup_name(name); +} + +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0) */ + +#endif /* KALLSYMS_COMPAT_H */ \ No newline at end of file diff --git a/executer/kernel/mcctrl/syscall.c b/executer/kernel/mcctrl/syscall.c index 80302701..7cb375ee 100644 --- a/executer/kernel/mcctrl/syscall.c +++ b/executer/kernel/mcctrl/syscall.c @@ -57,6 +57,21 @@ #include #include +/* Compatibility function for vfs_fstat which is not exported in newer kernels */ +static inline int mcctrl_vfs_fstat(int fd, struct kstat *stat) +{ + struct file *file; + int error; + + file = fget(fd); + if (!file) + return -EBADF; + + error = vfs_getattr(&file->f_path, stat, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT); + fput(file); + return error; +} + #define ALIGN_WAIT_BUF(z) (((z + 63) >> 6) << 6) //#define SC_DEBUG @@ -950,7 +965,7 @@ static int pager_req_create(ihk_os_t os, int fd, uintptr_t result_pa) dprintk("pager_req_create(%d,%lx)\n", fd, (long)result_pa); - error = vfs_fstat(fd, &st); + error = mcctrl_vfs_fstat(fd, &st); if (error) { printk("pager_req_create(%d,%lx):vfs_stat failed. %d\n", fd, (long)result_pa, error); goto out; @@ -1587,7 +1602,7 @@ retry: pmd = pmd_offset(pud, va); if (!pmd_none(*pmd) && !pmd_bad(*pmd) && pmd_present(*pmd)) { - pte = pte_offset_map(pmd, va); + pte = pte_offset_kernel(pmd, va); if (!pte_none(*pte) && pte_present(*pte)) { pfn = (uintptr_t)pte_pfn(*pte) << PAGE_SHIFT; #define PFN_PRESENT ((uintptr_t)1 << 0)