您好!
我的客户报告了 CPU 执行 strexd 指令时的"Unhandled FAULT:异步外部中止(0x1211)"。
出现问题;
-在任何板上。
-只要函数 SYS_Atomic_compare_and_SWAP64 (pSrc、OLD_VALUE、OLD_VALUE、RESULT)、就会执行;
-上述函数对映射在 0x1600_0000到0x161F_4FFF (物理地址)的 MRAM 的访问。
-使用其他功能的 MRAM 访问工作正常。
-使用 RT-Linux SDK (内核版本为4.19 )。
这是 DBG 日志。
Thread 17 "BlkDrvUdp" received signal SIGBUS, Bus error. [Switching to Thread 0xb04fe460 (LWP 507)] 0x002fc384 in SysCpuReadInt64 (pResult=<optimized out>, pSrc=<optimized out>) at ../../../Components/SysCpuHandling/SysCpuHandling.c:340 340 ../../../Components/SysCpuHandling/SysCpuHandling.c: No such file or directory. (gdb) bt #0 0x002fc384 in SysCpuReadInt64 (pResult=<optimized out>, pSrc=<optimized out>) at ../../../Components/SysCpuHandling/SysCpuHandling.c:340 #1 SysCpuReadInt64 (pResult=<synthetic pointer>, pSrc=0xb1eb4018) at ../../../Components/SysCpuHandling/SysCpuHandling.c:309 #2 SysCpuReadValueAtomic (pSrc=pSrc@entry=0xb1eb4018, pDest=0xb04fcf98, nLen=<optimized out>) at ../../../Components/SysCpuHandling/SysCpuHandling.c:634 #3 0x0018d1a6 in ReadValueAtomic (pDst=pDst@entry=0xb04fcf98, pSrc=pSrc@entry=0xb1eb4018, nLen=8) at ../../../Components/CmpMonitor2/CmpMonitor2.c:640 #4 0x0018d29e in WriteReadValue (pData=0xb1eb4018 <error: Cannot access memory at address 0xb1eb4018>, pReadExp=0x0, pWriter=0xb04fd18c) at ../../../Components/CmpMonitor2/CmpMonitor2.c:702 #5 ExecuteReadExp (pApp=pApp@entry=0x420678 <s_StaticAppList+60>, pReadExp=pReadExp@entry=0xb04fd030, pWriter=pWriter@entry=0xb04fd18c) at ../../../Components/CmpMonitor2/CmpMonitor2.c:967 #6 0x0018d7e8 in ProcessReadExpList2 (pApp=<optimized out>, pWriter=0xb04fd18c, pReader=0xb04fd044) at ../../../Components/CmpMonitor2/CmpMonitor2.c:1030 #7 ProcessService (pduSendBuffer=..., pWriter=0xb04fd18c, pReader=0xb04fd044, pHeader=<optimized out>) at ../../../Components/CmpMonitor2/CmpMonitor2.c:1733 #8 Monitoring2ServiceHandler (ulChannelId=<optimized out>, pHeader=<optimized out>, pduData=..., pduSendBuffer=...) at ../../../Components/CmpMonitor2/CmpMonitor2.c:363 #9 0x002dba96 in ServerAppHandleRequest3 (ulChannelId=ulChannelId@entry=31296, pduRequest=..., pduReply=..., bFirstCall=1, bFirstCall@entry=1212875) at ../../../Components/CmpSrv/CmpSrv.c:612 #10 0x002d5682 in SecChServerHandleRequest (ui32ChannelHandle=ui32ChannelHandle@entry=31296, pduRequest=..., pduReply=..., bFirstCall=bFirstCall@entry=1) at ../../../Components/CmpSecureChannel/CmpSecureChannelServer.c:440 #11 0x001281ca in NetServerMessageReceived3 (pChBuffer=pChBuffer@entry=0xb490b010, pduData=..., bFirstCall=bFirstCall@entry=1) at ../../../Components/CmpChannelServer/CmpChannelServer.c:971 #12 0x0012736a in HandleL4DataPackage (pChBuffer=0xb490b010, nSize=256, pDataPkg=<optimized out>, addrSender=...) at ../../../Components/CmpChannelMgr/CmpChannelMgr.c:839 #13 HandleL4Data (byPkgType=<optimized out>, pduData=..., addrSender=...) at ../../../Components/CmpChannelMgr/CmpChannelMgr.c:937 #14 ChannelMgrHandleData (hRouter=hRouter@entry=0xb4a01718, hNetworkInterface=hNetworkInterface@entry=0xffff, byServiceId=<optimized out>, byMessageId=<optimized out>, addrSender=..., addrReceiver=..., pduData=..., nRouterError=0) at ../../../Components/CmpChannelMgr/CmpChannelMgr.c:1690 #15 0x002cd300 in HandleLocally (pRouter=pRouter@entry=0xb4a01718, pniSender=pniSender@entry=0xb4a01718, pnaSender=pnaSender@entry=0xb04fd9a0, pHeader=pHeader@entry=0xb04fda58, pduContent=..., addrSender=..., addrReceiver=...) at ../../../Components/CmpRouter/CmpRouter.c:785 #16 0x002cee38 in RoutePackage (pRouter=0xb4a01718, pNetworkSender=pNetworkSender@entry=0xb4a01718, addrReceiver=..., addrSender=..., naSender=..., pduData=..., nDataOffset=2, bUseQueue=-1263770880) at ../../../Components/CmpRouter/CmpRouter.c:1409 #17 0x002cf530 in RouterHandleData (hNetwork=<optimized out>, naSender=..., pduData=..., bIsBroadcast=bIsBroadcast@entry=0) at ../../../Components/CmpRouter/CmpRouter.c:2156 #18 0x000b7eba in UdpReceiveBlock (iDev=<optimized out>, iDev@entry=0, iCount=iCount@entry=2, pfdDataAvailable=pfdDataAvailable@entry=0xb04fdd14) at ../../../Components/CmpBlkDrvUdp/CmpBlkDrvUdp.c:563 #19 0x000b7f4a in UdpReceiveBlocks (pfdDataAvailable=pfdDataAvailable@entry=0xb04fdd14) at ../../../Components/CmpBlkDrvUdp/CmpBlkDrvUdp.c:583 #20 0x000b88f4 in CommunicationThread (ptp=0x51751c <s_StaticTaskList+3204>) at ../../../Components/CmpBlkDrvUdp/CmpBlkDrvUdp.c:393 #21 0x003137f8 in SysTaskFrame (pTask=0x517510 <s_StaticTaskList+3192>) at ../Sys/SysTaskLinux.c:439 #22 0xb4d5fb00 in start_thread (arg=0xaeeece45) at pthread_create.c:486 #23 0xb4cd42fc in ?? () at ../sysdeps/unix/sysv/linux/arm/clone.S:73 from /lib/libc.so.6 Backtrace stopped: previous frame identical to this frame (corrupt stack?)
SYS_Atomic_compare_and_SWAP64 ()位于 SysCpuHandling.c 的第340行
e2e.ti.com/.../SysCpuHandling.c
反汇编代码:
(gdb) disassemble/m Dump of assembler code for function SysCpuReadValueAtomic: 309 RTS_I64 CDECL SysCpuReadInt64(RTS_I64 *pSrc, RTS_RESULT *pResult) 310 { 311 if (pSrc == NULL) 312 { 313 RTS_SETRESULT(pResult, ERR_PARAMETER); 314 return 0; 315 } 316 317 #if SYSCPU_ALIGNMENT_CHECK_64 > 1 318 /* Check alignment, atomic assignment is only possible if pSrc is aligned to allowed boundary */ 319 if (((RTS_UINTPTR)pSrc % SYSCPU_ALIGNMENT_CHECK_64) != 0) 320 { 321 RTS_SETRESULT(pResult, ERR_ALIGNMENT); 322 return 0; 323 } 324 #endif 325 326 #if defined(TRG_64BIT) 327 /* on 64bit targets, the atomic assignment is always assured */ 328 RTS_SETRESULT(pResult, ERR_OK); 329 return *pSrc; 330 #else 331 #ifdef SYS_ATOMIC_COMPARE_AND_SWAP64 332 { 333 /* use operating system function if available */ 334 RTS_RESULT result; 335 RTS_I64 old_value = 0; 336 337 do 338 { 339 old_value = *pSrc; 0x002fc370 <+44>: ldrd r6, r7, [r0] 340 SYS_ATOMIC_COMPARE_AND_SWAP64(pSrc, old_value, old_value, result); 0x002fc374 <+48>: dmb ish 0x002fc378 <+52>: ldrexd r4, r5, [r0] 0x002fc37c <+56>: cmp r5, r7 0x002fc37e <+58>: it eq 0x002fc380 <+60>: cmpeq r4, r6 0x002fc382 <+62>: bne.n 0x2fc38c <SysCpuReadValueAtomic+72> => 0x002fc384 <+64>: strexd r1, r6, r7, [r0] 0x002fc388 <+68>: cmp r1, #0 0x002fc38a <+70>: bne.n 0x2fc378 <SysCpuReadValueAtomic+52> 0x002fc38c <+72>: dmb ish 0x002fc390 <+76>: bne.n 0x2fc370 <SysCpuReadValueAtomic+44> 0x002fc392 <+78>: mov r4, sp 0x002fc394 <+80>: strd r6, r7, [sp]
信息寄存器:
R0值为 0xb1eb4018。
(gdb) info registers r0 0xb1eb4018 2984984600 r1 0xb04fcf98 2958020504 r2 0x0 0 r3 0xb04fcf98 2958020504 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x366fa8 3567528 r9 0xf095d44e 4036351054 r10 0xb04fd0d8 2958020824 r11 0x3a88 14984 r12 0x3f6178 4153720 sp 0xb04fcda0 0xb04fcda0 lr 0x18d1a7 1626535 pc 0x2fc384 0x2fc384 <SysCpuReadValueAtomic+64> cpsr 0x60010030 1610678320 fpscr 0x0 0
存储器映射:
0xb1eb_4000映射到0x1600_1000 (物理地址)
root@HX-SDC:/proc/2030# cat maps | grep mem b0e0c000-b0e0d000 rwxs 4a002000 00:06 8957 /dev/mem b1eb4000-b20a8000 rwxs 16001000 00:06 8957 /dev/mem b20c9000-b20ca000 rwxs 16000000 00:06 8957 /dev/mem b20ca000-b20cb000 rwxs 16000000 00:06 8957 /dev/mem b419a000-b421a000 rwxs 18100000 00:06 8957 /dev/mem b4b07000-b4b08000 rwxs 17001000 00:06 8957 /dev/mem b4b08000-b4b09000 r-xs 17001000 00:06 8957 /dev/mem b4b09000-b4b0b000 r-xs 1801c000 00:06 8957 /dev/mem b4b0b000-b4b0d000 r-xs 1800c000 00:06 8957 /dev/mem b4b0d000-b4b0f000 rwxs 1801e000 00:06 8957 /dev/mem b4b0f000-b4b11000 rwxs 1800e000 00:06 8957 /dev/mem b4b11000-b4b13000 rwxs 18014000 00:06 8957 /dev/mem b4b13000-b4b15000 rwxs 18004000 00:06 8957 /dev/mem b6f22000-b6f24000 rwxs 18016000 00:06 8957 /dev/mem b6f24000-b6f26000 rwxs 18006000 00:06 8957 /dev/mem
Question:
-"未处理故障:异步外部中止(0x1211)"是什么意思?
-问题的潜在原因是什么?
谢谢。此致、
田代浩一郎