Re: V4 core speculative execution?
nop head <[email protected]> Wed, 15 Apr 2009 10:43:31 +0100
| Newsgroups | gmane.comp.hardware.motorola.microcontrollers.coldfire |
|---|---|
| Message-ID | <[email protected]> |
--000e0cd24492c56ddc046794c7d2 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Hi Tim, Sorry I was mistaken. 55555555 is cacheable and changing it to a non-cacheable address stops the bus error. The problem is though that 55555555 was just an arbirtary example. In general it could be anywhere, including I/O address, where random reads could cause some very obscure bugs. Regards, Chris 2009/4/15 nop head <[email protected]> > Hi Tim, > > >> We have our RTOS running very reliably on V4E processors and aren't >> having any problems like this. These issues are related to your >> RAMBAR, ACR, and MMU configuration, and whether regions are set for >> precise or imprecise accesses. Imprecise mode allows speculative >> accesses, precise mode doesn't. > > > Yes I also have an RTOS running and as far as I can tell that works. > Normally in C pointers point to a valid object, or one past the end of an > array, or are NULL, in which case you could get away with speculatively > derefencing them as long as address 0 was readable. It is only where I have > unions where a pointer and a scalar share the same 32 bit field. > > I am not using the MMU. 55555555 matches no ACRs RAMBARs or chip selects so > it should use the default cache mode in CACR which is inhibited precise. > > >> >> >> > Why does it sometimes lock the processor rather than giving an XLB >> > interrupt. >> >> May be related to the fact that bus errors in background debug mode >> can hang the processor. > > > It locks up even with BDM not connected. When BDM is connected the debugger > has to assert reset to get the CPU to enter background mode. > > Oddly if I set A0 to an invalid address that doesn't make the branch > condition, e.g. 55555554, then it actually tries to jump to that address and > always gets an XLB bus error as expected. It only seems to be this > speculative fetch that sometimes locks up, sometimes bus errors. For a > particular program it will always do the same thing but if code moves about > a bit it can either work, lock up, or bus error. > > I don't know whether this just applies to pointers to function or whether > pointers to objects could be speculatively dereferenced as well. It seems > like a major bug in the core but I can't find any referenc to it. I do > vaguely remember a few years ago reading that somebody had to make address 0 > readable to prevent bus errors on NULL pointers. I foolishly thought such a > major bug would have been fixed by now. > > The really wierd thing is that having an active breakpoint seems to fix it. > Does that mean that having a dormant breakpoint modifies the processors > prefetch behavior, reducing its performance? If so, it allows a whole new > class of Heisenbugs. > > Chris > >> >> >> Best regards, >> Tim >> >> nop head wrote: >> >>> I am having a problem with code that works on 68K and V3 Coldfires not >>> working on V4. I find it hard to believe, but it looks like the V4 core >>> partially executes code that is branched around. Here is a distilled example >>> of the sort of code that fails, not pretty but I think it is valid C: - >>> >>> typedef void (*f_ty)(void); // a function pointer >>> >>> // A union of an integer and a pointer, initialised to an integer that is >>> not a valid address >>> union { >>> int x; >>> f_ty f; >>> } p = { 0x55555555 }; >>> >>> // This is the sort of sequence that fails >>> { >>> dword d = p.x; >>> f_ty f = p.f; >>> if(d != 0x55555555) >>> f(); >>> } >>> >>> This compiles to: - >>> >>> movea.l _p,a0 >>> cmpa.l #0x55555555 >>> beq.s skip >>> jsr (a0) >>> skip >>> >>> So a0 should contain all 5's, which is not a valid address in my map, but >>> the branch should prevent it being used as an address. What actually >>> happends seems to depend on the code alignment, etc. >>> >>> It can simply run past the code OK. >>> >>> It can give an XLB interrupt with 55555554 in the address capture >>> register. >>> >>> It can lock up the processor. When I hit break in my BDM debugger the PC >>> is a couple of instructions past this block. >>> >>> If I set a breakpoint anywhere in the program the code runs OK, >>> regardless of whether the breakpoint is triggered. >>> >>> So it looks like the core sometimes does a pre-fetch on 55555555, even >>> though it will not be executed. My questions are: - >>> >>> Is this a known bug/feature in the V4 core? >>> Why does it sometimes lock the processor rather than giving an XLB >>> interrupt. >>> Why does having a breakpoint active make it work? >>> Is that a workaround or do I have to find all the places in my code that >>> this could happen an insert NOPs or something. A complete nightmare because >>> I have a whole state machien architecture that relies on being able to >>> contain addresses and some flags in the same 32 bit value! >>> >>> Chris >>> >>> >>> [email protected] Send a post to the list. >>> [email protected] Join the list. [email protected] the list in digest mode. >>> [email protected] Leave the list. >>> >> >> ------------------------------------------------------------ >> Tim Stoutamore, Principal Engineer >> Blunk Microsystems, LLC >> 6576 Leyland Park Drive >> San Jose, CA 95120-4558 >> Tel: 408/323-1758 >> [email protected] >> www.blunkmicro.com >> ------------------------------------------------------------ >> --- >> [email protected] Send a post to the list. >> [email protected] Join the list. >> [email protected] Join the list in digest mode. >> [email protected] Leave the list. >> >> > --000e0cd24492c56ddc046794c7d2 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi Tim,<br>=A0Sorry I was mistaken. 55555555 is cacheable and changing it t= o a non-cacheable address stops the bus error. The problem is though that 5= 5555555 was just an arbirtary example. In general it could be anywhere, inc= luding I/O address, where random reads could cause some very obscure bugs.<= br> <br>Regards, Chris<br><br><div class=3D"gmail_quote">2009/4/15 nop head <sp= an dir=3D"ltr"><<a href=3D"mailto:[email protected]">nop.head@goog= lemail.com</a>></span><br><blockquote class=3D"gmail_quote" style=3D"bor= der-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-= left: 1ex;"> Hi Tim,<br><br><div class=3D"gmail_quote"><div class=3D"im"><blockquote cla= ss=3D"gmail_quote" style=3D"border-left: 1px solid rgb(204, 204, 204); marg= in: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><br></div> We have our RTOS running very reliably on V4E processors and aren't<br> having any problems like this. These issues are related to your<br> RAMBAR, ACR, and MMU configuration, and whether regions are set for<br> precise or imprecise accesses. Imprecise mode allows speculative<br> accesses, precise mode doesn't.</blockquote><div>=A0</div></div><div>Ye= s I also have an RTOS running and as far as I can tell that works. Normally= in C pointers point to a valid object, or one past the end of an array, or= are NULL, in which case you could get away with speculatively derefencing = them as long as address 0 was readable. It is only where I have unions wher= e a pointer and a scalar share the same 32 bit field.<br> <br>I am not using the MMU. 55555555 matches no ACRs RAMBARs or chip select= s so it should use the default cache mode in CACR which is inhibited precis= e.<br>=A0</div><div class=3D"im"><blockquote class=3D"gmail_quote" style=3D= "border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padd= ing-left: 1ex;"> <div><br> <br> > Why does it sometimes lock the processor rather than giving an XLB<br> > interrupt.<br> <br></div> May be related to the fact that bus errors in background debug mode<br> can hang the processor.</blockquote></div><div><br>It locks up even with BD= M not connected. When BDM is connected the debugger has to assert reset to = get the CPU to enter background mode. <br><br>Oddly if I set A0 to an inval= id address that doesn't make the branch condition, e.g. 55555554, then = it actually tries to jump to that address and always gets an XLB bus error = as expected. It only seems to be this speculative fetch that sometimes lock= s up, sometimes bus errors. For a particular program it will always do the = same thing but if code moves about a bit it can either work, lock up, or bu= s error.<br> <br>=A0I don't know whether this just applies to pointers to function o= r whether pointers to objects could be speculatively dereferenced as well. = It seems like a major bug in the core but I can't find any referenc to = it. I do vaguely remember a few years ago reading that somebody had to make= address 0 readable to prevent bus errors on NULL pointers. I foolishly tho= ught such a major bug would have been fixed by now.<br> <br>The really wierd thing is that having an active breakpoint seems to fix= it. Does that mean that having a dormant breakpoint modifies the processor= s prefetch behavior, reducing its performance? If so, it allows a whole new= class of Heisenbugs.<br> <br>Chris<br></div><div><div></div><div class=3D"h5"><blockquote class=3D"g= mail_quote" style=3D"border-left: 1px solid rgb(204, 204, 204); margin: 0pt= 0pt 0pt 0.8ex; padding-left: 1ex;"><br> <br> Best regards,<br> Tim<br> <br> nop head wrote:<br> <blockquote class=3D"gmail_quote" style=3D"border-left: 1px solid rgb(204, = 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><= div> I am having a problem with code that works on 68K and V3 Coldfires not work= ing on V4. I find it hard to believe, but it looks like the V4 core partial= ly executes code that is branched around. Here is a distilled example of th= e sort of code that fails, not pretty but I think it is valid C: -<br> <br> typedef void (*f_ty)(void); =A0 =A0 =A0 =A0 // a function pointer<br> <br> // A union of an integer and a pointer, initialised to an integer that is n= ot a valid address<br> union {<br> =A0 =A0int x;<br> =A0 =A0f_ty =A0f;<br> } p =3D { 0x55555555 };<br> <br> // This is the sort of sequence that fails<br> {<br> =A0 =A0 =A0 dword d =3D p.x;<br> =A0 =A0 =A0 =A0f_ty f =3D p.f;<br> =A0 =A0 =A0 =A0if(d !=3D 0x55555555)<br> =A0 =A0 =A0 =A0 =A0 =A0 f();<br> =A0}<br> <br> This compiles to: -<br> <br> =A0 =A0 movea.l =A0_p,a0<br> =A0 =A0 cmpa.l =A0#0x55555555<br> =A0 =A0 beq.s =A0 =A0skip<br> =A0 =A0 jsr =A0 =A0 =A0 (a0)<br> skip<br> <br> So a0 should contain all 5's, which is not a valid address in my map, b= ut the branch should prevent it being used as an address. What actually hap= pends seems to depend on the code alignment, etc.<br> <br> It can simply run past the code OK.<br> <br> It can give an XLB interrupt with 55555554 in the address capture register.= <br> <br> It can lock up the processor. When I hit break in my BDM debugger the PC is= a couple of instructions past this block.<br> <br> If I set a breakpoint anywhere in the program the code runs OK, regardless = of whether the breakpoint is triggered.<br> <br> So it looks like the core sometimes does a pre-fetch on 55555555, even thou= gh it will not be executed. My questions are: -<br> <br> Is this a known bug/feature in the V4 core?<br> Why does it sometimes lock the processor rather than giving an XLB interrup= t.<br> Why does having a breakpoint active make it work?<br> Is that a workaround or do I have to find all the places in my code that th= is could happen an insert NOPs or something. A complete nightmare because I= have a whole state machien architecture that relies on being able to conta= in addresses and some flags in the same 32 bit value!<br> <br> Chris<br> <br> <br> </div></div><a href=3D"mailto:[email protected]" target=3D"_blank">cold= [email protected]</a> Send a post to the list. <a href=3D"mailto:coldfire-j= [email protected]" target=3D"_blank">[email protected]</a> Join the= list. <a href=3D"mailto:[email protected]" target=3D"_blank">co= [email protected]</a> Join the list in digest mode. <a href=3D"mai= lto:[email protected]" target=3D"_blank">coldfire-leave@wildrice.= com</a> Leave the list.<br> </blockquote> <br> ------------------------------------------------------------<br> Tim Stoutamore, Principal Engineer<br> Blunk Microsystems, LLC<br> 6576 Leyland Park Drive<br> San Jose, CA 95120-4558<br> Tel: 408/323-1758<br> <a href=3D"mailto:[email protected]" target=3D"_blank">stout@blunkmicro.= com</a><br> <a href=3D"http://www.blunkmicro.com" target=3D"_blank">www.blunkmicro.com<= /a><br> ------------------------------------------------------------<br> ---<br> <a href=3D"mailto:[email protected]" target=3D"_blank">coldfire@wildric= e.com</a> =A0 =A0 =A0 =A0 =A0 =A0 =A0Send a post to the list.<br> <a href=3D"mailto:[email protected]" target=3D"_blank">coldfire-jo= [email protected]</a> =A0 =A0 =A0 =A0Join the list.<br> <a href=3D"mailto:[email protected]" target=3D"_blank">coldfire-= [email protected]</a> =A0 =A0Join the list in digest mode.<br> <a href=3D"mailto:[email protected]" target=3D"_blank">coldfire-l= [email protected]</a> =A0 =A0 Leave the list.<br> <br> </blockquote></div></div></div><br> </blockquote></div><br> [email protected]=09Send a post to the list. [email protected]=09Join the list. [email protected]=09Join the list in digest mode. [email protected]=09Leave the list. --000e0cd24492c56ddc046794c7d2--