/* Output RDRAND output on stdout */
#include <unistd.h>
#include <stdint.h>
#include <cpuid.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFS (1024*64)

unsigned cpuid_ecx(unsigned level) 
{
	unsigned a, b, c, d;
	__cpuid(level, a, b, c, d);
	return c;
}

int main(void)
{
	uint64_t buf[BUFS / 8];
	int i = 0;

	if (!(cpuid_ecx(1) & (1U << 30))) {
		printf("No support for RDRAND\n"); 
		exit(1);
	}
	for (;;) { 
		uint64_t r;
		asm("1: rdrand %0 ; jnc 1b" : "=r" (r));
		buf[i++] = r;
		if (i >= BUFS/8) {
			int n = write(1, buf, BUFS);
			if (n != BUFS) {
				perror("write");
				break;
			}
			i = 0;
		}
	}
	return 0;
}
