Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Jun 2014 21:25:37 +0200
From:      Michael Tuexen <tuexen@freebsd.org>
To:        Mark R V Murray <markm@FreeBSD.org>
Cc:        Hans Petter Selasky <hps@selasky.org>, svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r266083 - in head/sys/arm: arm include
Message-ID:  <494BE7DA-26BC-43A7-8BC0-ECAE8A75E1EF@freebsd.org>
In-Reply-To: <5F36DFA5-C5B1-4E5D-88EE-9D60240B40FD@FreeBSD.org>
References:  <201405141911.s4EJBFZZ097826@svn.freebsd.org> <537D0952.2040001@selasky.org> <7610C8E6-3F01-4317-BC1A-67645A162CD7@FreeBSD.org> <53871493.2010502@selasky.org> <EE7E19AA-BE18-4740-A636-4DA3023A5392@FreeBSD.org> <9412A358-EBCB-4A5A-B728-2A15C50FC217@fh-muenster.de> <D118F546-0F32-429F-86F2-69BEE0EC2D2F@FreeBSD.org> <CC36082E-1DFD-4576-9653-970F93A3699C@fh-muenster.de> <FD5DF228-1B2B-48F9-8445-54BF5959FEDA@FreeBSD.org> <9B438991-C970-46A7-8116-A490E02D7139@fh-muenster.de> <3841D090-5973-40B0-B61C-F15E8C1978C9@FreeBSD.org> <3664DBD3-7CEA-43E8-9757-E835BB21FE9E@freebsd.org> <5F36DFA5-C5B1-4E5D-88EE-9D60240B40FD@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

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

>=20
> On 16 Jun 2014, at 08:28, Michael Tuexen <tuexen@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:
>=20
> Thanks!
>=20
>> Is there an easy test to see if the code actually works as expected =
and not that it just
>> allows the system to boot?
>=20
> Yes. :-)
>=20
> #include <sys/types.h>
>=20
> #include <stdio.h>
>=20
> static __inline uint64_t
> get_cyclecount(void)
> {
> 	uint32_t ccnt;
> 	uint64_t tsc;
>=20
> 	/* Read CCNT.  */
> 	__asm __volatile("mrc p15, 0, %0, c15, c12, 1": "=3Dr" (ccnt));
>=20
> 	tsc =3D (uint64_t)ccnt;
>=20
> 	return (tsc);
> }
>=20
> #define N 100000
>=20
> int
> main(int argc, char *argv[])
> {
> 	int i;
> 	uint64_t ccnt[N];
>=20
> 	for (i =3D 0; i < N; i++)
> 		ccnt[i] =3D get_cyclecount();
>=20
> 	for (i =3D 1; i < N; i++)
> 		printf("%6d %016llX %16llu\n", i, ccnt[i], ccnt[i] - =
ccnt[i - 1]);
>=20
>=20
> 	return (0);
> }
>=20
> 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.
>=20
>> Regarding the 32-bit limitation: Do we want to increment the register =
only every
>> 64 clock cycle?
>=20
> Definitely not! The value is in the low bits; wrap is of little =
consequence.
OK.

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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?494BE7DA-26BC-43A7-8BC0-ECAE8A75E1EF>