On Sat, Nov 03, 2001 at 02:03:12AM +0000, [EMAIL PROTECTED] wrote:
> Method2 is broken because it gives erroneous results.  
> In my original post I presented a small program that 
> called three different versions of a RDTSC functions 
> (1,2,2A) and only method 1 gave results that were in any 
> posssible way correct.  Since these are three different 
> functions, there can't be any optimization issues 
> between the source code in the three functions and it's 
> not at all obvious -- at least to me -- where 
> a "volatile" declaration could be put.  If someone could 
> post a modified version of my program in method 2 or 
> method 2a worked, I'd be very grateful.


> > > ---method1---
> > > __inline__ unsigned long long int rdtsc(void)
> > > {
> > >   unsigned long long int x;
> > >   __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
> > >   return x;
> > > }
> > > 
> > > 
> > > ---method2A---
> > > __inline__ unsigned long long int hwtime(void)
> > > {
> > >   unsigned long long int x;
> > >   __asm__("rdtsc\n\t"
> > >           "mov %%edx, %%ecx\n\t"
> > >           :"=A" (x));
> > >   return x;
> > > }

Things, severally:

1) Use __volatile__, not volatile. Just an ANISism for clarity.

2) The mov is, in practice, as much use as a chocolate teapot. You're
achieving absolutely nada.

3) In the case you're using 2A, [It's been a long time since I did any
"serious" assembly], don't you need to give some clobber registers?
Specifically, something like:

---method2A-clobber---
__inline__ unsigned long long int hwtime(void)
{
 unsigned long long int x;
 __asm__("rdtsc\n\t"
          "mov %%edx, %%ecx\n\t"
          :"=A" (x)
          :
          : "ecx");
  return x;
}

Or %ecx, or whatever it is. Can't remember, as I'm not using it.

In the end, here's some actual code I'm now using:

/* Ripped straight out of "vanilla" kernel */
#define rdtscll(x) \
        __asm__ __volatile__ ("rdtsc" : "=A" (x))

<snip>
long long int time_blocked,counter0,counter1;
do_some_funky_init_stuff();
        while (1) {
                rdtscll(counter0);
                pthread_wait_np ();
                rdtscll(counter1);
                time_blocked = counter1-counter0;
                rtf_put(fifo_out, (char *) &time_blocked,sizeof(time_blocked));
        }
</snip>

Obviously, that achieves very little except to tell you what _other_
processes in your system are doing to aid in the jitter of your piece
of code.
But still, it gets the point across, yes?

Gary (-;        

PS Norm, you've been instrumental in getting me this far, and thanks
(=
-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
--
For more information on Real-Time Linux see:
http://www.rtlinux.org/

Reply via email to