[Bug 852795] [NEW] valgrind does not support ivybridge rdrand instruction
Colin King
852795 at bugs.launchpad.net
Sat Sep 17 19:37:39 UTC 2011
Public bug reported:
Valgrind does not support Ivybridge rdrand instructions in Oneiric but
gcc does support it.
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
static inline uint16_t rdrand16(void)
{
uint16_t val;
int error;
do {
asm("rdrand %%ax;\n\
mov $1,%%edx;\n\
cmovae %%ax,%%dx;\n\
mov %%edx,%1;\n\
mov %%ax, %0;":"=r"(val),"=r"(error)::"%ax","%dx");
} while (error == 0);
return val;
}
main(int argc, char *argv[])
{
printf("%d\n", (int)rdrand16());
}
$ gcc -O5 rdrand.c
$ valgrind --version
valgrind-3.6.1
$ valgrind ./a.out
==5007== Memcheck, a memory error detector
==5007== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==5007== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==5007== Command: ./a.out
==5007==
vex amd64->IR: unhandled instruction bytes: 0x66 0xF 0xC7 0xF0 0xBA 0x1
==5007== valgrind: Unrecognised instruction at address 0x4004fb.
==5007== Your program just tried to execute an instruction that Valgrind
==5007== did not recognise. There are two possible reasons for this.
==5007== 1. Your program has a bug and erroneously jumped to a non-code
==5007== location. If you are running Memcheck and you just saw a
==5007== warning about a bad jump, it's probably your program's fault.
==5007== 2. The instruction is legitimate but Valgrind doesn't handle it,
==5007== i.e. it's Valgrind's fault. If you think this is the case or
==5007== you are not sure, please let us know and we'll try to fix it.
==5007== Either way, Valgrind will now raise a SIGILL signal which will
==5007== probably kill your program.
==5007==
==5007== Process terminating with default action of signal 4 (SIGILL)
==5007== Illegal opcode at address 0x4004FB
==5007== at 0x4004FB: rdrand16 (in /home/ubuntu/a.out)
==5007== by 0x400538: main (in /home/ubuntu/a.out)
==5007==
==5007== HEAP SUMMARY:
==5007== in use at exit: 0 bytes in 0 blocks
==5007== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==5007==
==5007== All heap blocks were freed -- no leaks are possible
==5007==
==5007== For counts of detected and suppressed errors, rerun with: -v
==5007== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
Illegal instruction (core dumped)
** Affects: valgrind (Ubuntu)
Importance: Undecided
Status: New
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to valgrind in Ubuntu.
https://bugs.launchpad.net/bugs/852795
Title:
valgrind does not support ivybridge rdrand instruction
Status in “valgrind” package in Ubuntu:
New
Bug description:
Valgrind does not support Ivybridge rdrand instructions in Oneiric but
gcc does support it.
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
static inline uint16_t rdrand16(void)
{
uint16_t val;
int error;
do {
asm("rdrand %%ax;\n\
mov $1,%%edx;\n\
cmovae %%ax,%%dx;\n\
mov %%edx,%1;\n\
mov %%ax, %0;":"=r"(val),"=r"(error)::"%ax","%dx");
} while (error == 0);
return val;
}
main(int argc, char *argv[])
{
printf("%d\n", (int)rdrand16());
}
$ gcc -O5 rdrand.c
$ valgrind --version
valgrind-3.6.1
$ valgrind ./a.out
==5007== Memcheck, a memory error detector
==5007== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==5007== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==5007== Command: ./a.out
==5007==
vex amd64->IR: unhandled instruction bytes: 0x66 0xF 0xC7 0xF0 0xBA 0x1
==5007== valgrind: Unrecognised instruction at address 0x4004fb.
==5007== Your program just tried to execute an instruction that Valgrind
==5007== did not recognise. There are two possible reasons for this.
==5007== 1. Your program has a bug and erroneously jumped to a non-code
==5007== location. If you are running Memcheck and you just saw a
==5007== warning about a bad jump, it's probably your program's fault.
==5007== 2. The instruction is legitimate but Valgrind doesn't handle it,
==5007== i.e. it's Valgrind's fault. If you think this is the case or
==5007== you are not sure, please let us know and we'll try to fix it.
==5007== Either way, Valgrind will now raise a SIGILL signal which will
==5007== probably kill your program.
==5007==
==5007== Process terminating with default action of signal 4 (SIGILL)
==5007== Illegal opcode at address 0x4004FB
==5007== at 0x4004FB: rdrand16 (in /home/ubuntu/a.out)
==5007== by 0x400538: main (in /home/ubuntu/a.out)
==5007==
==5007== HEAP SUMMARY:
==5007== in use at exit: 0 bytes in 0 blocks
==5007== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==5007==
==5007== All heap blocks were freed -- no leaks are possible
==5007==
==5007== For counts of detected and suppressed errors, rerun with: -v
==5007== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
Illegal instruction (core dumped)
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/valgrind/+bug/852795/+subscriptions
More information about the foundations-bugs
mailing list