-
Notifications
You must be signed in to change notification settings - Fork 846
Description
测试设备:小米MAX3,安卓10,内核版本4.4.192(kernel文件从官方刷机包nitrogen_images_V12.5.1.0.QEDCNXM_20210616.0000.00_10.0_cn_b3f92af01f.tgz提取)
现象:修补内核后打包刷入,设备无限重启。
无限重启原因:官方内核开启了THREAD_INFO_IN_TASK(参看小米的github代码https://github.com/MiCode/Xiaomi_Kernel_OpenSource/blob/nitrogen-q-oss/arch/arm64/Kconfig 107行select THREAD_INFO_IN_TASK)
然后https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.4.192.tar.xz 下载的内核源码里面THREAD_INFO_IN_TASK的字符串根本都找不到。
接着是patch_base.cpp的代码:
bool PatchBase::is_CONFIG_THREAD_INFO_IN_TASK() {
return !m_kernel_ver_parser.is_kernel_version_less("4.4.207");
}
这会导致修补的代码把SP_EL0当thread_info指针(SP_EL0对齐到页边界4k)而不是task_struct指针。因此直接根据内核版本来判断不一定准确。
我直接把"4.4.207"改成了"4.4.192",重新修补刷入后手机可以正常开机了。当然这肯定不是好办法。下面是小米MAX3 内核版本4.4.192的prctl_get_seccomp反汇编代码:
ROM:00000000000CFA9C prctl_get_seccomp ; CODE XREF: sub_3A18C+CC↑p
ROM:00000000000CFA9C MRS X0, SP_EL0
ROM:00000000000CFAA0 LDRSW X0, [X0,#0x850]
ROM:00000000000CFAA4 RET
ROM:00000000000CFAA4 ; End of function prctl_get_seccomp
指令比较少。
如果没配置THREAD_INFO_IN_TASK,生成的指令会多一些。要先4k对齐,再定位到thread_info->task, task->seccomp.mode。
是不是可以通过这个特征来判断THREAD_INFO_IN_TASK?还是有别的更好的办法?