Xen-cpu@100->cpu@1:Failed to bring up CPU 1 (error -2)
问题描述:
在使用mtk2715平台的原生态的dts中cpu@100\reg=0x100,这种格式会造成一个Xen可以启动8个cpu,但dom0的kernel只能启动一个的情况。如果修改成cpu@0_0的格式,则是Xen无法启动cpu,在浏览Xen源码时有创建cpu节点的操作,并且处理节点的时候会默认跳过cpu节点的处理,Xen自行创建cpu节点信息
问题解决及其原因分析:
将dts中cpu节点的格式由cpu@100__100修改成cpu@1_1的格式,其他1-7个cpu节点格式同步。
将Xen中处理cpu节点默认跳过的操作关闭 --接口:handle_node
重新编译刷机就会出现问题描述中Xen的cpu启动失败,dom0的kernel虽然失败,但能正常读取到8cpus
结合日志和Xen的源码追踪,Xen启动cpu的条件依赖于设备树中的reg参数,可以理解为cpu编号,找到Xen通过dts获取cpu编号的接口,并在关键数组赋值将其左移8位即可(dts原生态的cpu编号:cpu@100/reg=0x100)
static void __init dt_smp_init_cpus(void):
fixbug之后的日志呈现:
总结: Xen启动cpu必须使用物理cpu的编号,但是dom0的cpu是虚拟cpu。例如cpu@100的编号是256,这个只能用于物理cpu,虚拟cpu的编号应该是1,根据这个结论去灵活修改Xen的源码(如果修改dom0的kernel可能无效,这边尝试从dts读出来的256右移8位,crash依然存在)