The build is successful, testing is required
This commit is contained in:
@ -6,6 +6,7 @@
|
|||||||
#include <asm/vgtod.h>
|
#include <asm/vgtod.h>
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "../../mcctrl.h"
|
#include "../../mcctrl.h"
|
||||||
|
#include "../../kallsyms_compat.h"
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,8,0) && defined(CONFIG_X86_VSYSCALL_EMULATION)
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,8,0) && defined(CONFIG_X86_VSYSCALL_EMULATION)
|
||||||
#define gtod (&VVAR(vsyscall_gtod_data))
|
#define gtod (&VVAR(vsyscall_gtod_data))
|
||||||
@ -35,19 +36,19 @@ static void **hv_clock;
|
|||||||
int arch_symbols_init(void)
|
int arch_symbols_init(void)
|
||||||
{
|
{
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)
|
#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))
|
if (WARN_ON(!_vdso_image_64))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23)
|
#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))
|
if (WARN_ON(!vdso_start))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
vdso_end = (void *) kallsyms_lookup_name("vdso_end");
|
vdso_end = (void *) mcctrl_lookup_name("vdso_end");
|
||||||
if (WARN_ON(!vdso_end))
|
if (WARN_ON(!vdso_end))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
vdso_pages = (void *) kallsyms_lookup_name("vdso_pages");
|
vdso_pages = (void *) mcctrl_lookup_name("vdso_pages");
|
||||||
if (WARN_ON(!vdso_pages))
|
if (WARN_ON(!vdso_pages))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
#endif
|
#endif
|
||||||
@ -56,8 +57,8 @@ int arch_symbols_init(void)
|
|||||||
if (WARN_ON(!__vvar_page_ptr))
|
if (WARN_ON(!__vvar_page_ptr))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
hpet_address = (void *) kallsyms_lookup_name("hpet_address");
|
hpet_address = (void *) mcctrl_lookup_name("hpet_address");
|
||||||
hv_clock = (void *) kallsyms_lookup_name("hv_clock");
|
hv_clock = (void *) mcctrl_lookup_name("hv_clock");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -34,6 +34,7 @@
|
|||||||
#include <linux/version.h>
|
#include <linux/version.h>
|
||||||
#include "mcctrl.h"
|
#include "mcctrl.h"
|
||||||
#include <ihk/ihk_host_user.h>
|
#include <ihk/ihk_host_user.h>
|
||||||
|
#include "kallsyms_compat.h"
|
||||||
|
|
||||||
#define OS_MAX_MINOR 64
|
#define OS_MAX_MINOR 64
|
||||||
|
|
||||||
@ -237,75 +238,84 @@ struct inode_operations *mcctrl_hugetlbfs_inode_operations;
|
|||||||
|
|
||||||
static int symbols_init(void)
|
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)
|
#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
|
#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 defined(CONFIG_X86_64_SMP)
|
||||||
if (!mcctrl_sys_mount)
|
if (!mcctrl_sys_mount)
|
||||||
mcctrl_sys_mount =
|
mcctrl_sys_mount =
|
||||||
(void *) kallsyms_lookup_name("__x64_sys_mount");
|
(void *) mcctrl_lookup_name("__x64_sys_mount");
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
if (WARN_ON(!mcctrl_sys_mount))
|
if (WARN_ON(!mcctrl_sys_mount))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,17,0)
|
#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
|
#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 defined(CONFIG_X86_64_SMP)
|
||||||
if (!mcctrl_sys_umount)
|
if (!mcctrl_sys_umount)
|
||||||
mcctrl_sys_umount =
|
mcctrl_sys_umount =
|
||||||
(void *) kallsyms_lookup_name("__x64_sys_umount");
|
(void *) mcctrl_lookup_name("__x64_sys_umount");
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
if (WARN_ON(!mcctrl_sys_umount))
|
if (WARN_ON(!mcctrl_sys_umount))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,17,0)
|
#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
|
#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 defined(CONFIG_X86_64_SMP)
|
||||||
if (!mcctrl_sys_unshare)
|
if (!mcctrl_sys_unshare)
|
||||||
mcctrl_sys_unshare =
|
mcctrl_sys_unshare =
|
||||||
(void *) kallsyms_lookup_name("__x64_sys_unshare");
|
(void *) mcctrl_lookup_name("__x64_sys_unshare");
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
if (WARN_ON(!mcctrl_sys_unshare))
|
if (WARN_ON(!mcctrl_sys_unshare))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
mcctrl_sched_setaffinity =
|
mcctrl_sched_setaffinity =
|
||||||
(void *) kallsyms_lookup_name("sched_setaffinity");
|
(void *) mcctrl_lookup_name("sched_setaffinity");
|
||||||
if (WARN_ON(!mcctrl_sched_setaffinity))
|
if (WARN_ON(!mcctrl_sched_setaffinity))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
mcctrl_sched_setscheduler_nocheck =
|
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))
|
if (WARN_ON(!mcctrl_sched_setscheduler_nocheck))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,17,0)
|
#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
|
#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 defined(CONFIG_X86_64_SMP)
|
||||||
if (!mcctrl_sys_readlinkat)
|
if (!mcctrl_sys_readlinkat)
|
||||||
mcctrl_sys_readlinkat =
|
mcctrl_sys_readlinkat =
|
||||||
(void *) kallsyms_lookup_name("__x64_sys_readlinkat");
|
(void *) mcctrl_lookup_name("__x64_sys_readlinkat");
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
if (WARN_ON(!mcctrl_sys_readlinkat))
|
if (WARN_ON(!mcctrl_sys_readlinkat))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
mcctrl_zap_page_range =
|
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))
|
if (WARN_ON(!mcctrl_zap_page_range))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
mcctrl_hugetlbfs_inode_operations =
|
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))
|
if (WARN_ON(!mcctrl_hugetlbfs_inode_operations))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
@ -359,6 +369,7 @@ static void __exit mcctrl_exit(void)
|
|||||||
|
|
||||||
binfmt_mcexec_exit();
|
binfmt_mcexec_exit();
|
||||||
uti_attr_finalize();
|
uti_attr_finalize();
|
||||||
|
cleanup_kallsyms_lookup();
|
||||||
#ifdef ENABLE_TOFU
|
#ifdef ENABLE_TOFU
|
||||||
mcctrl_tofu_restore_release_handlers();
|
mcctrl_tofu_restore_release_handlers();
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
72
executer/kernel/mcctrl/kallsyms_compat.h
Normal file
72
executer/kernel/mcctrl/kallsyms_compat.h
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/* kallsyms_compat.h - Compatibility layer for kallsyms_lookup_name */
|
||||||
|
|
||||||
|
#ifndef KALLSYMS_COMPAT_H
|
||||||
|
#define KALLSYMS_COMPAT_H
|
||||||
|
|
||||||
|
#include <linux/version.h>
|
||||||
|
#include <linux/kallsyms.h>
|
||||||
|
#include <linux/kprobes.h>
|
||||||
|
|
||||||
|
/* 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 */
|
||||||
@ -57,6 +57,21 @@
|
|||||||
#include <archdeps.h>
|
#include <archdeps.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
|
||||||
|
/* 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 ALIGN_WAIT_BUF(z) (((z + 63) >> 6) << 6)
|
||||||
|
|
||||||
//#define SC_DEBUG
|
//#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);
|
dprintk("pager_req_create(%d,%lx)\n", fd, (long)result_pa);
|
||||||
|
|
||||||
error = vfs_fstat(fd, &st);
|
error = mcctrl_vfs_fstat(fd, &st);
|
||||||
if (error) {
|
if (error) {
|
||||||
printk("pager_req_create(%d,%lx):vfs_stat failed. %d\n", fd, (long)result_pa, error);
|
printk("pager_req_create(%d,%lx):vfs_stat failed. %d\n", fd, (long)result_pa, error);
|
||||||
goto out;
|
goto out;
|
||||||
@ -1587,7 +1602,7 @@ retry:
|
|||||||
pmd = pmd_offset(pud, va);
|
pmd = pmd_offset(pud, va);
|
||||||
if (!pmd_none(*pmd) && !pmd_bad(*pmd) &&
|
if (!pmd_none(*pmd) && !pmd_bad(*pmd) &&
|
||||||
pmd_present(*pmd)) {
|
pmd_present(*pmd)) {
|
||||||
pte = pte_offset_map(pmd, va);
|
pte = pte_offset_kernel(pmd, va);
|
||||||
if (!pte_none(*pte) && pte_present(*pte)) {
|
if (!pte_none(*pte) && pte_present(*pte)) {
|
||||||
pfn = (uintptr_t)pte_pfn(*pte) << PAGE_SHIFT;
|
pfn = (uintptr_t)pte_pfn(*pte) << PAGE_SHIFT;
|
||||||
#define PFN_PRESENT ((uintptr_t)1 << 0)
|
#define PFN_PRESENT ((uintptr_t)1 << 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user