Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 3 Aug 2013 10:24:40 +0100
From:      Mark R V Murray <mark@grondar.org>
To:        "freebsd-arm@freebsd.org" <arm@freebsd.org>
Subject:   PATCH: get_cyclecount() on ARMv6 and better
Message-ID:  <78D22A66-86E5-43B1-ABCA-7BF14F8061AB@grondar.org>

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

--Apple-Mail=_D171F5B6-526F-4EE1-99BD-6BDA85945958
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii

Hi folks

The CSPRNG used to drive /dev/random is Yarrow, and it needs good timing =
jitter to produce decent numbers.

The i86_32 and i86_64 platforms both have the TSC register, wrapped in =
the get_cyclecount() inline function, but the ARM platform doesn't use =
its equivalent, the CCNT register. The alternative, using system time, =
loses LOTS of low-bit jitter, and is certainly worth improving upon.

I'm at the early stages of testing the patch below (I only have RPi), =
and would like to get some comments and reviews, please. I am very =
doubtful indeed that I got the #ifdefs right - they are a bit of a =
minefield! ;-)

The patch  returns the 32-bit CCNT register as the 64-bit quantity that =
get_cyclecount() provides on all platforms; this is a very minor =
problem, but I suppose I could figure out some kind of crude carry =
mechanism and force the number to increment beyond 32 bits; I doubt its =
worth it though, as its the low bits that provide the jitter.

Thanks in advance!

M
--=20
Mark R V Murray

Index: cpu.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- cpu.h	(revision 253832)
+++ cpu.h	(working copy)
@@ -5,6 +5,9 @@
 #define MACHINE_CPU_H
=20
 #include <machine/armreg.h>
+#ifndef _KERNEL
+#include <machine/sysarch.h>
+#endif
=20
 void	cpu_halt(void);
 void	swi_vm(void *);
@@ -13,11 +16,26 @@
 static __inline uint64_t
 get_cyclecount(void)
 {
+#if defined (__ARM_ARCH_7__) || \
+	defined (__ARM_ARCH_7A__)  || \
+	defined (__ARM_ARCH_6__)   || \
+	defined (__ARM_ARCH_6J__)  || \
+	defined (__ARM_ARCH_6K__)  || \
+	defined (__ARM_ARCH_6T2__) || \
+	defined (__ARM_ARCH_6Z__)  || \
+	defined (__ARM_ARCH_6ZK__)
+
+	uint32_t ccnt;
+
+	/* Read CCNT. Darn; its only 32 bits. */
+	__asm __volatile("mrc p15, 0, %0, c9, c13, 0": "=3Dr" (ccnt));
+	return ((uint64_t)ccnt);
+#else
 	struct bintime bt;
=20
 	binuptime(&bt);
 	return ((uint64_t)bt.sec << 56 | bt.frac >> 8);
-		=09
+#endif
 }
 #endif



--Apple-Mail=_D171F5B6-526F-4EE1-99BD-6BDA85945958
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename=signature.asc
Content-Type: application/pgp-signature;
	name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Version: GnuPG/MacGPG2 v2.0.20 (Darwin)
Comment: GPGTools - http://gpgtools.org

iQCVAwUBUfzMXt58vKOKE6LNAQoPHQQAqTiNIzalyHsXM2OnsOS+L84Ye8zeULy1
8UGin+/GBov8o50bfsxKKtNRsc32vmDdHR8kUZ6WIq+QzduGXGusHDGJZqE3dAs/
n7e2KXWzb4Oq6Rtr8LcQmLYrUsUypMrtPvn5OPaQc+IkYjoSTDgd0Hkt6xsYnl7n
JCajRgHnSlg=
=xwZi
-----END PGP SIGNATURE-----

--Apple-Mail=_D171F5B6-526F-4EE1-99BD-6BDA85945958--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?78D22A66-86E5-43B1-ABCA-7BF14F8061AB>