From 1306acc017d6d84688ad00ce2a3717ac38ce685b Mon Sep 17 00:00:00 2001 From: liankong Date: Sun, 30 Mar 2025 02:02:53 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/kpm/kpm.c | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/kernel/kpm/kpm.c b/kernel/kpm/kpm.c index 997a290d..73545905 100644 --- a/kernel/kpm/kpm.c +++ b/kernel/kpm/kpm.c @@ -406,33 +406,52 @@ typedef enum { RELOC_OP_PAGE } reloc_op_t; -// 移植自内核 arch/arm64/kernel/insn.c +typedef enum { + AARCH64_INSN_IMM_16, // 16-bit 立即数(MOVZ/MOVK) + AARCH64_INSN_IMM_26, // 26-bit 跳转偏移(B/BL) + AARCH64_INSN_IMM_ADR, // 21-bit 页偏移(ADR/ADRP) + AARCH64_INSN_IMM_19 // 19-bit 条件跳转 +} aarch64_insn_imm_type; + +/* 编码立即数到指令 */ +static u32 aarch64_insn_encode_immediate(u32 insn, s64 imm, int shift, int bits) +{ + u32 mask = (BIT(bits) - 1) << shift; + return (insn & ~mask) | ((imm & (BIT(bits) - 1)) << shift); +} + +/* 修补指令中的立即数字段 */ int aarch64_insn_patch_imm(void *addr, aarch64_insn_imm_type type, s64 imm) { u32 insn = le32_to_cpu(*(u32 *)addr); u32 new_insn; switch (type) { - case AARCH64_INSN_IMM_16: // MOVZ/MOVK 的 16-bit 立即数 - new_insn = aarch64_insn_encode_immediate(type, insn, imm); + case AARCH64_INSN_IMM_16: + /* MOVZ/MOVK: imm[15:0] → shift=5, bits=16 */ + new_insn = aarch64_insn_encode_immediate(insn, imm, 5, 16); break; - case AARCH64_INSN_IMM_26: // B/BL 的 26-bit 偏移 - new_insn = aarch64_insn_encode_offset(insn, imm, 26); + case AARCH64_INSN_IMM_26: + /* B/BL: offset[25:0] → shift=0, bits=26 */ + new_insn = aarch64_insn_encode_immediate(insn, imm, 0, 26); break; - case AARCH64_INSN_IMM_ADR: // ADR 的 21-bit 页偏移 - new_insn = aarch64_insn_encode_offset(insn, imm, 21); + case AARCH64_INSN_IMM_ADR: + /* ADR/ADRP: imm[20:0] → shift=5, bits=21 */ + new_insn = aarch64_insn_encode_immediate(insn, imm, 5, 21); break; - case AARCH64_INSN_IMM_19: // 条件跳转的 19-bit 偏移 - new_insn = aarch64_insn_encode_offset(insn, imm, 19); + case AARCH64_INSN_IMM_19: + /* 条件跳转: offset[18:0] → shift=5, bits=19 */ + new_insn = aarch64_insn_encode_immediate(insn, imm, 5, 19); break; default: return -EINVAL; } + /* 写入新指令并刷新缓存 */ *(u32 *)addr = cpu_to_le32(new_insn); + flush_icache_range((unsigned long)addr, (unsigned long)addr + 4); return 0; } - /* 指令编码辅助函数 */ static int reloc_data(reloc_op_t op, void *loc, u64 val, int len) { From e27471fa9ea3975e82663548e2c483e012fd5d1d Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Sun, 30 Mar 2025 02:02:56 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=B8=BA=20SukiSU-Ultra=20=E7=9A=84=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/shirkneko/zako/sukisu/ui/util/Downloader.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/Downloader.kt b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/Downloader.kt index e3ff97b7..8791f492 100644 --- a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/Downloader.kt +++ b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/Downloader.kt @@ -64,7 +64,7 @@ fun download( fun checkNewVersion(): LatestVersionInfo { // 改为新的 release 接口 - val url = "https://api.github.com/repos/ShirkNeko/KernelSU/releases/latest" + val url = "https://api.github.com/repos/ShirkNeko/SukiSU-Ultra/releases/latest" val defaultValue = LatestVersionInfo() return runCatching { okhttp3.OkHttpClient().newCall(okhttp3.Request.Builder().url(url).build()).execute() From 2c4103bcc344395d7a203ce1d19d0c437aec21d0 Mon Sep 17 00:00:00 2001 From: liankong Date: Sun, 30 Mar 2025 02:12:49 +0800 Subject: [PATCH 3/5] 1 --- kernel/kpm/kpm.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/kernel/kpm/kpm.c b/kernel/kpm/kpm.c index 73545905..052e85c3 100644 --- a/kernel/kpm/kpm.c +++ b/kernel/kpm/kpm.c @@ -406,15 +406,8 @@ typedef enum { RELOC_OP_PAGE } reloc_op_t; -typedef enum { - AARCH64_INSN_IMM_16, // 16-bit 立即数(MOVZ/MOVK) - AARCH64_INSN_IMM_26, // 26-bit 跳转偏移(B/BL) - AARCH64_INSN_IMM_ADR, // 21-bit 页偏移(ADR/ADRP) - AARCH64_INSN_IMM_19 // 19-bit 条件跳转 -} aarch64_insn_imm_type; - /* 编码立即数到指令 */ -static u32 aarch64_insn_encode_immediate(u32 insn, s64 imm, int shift, int bits) +static u32 K_aarch64_insn_encode_immediate(u32 insn, s64 imm, int shift, int bits) { u32 mask = (BIT(bits) - 1) << shift; return (insn & ~mask) | ((imm & (BIT(bits) - 1)) << shift); @@ -429,19 +422,19 @@ int aarch64_insn_patch_imm(void *addr, aarch64_insn_imm_type type, s64 imm) switch (type) { case AARCH64_INSN_IMM_16: /* MOVZ/MOVK: imm[15:0] → shift=5, bits=16 */ - new_insn = aarch64_insn_encode_immediate(insn, imm, 5, 16); + new_insn = K_aarch64_insn_encode_immediate(insn, imm, 5, 16); break; case AARCH64_INSN_IMM_26: /* B/BL: offset[25:0] → shift=0, bits=26 */ - new_insn = aarch64_insn_encode_immediate(insn, imm, 0, 26); + new_insn = K_aarch64_insn_encode_immediate(insn, imm, 0, 26); break; case AARCH64_INSN_IMM_ADR: /* ADR/ADRP: imm[20:0] → shift=5, bits=21 */ - new_insn = aarch64_insn_encode_immediate(insn, imm, 5, 21); + new_insn = K_aarch64_insn_encode_immediate(insn, imm, 5, 21); break; case AARCH64_INSN_IMM_19: /* 条件跳转: offset[18:0] → shift=5, bits=19 */ - new_insn = aarch64_insn_encode_immediate(insn, imm, 5, 19); + new_insn = K_aarch64_insn_encode_immediate(insn, imm, 5, 19); break; default: return -EINVAL; From 6a6c460bd54676163628606f55787161841b57f2 Mon Sep 17 00:00:00 2001 From: liankong Date: Sun, 30 Mar 2025 02:17:27 +0800 Subject: [PATCH 4/5] 2 --- kernel/kpm/kpm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/kpm/kpm.c b/kernel/kpm/kpm.c index 052e85c3..eb67c9e6 100644 --- a/kernel/kpm/kpm.c +++ b/kernel/kpm/kpm.c @@ -414,7 +414,7 @@ static u32 K_aarch64_insn_encode_immediate(u32 insn, s64 imm, int shift, int bit } /* 修补指令中的立即数字段 */ -int aarch64_insn_patch_imm(void *addr, aarch64_insn_imm_type type, s64 imm) +int aarch64_insn_patch_imm(void *addr, enum aarch64_insn_imm_type type, s64 imm) { u32 insn = le32_to_cpu(*(u32 *)addr); u32 new_insn; From 562baac934c6244fb29543f521b745b37bdaba17 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Sun, 30 Mar 2025 02:23:01 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20KernelSU=20KPM=20?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E9=85=8D=E7=BD=AE=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/Kconfig | 8 ++++++++ kernel/Makefile | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/kernel/Kconfig b/kernel/Kconfig index d95e4c84..70230587 100644 --- a/kernel/Kconfig +++ b/kernel/Kconfig @@ -23,4 +23,12 @@ config KSU_HOOK This option enables the KernelSU Hook feature. If enabled, it will override the kernel version check and enable the hook functionality. +config KPM + bool "Enable KernelSU KPM" + default n + help + This option enables the KernelSU KPM feature. If enabled, it will + override the kernel version check and enable the hook functionality. + + endmenu diff --git a/kernel/Makefile b/kernel/Makefile index ca0cc941..dbfbcc79 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -16,7 +16,7 @@ ccflags-y += -I$(objtree)/security/selinux -include $(srctree)/include/uapi/asm- obj-$(CONFIG_KSU) += kernelsu.o -obj-y += kpm/ +obj-$(CONFIG_KPM) += kpm/ # .git is a text file while the module is imported by 'git submodule add'.