diff --git a/kernel/supercall/dispatch.c b/kernel/supercall/dispatch.c
index 1990b5d146b6..17e9d87a701b 100644
--- a/kernel/supercall/dispatch.c
+++ b/kernel/supercall/dispatch.c
@@ -41,6 +41,34 @@ static int do_get_info(void __user *arg)
{
struct ksu_get_info_cmd cmd = { .version = KERNEL_SU_VERSION, .flags = 0 };
+#ifdef MODULE
+ cmd.flags |= KSU_GET_INFO_FLAG_LKM;
+#endif
+
+ if (is_manager()) {
+ cmd.flags |= KSU_GET_INFO_FLAG_MANAGER;
+ }
+ if (ksu_late_loaded) {
+ cmd.flags |= KSU_GET_INFO_FLAG_LATE_LOAD;
+ }
+#ifdef EXPECTED_SIZE2
+ cmd.flags |= KSU_GET_INFO_FLAG_PR_BUILD;
+#endif
+ cmd.features = KSU_FEATURE_MAX;
+ cmd.uapi_version = KERNEL_SU_UAPI_VERSION;
+
+ if (copy_to_user(arg, &cmd, sizeof(cmd))) {
+ pr_err("get_version: copy_to_user failed\n");
+ return -EFAULT;
+ }
+
+ return 0;
+}
+
+static int do_get_info_legacy(void __user *arg)
+{
+ struct ksu_get_info_legacy_cmd cmd = { .version = KERNEL_SU_VERSION, .flags = 0 };
+
#ifdef MODULE
cmd.flags |= KSU_GET_INFO_FLAG_LKM;
#endif
@@ -669,6 +697,12 @@ static const struct ksu_ioctl_cmd_map ksu_ioctl_handlers[] = {
.handler = do_get_info,
.perm_check = always_allow
},
+ {
+ .cmd = KSU_IOCTL_GET_INFO_LEGACY,
+ .name = "GET_INFO_LEGACY",
+ .handler = do_get_info_legacy,
+ .perm_check = always_allow
+ },
{
.cmd = KSU_IOCTL_REPORT_EVENT,
.name = "REPORT_EVENT",
diff --git a/manager/app/src/main/cpp/jni.cc b/manager/app/src/main/cpp/jni.cc
index c78c4e8a2be6..4d2b117c40be 100644
--- a/manager/app/src/main/cpp/jni.cc
+++ b/manager/app/src/main/cpp/jni.cc
@@ -23,6 +23,18 @@ Java_me_weishu_kernelsu_Natives_getVersion(JNIEnv *env, jobject) {
return legacy_get_info().first;
}
+extern "C"
+JNIEXPORT jint JNICALL
+Java_me_weishu_kernelsu_Natives_getKernelUAPIVersion(JNIEnv *env, jobject) {
+ return get_kernel_uapi_version();
+}
+
+extern "C"
+JNIEXPORT jint JNICALL
+Java_me_weishu_kernelsu_Natives_getManagerUAPIVersion(JNIEnv *env, jobject) {
+ return get_manager_uapi_version();
+}
+
extern "C"
JNIEXPORT jint JNICALL
Java_me_weishu_kernelsu_Natives_getSuperuserCount(JNIEnv *env, jobject) {
diff --git a/manager/app/src/main/cpp/ksu.cc b/manager/app/src/main/cpp/ksu.cc
index e80477005deb..f2148b07b8f2 100644
--- a/manager/app/src/main/cpp/ksu.cc
+++ b/manager/app/src/main/cpp/ksu.cc
@@ -79,11 +79,23 @@ static struct ksu_get_info_cmd g_version {};
struct ksu_get_info_cmd get_info() {
if (!g_version.version) {
- ksuctl(KSU_IOCTL_GET_INFO, &g_version);
+ if (ksuctl(KSU_IOCTL_GET_INFO, &g_version) < 0) {
+ ksuctl(KSU_IOCTL_GET_INFO_LEGACY, &g_version);
+ g_version.uapi_version = 0;
+ }
}
return g_version;
}
+uint32_t get_kernel_uapi_version() {
+ auto info = get_info();
+ return info.uapi_version;
+}
+
+uint32_t get_manager_uapi_version() {
+ return KERNEL_SU_UAPI_VERSION;
+}
+
uint32_t get_version() {
auto info = get_info();
return info.version;
diff --git a/manager/app/src/main/cpp/ksu.h b/manager/app/src/main/cpp/ksu.h
index 7a6a44ca4c92..011f9e0e746f 100644
--- a/manager/app/src/main/cpp/ksu.h
+++ b/manager/app/src/main/cpp/ksu.h
@@ -12,6 +12,10 @@
#include "uapi/ksu.h"
+uint32_t get_kernel_uapi_version();
+
+uint32_t get_manager_uapi_version();
+
uint32_t get_version();
bool uid_should_umount(int uid);
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/Natives.kt b/manager/app/src/main/java/me/weishu/kernelsu/Natives.kt
index c6275bf7f0df..0c9e91e2166a 100644
--- a/manager/app/src/main/java/me/weishu/kernelsu/Natives.kt
+++ b/manager/app/src/main/java/me/weishu/kernelsu/Natives.kt
@@ -21,7 +21,8 @@ object Natives {
// 32310: new get_allow_list ioctl
// 32336: new set_sepolicy ioctl
// 32377: add set_init_pgrp ioctl
- const val MINIMAL_SUPPORTED_KERNEL = 32377
+ // 32513: add uapi version
+ const val MINIMAL_SUPPORTED_KERNEL = 32513
const val KERNEL_SU_DOMAIN = "u:r:ksu:s0"
@@ -114,8 +115,18 @@ object Natives {
}
}
+ val kernelUAPIVersion: Int
+ external get
+
+ val managerUAPIVersion: Int
+ external get
+
+ fun checkUAPIMismatch(): Boolean {
+ return kernelUAPIVersion != managerUAPIVersion
+ }
+
fun requireNewKernel(): Boolean {
- return version != -1 && version < MINIMAL_SUPPORTED_KERNEL
+ return (version != -1 && version < MINIMAL_SUPPORTED_KERNEL) || checkUAPIMismatch()
}
@Keep
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMaterial.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMaterial.kt
index f878a5fdfb58..40ac290ee92a 100644
--- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMaterial.kt
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMaterial.kt
@@ -47,6 +47,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import me.weishu.kernelsu.KernelVersion
+import me.weishu.kernelsu.Natives
import me.weishu.kernelsu.R
import me.weishu.kernelsu.ui.component.dialog.rememberConfirmDialog
import me.weishu.kernelsu.ui.component.material.TonalCard
@@ -94,15 +95,34 @@ fun HomePagerMaterial(
if (state.showGkiWarning) {
WarningCard(stringResource(id = R.string.home_gki_warning))
}
- if (state.showRequireKernelWarning) {
+ if (state.showUAPIMisMatchWarning) {
WarningCard(
stringResource(
- id = R.string.require_kernel_version,
- state.ksuVersion ?: 0,
- me.weishu.kernelsu.Natives.MINIMAL_SUPPORTED_KERNEL
+ id = R.string.uapi_mismatch,
+ state.managerUAPIVersion,
+ state.kernelUAPIVersion ?: 0,
)
)
}
+ if (state.showRequireKernelWarning) {
+ if (state.currentManagerVersionCode < (state.ksuVersion ?: 0)) {
+ WarningCard(
+ stringResource(
+ id = R.string.require_manager_version,
+ state.currentManagerVersionCode,
+ state.ksuVersion ?: 0,
+ )
+ )
+ } else {
+ WarningCard(
+ stringResource(
+ id = R.string.require_kernel_version,
+ state.ksuVersion ?: 0,
+ Natives.MINIMAL_SUPPORTED_KERNEL
+ )
+ )
+ }
+ }
if (state.showRootWarning) {
WarningCard(stringResource(id = R.string.grant_root_failed))
}
@@ -232,7 +252,7 @@ private fun StatusCard(
}
Spacer(Modifier.height(4.dp))
Text(
- text = stringResource(R.string.home_working_version, state.ksuVersion),
+ text = stringResource(R.string.home_working_version, "${state.ksuVersion}/${state.kernelUAPIVersion}"),
style = MaterialTheme.typography.bodyMedium
)
}
@@ -584,4 +604,7 @@ private fun previewHomeScreenState(
superuserCount = superuserCount,
moduleCount = moduleCount,
systemInfo = previewSystemInfo.copy(selinuxStatus = selinuxStatus),
+ kernelUAPIVersion = 1,
+ managerUAPIVersion = 1,
+ uapiMismatch = false
)
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMiuix.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMiuix.kt
index 237dd25f4b18..07a7fa9f8ad9 100644
--- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMiuix.kt
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMiuix.kt
@@ -131,14 +131,34 @@ fun HomePagerMiuix(
if (state.showGkiWarning) {
WarningCard(stringResource(id = R.string.home_gki_warning))
}
- if (state.showRequireKernelWarning) {
+ if (state.showUAPIMisMatchWarning) {
WarningCard(
stringResource(
- id = R.string.require_kernel_version,
- state.ksuVersion ?: 0, me.weishu.kernelsu.Natives.MINIMAL_SUPPORTED_KERNEL
- ),
+ id = R.string.uapi_mismatch,
+ state.managerUAPIVersion,
+ state.kernelUAPIVersion ?: 0,
+ )
)
}
+ if (state.showRequireKernelWarning) {
+ if (state.currentManagerVersionCode < (state.ksuVersion ?: 0)) {
+ WarningCard(
+ stringResource(
+ id = R.string.require_manager_version,
+ state.currentManagerVersionCode,
+ state.ksuVersion ?: 0,
+ )
+ )
+ } else {
+ WarningCard(
+ stringResource(
+ id = R.string.require_kernel_version,
+ state.ksuVersion ?: 0,
+ me.weishu.kernelsu.Natives.MINIMAL_SUPPORTED_KERNEL
+ )
+ )
+ }
+ }
if (state.showRootWarning) {
WarningCard(stringResource(id = R.string.grant_root_failed))
}
@@ -293,7 +313,7 @@ private fun StatusCard(
Spacer(Modifier.height(2.dp))
Text(
modifier = Modifier.fillMaxWidth(),
- text = stringResource(R.string.home_working_version, state.ksuVersion),
+ text = stringResource(R.string.home_working_version, "${state.ksuVersion}/${state.kernelUAPIVersion}"),
fontSize = 14.sp,
fontWeight = FontWeight.Medium,
)
@@ -656,4 +676,7 @@ private fun previewHomeScreenState(
superuserCount = superuserCount,
moduleCount = moduleCount,
systemInfo = previewSystemInfo.copy(selinuxStatus = selinuxStatus),
+ kernelUAPIVersion = 1,
+ managerUAPIVersion = 1,
+ uapiMismatch = false,
)
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeUiState.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeUiState.kt
index b870d5c6bdc0..1448e057bc40 100644
--- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeUiState.kt
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeUiState.kt
@@ -8,11 +8,14 @@ import me.weishu.kernelsu.ui.util.module.LatestVersionInfo
data class HomeUiState(
val kernelVersion: KernelVersion,
val ksuVersion: Int?,
+ val managerUAPIVersion: Int,
+ val kernelUAPIVersion: Int?,
val lkmMode: Boolean?,
val isManager: Boolean,
val isManagerPrBuild: Boolean,
val isKernelPrBuild: Boolean,
val requiresNewKernel: Boolean,
+ val uapiMismatch: Boolean,
val isRootAvailable: Boolean,
val isSafeMode: Boolean,
val isLateLoadMode: Boolean,
@@ -35,6 +38,9 @@ data class HomeUiState(
val showRequireKernelWarning: Boolean
get() = isManager && requiresNewKernel
+ val showUAPIMisMatchWarning: Boolean
+ get() = isManager && showRequireKernelWarning && uapiMismatch
+
val showRootWarning: Boolean
get() = ksuVersion != null && !isRootAvailable
diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/HomeViewModel.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/HomeViewModel.kt
index 13bd02001b15..0ca1fbc6d1a9 100644
--- a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/HomeViewModel.kt
+++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/HomeViewModel.kt
@@ -47,6 +47,8 @@ class HomeViewModel : ViewModel() {
val kernelVersion = getKernelVersion()
val isManager = Natives.isManager
val ksuVersion = if (isManager) Natives.version else null
+ val kernelUAPIVersion = if (isManager) Natives.kernelUAPIVersion else null
+ val managerUAPIVersion = Natives.managerUAPIVersion
val lkmMode = ksuVersion?.let { if (kernelVersion.isGKI()) Natives.isLkmMode else null }
val isRootAvailable = rootAvailable()
val managerVersion = getManagerVersion(ksuApp)
@@ -59,6 +61,9 @@ class HomeViewModel : ViewModel() {
isManagerPrBuild = BuildConfig.IS_PR_BUILD,
isKernelPrBuild = Natives.isPrBuild,
requiresNewKernel = isManager && Natives.requireNewKernel(),
+ uapiMismatch = isManager && Natives.checkUAPIMismatch(),
+ kernelUAPIVersion = kernelUAPIVersion,
+ managerUAPIVersion = managerUAPIVersion,
isRootAvailable = isRootAvailable,
isSafeMode = Natives.isSafeMode,
isLateLoadMode = Natives.isLateLoadMode,
@@ -70,7 +75,7 @@ class HomeViewModel : ViewModel() {
moduleCount = getModuleCount(),
systemInfo = SystemInfo(
kernelVersion = Os.uname().release,
- managerVersion = "${managerVersion.versionName} (${managerVersion.versionCode})",
+ managerVersion = "${managerVersion.versionName} (${managerVersion.versionCode}/${managerUAPIVersion})",
deviceModel = resolveDeviceName(),
fingerprint = Build.FINGERPRINT,
selinuxStatus = getSELinuxStatusRaw(),
diff --git a/manager/app/src/main/res/values-ar/strings.xml b/manager/app/src/main/res/values-ar/strings.xml
index e7bbac3ee577..4f37d856daa0 100644
--- a/manager/app/src/main/res/values-ar/strings.xml
+++ b/manager/app/src/main/res/values-ar/strings.xml
@@ -4,7 +4,7 @@
غير مثبت
إضغط للتثبيت
يعمل
- الإصدار: %d
+ الإصدار: %s
غير مدعوم
KernelSU يدعم GKI kernels فقط
إصدار النواة
diff --git a/manager/app/src/main/res/values-az/strings.xml b/manager/app/src/main/res/values-az/strings.xml
index d6469a6f37c2..60bece117770 100644
--- a/manager/app/src/main/res/values-az/strings.xml
+++ b/manager/app/src/main/res/values-az/strings.xml
@@ -5,7 +5,7 @@
Yüklənmədi
Yükləmək üçün toxunun
İşləyir
- Versiya: %d
+ Versiya: %s
Hal-hazırda KernelSU yalnız GKI nüvələrini dəstəkləyir
Dəstəklənmir
Yüklə
diff --git a/manager/app/src/main/res/values-bg/strings.xml b/manager/app/src/main/res/values-bg/strings.xml
index 9ecc56c6c69c..7922819ae1a0 100644
--- a/manager/app/src/main/res/values-bg/strings.xml
+++ b/manager/app/src/main/res/values-bg/strings.xml
@@ -4,7 +4,7 @@
Не е инсталирано
Натиснете да инсталирате
Работи
- Версия: %d
+ Версия: %s
Неподдържано
KernelSU само поддържа GKI кернели за сега.
Версия на кернела
diff --git a/manager/app/src/main/res/values-bn-rBD/strings.xml b/manager/app/src/main/res/values-bn-rBD/strings.xml
index 21416a1db4b8..63e51ec64390 100644
--- a/manager/app/src/main/res/values-bn-rBD/strings.xml
+++ b/manager/app/src/main/res/values-bn-rBD/strings.xml
@@ -30,7 +30,7 @@
পারমিসিভ
মোডিউল ডিসেবল করা যায়নি: %s
কোনো মোডিউল ইন্সটল করা নেই
- সংস্করণ: %d
+ সংস্করণ: %s
নেইম স্পেস মাউন্ট
ইনহেরিটেড
ইন্ডিভিজুয়াল
diff --git a/manager/app/src/main/res/values-bn/strings.xml b/manager/app/src/main/res/values-bn/strings.xml
index 50d91ca4cb0c..284c528a0604 100644
--- a/manager/app/src/main/res/values-bn/strings.xml
+++ b/manager/app/src/main/res/values-bn/strings.xml
@@ -4,7 +4,7 @@
ইনস্টল করা হয়নি
ইনস্টল করার জন্য ক্লিক করুন
ওয়ার্কিং
- ওয়ার্কিং সংস্করণ: %d
+ ওয়ার্কিং সংস্করণ: %s
অসমর্থিত
KernelSU শুধুমাত্র GKI কার্নেল সমর্থন করে
কার্নেল সংস্করণ
diff --git a/manager/app/src/main/res/values-bs/strings.xml b/manager/app/src/main/res/values-bs/strings.xml
index 0f47c42f67f4..77301de7abef 100644
--- a/manager/app/src/main/res/values-bs/strings.xml
+++ b/manager/app/src/main/res/values-bs/strings.xml
@@ -49,7 +49,7 @@
Pravila
Neuspješno ažuriranje SELinux pravila za: %s
Radi
- Verzija: %d
+ Verzija: %s
Kernel verzija
Permisivno
Deinstalirajte
diff --git a/manager/app/src/main/res/values-da/strings.xml b/manager/app/src/main/res/values-da/strings.xml
index bb386fe9ad8c..b847f767b758 100644
--- a/manager/app/src/main/res/values-da/strings.xml
+++ b/manager/app/src/main/res/values-da/strings.xml
@@ -50,7 +50,7 @@
Opdatering af SELinux-regler mislykkedes for %s
Start download: %s
Klik for at installere
- Version: %d
+ Version: %s
Hjem
Ikke installeret
Fingeraftryk
diff --git a/manager/app/src/main/res/values-de/strings.xml b/manager/app/src/main/res/values-de/strings.xml
index 9451397bf084..b3a615e24fb4 100644
--- a/manager/app/src/main/res/values-de/strings.xml
+++ b/manager/app/src/main/res/values-de/strings.xml
@@ -4,7 +4,7 @@
Nicht installiert
Permissiv
Funktioniert
- Version: %d
+ Version: %s
Superuser
Tippe zum Installieren
Unbekannt
diff --git a/manager/app/src/main/res/values-es/strings.xml b/manager/app/src/main/res/values-es/strings.xml
index 048f3733b5af..90028e226534 100644
--- a/manager/app/src/main/res/values-es/strings.xml
+++ b/manager/app/src/main/res/values-es/strings.xml
@@ -4,7 +4,7 @@
No instalado
Haz clic para instalar
Funcionando
- Versión: %d
+ Versión: %s
Sin soporte
KernelSU solo admite kernels GKI por ahora
Versión del kernel
diff --git a/manager/app/src/main/res/values-et/strings.xml b/manager/app/src/main/res/values-et/strings.xml
index 294a68ea871a..4a67be83ae75 100644
--- a/manager/app/src/main/res/values-et/strings.xml
+++ b/manager/app/src/main/res/values-et/strings.xml
@@ -1,7 +1,7 @@
Töötamine
- Versioon: %d
+ Versioon: %s
Tuum
Manageri versioon
Sõrmejälg
diff --git a/manager/app/src/main/res/values-fa/strings.xml b/manager/app/src/main/res/values-fa/strings.xml
index 8000037eb778..ad9c150f4fac 100644
--- a/manager/app/src/main/res/values-fa/strings.xml
+++ b/manager/app/src/main/res/values-fa/strings.xml
@@ -4,7 +4,7 @@
نصب نشده است
برای نصب ضربه بزنید
به درستی کار میکند
- نسخه: %d
+ نسخه: %s
پشتیبانی نشده
کرنل اس یو فقط هسته های gki را پشتیبانی میکند
هسته
diff --git a/manager/app/src/main/res/values-fil/strings.xml b/manager/app/src/main/res/values-fil/strings.xml
index 22d911c0a642..ccb5b3f46a1f 100644
--- a/manager/app/src/main/res/values-fil/strings.xml
+++ b/manager/app/src/main/res/values-fil/strings.xml
@@ -8,7 +8,7 @@
Panimula
I-click para i-install
Gumagana
- Bersyon: %d
+ Bersyon: %s
Hindi matukoy
Hindi Suportado
Sinusuportahan lamang ng KernelSU ang mga GKI na kernel.
diff --git a/manager/app/src/main/res/values-fr/strings.xml b/manager/app/src/main/res/values-fr/strings.xml
index 74c33b45e84c..a54a5692f438 100644
--- a/manager/app/src/main/res/values-fr/strings.xml
+++ b/manager/app/src/main/res/values-fr/strings.xml
@@ -2,7 +2,7 @@
Non installé
Fonctionnel
- Version : %d
+ Version : %s
KernelSU prend désormais en charge seulement les noyaux GKI, mais vous pouvez patcher l\'image pour les appareils GKI.
Version du noyau
Empreinte
diff --git a/manager/app/src/main/res/values-hi/strings.xml b/manager/app/src/main/res/values-hi/strings.xml
index d8e0db9657ef..4a0ecfe2f196 100644
--- a/manager/app/src/main/res/values-hi/strings.xml
+++ b/manager/app/src/main/res/values-hi/strings.xml
@@ -45,7 +45,7 @@
मॉड्यूल
निर्माता
हमारे बारे में
- वर्जन: %d
+ वर्जन: %s
रीबूट करें
KernelSU अभी केवल GKI कर्नल्स को सपोर्ट करता है
SELinux स्थिति
diff --git a/manager/app/src/main/res/values-hr/strings.xml b/manager/app/src/main/res/values-hr/strings.xml
index bd6da57bb9ab..76001aa8a327 100644
--- a/manager/app/src/main/res/values-hr/strings.xml
+++ b/manager/app/src/main/res/values-hr/strings.xml
@@ -7,7 +7,7 @@
Nije uspjelo ažuriranje SELinux pravila za %s
Početna
Nije instalirano
- Verzija: %d
+ Verzija: %s
Kliknite da instalirate
Radi
Nepodržano
diff --git a/manager/app/src/main/res/values-hu/strings.xml b/manager/app/src/main/res/values-hu/strings.xml
index b25111cb5ba4..c57491563b4a 100644
--- a/manager/app/src/main/res/values-hu/strings.xml
+++ b/manager/app/src/main/res/values-hu/strings.xml
@@ -1,7 +1,7 @@
Működik
- Verzió: %d
+ Verzió: %s
A KernelSU jelenleg csak GKI kerneleket támogat
Kernel
Alkalmazás verziója
diff --git a/manager/app/src/main/res/values-in/strings.xml b/manager/app/src/main/res/values-in/strings.xml
index 968d8b09b40b..bb7828f7df0b 100644
--- a/manager/app/src/main/res/values-in/strings.xml
+++ b/manager/app/src/main/res/values-in/strings.xml
@@ -4,7 +4,7 @@
Tidak terpasang
Ketuk untuk memasang
Berfungsi
- Versi: %d
+ Versi: %s
Tidak didukung
KernelSU sekarang hanya mendukung kernel GKI, tetapi Anda dapat menambal image untuk perangkat GKI.
Versi kernel
diff --git a/manager/app/src/main/res/values-it/strings.xml b/manager/app/src/main/res/values-it/strings.xml
index 53f9a5819204..54aad2089b9f 100644
--- a/manager/app/src/main/res/values-it/strings.xml
+++ b/manager/app/src/main/res/values-it/strings.xml
@@ -4,7 +4,7 @@
Non installato
Clicca per installare
In esecuzione
- Versione: %d
+ Versione: %s
Non supportato
KernelSU ora supporta solo i kernel GKI
Kernel
diff --git a/manager/app/src/main/res/values-iw/strings.xml b/manager/app/src/main/res/values-iw/strings.xml
index b64a08016faf..447c25da2c87 100644
--- a/manager/app/src/main/res/values-iw/strings.xml
+++ b/manager/app/src/main/res/values-iw/strings.xml
@@ -45,7 +45,7 @@
מודולים
יוצר
אודות
- גרסה: %d
+ גרסה: %s
הפעלה מחדש
KernelSU תומך רק בליבת GKI כעת
סטטוס SELinux
diff --git a/manager/app/src/main/res/values-ja/strings.xml b/manager/app/src/main/res/values-ja/strings.xml
index 0ea2348d116b..c41a40bbf52e 100644
--- a/manager/app/src/main/res/values-ja/strings.xml
+++ b/manager/app/src/main/res/values-ja/strings.xml
@@ -4,7 +4,7 @@
未インストール
タップしてインストール
動作中
- バージョン: %d
+ バージョン: %s
非対応
KernelSU は現在 GKI カーネルのみをサポートしています。ただし、GKI デバイス向けにイメージにパッチを適用することは可能です。
カーネル
diff --git a/manager/app/src/main/res/values-kn/strings.xml b/manager/app/src/main/res/values-kn/strings.xml
index db651c171fbe..f130bdcdede9 100644
--- a/manager/app/src/main/res/values-kn/strings.xml
+++ b/manager/app/src/main/res/values-kn/strings.xml
@@ -37,7 +37,7 @@
ಮಾಡ್ಯೂಲ್
ಲೇಖಕ
ಬಗ್ಗೆ
- ವರ್ಷನ್: %d
+ ವರ್ಷನ್: %s
ರೀಬೂಟ್
KernelSU ಈಗ GKI ಕರ್ನಲ್ಗಳನ್ನು ಮಾತ್ರ ಬೆಂಬಲಿಸುತ್ತದೆ
SELinux ಸ್ಥಿತಿ
diff --git a/manager/app/src/main/res/values-ko/strings.xml b/manager/app/src/main/res/values-ko/strings.xml
index 48f7e177714f..323a2cd9e707 100644
--- a/manager/app/src/main/res/values-ko/strings.xml
+++ b/manager/app/src/main/res/values-ko/strings.xml
@@ -4,7 +4,7 @@
설치되지 않음
이 곳을 눌러 설치하기
작동 중
- 버전: %d
+ 버전: %s
지원되지 않음
KernelSU는 현재 GKI 커널만 지원합니다.
커널 버전
diff --git a/manager/app/src/main/res/values-lt/strings.xml b/manager/app/src/main/res/values-lt/strings.xml
index 15a2e8d937ab..25a9570c85aa 100644
--- a/manager/app/src/main/res/values-lt/strings.xml
+++ b/manager/app/src/main/res/values-lt/strings.xml
@@ -58,7 +58,7 @@
KernelSU dabar palaiko tik GKI branduolius
Spustelėkite norėdami įdiegti
Veikia
- Versija: %d
+ Versija: %s
Nepalaikoma
Tvarkyklės versija
Branduolys
diff --git a/manager/app/src/main/res/values-lv/strings.xml b/manager/app/src/main/res/values-lv/strings.xml
index 6eeb688413d9..39e7d663eadf 100644
--- a/manager/app/src/main/res/values-lv/strings.xml
+++ b/manager/app/src/main/res/values-lv/strings.xml
@@ -12,7 +12,7 @@
Nav uzstādīts
Noklikšķiniet, lai uzstādītu
Darbojas
- Versija: %d
+ Versija: %s
Neatbalstīts
KernelSU pagaidām atbalsta tikai GKI kodolus
Kodols
diff --git a/manager/app/src/main/res/values-mr/strings.xml b/manager/app/src/main/res/values-mr/strings.xml
index b1d37a5f91bb..3eccee77ac61 100644
--- a/manager/app/src/main/res/values-mr/strings.xml
+++ b/manager/app/src/main/res/values-mr/strings.xml
@@ -4,7 +4,7 @@
होम
इंस्टॉल साठी क्लिक करा
कार्यरत
- आवृत्ती: %d
+ आवृत्ती: %s
असमर्थित
KernelSU आता फक्त GKI कर्नलचे समर्थन करते
कर्नल
diff --git a/manager/app/src/main/res/values-ms/strings.xml b/manager/app/src/main/res/values-ms/strings.xml
index a2834bbd0b74..46e159945cf1 100644
--- a/manager/app/src/main/res/values-ms/strings.xml
+++ b/manager/app/src/main/res/values-ms/strings.xml
@@ -15,7 +15,7 @@
Tekan untuk memasang
Modul
Tentang
- Versi: %d
+ Versi: %s
Reboot
KernelSU ketika ini hanya menyokong kernel GKI
Status SELinux
diff --git a/manager/app/src/main/res/values-nl/strings.xml b/manager/app/src/main/res/values-nl/strings.xml
index 6797165e43dc..9901cf9578b4 100644
--- a/manager/app/src/main/res/values-nl/strings.xml
+++ b/manager/app/src/main/res/values-nl/strings.xml
@@ -4,7 +4,7 @@
Niet geïnstalleerd
Tik om te installeren
Werkend
- Versie: %d
+ Versie: %s
Niet ondersteund
KernelSU ondersteunt momenteel alleen GKI-kernels, maar je kunt de image patchen voor GKI-apparaten.
Kernel version
diff --git a/manager/app/src/main/res/values-pl/strings.xml b/manager/app/src/main/res/values-pl/strings.xml
index 955d25900674..ec1a386f1cef 100644
--- a/manager/app/src/main/res/values-pl/strings.xml
+++ b/manager/app/src/main/res/values-pl/strings.xml
@@ -5,7 +5,7 @@
Nie zainstalowano
Kliknij, aby zainstalować
Działa
- Wersja: %d
+ Wersja: %s
Nieobsługiwany
KernelSU obsługuje obecnie tylko jądra GKI.
Wersja jądra
diff --git a/manager/app/src/main/res/values-pt-rBR/strings.xml b/manager/app/src/main/res/values-pt-rBR/strings.xml
index f0d3b21f9829..9ee6b60678ed 100644
--- a/manager/app/src/main/res/values-pt-rBR/strings.xml
+++ b/manager/app/src/main/res/values-pt-rBR/strings.xml
@@ -4,7 +4,7 @@
Não instalado
Clique para instalar
Em execução
- Versão: %d
+ Versão: %s
Sem suporte
KernelSU suporta apenas kernels GKI agora
Versão do kernel
diff --git a/manager/app/src/main/res/values-pt/strings.xml b/manager/app/src/main/res/values-pt/strings.xml
index 8fe87b18415f..8aa8d39d34cb 100644
--- a/manager/app/src/main/res/values-pt/strings.xml
+++ b/manager/app/src/main/res/values-pt/strings.xml
@@ -4,7 +4,7 @@
Início
Clique para instalar
Funcionando
- Versão: %d
+ Versão: %s
Kernel
Instalar
Sem suporte
diff --git a/manager/app/src/main/res/values-ro/strings.xml b/manager/app/src/main/res/values-ro/strings.xml
index f0f0a1553078..08d4e4bf2637 100644
--- a/manager/app/src/main/res/values-ro/strings.xml
+++ b/manager/app/src/main/res/values-ro/strings.xml
@@ -4,7 +4,7 @@
Nu este instalat
Click pentru a instala
Funcționează
- Versiune: %d
+ Versiune: %s
Necompatibil
KernelSU suportă doar nuclee GKI acum
Nucleu
diff --git a/manager/app/src/main/res/values-ru/strings.xml b/manager/app/src/main/res/values-ru/strings.xml
index 9d15cbf3cee7..f59b5f240d7d 100644
--- a/manager/app/src/main/res/values-ru/strings.xml
+++ b/manager/app/src/main/res/values-ru/strings.xml
@@ -4,7 +4,7 @@
Не установлен
Нажмите, чтобы установить
Работает
- Версия: %d
+ Версия: %s
Не поддерживается
Теперь KernelSU поддерживает только ядра GKI, однако вы всё ещё можете пропатчить образ для GKI-устройств.
diff --git a/manager/app/src/main/res/values-sl/strings.xml b/manager/app/src/main/res/values-sl/strings.xml
index 12ed20d393be..627af6cc7a3d 100644
--- a/manager/app/src/main/res/values-sl/strings.xml
+++ b/manager/app/src/main/res/values-sl/strings.xml
@@ -2,7 +2,7 @@
Klikni za namestitev
V obdelavi
- Verzija: %d
+ Verzija: %s
KernelSU podpira samo GKI kernele
Kernel
Verzija upravitelja
diff --git a/manager/app/src/main/res/values-sr/strings.xml b/manager/app/src/main/res/values-sr/strings.xml
index 05693945d20d..e0c9c1335425 100644
--- a/manager/app/src/main/res/values-sr/strings.xml
+++ b/manager/app/src/main/res/values-sr/strings.xml
@@ -3,7 +3,7 @@
Додирните да бисте инсталирали
Почетна
Није инсталирано
- Верзија: %d
+ Верзија: %s
Ради
Сачувај Дневнике
Preusmeri su binarni fajl
diff --git a/manager/app/src/main/res/values-te/strings.xml b/manager/app/src/main/res/values-te/strings.xml
index 515cb6257146..cc06fe6dcf79 100644
--- a/manager/app/src/main/res/values-te/strings.xml
+++ b/manager/app/src/main/res/values-te/strings.xml
@@ -14,7 +14,7 @@
ఇన్స్టాల్ చేయలేదు
ఇన్స్టాల్ చేయడానికి క్లిక్ చేయండి
పని చేస్తోంది
- వెర్షన్: %d
+ వెర్షన్: %s
లాగ్లు సేవ్ చేయండి
su బైనరీని మళ్ళించండి
యాప్ ప్రొఫైల్లో సూపర్యూజర్ అనుమతి ఉన్న యాప్ల కోసం /system/bin/su ని ksud కి మళ్ళించండి; కొత్త ప్రాసెస్లకు మాత్రమే పని చేస్తుంది.
diff --git a/manager/app/src/main/res/values-th/strings.xml b/manager/app/src/main/res/values-th/strings.xml
index 2231943a0aae..27488f98da80 100644
--- a/manager/app/src/main/res/values-th/strings.xml
+++ b/manager/app/src/main/res/values-th/strings.xml
@@ -4,7 +4,7 @@
ยังไม่ได้ติดตั้ง
กดเพื่อติดตั้ง
กำลังทำงาน
- เวอร์ชัน: %d
+ เวอร์ชัน: %s
เวอร์ชันตัวจัดการ
ไม่รองรับ
Enforcing
diff --git a/manager/app/src/main/res/values-tr/strings.xml b/manager/app/src/main/res/values-tr/strings.xml
index 93860d457783..bca73e3db97b 100644
--- a/manager/app/src/main/res/values-tr/strings.xml
+++ b/manager/app/src/main/res/values-tr/strings.xml
@@ -5,7 +5,7 @@
Kurulmadı
Yüklemek için dokunun
Çalışıyor
- Sürüm: %d
+ Sürüm: %s
Desteklenmiyor
KernelSU şimdilik sadece GKI çekirdeklerini destekliyor
Çekirdek Versiyonu
diff --git a/manager/app/src/main/res/values-uk/strings.xml b/manager/app/src/main/res/values-uk/strings.xml
index 02c20b14a692..03c8e5300abc 100644
--- a/manager/app/src/main/res/values-uk/strings.xml
+++ b/manager/app/src/main/res/values-uk/strings.xml
@@ -4,7 +4,7 @@
Не встановлено
Натисніть щоб встановити
Працює
- Версія: %d
+ Версія: %s
Не підтримується
KernelSU зараз підтримує лише ядра GKI.
Версія ядра
diff --git a/manager/app/src/main/res/values-vi/strings.xml b/manager/app/src/main/res/values-vi/strings.xml
index 428452d8f4fa..1890a3691522 100644
--- a/manager/app/src/main/res/values-vi/strings.xml
+++ b/manager/app/src/main/res/values-vi/strings.xml
@@ -26,7 +26,7 @@
Chưa cài đặt
Nhấn để cài đặt
Đang hoạt động
- Phiên bản: %d
+ Phiên bản: %s
Không được hỗ trợ
KernelSU hiện tại chỉ hỗ trợ Kernel GKI, nhưng bạn có thể patch file .img của thiết bị GKI mà bạn cần.
Phiên bản Kernel
diff --git a/manager/app/src/main/res/values-zh-rCN/strings.xml b/manager/app/src/main/res/values-zh-rCN/strings.xml
index 5f8ef5296c42..5e1a41746a0f 100644
--- a/manager/app/src/main/res/values-zh-rCN/strings.xml
+++ b/manager/app/src/main/res/values-zh-rCN/strings.xml
@@ -4,7 +4,7 @@
未安装
点击安装
工作中
- 版本:%d
+ 版本:%s
不支持
KernelSU 现在只支持 GKI 内核,但是你可以为 GKI 设备补丁镜像。
管理器版本 (%1$d) 与 KernelSU 驱动版本 (%2$d) 不匹配。
@@ -83,6 +83,8 @@
SELinux
卸载模块
为 %s 更新 App Profile 失败
+ 管理器 uapi 版本 (%1$d) 与 KernelSU 驱动 uapi 版本 (%2$d) 不匹配。
+ 当前 KernelSU 管理器版本 %1$d 过低,KernelSU 无法正常工作. 请将 KernelSU 管理器版本升级至 %2$d 或以上!
当前 KernelSU 版本 %1$d 过低,管理器无法正常工作,请将内核 KernelSU 版本升级至 %2$d 或以上!
默认卸载模块
App Profile 中「卸载模块」的全局默认值,如果启用,会将未自定义 Profile 的应用移除所有模块针对系统的修改
diff --git a/manager/app/src/main/res/values-zh-rHK/strings.xml b/manager/app/src/main/res/values-zh-rHK/strings.xml
index 1091ec99c342..70dc0aa727fc 100644
--- a/manager/app/src/main/res/values-zh-rHK/strings.xml
+++ b/manager/app/src/main/res/values-zh-rHK/strings.xml
@@ -4,7 +4,7 @@
未安裝
按一下開始安裝
運作中
- KernelSU 版本:%d
+ KernelSU 版本:%s
不支援
KernelSU 現僅支援 GKI 核心,但仍可修補 GKI 裝置映像。
裝置型號
diff --git a/manager/app/src/main/res/values-zh-rTW/strings.xml b/manager/app/src/main/res/values-zh-rTW/strings.xml
index a461dceaff68..d0764f22bda2 100644
--- a/manager/app/src/main/res/values-zh-rTW/strings.xml
+++ b/manager/app/src/main/res/values-zh-rTW/strings.xml
@@ -4,7 +4,7 @@
尚未安裝
點選開始安裝
已開始運作
- 版本:%d
+ 版本:%s
未受支援
KernelSU 目前僅支援 GKI 核心
裝置型號
diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml
index 980265d8a1a5..8fff7af80895 100644
--- a/manager/app/src/main/res/values/strings.xml
+++ b/manager/app/src/main/res/values/strings.xml
@@ -5,7 +5,7 @@
Not installed
Tap to install
Working
- Version: %d
+ Version: %s
Unsupported
KernelSU only supports GKI kernels now, but you can patch the image for GKI devices.
Manager version (%1$d) and KernelSU driver version (%2$d) mismatch.
@@ -104,6 +104,8 @@
SELinux context
Umount modules
Failed to update App Profile for %s
+ Manager uapi version (%1$d) and KernelSU driver uapi version (%2$d) mismatch.
+ The current KernelSU manager version %1$d is too low for KernelSU to work properly. Please upgrade manager to version %2$d or higher!
The current KernelSU version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher!
Umount modules by default
The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set.
diff --git a/uapi/supercall.h b/uapi/supercall.h
index cae5da2fa821..5e5e8f78fb4b 100644
--- a/uapi/supercall.h
+++ b/uapi/supercall.h
@@ -6,6 +6,8 @@
#include "uapi/app_profile.h"
+static const __u32 KERNEL_SU_UAPI_VERSION = 1;
+
/* Magic numbers for reboot hook to install fd */
static const __u32 KSU_INSTALL_MAGIC1 = 0xDEADBEEF;
static const __u32 KSU_INSTALL_MAGIC2 = 0xCAFEBABE;
@@ -27,6 +29,13 @@ struct ksu_get_info_cmd {
__u32 version; /* Output: KERNEL_SU_VERSION */
__u32 flags; /* Output: KSU_GET_INFO_FLAG_* bits */
__u32 features; /* Output: max feature ID supported */
+ __u32 uapi_version; /* Output: KERNEL_SU_UAPI_VERSION */
+};
+
+struct ksu_get_info_legacy_cmd {
+ __u32 version; /* Output: KERNEL_SU_VERSION */
+ __u32 flags; /* Output: KSU_GET_INFO_FLAG_* bits */
+ __u32 features; /* Output: max feature ID supported */
};
struct ksu_report_event_cmd {
@@ -140,7 +149,9 @@ static const __u8 KSU_UMOUNT_DEL = 2; /* delete entry, strcmp */
/* IOCTL command definitions */
static const __u32 KSU_IOCTL_GRANT_ROOT = _IOC(_IOC_NONE, 'K', 1, 0);
-static const __u32 KSU_IOCTL_GET_INFO = _IOC(_IOC_READ, 'K', 2, 0);
+static const __u32 KSU_IOCTL_GET_INFO = _IOR('K', 2, struct ksu_get_info_cmd);
+/* deprecated */
+static const __u32 KSU_IOCTL_GET_INFO_LEGACY = _IOC(_IOC_READ, 'K', 2, 0);
static const __u32 KSU_IOCTL_REPORT_EVENT = _IOC(_IOC_WRITE, 'K', 3, 0);
static const __u32 KSU_IOCTL_SET_SEPOLICY = _IOC(_IOC_READ | _IOC_WRITE, 'K', 4, 0);
static const __u32 KSU_IOCTL_CHECK_SAFEMODE = _IOC(_IOC_READ, 'K', 5, 0);
diff --git a/userspace/ksud/src/cli.rs b/userspace/ksud/src/cli.rs
index 26a01d2f2aca..a423158363c6 100644
--- a/userspace/ksud/src/cli.rs
+++ b/userspace/ksud/src/cli.rs
@@ -8,7 +8,8 @@ use log::{LevelFilter, error, info};
use crate::boot_patch::{BootPatchArgs, BootRestoreArgs};
use crate::module::regenerate_preinit_rc;
use crate::{
- apk_sign, assets, debug, defs, init_event, ksucalls, module, module_config, sulog, utils,
+ apk_sign, assets, debug, defs, init_event, ksu_uapi, ksucalls, module, module_config, sulog,
+ utils,
};
/// KernelSU userspace cli
@@ -214,6 +215,9 @@ enum Debug {
/// Launch sulogd daemon manually
Sulogd,
+
+ /// Get kernel info
+ Info,
}
#[derive(clap::Subcommand, Debug)]
@@ -700,6 +704,26 @@ pub fn run() -> Result<()> {
MarkCommand::Refresh => debug::mark_refresh(),
},
Debug::Sulogd => sulog::ensure_sulogd_running(),
+ Debug::Info => {
+ let info = ksucalls::get_info();
+ println!("version: {}", info.version);
+ println!("flags: 0x{:x}", info.flags);
+ println!("uapi_version: {}", info.uapi_version);
+ println!("features: 0x{:x}", info.features);
+ println!(
+ "lkm: {}",
+ (info.flags & ksu_uapi::KSU_GET_INFO_FLAG_LKM) != 0
+ );
+ println!(
+ "late_load: {}",
+ (info.flags & ksu_uapi::KSU_GET_INFO_FLAG_LATE_LOAD) != 0
+ );
+ println!(
+ "pr_build: {}",
+ (info.flags & ksu_uapi::KSU_GET_INFO_FLAG_PR_BUILD) != 0
+ );
+ Ok(())
+ }
},
Commands::BootPatch(boot_patch) => crate::boot_patch::patch(boot_patch),
diff --git a/userspace/ksud/src/init_event.rs b/userspace/ksud/src/init_event.rs
index d660a012a18f..f4f950cc57e6 100644
--- a/userspace/ksud/src/init_event.rs
+++ b/userspace/ksud/src/init_event.rs
@@ -6,7 +6,7 @@ use crate::{
};
use anyhow::{Context, Result};
use libc::_exit;
-use log::{info, warn};
+use log::{error, info, warn};
use prop_rs_android::resetprop::ResetProp;
use prop_rs_android::sys_prop;
use rustix::process::chdir;
@@ -14,6 +14,11 @@ use std::path::Path;
use std::process::Command;
pub fn on_post_data_fs() -> Result<()> {
+ if ksucalls::is_uapi_version_mismatch() {
+ error!("Kernel and userspace uapi version mismatch! skip on_post_fs_data");
+ return Ok(());
+ }
+
ksucalls::report_post_fs_data();
utils::umask(0);
@@ -151,11 +156,21 @@ pub fn run_stage(stage: &str, block: bool) {
}
pub fn on_services() {
+ if ksucalls::is_uapi_version_mismatch() {
+ error!("Kernel and userspace uapi version mismatch! skip on_services");
+ return;
+ }
+
info!("on_services triggered!");
run_stage("service", false);
}
pub fn on_boot_completed() {
+ if ksucalls::is_uapi_version_mismatch() {
+ error!("Kernel and userspace uapi version mismatch! skip on_boot_completed");
+ return;
+ }
+
ksucalls::report_boot_complete();
info!("on_boot_completed triggered!");
@@ -230,6 +245,12 @@ fn catch_bootlog(logname: &str, command: &[&str]) -> Result<()> {
}
pub fn soft_reboot() -> Result<()> {
+ // check it avoid user click "soft_reboot" in manager when version mismatch
+ if ksucalls::is_uapi_version_mismatch() {
+ error!("Kernel and userspace uapi version mismatch! skip soft_reboot");
+ return Ok(());
+ }
+
utils::daemonize_with(true, || -> Result<()> {
switch_mnt_ns(1)?;
chdir("/")?;
diff --git a/userspace/ksud/src/ksucalls.rs b/userspace/ksud/src/ksucalls.rs
index b85b64b7fe48..d7ea52e03c54 100644
--- a/userspace/ksud/src/ksucalls.rs
+++ b/userspace/ksud/src/ksucalls.rs
@@ -62,14 +62,17 @@ fn ksuctl(request: u32, arg: *mut T) -> std::io::Result {
}
// API implementations
-fn get_info() -> ksu_uapi::ksu_get_info_cmd {
+pub fn get_info() -> ksu_uapi::ksu_get_info_cmd {
*INFO_CACHE.get_or_init(|| {
let mut cmd = ksu_uapi::ksu_get_info_cmd {
version: 0,
flags: 0,
features: 0,
+ uapi_version: 0,
};
- let _ = ksuctl(ksu_uapi::KSU_IOCTL_GET_INFO, &raw mut cmd);
+ if ksuctl(ksu_uapi::KSU_IOCTL_GET_INFO, &raw mut cmd).is_err() {
+ let _ = ksuctl(ksu_uapi::KSU_IOCTL_GET_INFO_LEGACY, &raw mut cmd);
+ }
cmd
})
}
@@ -82,6 +85,10 @@ pub fn is_late_load() -> bool {
get_info().flags & ksu_uapi::KSU_GET_INFO_FLAG_LATE_LOAD != 0
}
+pub fn is_uapi_version_mismatch() -> bool {
+ get_info().uapi_version != ksu_uapi::KERNEL_SU_UAPI_VERSION
+}
+
pub fn grant_root() -> std::io::Result<()> {
ksuctl(ksu_uapi::KSU_IOCTL_GRANT_ROOT, std::ptr::null_mut::())?;
Ok(())
diff --git a/userspace/ksuinit/src/lib.rs b/userspace/ksuinit/src/lib.rs
index a90990739f14..058db33828f4 100644
--- a/userspace/ksuinit/src/lib.rs
+++ b/userspace/ksuinit/src/lib.rs
@@ -150,7 +150,8 @@ fn has_kernelsu_v2() -> bool {
use syscalls::{Sysno, syscall};
const KSU_INSTALL_MAGIC1: u32 = 0xDEADBEEF;
const KSU_INSTALL_MAGIC2: u32 = 0xCAFEBABE;
- const KSU_IOCTL_GET_INFO: u32 = 0x80004b02; // _IOC(_IOC_READ, 'K', 2, 0)
+ const KSU_IOCTL_GET_INFO: u32 = 0x80104b02; // _IOR('K', 2, struct ksu_get_info_cmd)
+ const KSU_IOCTL_GET_INFO_LEGACY: u32 = 0x80004b02; // _IOC(_IOC_READ, 'K', 2, 0)
#[repr(C)]
#[derive(Default)]
@@ -158,6 +159,15 @@ fn has_kernelsu_v2() -> bool {
version: u32,
flags: u32,
features: u32,
+ uapi_version: u32,
+ }
+
+ #[repr(C)]
+ #[derive(Default)]
+ struct GetInfoLegacyCmd {
+ version: u32,
+ flags: u32,
+ features: u32,
}
// Try new method: get driver fd using reboot syscall with magic numbers
@@ -180,7 +190,18 @@ fn has_kernelsu_v2() -> bool {
match ret {
Ok(_) => cmd.version,
- Err(_) => 0,
+ Err(_) => {
+ let mut cmd = GetInfoLegacyCmd::default();
+ match syscall!(
+ Sysno::ioctl,
+ fd,
+ KSU_IOCTL_GET_INFO_LEGACY,
+ &mut cmd as *mut _
+ ) {
+ Ok(_) => cmd.version,
+ Err(_) => 0,
+ }
+ }
}
};