[U-Boot] [RFC] powerpc/lib: unsafe register handling in wait_ticks
Joakim Tjernlund
joakim.tjernlund at transmode.se
Thu Jan 24 19:47:21 CET 2013
>
> Hi,
Hi Mats
I would appreciate if you CC me directly on stuff I have been involved in.
I don't read every mail on u-boot list(to many of them). It was just
plain luck I saw this one.
>
> If watchdog is enabled, the arch/powerpc/lib/ticks.S::wait_ticks()
function
> calls the function specified by the WATCHDOG_RESET macro.
> The wait_ticks function depends on the registers r0, r6 and r7 being
> preserved however that is not guaranteed if the reset function is a
> C function.
>
> The following patch changes to using r14+r15 instead of r6+r7 and
> saves all necessary registers on the stack.
This adds some extra churn to the code that my patch didn't do.
On the other hand your patch makes the function look more
like how gcc would have done so I am fine with that.
However, I am not sure r14 is a good fit, I cannot remember if there is
some
special purpose for r14. Hopefully somebody on the list knows.
>
> As I'm quite fresh to PowerPC assembly language I would appreciate
> any feedback on the implementation.
>
> On a side note, one could wonder why this function is not written in
> C language to start with.
History I guess, once upon a time this function didn't need(or could not
use)
the stack. Now it would be quite possible to change it into C.
>
> Best regards,
> Mats Kärrman
>
> --- a/arch/powerpc/lib/ticks.S
> +++ b/arch/powerpc/lib/ticks.S
> @@ -50,19 +50,24 @@ wait_ticks:
> stwu r1, -16(r1)
> mflr r0 /* save link register */
> stw r0, 20(r1) /* Use r0 or GDB will be unhappy */
> - mr r7, r3 /* save tick count */
> + stw r14, 12(r1) /* save used registers */
> + stw r15, 8(r1)
> + mr r14, r3 /* save tick count */
> bl get_ticks /* Get start time */
>
> /* Calculate end time */
> - addc r7, r4, r7 /* Compute end time lower */
> - addze r6, r3 /* and end time upper */
> + addc r14, r4, r14 /* Compute end time lower */
> + addze r15, r3 /* and end time upper */
>
> WATCHDOG_RESET /* Trigger watchdog, if needed */
> 1: bl get_ticks /* Get current time */
> - subfc r4, r4, r7 /* Subtract current time from end time */
> - subfe. r3, r3, r6
> + subfc r4, r4, r14 /* Subtract current time from end time */
> + subfe. r3, r3, r15
> bge 1b /* Loop until time expired */
>
> - mtlr r0 /* restore link register */
> + lwz r15, 8(r1) /* restore saved registers */
> + lwz r14, 12(r1)
> + lwz r0, 20(r1)
> addi r1,r1,16
> + mtlr r0
> blr
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
More information about the U-Boot
mailing list