From 712f10e86af9fee3bf6756ab35a4821ceec9fd18 Mon Sep 17 00:00:00 2001 From: longpanda Date: Tue, 14 May 2024 14:59:12 +0800 Subject: [PATCH] Fix VTOY_LINUX_REMOUNT feature in RHEL 9.4+ (#2827) --- DMPATCH/dmpatch.c | 97 ++++++++++++++------ IMG/cpio_x86/ventoy/tool/dm_patch_64.ko | Bin 13552 -> 14256 bytes IMG/cpio_x86/ventoy/tool/dm_patch_ibt_64.ko | Bin 14312 -> 15016 bytes 3 files changed, 67 insertions(+), 30 deletions(-) diff --git a/DMPATCH/dmpatch.c b/DMPATCH/dmpatch.c index f91648f1a62..3dd79474260 100644 --- a/DMPATCH/dmpatch.c +++ b/DMPATCH/dmpatch.c @@ -451,39 +451,24 @@ static u64 notrace dmpatch_ibt_save(void) { return 0; } static void notrace dmpatch_ibt_restore(u64 save) { (void)save; } #endif -static int notrace dmpatch_init(void) +static int notrace dmpatch_process(unsigned long a, unsigned long b, unsigned long c) { int r = 0; int rc = 0; - u64 msr = 0; - - if (g_ko_param.ibt == 0x8888) - { - msr = dmpatch_ibt_save(); - } - - kprintf = (printk_pf)(g_ko_param.printk_addr); + unsigned long kv_major = 0; + unsigned long kv_minor = 0; + unsigned long kv_subminor = 0; - vdebug("dmpatch_init start pagesize=%lu kernel=%lu.%lu.%lu ...\n", - g_ko_param.pgsize, g_ko_param.kv_major, g_ko_param.kv_minor, g_ko_param.kv_subminor); - - if (g_ko_param.struct_size != sizeof(ko_param)) - { - vdebug("Invalid struct size %d %d\n", (int)g_ko_param.struct_size, (int)sizeof(ko_param)); - return -EINVAL; - } - - if (g_ko_param.sym_get_addr == 0 || g_ko_param.sym_put_addr == 0 || - g_ko_param.ro_addr == 0 || g_ko_param.rw_addr == 0) - { - return -EINVAL; - } + vdebug("dmpatch_process as KV %d.%d.%d ...\n", (int)a, (int)b, (int)c); - set_mem_ro = (set_memory_attr_pf)(g_ko_param.ro_addr); - set_mem_rw = (set_memory_attr_pf)(g_ko_param.rw_addr); - reg_kprobe = (kprobe_reg_pf)g_ko_param.reg_kprobe_addr; - unreg_kprobe = (kprobe_unreg_pf)g_ko_param.unreg_kprobe_addr; + kv_major = g_ko_param.kv_major; + kv_minor = g_ko_param.kv_minor; + kv_subminor = g_ko_param.kv_subminor; + g_ko_param.kv_major = a; + g_ko_param.kv_minor = b; + g_ko_param.kv_subminor = c; + if (dmpatch_kv_above(6, 5, 0)) /* >= kernel 6.5 */ { vdebug("new interface patch dm_get_table_device...\n"); @@ -531,14 +516,66 @@ static int notrace dmpatch_init(void) vdebug("######## dm patch success ###########\n"); vdebug("#####################################\n"); +out: + + g_ko_param.kv_major = kv_major; + g_ko_param.kv_minor = kv_minor; + g_ko_param.kv_subminor = kv_subminor; + + return rc; +} + +static int notrace dmpatch_init(void) +{ + int rc = 0; + u64 msr = 0; + + if (g_ko_param.ibt == 0x8888) + { + msr = dmpatch_ibt_save(); + } + + kprintf = (printk_pf)(g_ko_param.printk_addr); + + vdebug("dmpatch_init start pagesize=%lu kernel=%lu.%lu.%lu ...\n", + g_ko_param.pgsize, g_ko_param.kv_major, g_ko_param.kv_minor, g_ko_param.kv_subminor); + + if (g_ko_param.struct_size != sizeof(ko_param)) + { + vdebug("Invalid struct size %d %d\n", (int)g_ko_param.struct_size, (int)sizeof(ko_param)); + return -EINVAL; + } + + if (g_ko_param.sym_get_addr == 0 || g_ko_param.sym_put_addr == 0 || + g_ko_param.ro_addr == 0 || g_ko_param.rw_addr == 0) + { + return -EINVAL; + } + + set_mem_ro = (set_memory_attr_pf)(g_ko_param.ro_addr); + set_mem_rw = (set_memory_attr_pf)(g_ko_param.rw_addr); + reg_kprobe = (kprobe_reg_pf)g_ko_param.reg_kprobe_addr; + unreg_kprobe = (kprobe_unreg_pf)g_ko_param.unreg_kprobe_addr; + + rc = dmpatch_process(g_ko_param.kv_major, g_ko_param.kv_minor, g_ko_param.kv_subminor); + if (rc) + { + if (g_ko_param.kv_major >= 5) + { + rc = dmpatch_process(6, 5, 0); + if (rc) + { + rc = dmpatch_process(6, 7, 0); + } + } + } + if (g_ko_param.ibt == 0x8888) { dmpatch_ibt_restore(msr); } -out: - - return rc; + return rc; } static void notrace dmpatch_exit(void) diff --git a/IMG/cpio_x86/ventoy/tool/dm_patch_64.ko b/IMG/cpio_x86/ventoy/tool/dm_patch_64.ko index a224f5610daea3d37c06735b749b9604488c450a..47f8d73cb686ae7acf136f6c1146e8033a8d0aa5 100644 GIT binary patch literal 14256 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 AZvX%Q diff --git a/IMG/cpio_x86/ventoy/tool/dm_patch_ibt_64.ko b/IMG/cpio_x86/ventoy/tool/dm_patch_ibt_64.ko index 7b90e4f3ec70dee2b908524b5668a857f17d4f3b..91c31f0e5a8fe25f499ac65eb1c3fb77f4100613 100644 GIT binary patch literal 15016 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 UI&Sa2`mZDZx3eJSJa5MT1=MliQ~&?~ literal 14312 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