X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/1f49265f29459295bc1b66c53da3de9e99a9370e..f2562fecb9ea5274c436042bde4664f9f4d969c1:/VtoyTool/vtoykmod.c diff --git a/VtoyTool/vtoykmod.c b/VtoyTool/vtoykmod.c index b3519f3..a1e2ea8 100644 --- a/VtoyTool/vtoykmod.c +++ b/VtoyTool/vtoykmod.c @@ -24,6 +24,9 @@ #include #include #include +#ifdef VTOY_X86_64 +#include +#endif #define _ull unsigned long long @@ -176,7 +179,9 @@ typedef struct ko_param unsigned long sym_get_size; unsigned long sym_put_addr; unsigned long sym_put_size; - unsigned long padding[3]; + unsigned long kv_major; + unsigned long ibt; + unsigned long padding[1]; }ko_param; #pragma pack() @@ -344,7 +349,7 @@ static int vtoykmod_update_vermagic(char *oldbuf, int oldsize, char *newbuf, int if (oldver && newver) { memcpy(oldver, newver, strlen(newver) + 1); - if (strstr(newver, "modversions")) + //if (strstr(newver, "modversions")) { *modver = 1; } @@ -484,6 +489,8 @@ int vtoykmod_fill_param(char **argv) param->sym_put_size = strtoul(argv[8], NULL, 10); param->reg_kprobe_addr = strtoul(argv[9], NULL, 16); param->unreg_kprobe_addr = strtoul(argv[10], NULL, 16); + param->kv_major = (unsigned long)(argv[11][0] - '0'); + param->ibt = strtoul(argv[12], NULL, 16);; debug("pgsize=%lu (%s)\n", param->pgsize, argv[1]); debug("printk_addr=0x%lx (%s)\n", param->printk_addr, argv[2]); @@ -495,6 +502,8 @@ int vtoykmod_fill_param(char **argv) debug("sym_put_size=%lu (%s)\n", param->sym_put_size, argv[8]); debug("reg_kprobe_addr=0x%lx (%s)\n", param->reg_kprobe_addr, argv[9]); debug("unreg_kprobe_addr=0x%lx (%s)\n", param->unreg_kprobe_addr, argv[10]); + debug("kv_major=%lu (%s)\n", param->kv_major, argv[11]); + debug("ibt=0x%lx (%s)\n", param->ibt, argv[12]); break; } @@ -511,6 +520,26 @@ int vtoykmod_fill_param(char **argv) return 0; } +#ifdef VTOY_X86_64 +static int vtoykmod_check_ibt(void) +{ + uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0; + + __cpuid_count(7, 0, eax, ebx, ecx, edx); + + if (edx & (1 << 20)) + { + return 0; + } + return 1; +} +#else +static int vtoykmod_check_ibt(void) +{ + return 1; +} +#endif + int vtoykmod_main(int argc, char **argv) { int i; @@ -532,6 +561,10 @@ int vtoykmod_main(int argc, char **argv) { return vtoykmod_update(argv[2], argv[3]); } + else if (argv[1][0] == '-' && argv[1][1] == 'I') + { + return vtoykmod_check_ibt(); + } return 0; }