Hi Fabrizio,

> Question #1: Is there a way I can do the same thing on a Sparcv8 system?
> Does sparcv8 has the 'tick' register at all or the 'tick' register  
> was introduced only on newer architectures?

On SPARCv9 and above, you should actually use STICK (system tick) as we
support mix-speed configuration.  %stick is a per processor register
that's synchronized across all the CPUs.

With SPARCv8, I think %tick is a privilege register and you need to use
"rdpr %tick".

> Problem #2: How can I do a similar thing with Sun's CC compiler? The  
> 'asm' sections are valid only for gcc and I'm not very familiar with  
> Sun's CC.

Sun's CC compiler uses a different format inline functions.  Please
refer to
    usr/src/uts/i86pc/ml/amd64.il and ia32.il
    usr/src/uts/sparc/ml/sparc.il
for examples.

Hope that helps.

Sherry


On Mon, Aug 20, 2007 at 10:48:08AM -0700, Fabrizio Bertocci wrote:
> Hi everyone,
> I have two questions for the Solaris experts here, both related to  
> finding the right way to read the real-time clock from my application  
> (running in user's space).
> 
> Bottom line is that I need to have a 'rdtsc()' function available on  
> Sparc. Currently my
> 'rdtsc()' function works on Intel/AMD platforms and simply executes the
> processor's 'rdtsc' instruction to return a 64-bit integer with the
> number of clock tick since power up.
> 
> The IA32 version of rdtsc() is:
> 
> inline unsigned long long HiresTimer::rdtsc() {
>      unsigned long long x;
>      asm volatile(
>              "rdtsc \n\t"
>              : "=A" (x));
>      return x;
> }
> 
> 
> The IA64 version is:
> 
> inline unsigned long long HiresTimer::rdtsc() {
>      unsigned long high, low;
>      asm volatile(
>              "rdtsc \n\t"
>              : "=a" (low),
>                "=d" (high));
>      return ((unsigned long long)high << 32) | (low);
> }
> 
> The above code works perfectly on Solaris 10 on x86 with gcc (3.4.x  
> and 4.1.x).
> 
> For the Solaris on Sparc, I was able to get this to work on a sparcv9  
> system:
> 
> inline unsigned long long HiresTimer::rdtsc() {
>      unsigned long long tickreg;
>      asm ("rd %%tick, %0" : "=r" (tickreg));
>      return tickreg;
> }
> 
> (still with gcc).
> 
> Question #1: Is there a way I can do the same thing on a Sparcv8 system?
> Does sparcv8 has the 'tick' register at all or the 'tick' register  
> was introduced only on newer architectures?
> 
> Problem #2: How can I do a similar thing with Sun's CC compiler? The  
> 'asm' sections are valid only for gcc and I'm not very familiar with  
> Sun's CC.
> 
> Thank you in advance for any help you can give me.
> 
> Fabrizio Bertocci
> 
> 
> _______________________________________________
> opensolaris-code mailing list
> opensolaris-code@opensolaris.org
> http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

-- 
Sherry Moore, Solaris Kernel Development        http://blogs.sun.com/sherrym
_______________________________________________
opensolaris-code mailing list
opensolaris-code@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

Reply via email to