On 16 Jun 2014, at 08:28, Michael Tuexen <tue...@freebsd.org> wrote:
> your patch for accessing the value is correct. However, the initialisation 
> code also
> needs to be adopted to the platform. So in addition to your patch, you also 
> need:

Thanks!

> Is there an easy test to see if the code actually works as expected and not 
> that it just
> allows the system to boot?

Yes. :-)

#include <sys/types.h>

#include <stdio.h>

static __inline uint64_t
get_cyclecount(void)
{
        uint32_t ccnt;
        uint64_t tsc;

        /* Read CCNT.  */
        __asm __volatile("mrc p15, 0, %0, c15, c12, 1": "=r" (ccnt));

        tsc = (uint64_t)ccnt;

        return (tsc);
}

#define N 100000

int
main(int argc, char *argv[])
{
        int i;
        uint64_t ccnt[N];

        for (i = 0; i < N; i++)
                ccnt[i] = get_cyclecount();

        for (i = 1; i < N; i++)
                printf("%6d %016llX %16llu\n", i, ccnt[i], ccnt[i] - ccnt[i - 
1]);


        return (0);
}

Should print a whole lotta numbers, incrementing, unless you hit the wraparound.

> Regarding the 32-bit limitation: Do we want to increment the register only 
> every
> 64 clock cycle?

Definitely not! The value is in the low bits; wrap is of little consequence.

M
-- 
Mark R V Murray

_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to