Re: [patch] "single step" atomic instruction sequences as a whole.

Luis Machado
2007-02-17T02:24:44Z

Emi,

I tried your patch against the CVS head. GDB seems to handle this set of
instructions just fine:

0x40000119a00 <._IO_puts+80>: beq- cr7,0x40000119a3c <._IO_puts
+140>
0x40000119a04 <._IO_puts+84>: li r0,1
0x40000119a08 <._IO_puts+88>: lwarx r11,0,r3
0x40000119a0c <._IO_puts+92>: cmpw r11,r9
0x40000119a10 <._IO_puts+96>: bne- 0x40000119a1c <._IO_puts+108>
0x40000119a14 <._IO_puts+100>: stwcx. r0,0,r3
0x40000119a18 <._IO_puts+104>: bne+ 0x40000119a08 <._IO_puts+88>
0x40000119a1c <._IO_puts+108>: isync
0x40000119a20 <._IO_puts+112>: cmpwi cr7,r11,0
0x40000119a24 <._IO_puts+116>: bne- cr7,0x40000119b84 <._IO_puts
+468>

If i step through "lwarx", i end up with this:

Stepping over an atomic sequence of instructions.
Beginning at 0x0000040000119a08, break at 0x0000040000119a18 next time.
0x0000040000119a18 in ._IO_puts () from /lib64/power5/libc.so.6

So far so good. But if we continue executing the program we will
eventually reach a set of instructions like this one:

0x40000119ae8 <._IO_puts+312>: lwarx r9,0,r3
0x40000119aec <._IO_puts+316>: stwcx. r0,0,r3
0x40000119af0 <._IO_puts+320>: bne+ 0x40000119ae8 <._IO_puts+312>

At this point, GDB keeps stepping through the lwarx and stwcx
instructions endlessly. If i hit continue right after the first
breakpoint (0x40000119a08), the program ends normally

I tested the same instruction block with Paul's patch and this did not
happen, stating that it skipped the atomic instruction set as usual, and
ending the program.

I'm trying to figure out what is going on exactly.

Regards,
Luis