svn commit: r266083 - in head/sys/arm: arm include

Michael Tuexen tuexen at freebsd.org
Mon Jun 16 19:25:43 UTC 2014


On 16 Jun 2014, at 19:36, Mark R V Murray <markm at FreeBSD.org> wrote:

> 
> On 16 Jun 2014, at 08:28, Michael Tuexen <tuexen at 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.
Don't I need to compile a kernel with _PMC_USER_READ_WRITE_ being defined, since
without it a user process can't access the register. When running it on a kernel
not defining _PMC_USER_READ_WRITE_, I get a core with Illegal instruction.

Let me build a kernel with the above define and retest.
> 
>> 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.
OK.

Best regards
Michael
> 
> M
> -- 
> Mark R V Murray
> 
> 



More information about the svn-src-all mailing list