diff --git a/qtfs/qtfs/Makefile b/qtfs/qtfs/Makefile index f3c6014bb8c439afe87ca64c4485a604c1e0fdd3..fb6a51e895b40548b4ab70c537cd490401cecf6b 100644 --- a/qtfs/qtfs/Makefile +++ b/qtfs/qtfs/Makefile @@ -1,5 +1,5 @@ ccflags-y += -I$(src)/../ -I$(src) -DQTFS_CLIENT -KBUILD=/lib/modules/$(shell uname -r)/build/ +KBUILD=/lib/modules/5.10*/build/ obj-m:=qtfs.o qtfs-objs:=qtfs-mod.o sb.o syscall.o ../conn.o xattr.o proc.o ../misc.o miss.o diff --git a/qtfs/qtfs/syscall.c b/qtfs/qtfs/syscall.c index c83270fc51f9e30c42c8325b29bc5a919930ecc8..a83e025d412210910448d59c0f2c10ddca9bb377 100644 --- a/qtfs/qtfs/syscall.c +++ b/qtfs/qtfs/syscall.c @@ -9,10 +9,22 @@ #include "conn.h" #include "qtfs-mod.h" + static long qtfs_remote_mount(char __user *dev_name, char __user *dir_name, char __user *type, unsigned long flags, void __user *data); static int qtfs_remote_umount(char __user *name, int flags); +#ifdef __aarch64__ +static struct kprobe kp = { + .symbol_name = "kallsyms_lookup_name" +}; +typedef unsigned long (*kallsyms_lookup_name_t)(const char *name); +extern unsigned long kallsyms_lookup_name(const char *name); +void (*update_mapping_prot)(phys_addr_t phys, unsigned long virt, phys_addr_t size, pgprot_t prot); +unsigned long start_rodata, end_rodata; +#define section_size (end_rodata - start_rodata) +#endif + static char *qtfs_copy_mount_string(const void __user *data) { return data ? strndup_user(data, PATH_MAX) : NULL; @@ -260,32 +272,46 @@ __SYSCALL_DEFINEx(2, _qtfs_umount, char __user *, name, int, flags) // make the page writable int make_rw(unsigned long address) { +#ifdef __x86_64__ unsigned int level; pte_t *pte = lookup_address(address, &level); pte->pte |= _PAGE_RW; +#endif +#ifdef __aarch64__ + update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL); +#endif return 0; } // make the page write protected int make_ro(unsigned long address) { +#ifdef __x86_64__ unsigned int level; pte_t *pte = lookup_address(address, &level); pte->pte &= ~_PAGE_RW; +#endif + +#ifdef __aarch64__ + update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL_RO); +#endif return 0; } int qtfs_dir_to_qtdir(char *dir, char *qtdir) { - int ret; + int ret = 0; struct path path; ret = kern_path(dir, LOOKUP_FOLLOW, &path); if (ret) { - qtfs_err("qtfs dir to qtdir failed, ret: %d\n", ret); - return ret; + strcpy(qtdir, dir); + return 0; + } + if (strcmp(path.mnt->mnt_sb->s_type->name, QTFS_FSTYPE_NAME)) { + strcpy(qtdir, dir); + } else { + ret = qtfs_fullname(qtdir, path.dentry); } - - ret = qtfs_fullname(qtdir, path.dentry); path_put(&path); return ret; } @@ -486,6 +512,9 @@ static unsigned long *qtfs_oldsyscall_epoll_ctl = NULL; int qtfs_syscall_init(void) { +#ifdef __aarch64__ + kallsyms_lookup_name_t kallsyms_lookup_name; +#endif qtfs_debug("qtfs use my_mount instead of mount:0x%lx umount:0x%lx\n", (unsigned long)qtfs_kern_syms.sys_call_table[__NR_mount], (unsigned long)qtfs_kern_syms.sys_call_table[__NR_umount2]); qtfs_debug("qtfs use my_epoll_ctl instead of epoll_ctl:0x%lx\n", @@ -500,6 +529,13 @@ int qtfs_syscall_init(void) qtfs_kern_syms.sys_call_table[__NR_epoll_ctl] = (unsigned long *)__x64_sys_qtfs_epoll_ctl; #endif #ifdef __aarch64__ + register_kprobe(&kp); + kallsyms_lookup_name = (kallsyms_lookup_name_t) kp.addr; + unregister_kprobe(&kp); + update_mapping_prot = (void *)kallsyms_lookup_name("update_mapping_prot"); + start_rodata = (unsigned long)kallsyms_lookup_name("__start_rodata"); + end_rodata= (unsigned long)kallsyms_lookup_name("__end_rodata"); + qtfs_kern_syms.sys_call_table[__NR_mount] = (unsigned long *)__arm64_sys_qtfs_mount; qtfs_kern_syms.sys_call_table[__NR_umount2] = (unsigned long *)__arm64_sys_qtfs_umount; qtfs_kern_syms.sys_call_table[__NR_epoll_ctl] = (unsigned long *)__arm64_sys_qtfs_epoll_ctl; diff --git a/qtfs/qtfs_server/Makefile b/qtfs/qtfs_server/Makefile index c1c5ef6eda6ebc938ef31b3a2c3b9c291ea5cef0..13f9c3e8a797ad92c11eccb9ac06b999a6b97b0e 100644 --- a/qtfs/qtfs_server/Makefile +++ b/qtfs/qtfs_server/Makefile @@ -1,5 +1,5 @@ ccflags-y += -I$(src)/../ -I$(src) -DQTFS_SERVER -KBUILD=/lib/modules/$(shell uname -r)/build/ +KBUILD=/lib/modules/5.10*/build/ obj-m:=qtfs_server.o qtfs_server-objs:=../conn.o fsops.o qtfs-server.o ../misc.o