From d286f49e11aa8db678fcc90e4600925ef27f7153 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Tue, 4 Nov 2025 00:09:42 +0800 Subject: [PATCH] [skip ci]kernel: Migrating KPM to ioctl --- kernel/core_hook.c | 16 --------------- kernel/kpm/kpm.c | 13 ++++++++++++ kernel/kpm/kpm.h | 50 ++++++++++++++++++++++++++++----------------- kernel/supercalls.c | 3 +++ kernel/supercalls.h | 4 ++++ 5 files changed, 51 insertions(+), 35 deletions(-) diff --git a/kernel/core_hook.c b/kernel/core_hook.c index 37559858..2d689804 100644 --- a/kernel/core_hook.c +++ b/kernel/core_hook.c @@ -45,10 +45,6 @@ #include "manual_su.h" #endif -#ifdef CONFIG_KPM -#include "kpm/kpm.h" -#endif - bool ksu_module_mounted = false; #ifdef CONFIG_COMPAT @@ -442,18 +438,6 @@ int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3, pr_info("option: 0x%x, cmd: %ld\n", option, arg2); #endif -#ifdef CONFIG_KPM - if(sukisu_is_kpm_control_code(arg2)) { - int res; - - pr_info("KPM: calling before arg2=%d\n", (int) arg2); - - res = sukisu_handle_kpm(arg2, arg3, arg4, arg5); - - return 0; - } -#endif - #ifdef CONFIG_KSU_MANUAL_SU if (arg2 == CMD_MANUAL_SU_REQUEST) { struct manual_su_request request; diff --git a/kernel/kpm/kpm.c b/kernel/kpm/kpm.c index 32a58ce5..7fedcddb 100644 --- a/kernel/kpm/kpm.c +++ b/kernel/kpm/kpm.c @@ -209,3 +209,16 @@ int sukisu_is_kpm_control_code(unsigned long arg2) { return (arg2 >= CMD_KPM_CONTROL && arg2 <= CMD_KPM_CONTROL_MAX) ? 1 : 0; } + +int do_kpm(void __user *arg) +{ + struct ksu_kpm_cmd cmd; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) { + pr_err("kpm: copy_from_user failed\n"); + return -EFAULT; + } + + return sukisu_handle_kpm(cmd.arg2, cmd.arg3, cmd.arg4, cmd.arg5); +} + diff --git a/kernel/kpm/kpm.h b/kernel/kpm/kpm.h index e8349d36..7e93ad22 100644 --- a/kernel/kpm/kpm.h +++ b/kernel/kpm/kpm.h @@ -1,58 +1,70 @@ #ifndef __SUKISU_KPM_H #define __SUKISU_KPM_H -extern int sukisu_handle_kpm(unsigned long arg2, unsigned long arg3, unsigned long arg4, - unsigned long arg5); -extern int sukisu_is_kpm_control_code(unsigned long arg2); +#include +#include + +struct ksu_kpm_cmd { + __aligned_u64 arg2; + __aligned_u64 arg3; + __aligned_u64 arg4; + __aligned_u64 arg5; +}; + +int sukisu_handle_kpm(unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5); +int sukisu_is_kpm_control_code(unsigned long arg2); +int do_kpm(void __user *arg); + +#define KSU_IOCTL_KPM _IOC(_IOC_READ|_IOC_WRITE, 'K', 200, 0) /* KPM Control Code */ -#define CMD_KPM_CONTROL 28 -#define CMD_KPM_CONTROL_MAX 35 +#define CMD_KPM_CONTROL 1 +#define CMD_KPM_CONTROL_MAX 10 /* Control Code */ /* - * prctl(xxx, 28, "PATH", "ARGS") + * prctl(xxx, 1, "PATH", "ARGS") * success return 0, error return -N */ -#define SUKISU_KPM_LOAD 28 +#define SUKISU_KPM_LOAD 1 /* - * prctl(xxx, 29, "NAME") + * prctl(xxx, 2, "NAME") * success return 0, error return -N */ -#define SUKISU_KPM_UNLOAD 29 +#define SUKISU_KPM_UNLOAD 2 /* - * num = prctl(xxx, 30) + * num = prctl(xxx, 3) * error return -N * success return +num or 0 */ -#define SUKISU_KPM_NUM 30 +#define SUKISU_KPM_NUM 3 /* - * prctl(xxx, 31, Buffer, BufferSize) + * prctl(xxx, 4, Buffer, BufferSize) * success return +out, error return -N */ -#define SUKISU_KPM_LIST 31 +#define SUKISU_KPM_LIST 4 /* - * prctl(xxx, 32, "NAME", Buffer[256]) + * prctl(xxx, 5, "NAME", Buffer[256]) * success return +out, error return -N */ -#define SUKISU_KPM_INFO 32 +#define SUKISU_KPM_INFO 5 /* - * prctl(xxx, 33, "NAME", "ARGS") + * prctl(xxx, 6, "NAME", "ARGS") * success return KPM's result value * error return -N */ -#define SUKISU_KPM_CONTROL 33 +#define SUKISU_KPM_CONTROL 6 /* - * prctl(xxx, 34, buffer, bufferSize) + * prctl(xxx, 7, buffer, bufferSize) * success return KPM's result value * error return -N */ -#define SUKISU_KPM_VERSION 34 +#define SUKISU_KPM_VERSION 7 #endif diff --git a/kernel/supercalls.c b/kernel/supercalls.c index 77b5218c..35c1629b 100644 --- a/kernel/supercalls.c +++ b/kernel/supercalls.c @@ -542,6 +542,9 @@ static const struct ksu_ioctl_cmd_map ksu_ioctl_handlers[] = { { .cmd = KSU_IOCTL_DYNAMIC_MANAGER, .name = "SET_DYNAMIC_MANAGER", .handler = do_dynamic_manager, .perm_check = manager_or_root}, { .cmd = KSU_IOCTL_GET_MANAGERS, .name = "GET_MANAGERS", .handler = do_get_managers, .perm_check = manager_or_root}, { .cmd = KSU_IOCTL_ENABLE_UID_SCANNER, .name = "SET_ENABLE_UID_SCANNER", .handler = do_enable_uid_scanner, .perm_check = manager_or_root}, +#ifdef CONFIG_KPM + { .cmd = KSU_IOCTL_KPM, .name = "KPM_OPERATION", .handler = do_kpm, .perm_check = manager_or_root}, +#endif { .cmd = 0, .name = NULL, .handler = NULL, .perm_check = NULL} // Sentine }; diff --git a/kernel/supercalls.h b/kernel/supercalls.h index 023d6d3d..8fbbfd5e 100644 --- a/kernel/supercalls.h +++ b/kernel/supercalls.h @@ -5,6 +5,10 @@ #include #include "ksu.h" +#ifdef CONFIG_KPM +#include "kpm/kpm.h" +#endif + // Magic numbers for reboot hook to install fd #define KSU_INSTALL_MAGIC1 0xDEADBEEF #define KSU_INSTALL_MAGIC2 0xCAFEBABE