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

ARM平台ioremap是否生效?Zynq-7010 FPGA中断触发0x1406异常

Zynq-7010 FPGA上Linux 5.10内核多连续中断触发0x1406外部中止异常排查求助

在Zynq-7010 FPGA平台测试Linux 5.10内核时,处理多连续中断过程中,中断处理程序触发Unhandled fault: imprecise external abort (0x1406)异常,完整异常日志如下:

[  267.634250] 8<--- cut here ---
[  267.635983] Unhandled fault: imprecise external abort (0x1406) at 0xb418b000
[  267.641733] pgd = 1945ea2d
[  267.643116] [b418b000] *pgd=00000000
[  267.645383] Internal error: : 1406 [#1] PREEMPT SMP ARM
[  267.649291] Modules linked in: snd_soc_hdmi_codec snd_soc_adi_axi_spdif adi_axi_hdmi clk_axi_clkgen isl9305 adv7511 epiphany(O)
[  267.659502] CPU: 0 PID: 5 Comm: kworker/0:0 Tainted: G           O      5.10.0-parallella #1
[  267.666617] Hardware name: Xilinx Zynq Platform
[  267.669898] Workqueue: events elink_mailbox_irq_handler_bh [epiphany]
[  267.675040] PC is at elink_mailbox_irq_handler_bh+0x2c/0x10c [epiphany]
[  267.680367] LR is at elink_mailbox_irq_handler_bh+0x14/0x10c [epiphany]
[  267.685676] pc : [<bf0006c8>]    lr : [<bf0006b0>]    psr: 600f0013
[  267.690634] sp : c1075f10  ip : 00007374  fp : ef80e940
[  267.694542] r10: 00000000  r9 : 00000000  r8 : 00000000
[  267.698449] r7 : ef811a00  r6 : ef80e780  r5 : c1bda2a8  r4 : deadbeef
[  267.703665] r3 : f0af0738  r2 : f0a00000  r1 : 00000000  r0 : bf0083c8
[  267.708900] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
[  267.714706] Control: 18c5387d  Table: 01a7404a  DAC: 00000051
[  267.719148] Process kworker/0:0 (pid: 5, stack limit = 0x29a50684)
[  267.724015] Stack: (0xc1075f10 to 0xc1076000)
[  267.727074] 5f00:                                     00000000 00000000 c1bda2a8 c1bda2a8
[  267.733931] 5f20: c100db80 ef80e780 ef811a00 c0137e30 ef80e798 c0f02d00 c100db80 ef80e780
[  267.740806] 5f40: c100db94 ef80e798 c0f02d00 00000008 c1074000 c01380ec c0f5dc0c c0f54bd5
[  267.747681] 5f60: c1075f74 c1039d40 00000000 c1074000 c101c700 c0138090 c100db80 c106dea4
[  267.754557] 5f80: c1039d64 c013e0cc 00000000 c101c700 c013df4c 00000000 00000000 00000000
[  267.761413] 5fa0: 00000000 00000000 00000000 c0100148 00000000 00000000 00000000 00000000
[  267.768289] 5fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  267.775145] 5fe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
[  267.782057] [<bf0006c8>] (elink_mailbox_irq_handler_bh [epiphany]) from [<c0137e30>] (process_one_work+0x1c4/0x424)
[  267.791181] [<c0137e30>] (process_one_work) from [<c01380ec>] (worker_thread+0x5c/0x568)
[  267.797964] [<c01380ec>] (worker_thread) from [<c013e0cc>] (kthread+0x180/0x184)
[  267.804065] [<c013e0cc>] (kthread) from [<c0100148>] (ret_from_fork+0x14/0x2c)
[  267.809982] Exception stack(0xc1075fb0 to 0xc1075ff8)
[  267.813724] 5fa0:                                     00000000 00000000 00000000 00000000
[  267.820599] 5fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[  267.827456] 5fe0: 00000000 00000000 00000000 00000000 00000013 00000000
[  267.832764] Code: e340300f e0823003 e5934000 f57ff04f (e1a03004) 
[  267.837557] ---[ end trace 081e716931792d8f ]---

异常发生在elink_mailbox_irq_handler_bh()函数中,目前怀疑异常由提供IO寄存器的FPGA硬件代码问题导致,已找到两种临时规避方法:

  • 方法1:在首次寄存器访问前添加调试打印
pr_info("adding delay works!\n");
empty = elink_mailbox_empty_p(elink);
if (!empty) {
    elink_mailbox_irq_disable(elink);
    atomic_set(&elink->mailbox_maybe_not_empty, 1);
}
  • 方法2:移除不必要的寄存器访问
//pr_info("adding delay works!\n");
//empty = elink_mailbox_empty_p(elink);
//if (!empty) {
    elink_mailbox_irq_disable(elink);
    atomic_set(&elink->mailbox_maybe_not_empty, 1);
//}

方法2生效的原因推测是减少了中断处理程序中的寄存器访问次数,避免了与主驱动代码的寄存器访问冲突。

另外,异常现场r4寄存器值为deadbeef,疑似FPGA读取问题的标识。在深入硬件调试前,寻求其他排查思路或见解。


内容的提问来源于stack exchange,提问作者Pete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:48:08