Linux下访问Xilinx MPSoC PCIe EP虚拟内存触发内核崩溃排查
PCIe EP移植Linux环境触发SError中断排查问题
我在Xilinx MPSoC上开发PCIe EP应用,裸机环境下已正常运行,现在要移植到Linux环境。访问映射到Outbound/Egress BAR的PCIe虚拟内存时,触发了Kernel panic - not syncing: Asynchronous SError Interrupt错误,推测可能是MMU异常或映射配置错误,请问从哪些方面排查?
错误日志
SError Interrupt on CPU3, code 0x00000000bf000002 -- SError CPU: 3 PID: 750 Comm: devmem Tainted: G O Hardware name: xlnx,zynq (DT) pstate: 60000000 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : 000000000040bf70 lr : 00000000004b6830 sp : 0000ffffeac85c10 x29: 0000ffffeac85ce0 x28: 00000000005bfa68 x27: 0000000000400310 x26: 00000000005c9000 x25: 0000000000000018 x24: 0000000000000002 x23: 0000000000000000 x22: 0000ffffeac85ec0 x21: 0000ffffeac85e98 x20: 0000000000000021 x19: 0000ffffeac85e98 x18: 0000000000000001 x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000 x14: 000000000360ed96 x13: 0000000000000018 x12: 00000000005c8f6c x11: 0000ffffeac85cf0 x10: 0000000000000010 x9 : 0000000000557a40 x8 : 000000000000000f x7 : 0000000000558340 x6 : 0000000000002000 x5 : 0000ffffeac86e1c x4 : 0000000000000003 x3 : 0000000000000000 x2 : 0000000000000010 x1 : 00000000005c1000 x0 : 0000000000000000 Kernel panic - not syncing: Asynchronous SError Interrupt CPU: 3 PID: 750 Comm: devmem Tainted: G O Hardware name: xlnx,zynqmp (DT) Call trace: dump_backtrace.part.0+0xc0/0xd0 show_stack+0x18/0x30 dump_stack_lvl+0x6c/0x88 dump_stack+0x18/0x34 panic+0x164/0x31c add_taint+0x0/0xb0 arm64_serror_panic+0x6c/0x7c do_serror+0x28/0x70 __el0_error_handler_common+0x40/0xa4 el0t_64_error_handler+0x10/0x20 el0t_64_error+0x190/0x194 SMP: stopping secondary CPUs Kernel Offset: disabled CPU features: 0x00000,01000100,0000420b Memory Limit: none ---[ end Kernel panic - not syncing: Asynchronous SError Interrupt ]---
排查方向
- BAR地址映射验证
检查设备树中PCIe EP的BAR配置,确认Outbound BAR的物理地址范围与裸机一致,且Linux内核已正确解析该配置。用lspci -v查看BAR的分配情况,确保地址空间未被其他设备占用。 - MMU页表配置检查
如果是通过驱动手动映射BAR,确认ioremap或devm_ioremap的参数正确:物理地址范围是否匹配BAR,映射属性(如IOREMAP_NOCACHE、IOREMAP_DEVICE)是否符合PCIe设备的访问要求。可以通过查看/proc/iomem确认映射的虚拟地址范围是否正确。 - PCIe控制器寄存器状态
读取Xilinx MPSoC的PCIe控制器寄存器(如PCIe_CFG_OFFSET相关寄存器),检查Outbound ATU(地址转换单元)的配置是否正确:是否已启用,地址转换规则(本地地址到PCIe总线地址)是否与裸机一致。特别注意地址宽度、endianness设置是否匹配Linux环境。 - 访问权限与缓存一致性
确认访问BAR的进程/驱动是否有足够权限,用户空间程序通过devmem访问时,要确保对应的物理地址已被内核正确映射,且未设置禁止用户访问的属性。另外,PCIe设备的访问通常需要非缓存属性,若错误使用缓存映射,可能导致数据一致性问题触发SError。 - SError错误码解析
错误码0x00000000bf000002对应ARM64的SError类型,可参考ARM架构手册或Xilinx文档解析具体错误原因:比如是地址错误、总线错误还是访问权限错误。结合寄存器状态进一步定位。 - 内核配置检查
确认Linux内核已启用必要的PCIe相关配置,比如CONFIG_PCIE_XILINX、CONFIG_PCI_EP_STATIC(如果使用静态EP配置),以及ARM64的错误处理相关配置(如CONFIG_ARM64_SERROR_PANIC是否开启,该选项会让SError直接触发panic,可临时关闭以获取更多调试信息)。 - 硬件信号与链路状态
检查PCIe链路是否正常训练完成,用lspci查看链路宽度、速率是否符合预期。硬件上确认PCIe插槽、线缆连接正常,没有信号干扰或硬件故障。
内容的提问来源于stack exchange,提问作者Pea
相关产品推荐
相关产品推荐

