Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <errno.h>
- #include <string.h>
- #include <pthread.h>
- #include <unistd.h>
- #include <stdlib.h>
- // Try making RDRAND fail.
- // gcc -Wall -Wextra -pedantic rdrand.c -pthread
- void *fseed(void *arg) {
- int id = *(int *)arg;
- fprintf(stderr, "Thread SEED%02d started.\n", id);
- asm volatile (
- "x:\n\t"
- "pause\n\t"
- "rdseed %%rax\n\t"
- "jmp x\n\t"
- : : : "rax"
- );
- return NULL;
- }
- void *frand(void *arg) {
- int id = *(int *)arg;
- unsigned x = 0;
- unsigned long tries = 0;
- fprintf(stderr, "Thread RAND%02d started.\n", id);
- asm volatile (
- "xor %1, %1\n\t"
- "retry:\n\t"
- "pause\n\t"
- "inc %1\n\t"
- "rdrand %0\n\t"
- "jc retry\n\t"
- "done:\n\t"
- : "=a"(x), "=r"(tries) : :
- );
- fprintf(stderr, "Thread RAND%02d done after %lu tries.\n", id, tries);
- exit(0);
- return NULL;
- }
- #define NSEED 1
- #define NRAND 10
- int main(void) {
- pthread_t st[NSEED], rt[NRAND];
- int sids[NSEED], rids[NRAND];
- for (int i = 0; i < NSEED; i++) {
- sids[i] = i;
- if ((errno = pthread_create(st + i, NULL, fseed, &sids[i])) != 0) {
- fprintf(stderr, "Thread SEED%02d startup failed: %s\n", i, strerror(errno));
- return 1;
- }
- }
- for (int i = 0; i < NRAND; i++) {
- rids[i] = i;
- if ((errno = pthread_create(rt + i, NULL, frand, &rids[i])) != 0) {
- fprintf(stderr, "Thread RAND%02d startup failed: %s\n", i, strerror(errno));
- return 1;
- }
- }
- sleep(1000);
- fputs("Timed out.\n", stderr);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement