svn commit: r274250 - head/sys/dev/random

Konstantin Belousov kib at FreeBSD.org
Fri Nov 7 20:10:10 UTC 2014


Author: kib
Date: Fri Nov  7 20:10:09 2014
New Revision: 274250
URL: https://svnweb.freebsd.org/changeset/base/274250

Log:
  Simplify assembler in ivy.c.  Move the copying of the random bits into
  buffer from asm to C, which reduces amount of arguments for inline asm
  and simplifies constraints.  Use unsigned types consistently.
  
  Submitted by:	bde
  Approved by:	secteam (delphij)
  Reviewed by:	markm
  MFC after:	1 week

Modified:
  head/sys/dev/random/ivy.c

Modified: head/sys/dev/random/ivy.c
==============================================================================
--- head/sys/dev/random/ivy.c	Fri Nov  7 19:34:10 2014	(r274249)
+++ head/sys/dev/random/ivy.c	Fri Nov  7 20:10:09 2014	(r274250)
@@ -61,42 +61,41 @@ static struct live_entropy_source random
 };
 
 static inline int
-ivy_rng_store(long *buf)
+ivy_rng_store(u_long *buf)
 {
 #ifdef __GNUCLIKE_ASM
-	long tmp;
+	u_long rndval;
 	int retry;
 
 	retry = RETRY_COUNT;
 	__asm __volatile(
 	    "1:\n\t"
-	    "rdrand	%2\n\t"	/* read randomness into tmp */
-	    "jb		2f\n\t" /* CF is set on success, exit retry loop */
+	    "rdrand	%1\n\t"	/* read randomness into tmp */
+	    "jc		2f\n\t" /* CF is set on success, exit retry loop */
 	    "dec	%0\n\t" /* otherwise, retry-- */
 	    "jne	1b\n\t" /* and loop if retries are not exhausted */
-	    "jmp	3f\n"	/* failure, retry is 0, used as return value */
-	    "2:\n\t"
-	    "mov	%2,%1\n\t" /* *buf = tmp */
-	    "3:"
-	    : "+q" (retry), "=m" (*buf), "+q" (tmp) : : "cc");
+	    "2:"
+	    : "+r" (retry), "=r" (rndval) : : "cc");
+	*buf = rndval;
 	return (retry);
 #else /* __GNUCLIKE_ASM */
 	return (0);
 #endif
 }
 
-/* It is specifically allowed that buf is a multiple of sizeof(long) */
+/* It is required that buf length is a multiple of sizeof(u_long). */
 static u_int
 random_ivy_read(void *buf, u_int c)
 {
-	long *b;
+	u_long *b, rndval;
 	u_int count;
 
 	KASSERT(c % sizeof(*b) == 0, ("partial read %d", c));
 	b = buf;
 	for (count = c; count > 0; count -= sizeof(*b)) {
-		if (ivy_rng_store(b++) == 0)
+		if (ivy_rng_store(&rndval) == 0)
 			break;
+		*b++ = rndval;
 	}
 	return (c - count);
 }


More information about the svn-src-all mailing list