Hi Wolfgang, On Sat, Nov 3, 2012 at 5:29 AM, Wolfgang Denk <w...@denx.de> wrote: > Dear Simon Glass, > > In message <1351813330-23741-1-git-send-email-...@chromium.org> you wrote: >> It is good to have these functions written in C instead of assembler, >> but with -O0 the cache_disable() function doesn't return. Rather than >> revert to assembler, this fix just forces this to be built with -O2. > > NAK. > > This is vodoo programming to fix a problem which is obviously not > correctly understood (and fixed), so the real cause remains unfixed. > >> +/* >> + * Big hack warning! >> + * >> + * Devs like to compile with -O0 to get a nice debugging illusion. But this > > We don't use -O0 normally, and actually there are more places in the > code that are likely to cause problems or to actually break when > using -O0. > >> + * function does not survive that since -O0 causes the compiler to read the >> + * PC back from the stack after the dcache flush. Might it be possible to >> fix >> + * this by flushing the write buffer? >> + */ > > "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. Unfortunately things have moved on and I can't easily test this (now using Thumb2 where -O0 isn't quite so extreme). > >> +static void cache_disable(uint32_t cache_bit) __attribute__ ((optimize(2))); > > Sorry, I will not accept this. OK. If I hit it again next time I will try a bit harder to root cause it. Regards, Simon > > 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 > backups: always in season, never out of style. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot