Effect of additionnal save/restore instructions
Chris Johns
chrisj at rtems.org
Tue Apr 23 09:10:45 UTC 2013
Leonard Bise wrote:
> Hello all,
>
> I'm having a problem regarding the processor window registers that I
> cannot explain easily mostly because I'm not super familiar with this
> subject.
>
> First, I'm using a LEON2 Sparc v8 processor and RTEMS 4.8 version which
> is required by our project.
>
> We have a function using inline assembly to perform a flat delay, here
> is the code it use.
>
> void SCET_wait_2us(void) {
>
> {
>
> /*#[ operation SCET_wait_2us() */
>
> /* Performs a 60us delay using an ASM loop, this piece of code
> has been
>
> * measured on HW to validate the duration is correct */
>
> __asm__(" \
>
> save; \
>
> set " XSTR(NB_ITER_60US) ", %l7; \
>
> StartLoop1us: \
>
> dec 1, %l7; \
>
> cmp %l7, 0; \
>
> bne StartLoop1us; \
>
> nop; \
>
> restore; \
>
> ");
>
> /*#]*/
>
> }
>
> }
>
Do you need to indicate to gcc the asm code clobbers a register ?
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.3
Chris
>
> Originally this code didn't have the save and restore instruction but
> our sub contractor added them because they had problems compiling. I
> find it an odd solution but whatever.
>
> Once this code was implemented we started seeing random processor
> reset occurring in various contexts.
>
> I tested this code while being in the Eclipse debugger and once the
> crash happened I noticed I had a segmentation fault in Eclipse. I used
> GRMON to check the processor register and noticed that the last trap
> that occurred was a window underflow trap 0x06.
>
> I found in the RTEMS sources the code for this handler, and while I
> haven't understood everything I took out that the code was trying to
> recover from this error, is this correct?
> I copied the trap handler code below.
>
> RTEMS 4.8 branch
> file : rtems / c / src / lib / libcpu / sparc / reg_win / window.S
> *
> *
> SYM(window_underflow_trap_handler):
>
> /*
> * Calculate new WIM by "rotating" the valid bits in the WIM left
> * by one position. The following shows how the bits move for a
> SPARC
> * cpu implementation where SPARC_NUMBER_OF_REGISTER_WINDOWS is 8.
> *
> * OLD WIM = 76543210
> * NEW WIM = 07654321
> *
> * NOTE: New WIM must be stored in a global register since the
> * "save" instruction just prior to the load of the wim
> * register will result in the local register set changing.
> */
>
> mov %wim, %l3 ! Calculate new WIM
> sll %l3, 1, %l4 ! l4 = WIM << 1
> srl %l3, SPARC_NUMBER_OF_REGISTER_WINDOWS-1, %l5
> ! l5 = WIM >> (Number Windows-1)
> or %l5, %l4, %l5 ! l5 = (WIM << 1) |
> ! (WIM >> (Number Windows-1))
> mov %l5, %wim ! load the new WIM
> nop; nop; nop
> restore ! Two restores to get into the
> restore ! window to restore
> ldd [%sp + 0x00], %l0 ! First the local register set
> ldd [%sp + 0x08], %l2
> ldd [%sp + 0x10], %l4
> ldd [%sp + 0x18], %l6
> ldd [%sp + 0x20], %i0 ! Then the input registers
> ldd [%sp + 0x28], %i2
> ldd [%sp + 0x30], %i4
> ldd [%sp + 0x38], %i6
> save ! Get back to the trap window.
> save
> jmp %l1 ! Re-execute restore.
> rett %l2
>
> From my understanding this code should not ever fail, is that correct?
> What I'm not sure is that if this type of trap can be a
> common occurrence or if that means something went bad in the software.
>
> Basically now I removed the save/restore and it seems to be working fine
> but I'll have to explain exactly what was happening before.
> Is the compiler not expecting the user to add save/restore and could
> that lead to the behavior we see sometimes (processor reset). What are
> the usual way to handle this type of inline assembly? Never use
> save/restore?
>
> Also our customer gave us a sequence of command to send to the software
> that would produce this reset systematically however when we got the
> equipment over here, I tried with the same code the sequence and it is
> not happening as often as they say. There seem to be a lot of randomness
> to this problem.
>
> I really hope someone can provide some knowledge on this type of issue.
> --
> *
> *
> *Léonard Bise*
> Software Design Engineer
> Direct Line +41 (0)32 338 9902
>
> *SYDERAL SA*
> Neuenburgstrasse 7
> CH-3238 Gals (Switzerland)
> Desk Line +41 (0)32 338 9800
> Web Site http://www.syderal.ch
>
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-users
More information about the users
mailing list