From c413bc809c8411378a91064215b3ff9748370e53 Mon Sep 17 00:00:00 2001 From: Liu Yuntao Date: Sat, 5 Aug 2023 11:31:41 +0800 Subject: [PATCH] refactor "binfmt_rto" to "sysboost_loader" --- bin/daemon.rs | 6 ++-- bin/main.rs | 6 ++-- src/binfmt_rto/Makefile | 8 +++-- src/binfmt_rto/binfmt_rto.c | 22 ++++---------- src/binfmt_rto/loader_device.c | 55 ++++++++++++++++++++++++++++++++++ src/binfmt_rto/loader_device.h | 8 +++++ src/binfmt_rto/main.c | 49 ++++++++++++++++++++++++++++++ src/binfmt_rto/main.h | 10 +++++++ tests/test_binfmt_rto/Makefile | 2 +- 9 files changed, 140 insertions(+), 26 deletions(-) create mode 100644 src/binfmt_rto/loader_device.c create mode 100644 src/binfmt_rto/loader_device.h create mode 100644 src/binfmt_rto/main.c create mode 100644 src/binfmt_rto/main.h diff --git a/bin/daemon.rs b/bin/daemon.rs index a0a0350..353e2cd 100644 --- a/bin/daemon.rs +++ b/bin/daemon.rs @@ -24,8 +24,8 @@ use goblin::elf::Elf; const SYSBOOST_PATH: &str = "/usr/bin/sysboost"; const SYSBOOST_DB_PATH: &str = "/var/lib/sysboost/"; -const KO_PATH: &str = "/lib/modules/sysboost/binfmt_rto.ko"; -const KO_RTO_PARAM_PATH: &str = "/sys/module/binfmt_rto/parameters/use_rto"; +const KO_PATH: &str = "/lib/modules/sysboost/sysboost_loader.ko"; +const KO_RTO_PARAM_PATH: &str = "/sys/module/sysboost_loader/parameters/use_rto"; const SYSBOOST_BOLT_PROFILE: &str = "/usr/lib/sysboost.d/profile/"; const LDSO: &str = "ld-"; const LIBCSO: &str = "libc.so"; @@ -154,7 +154,7 @@ pub fn run_child(cmd: &str, args: &Vec) -> i32 { exit_code } -// echo 1 > /sys/module/binfmt_rto/parameters/use_rto +// echo 1 > /sys/module/sysboost_loader/parameters/use_rto fn set_ko_rto_flag(is_set: bool) -> i32 { let mut args: Vec = Vec::new(); if is_set { diff --git a/bin/main.rs b/bin/main.rs index 61aecfc..972a91e 100644 --- a/bin/main.rs +++ b/bin/main.rs @@ -27,12 +27,12 @@ const APP_NAME: &str = "sysboostd"; fn test_kmod() -> i32 { let mut args: Vec = Vec::new(); args.push("-c".to_string()); - args.push("lsmod | grep binfmt_rto".to_string()); + args.push("lsmod | grep sysboost_loader".to_string()); let ret = run_child("/usr/bin/bash", &args); if ret == 0 { - println!("binfmt_rto.ko is ready"); + println!("sysboost_loader.ko is ready"); } else { - println!("binfmt_rto.ko is not ready"); + println!("sysboost_loader.ko is not ready"); } return ret; } diff --git a/src/binfmt_rto/Makefile b/src/binfmt_rto/Makefile index 851b88b..92b440b 100644 --- a/src/binfmt_rto/Makefile +++ b/src/binfmt_rto/Makefile @@ -1,14 +1,15 @@ KDIR ?= /lib/modules/$(shell uname -r)/build -obj-m := binfmt_rto.o +obj-m := sysboost_loader.o +sysboost_loader-objs := main.o binfmt_rto.o loader_device.o PWD := $(shell pwd) modules: $(MAKE) -C $(KDIR) M=$(PWD) modules install: - rmmod binfmt_rto || true - insmod binfmt_rto.ko use_rto=1 debug=1 + rmmod sysboost_loader || true + insmod sysboost_loader.ko use_rto=1 debug=1 .PHONEY: clean @@ -20,3 +21,4 @@ clean: rm -f *.mod.c rm -f Module.symvers rm -f modules.order + rm -f *.mod diff --git a/src/binfmt_rto/binfmt_rto.c b/src/binfmt_rto/binfmt_rto.c index 74b2aba..1a1900d 100644 --- a/src/binfmt_rto/binfmt_rto.c +++ b/src/binfmt_rto/binfmt_rto.c @@ -10,7 +10,6 @@ * Copyright 1993, 1994: Eric Youngdale (ericy@cais.com). */ -#include #include #include #include @@ -51,6 +50,7 @@ #include #include +#include "main.h" #ifndef CONFIG_ELF_SYSBOOST #define CONFIG_ELF_SYSBOOST 1 @@ -60,15 +60,6 @@ #include #include "../elf_ext.h" -static bool use_rto = false; -module_param(use_rto, bool, 0600); -MODULE_PARM_DESC(use_rto, "use rto featue"); - -/* debug mode only process rto format */ -static int debug = 0; -module_param(debug, int, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(debug, "debug mode"); - /* compat 22.03 LTS, 22.03 LTS SP2 */ #ifndef MM_SAVED_AUXV #define MM_SAVED_AUXV(mm) mm->saved_auxv @@ -1162,6 +1153,9 @@ static bool check_elf_xattr(struct linux_binprm *bprm) { char *xattr = NULL; int xattr_size = 0; + + return false; + // try to get attr from bprm xattr_size = vfs_getxattr(bprm->file->f_path.dentry, "trusted.flags", NULL, 0); @@ -2706,7 +2700,7 @@ end_coredump: #endif /* CONFIG_ELF_CORE */ -static int init_rto_binfmt(void) +int init_rto_binfmt(void) { #ifdef CONFIG_ELF_SYSBOOST int ret = init_symbols(); @@ -2719,12 +2713,8 @@ static int init_rto_binfmt(void) return 0; } -static void exit_rto_binfmt(void) +void exit_rto_binfmt(void) { /* Remove the COFF and ELF loaders. */ unregister_binfmt(&elf_format); } - -module_init(init_rto_binfmt); -module_exit(exit_rto_binfmt); -MODULE_LICENSE("GPL"); diff --git a/src/binfmt_rto/loader_device.c b/src/binfmt_rto/loader_device.c new file mode 100644 index 0000000..e97049c --- /dev/null +++ b/src/binfmt_rto/loader_device.c @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2023 Huawei Technologies Co.,Ltd. All rights reserved. + */ + +#include +#include +#include "main.h" + +static long loader_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int len = cmd; + int ret; + char *data = kmalloc(len, GFP_KERNEL); + ret = copy_from_user(data, (char *)arg, len); + if (ret) + return ret; + + + pr_info("lyt get ioctl, cmd: %d, arg: 0x%lx, data: %s\n", cmd, arg, data); + + return 0; +} + +static const struct file_operations loader_fops = { + .owner = THIS_MODULE, + .unlocked_ioctl = loader_ioctl, + .compat_ioctl = loader_ioctl, +}; + +static struct miscdevice loader_miscdev = { + .minor = MISC_DYNAMIC_MINOR, + .name = "sysboost_loader", + .fops = &loader_fops, +}; + +int __init loader_device_init(void) +{ + int err = misc_register(&loader_miscdev); + if (err != 0) { + pr_err("sysboost_loader: init failed!\n"); + goto out; + } + + pr_info("sysboost_loader: init success.\n"); + +out: + return err; +} + +void __exit loader_device_exit(void) +{ + misc_deregister(&loader_miscdev); + pr_info("sysboost_loader: exit!\n"); +} diff --git a/src/binfmt_rto/loader_device.h b/src/binfmt_rto/loader_device.h new file mode 100644 index 0000000..a93609f --- /dev/null +++ b/src/binfmt_rto/loader_device.h @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2023 Huawei Technologies Co.,Ltd. All rights reserved. + */ + +int __init loader_device_init(void); +void __exit loader_device_exit(void); + diff --git a/src/binfmt_rto/main.c b/src/binfmt_rto/main.c new file mode 100644 index 0000000..749294e --- /dev/null +++ b/src/binfmt_rto/main.c @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2023 Huawei Technologies Co.,Ltd. All rights reserved. + */ + +#include "main.h" +#include "loader_device.h" + +bool use_rto = false; +module_param(use_rto, bool, 0600); +MODULE_PARM_DESC(use_rto, "use rto featue"); + +/* debug mode only process rto format */ +int debug = 0; +module_param(debug, int, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(debug, "debug mode"); + +int init_rto_binfmt(void); +void exit_rto_binfmt(void); + +static int __init sysboost_loader_init(void) +{ + int ret = 0; + + ret = init_rto_binfmt(); + if (ret) + goto error_rto; + + ret = loader_device_init(); + if (ret) + goto error_device; + + return 0; + +error_device: + exit_rto_binfmt(); +error_rto: + return ret; +} + +static void __exit sysboost_loader_exit(void) +{ + loader_device_exit(); + exit_rto_binfmt(); +} + +module_init(sysboost_loader_init); +module_exit(sysboost_loader_exit); +MODULE_LICENSE("GPL"); diff --git a/src/binfmt_rto/main.h b/src/binfmt_rto/main.h new file mode 100644 index 0000000..80f370b --- /dev/null +++ b/src/binfmt_rto/main.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2023 Huawei Technologies Co.,Ltd. All rights reserved. + */ + +#include + +extern bool use_rto; +extern int debug; + diff --git a/tests/test_binfmt_rto/Makefile b/tests/test_binfmt_rto/Makefile index 3a1a023..170644f 100644 --- a/tests/test_binfmt_rto/Makefile +++ b/tests/test_binfmt_rto/Makefile @@ -2,7 +2,7 @@ ROOT_DIR=../../ BUILD_DIR=$(ROOT_DIR)build/ SYSBOOST=$(BUILD_DIR)src/sysboost -KO_DIR=$(ROOT_DIR)src/binfmt_rto +KO_DIR=$(ROOT_DIR)src/sysboost_loader .PHONY: all -- Gitee