Dear Simon, In message <capnjgz38tzr2ztdq5d8fnfgcz9a+-vgjfv0saezjwiqbhh-...@mail.gmail.com> you wrote: > > > "compiler to read the PC back from the stack after the dcache flush" - > > can you please explain what exactly this means, and which exact > > problem it causes? > > This is the code without the patch (armv7) using -O0: > > 00000248 <cache_disable>: > 248: e92d4810 push {r4, fp, lr} > 24c: e28db008 add fp, sp, #8 > 250: e24dd01c sub sp, sp, #28 > 254: e50b0020 str r0, [fp, #-32] > 258: ee114f10 mrc 15, 0, r4, cr1, cr0, {0} > 25c: e50b4014 str r4, [fp, #-20] > 260: e51b3014 ldr r3, [fp, #-20] > 264: e50b3010 str r3, [fp, #-16] > 268: ebffff69 bl 14 <cp_delay> > 26c: e51b3020 ldr r3, [fp, #-32] > 270: e3530004 cmp r3, #4 > 274: 1a000007 bne 298 <cache_disable+0x50> > 278: e51b3010 ldr r3, [fp, #-16] > 27c: e2033004 and r3, r3, #4 > 280: e3530000 cmp r3, #0 > 284: 0a00000b beq 2b8 <cache_disable+0x70> > 288: e51b3020 ldr r3, [fp, #-32] > 28c: e3833001 orr r3, r3, #1 > 290: e50b3020 str r3, [fp, #-32] > 294: ebfffffe bl 0 <flush_dcache_all> > 298: e51b3020 ldr r3, [fp, #-32] > ^^^^^^^^^^^^^ > > 29c: e1e02003 mvn r2, r3 > 2a0: e51b3010 ldr r3, [fp, #-16] > 2a4: e0023003 and r3, r2, r3 > 2a8: e50b3018 str r3, [fp, #-24] > 2ac: e51b3018 ldr r3, [fp, #-24] > 2b0: ee013f10 mcr 15, 0, r3, cr1, cr0, {0} > 2b4: ea000000 b 2bc <cache_disable+0x74> > 2b8: e1a00000 nop ; (mov r0, r0) > 2bc: e24bd008 sub sp, fp, #8 > 2c0: e8bd8810 pop {r4, fp, pc} > > this is the code with the patch: > > 00000124 <dcache_disable>: > 124: e92d4010 push {r4, lr} > 128: ebffffb4 bl 0 <cp_delay> > 12c: ee114f10 mrc 15, 0, r4, cr1, cr0, {0} > 130: e3140004 tst r4, #4 > 134: 08bd8010 popeq {r4, pc} > 138: ebfffffe bl 0 <flush_dcache_all> > 13c: e3c44005 bic r4, r4, #5 > 140: ee014f10 mcr 15, 0, r4, cr1, cr0, {0} > 144: e8bd8010 pop {r4, pc} > > I have marked with ^^^^^^^^^^ the line that I think it dies. I did not > spent a lot of time looking at it - just found the problem with an ICE > and then tried to fix it. I suspect it can be fixed with some sort of > dsb() in flush_dcache_all(), but I am not sure.
The code is actually pretty much different - note that the version above contains calls to cache_disable() which are not visible in the code below. But then - the insn you mark is restoring r3 from the stack, after iut was stored there right before calling flush_dcache_all(). Why should this cause problems? And in which way is this "read[ing] the PC back from the stack" ? r3 is not the PC, right? > OK. If I hit it again next time I will try a bit harder to root cause it. Thanks, and sorry for insisting on a real explanation for obscure problems. Best regards, Wolfgang Denk -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de Teenagers are people who express a burning desire to be different by dressing exactly alike. There are some strings. They're just not attached. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot