X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/879a7592bdd58d1788e952efde9895fc48a3484e..4527e1db7923906ab174dcc930abcb5d96d01b64:/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh diff --git a/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh b/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh index 80765e3..62c2996 100644 --- a/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh +++ b/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh @@ -209,11 +209,20 @@ ventoy_check_dm_module() { vtlog "modprobe failed, now try to insmod ko..." $FIND /lib/modules/ -name "dm-mod.ko*" | while read vtline; do - vtlog "insmode $vtline " + vtlog "insmod $vtline " $BUSYBOX_PATH/insmod $vtline >>$VTLOG 2>&1 + if [ $? -eq 0 ]; then + vtlog "insmod success" + else + vtlog "insmod failed, try decompress" + if echo $vtline | $GREP -q "\.zst"; then + $VTOY_PATH/tool/zstdcat $vtline > $VTOY_PATH/extract_dm_mod.ko + $BUSYBOX_PATH/insmod $VTOY_PATH/extract_dm_mod.ko >>$VTLOG 2>&1 + fi + fi done fi - + if $GREP -q 'device-mapper' /proc/devices; then vtlog "device-mapper found in /proc/devices after retry" $BUSYBOX_PATH/true; return @@ -223,6 +232,42 @@ ventoy_check_dm_module() { fi } +ventoy_need_proc_ibt() { + vtKv=$($BUSYBOX_PATH/uname -r) + vtMajor=$(echo $vtKv | $AWK -F. '{print $1}') + vtMinor=$(echo $vtKv | $AWK -F. '{print $2}') + + #ibt was supported since linux kernel 5.18 + if [ $vtMajor -lt 5 ]; then + $BUSYBOX_PATH/false; return + elif [ $vtMajor -eq 5 ]; then + if [ $vtMajor -lt 18 ]; then + $BUSYBOX_PATH/false; return + fi + fi + + if $GREP -q ' ibt=off' /proc/cmdline; then + $BUSYBOX_PATH/false; return + fi + + #hardware CPU doesn't support IBT + if $VTOY_PATH/tool/vtoykmod -I; then + : + else + $BUSYBOX_PATH/false; return + fi + + #dot.CONFIG not enabled + if $GREP -q ' ibt_restore$' /proc/kallsyms; then + : + else + $BUSYBOX_PATH/false; return + fi + + $BUSYBOX_PATH/true +} + + ventoy_need_dm_patch() { if [ "$VTOY_LINUX_REMOUNT" != "01" ]; then if $GREP -q 'VTOY_LINUX_REMOUNT=1' /proc/cmdline; then @@ -256,6 +301,7 @@ ventoy_need_dm_patch() { } ventoy_dm_patch() { + vtDmPatchDebug=0 vtMType=$($BUSYBOX_PATH/uname -m) vtlog "######### ventoy_dm_patch ############" @@ -269,6 +315,16 @@ ventoy_dm_patch() { return fi + if ventoy_need_proc_ibt; then + vtlog "need to proc IBT" + vtKoName=dm_patch_ibt_64.ko + vtIBT='0x8888' + else + vtlog "NO need to proc IBT" + vtIBT='0' + fi + + if [ -f $VTOY_PATH/tool/$vtKoName ]; then vtlog "/ventoy/tool/$vtKoName exist OK" else @@ -304,6 +360,15 @@ ventoy_dm_patch() { kprobe_unreg_addr=$($GREP ' unregister_kprobe$' /proc/kallsyms | $AWK '{print $1}') if [ "$VTOY_DEBUG_LEVEL" = "01" ]; then + vtDmPatchDebug=1 + fi + + if $GREP -q 'dmpatch_debug' /proc/cmdline; then + vtDmPatchDebug=1 + fi + + + if [ $vtDmPatchDebug -eq 1 ]; then printk_addr=$($GREP ' printk$' /proc/kallsyms | $AWK '{print $1}') if [ -z "$printk_addr" ]; then printk_addr=$($GREP ' _printk$' /proc/kallsyms | $AWK '{print $1}') @@ -338,14 +403,17 @@ ventoy_dm_patch() { return elif [ -d /lib/modules/$vtKv/kernel/fs ]; then vtModPath=$($FIND /lib/modules/$vtKv/kernel/fs/ -name "*.ko*" | $HEAD -n1) - else + elif [ -d /lib/modules/$vtKv/kernel ]; then vtModPath=$($FIND /lib/modules/$vtKv/kernel/ -name "xfs.ko*" | $HEAD -n1) + elif [ -d /lib/modules/$vtKv/initrd ]; then + vtModPath=$($FIND /lib/modules/$vtKv/initrd/ -name "xfs.ko*" | $HEAD -n1) fi - + + if [ -z "$vtModPath" ]; then - vtModPath=$($FIND /lib/modules/$vtKv/kernel/ -name "*.ko*" | $HEAD -n1) + vtModPath=$($FIND /lib/modules/$vtKv/ -name "*.ko*" | $HEAD -n1) fi - + vtModName=$($BUSYBOX_PATH/basename $vtModPath) vtlog "template module is $vtModPath $vtModName" @@ -359,24 +427,32 @@ ventoy_dm_patch() { $BUSYBOX_PATH/xzcat $vtModPath > $VTOY_PATH/$vtModName elif echo $vtModPath | $GREP -q "[.]ko[.]gz$"; then $BUSYBOX_PATH/zcat $vtModPath > $VTOY_PATH/$vtModName + elif echo $vtModPath | $GREP -q "[.]ko[.]zst$"; then + $VTOY_PATH/tool/zstdcat $vtModPath > $VTOY_PATH/$vtModName else vtlog "unsupport module type" return fi + + #step1: modify vermagic/mod crc/relocation vtlog "$VTOY_PATH/tool/vtoykmod -u $VTOY_PATH/tool/$vtKoName $VTOY_PATH/$vtModName $vtDebug" - $VTOY_PATH/tool/vtoykmod -u $VTOY_PATH/tool/$vtKoName $VTOY_PATH/$vtModName $vtDebug + $VTOY_PATH/tool/vtoykmod -u $VTOY_PATH/tool/$vtKoName $VTOY_PATH/$vtModName $vtDebug >>$VTLOG 2>&1 #step2: fill parameters vtPgsize=$($VTOY_PATH/tool/vtoyksym -p) - vtlog "$VTOY_PATH/tool/vtoykmod -f $VTOY_PATH/tool/$vtKoName $vtPgsize 0x$printk_addr 0x$ro_addr 0x$rw_addr $get_addr $get_size $put_addr $put_size 0x$kprobe_reg_addr 0x$kprobe_unreg_addr $vtKv $vtDebug" - $VTOY_PATH/tool/vtoykmod -f $VTOY_PATH/tool/$vtKoName $vtPgsize 0x$printk_addr 0x$ro_addr 0x$rw_addr $get_addr $get_size $put_addr $put_size 0x$kprobe_reg_addr 0x$kprobe_unreg_addr $vtKv $vtDebug + vtlog "$VTOY_PATH/tool/vtoykmod -f $VTOY_PATH/tool/$vtKoName $vtPgsize 0x$printk_addr 0x$ro_addr 0x$rw_addr $get_addr $get_size $put_addr $put_size 0x$kprobe_reg_addr 0x$kprobe_unreg_addr $vtKv $vtIBT $vtDebug" + $VTOY_PATH/tool/vtoykmod -f $VTOY_PATH/tool/$vtKoName $vtPgsize 0x$printk_addr 0x$ro_addr 0x$rw_addr $get_addr $get_size $put_addr $put_size 0x$kprobe_reg_addr 0x$kprobe_unreg_addr $vtKv $vtIBT $vtDebug >>$VTLOG 2>&1 - $BUSYBOX_PATH/insmod $VTOY_PATH/tool/$vtKoName + vtlog "insmod $VTOY_PATH/tool/$vtKoName" + $BUSYBOX_PATH/insmod $VTOY_PATH/tool/$vtKoName >>$VTLOG 2>&1 if $GREP -q 'dm_patch' /proc/modules; then + vtlog "dm_patch module OK" echo "done" > $VTOY_PATH/dm_patch_done + else + vtlog "dm_patch module FAILED" fi }