From d27745af4c72e745737164c915e81e1f62cae882 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Tue, 26 Apr 2022 16:17:20 +0200 Subject: [PATCH] Import existing files into repository --- .gitignore | 2 + build.sh | 25 +++++++++++ fix-uring/.gitignore | 6 +++ fix-uring/Makefile | 7 +++ fix-uring/fix-uring.c | 102 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 142 insertions(+) create mode 100644 .gitignore create mode 100755 build.sh create mode 100644 fix-uring/.gitignore create mode 100644 fix-uring/Makefile create mode 100644 fix-uring/fix-uring.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..409e53a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +out +*.o diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..227767e --- /dev/null +++ b/build.sh @@ -0,0 +1,25 @@ +#! /bin/bash + +set -e + +export TEMPDIR=${TEMPDIR:-/scratch/local} + +releases=( + 5.10.110-433 +) + +for release in "${releases[@]}"; do + test -d $TMPDIR/linux-$release.x86_64 || (cd $TMPDIR && tar xf /src/mariux/beeroot/build-archives/linux-$release.x86_64.beebuild.tar.bz2) + ( + cd fix-uring + KERNEL=$TMPDIR/linux-$release.x86_64/build make clean + KERNEL=$TMPDIR/linux-$release.x86_64/build make + ) + ver=${release%-*} # 5.10.92 + build=${release#*-} # 421 + echo "release $release ver $ver build $build" + mkdir -p out/$ver.mx64.$build + cp fix-uring/fix-uring.ko out/$ver.mx64.$build/fix-uring.ko +done + + diff --git a/fix-uring/.gitignore b/fix-uring/.gitignore new file mode 100644 index 0000000..8e1e220 --- /dev/null +++ b/fix-uring/.gitignore @@ -0,0 +1,6 @@ +*.cmd +Module.symvers +*.ko +*.mod +*.mod.c +modules.order diff --git a/fix-uring/Makefile b/fix-uring/Makefile new file mode 100644 index 0000000..eee0780 --- /dev/null +++ b/fix-uring/Makefile @@ -0,0 +1,7 @@ +obj-m += fix-uring.o + +all: + make -C $(KERNEL) M=$(PWD) modules + +clean: + make -C $(KERNEL) M=$(PWD) clean diff --git a/fix-uring/fix-uring.c b/fix-uring/fix-uring.c new file mode 100644 index 0000000..836bb23 --- /dev/null +++ b/fix-uring/fix-uring.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include +#include + +#include + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Donald Buczek "); +MODULE_DESCRIPTION("fix-uring"); +MODULE_VERSION("0.01"); + +/* + * General concept to hook a kernel function with ftrace: + * + * https://www.codeproject.com/Articles/1275114/Hooking-Linux-Kernel-Functions-Part-2-How-to-Hook + * + * Idea to hack around the no longer exported kallsyms_lookup_name with register_kprobe + * originally from AMD developers in the comments of this thread: + * + * https://lwn.net/Articles/813350/ + */ + +/* function signature as defined in kernel source */ + +typedef long io_uring_setup_fn_type(u32 entries, struct io_uring_params __user *params); + +static io_uring_setup_fn_type *io_uring_setup; +static io_uring_setup_fn_type io_uring_setup_wrapper; + +static long io_uring_setup_wrapper(u32 entries, struct io_uring_params __user *params) { + printk("wrapper"); + return -ENOSYS; +} + +static void ftrace_callback(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *ops, struct pt_regs *regs) +{ + printk("trace callback"); + if (!within_module(parent_ip, THIS_MODULE)) + regs->ip = (unsigned long)io_uring_setup_wrapper; +} + +static int get_symbol_via_kprobe(char *name, void **addr) +{ + struct kprobe kp; + int err; + memset(&kp, 0, sizeof(kp)); + kp.symbol_name = name; + err = register_kprobe(&kp); + if (err) { + return err; + } + *addr = kp.addr; + unregister_kprobe(&kp); + return 0; +} + +static struct ftrace_ops ops = { + .func = ftrace_callback, + .flags = FTRACE_OPS_FL_SAVE_REGS|FTRACE_OPS_FL_IPMODIFY +}; + +static int __init fix_uring_init(void) +{ + int err; + + err = get_symbol_via_kprobe("io_uring_setup", (void **)&io_uring_setup); + if (err) { + pr_err("fix_uring: can't find io_uring_setup: %d\n", err); + return(err); + } + + err = ftrace_set_filter_ip(&ops, (unsigned long)io_uring_setup, 0, 0); + if (err) { + pr_err("fix_uring: ftrace_set_filter_ip failed: %d\n", err); + return(err); + + } + err = register_ftrace_function(&ops); + if (err) { + pr_err("fix_uring: register_ftrace_function failed: %d\n", err); + return(err); + + } + pr_info("fix-uring: installed\n"); + return 0; +} + +static void __exit fix_uring_exit(void) +{ + int err; + err = unregister_ftrace_function(&ops); + if (err) { + pr_err("fix_uring: unregister_ftrace_function failed: %d\n", err); + } + pr_info("fix-uring: removed\n"); +} + +module_init(fix_uring_init); +module_exit(fix_uring_exit);