All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: why "mov %0, %0" after "rd %%tick, %0"?
@ 2004-01-23 20:58 David S. Miller
  2004-01-23 20:59 ` Ed L Cashin
  2004-01-23 21:31 ` Ed L Cashin
  0 siblings, 2 replies; 3+ messages in thread
From: David S. Miller @ 2004-01-23 20:58 UTC (permalink / raw)
  To: sparclinux

On Fri, 23 Jan 2004 15:59:13 -0500
Ed L Cashin <ecashin@uga.edu> wrote:

> One thing I don't get is why there's a mov %0, %0 instruction after
> reading the tick register.  Is this because of the delay slot?

No, there is a bug in some of the UltraSPARC processors in that if
you go:

	rd	%tick, %reg
	cmp	%reg, XXX

the compare will get an incorrect result.  If we force the %tick result
into a simple move instruction this prevents the sequence that leads up
to the bug.


^ permalink raw reply	[flat|nested] 3+ messages in thread

* why "mov %0, %0" after "rd %%tick, %0"?
  2004-01-23 20:58 why "mov %0, %0" after "rd %%tick, %0"? David S. Miller
@ 2004-01-23 20:59 ` Ed L Cashin
  2004-01-23 21:31 ` Ed L Cashin
  1 sibling, 0 replies; 3+ messages in thread
From: Ed L Cashin @ 2004-01-23 20:59 UTC (permalink / raw)
  To: sparclinux

Hi.  In arch/sparc64/kernel/time.c, there are some routines that use
the %tick register.  It seems analogous to the Pentium's TSC.  I'm
planning to use that register in userland via inline asm.  (Thanks for
making sure that non-privileged access is allowed, BTW!)

One thing I don't get is why there's a mov %0, %0 instruction after
reading the tick register.  Is this because of the delay slot?

static unsigned long tick_get_tick(void)
{
	unsigned long ret;

	__asm__ __volatile__("rd	%%tick, %0\n\t"
			     "mov	%0, %0"
			     : "=r" (ret));

	return ret & ~TICK_PRIV_BIT;
}


-- 
--Ed L Cashin            |   PGP public key:
  ecashin@uga.edu        |   http://noserose.net/e/pgp/


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: why "mov %0, %0" after "rd %%tick, %0"?
  2004-01-23 20:58 why "mov %0, %0" after "rd %%tick, %0"? David S. Miller
  2004-01-23 20:59 ` Ed L Cashin
@ 2004-01-23 21:31 ` Ed L Cashin
  1 sibling, 0 replies; 3+ messages in thread
From: Ed L Cashin @ 2004-01-23 21:31 UTC (permalink / raw)
  To: sparclinux

"David S. Miller" <davem@redhat.com> writes:

> On Fri, 23 Jan 2004 15:59:13 -0500
> Ed L Cashin <ecashin@uga.edu> wrote:
>
>> One thing I don't get is why there's a mov %0, %0 instruction after
>> reading the tick register.  Is this because of the delay slot?
>
> No, there is a bug in some of the UltraSPARC processors in that if
> you go:
>
> 	rd	%tick, %reg
> 	cmp	%reg, XXX
>
> the compare will get an incorrect result.  If we force the %tick result
> into a simple move instruction this prevents the sequence that leads up
> to the bug.

Oh!  Thanks.  Do you think it's worth a comment?

--- linux-2.6.1/arch/sparc64/kernel/time.c.orig	Fri Jan 23 16:21:38 2004
+++ linux-2.6.1/arch/sparc64/kernel/time.c	Fri Jan 23 16:24:44 2004
@@ -108,6 +108,14 @@
 {
 	unsigned long ret;
 
+	/* There is a bug in some of the UltraSPARC processors
+	 * where a compare following a read of the %tick 
+	 * register gets an incorrect result.
+	 *
+	 * If we force the %tick result into a simple move
+	 * instruction this prevents the sequence that leads up
+	 * to the bug.
+	 */
 	__asm__ __volatile__("rd	%%tick, %0\n\t"
 			     "mov	%0, %0"
 			     : "=r" (ret));


-- 
--Ed L Cashin            |   PGP public key:
  ecashin@uga.edu        |   http://noserose.net/e/pgp/


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2004-01-23 21:31 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-01-23 20:58 why "mov %0, %0" after "rd %%tick, %0"? David S. Miller
2004-01-23 20:59 ` Ed L Cashin
2004-01-23 21:31 ` Ed L Cashin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.