[U-Boot] powerpc: fix register usage in some inline assembly code

Submitted by Timur Tabi on Dec. 14, 2010, 11:18 p.m.

Details

Message ID 1292368731-3819-1-git-send-email-timur@freescale.com
State Accepted
Commit 96805a529c3ce366f3ecfd58a8b72ec21432af1c
Headers show

Commit Message

Timur Tabi Dec. 14, 2010, 11:18 p.m.
In some usages of inline assembly, hard-coded registers were specified when a
scratch register should have been used instead.

Signed-off-by: Timur Tabi <timur@freescale.com>
---

I can't test the kgdb changes, but the rest appears to be okay.

 arch/powerpc/lib/kgdb.c |   25 +++++++++++++++----------
 arch/powerpc/lib/time.c |    5 ++++-
 2 files changed, 19 insertions(+), 11 deletions(-)

Comments

Wolfgang Denk Dec. 15, 2010, 7:21 a.m.
Dear Timur Tabi,

In message <1292368731-3819-1-git-send-email-timur@freescale.com> you wrote:
> In some usages of inline assembly, hard-coded registers were specified when a
> scratch register should have been used instead.

Is this just a cosmetic improvement, or are you fixing any real bug?
If so, what exactly is the problem?


Best regards,

Wolfgang Denk
Tabi Timur-B04825 Dec. 15, 2010, 12:32 p.m.
Wolfgang Denk wrote:
> In message<1292368731-3819-1-git-send-email-timur@freescale.com>  you wrote:
>> >  In some usages of inline assembly, hard-coded registers were specified when a
>> >  scratch register should have been used instead.

> Is this just a cosmetic improvement, or are you fixing any real bug?
> If so, what exactly is the problem?

Well, I'm not a expert on inline assembly, so I could be missing something, but IMHO it is fixing a real bug, although the current code does technically work.

The problem is that the code was modifying registers and gcc was unaware of that.  So there is a possibility that gcc could have put something important in those registers.  It appears that the authors of that code knew which registers were unused, and just made sure to use those.
Kumar Gala Dec. 15, 2010, 2:01 p.m.
On Dec 15, 2010, at 6:32 AM, Tabi Timur-B04825 wrote:

> Wolfgang Denk wrote:
>> In message<1292368731-3819-1-git-send-email-timur@freescale.com>  you wrote:
>>>> In some usages of inline assembly, hard-coded registers were specified when a
>>>> scratch register should have been used instead.
> 
>> Is this just a cosmetic improvement, or are you fixing any real bug?
>> If so, what exactly is the problem?
> 
> Well, I'm not a expert on inline assembly, so I could be missing something, but IMHO it is fixing a real bug, although the current code does technically work.
> 
> The problem is that the code was modifying registers and gcc was unaware of that.  So there is a possibility that gcc could have put something important in those registers.  It appears that the authors of that code knew which registers were unused, and just made sure to use those.

I doubt we disagree that the change is a good one, just trying to understand if it was because of an actual issue you where seeing or just because of some code review that you made it.

ie, is this needed in v2010.12 or goes into 'next'

- k
Timur Tabi Dec. 15, 2010, 2:02 p.m.
Kumar Gala wrote:
> I doubt we disagree that the change is a good one, just trying to understand
> if it was because of an actual issue you where seeing or just because of some
> code review that you made it.

Just a code review.

> 
> ie, is this needed in v2010.12 or goes into 'next'

Definitely 'next'.
Wolfgang Denk Dec. 17, 2010, 8:18 p.m.
Dear Timur Tabi,

In message <1292368731-3819-1-git-send-email-timur@freescale.com> you wrote:
> In some usages of inline assembly, hard-coded registers were specified when a
> scratch register should have been used instead.
> 
> Signed-off-by: Timur Tabi <timur@freescale.com>
> ---
> 
> I can't test the kgdb changes, but the rest appears to be okay.
> 
>  arch/powerpc/lib/kgdb.c |   25 +++++++++++++++----------
>  arch/powerpc/lib/time.c |    5 ++++-
>  2 files changed, 19 insertions(+), 11 deletions(-)

Applied to "next", thanks.

Best regards,

Wolfgang Denk

Patch hide | download patch | download mbox

diff --git a/arch/powerpc/lib/kgdb.c b/arch/powerpc/lib/kgdb.c
index 1ec6818..19a56db 100644
--- a/arch/powerpc/lib/kgdb.c
+++ b/arch/powerpc/lib/kgdb.c
@@ -12,11 +12,13 @@  void breakinst(void);
 int
 kgdb_setjmp(long *buf)
 {
-	asm ("mflr 0; stw 0,0(%0);"
-	     "stw 1,4(%0); stw 2,8(%0);"
-	     "mfcr 0; stw 0,12(%0);"
-	     "stmw 13,16(%0)"
-	     : : "r" (buf));
+	unsigned long temp;
+
+	asm volatile("mflr %0; stw %0,0(%1);"
+	     "stw %%r1,4(%1); stw %%r2,8(%1);"
+	     "mfcr %0; stw %0,12(%1);"
+	     "stmw %%r13,16(%1)"
+	     : "=&r"(temp) : "r" (buf));
 	/* XXX should save fp regs as well */
 	return 0;
 }
@@ -24,13 +26,16 @@  kgdb_setjmp(long *buf)
 void
 kgdb_longjmp(long *buf, int val)
 {
+	unsigned long temp;
+
 	if (val == 0)
 		val = 1;
-	asm ("lmw 13,16(%0);"
-	     "lwz 0,12(%0); mtcrf 0x38,0;"
-	     "lwz 0,0(%0); lwz 1,4(%0); lwz 2,8(%0);"
-	     "mtlr 0; mr 3,%1"
-	     : : "r" (buf), "r" (val));
+
+	asm volatile("lmw %%r13,16(%1);"
+	     "lwz %0,12(%1); mtcrf 0x38,%0;"
+	     "lwz %0,0(%1); lwz %%r1,4(%1); lwz %%r2,8(%1);"
+	     "mtlr %0; mr %%r3,%2"
+	     : "=&r"(temp) : "r" (buf), "r" (val));
 }
 
 static inline unsigned long
diff --git a/arch/powerpc/lib/time.c b/arch/powerpc/lib/time.c
index 2909961..34633c3 100644
--- a/arch/powerpc/lib/time.c
+++ b/arch/powerpc/lib/time.c
@@ -78,6 +78,8 @@  unsigned long ticks2usec(unsigned long ticks)
 
 int init_timebase (void)
 {
+	unsigned long temp;
+
 #if defined(CONFIG_5xx) || defined(CONFIG_8xx)
 	volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
 
@@ -86,7 +88,8 @@  int init_timebase (void)
 #endif
 
 	/* reset */
-	asm ("li 3,0 ; mttbu 3 ; mttbl 3 ;");
+	asm volatile("li %0,0 ; mttbu %0 ; mttbl %0;"
+	     : "=&r"(temp) );
 
 #if defined(CONFIG_5xx) || defined(CONFIG_8xx)
 	/* enable */