You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:25:55