x86: fix rdrand asm()
authorJan Beulich <jbeulich@suse.com>
Thu, 26 Sep 2013 08:11:00 +0000 (10:11 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 26 Sep 2013 08:11:00 +0000 (10:11 +0200)
Just learned the hard way that at least for non-volatile asm()s gcc
indeed does what the documentation says: It may move it across jumps
(i.e. ahead of the cpu_has() check). While the documentation claims
that this can also happen for volatile asm()s, if that was the case
we'd have many more problems in our code (and e,g, Linux would too).

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Keir Fraser <keir@xen.org>
xen/include/asm-x86/random.h

index 6198e72a7b15b38b93e60fd4a7511abd4e6b2e5a..9e1fe0bc1d01d1ef23aed06faf7537bfc553e774 100644 (file)
@@ -8,7 +8,7 @@ static inline unsigned int arch_get_random(void)
     unsigned int val = 0;
 
     if ( cpu_has(&current_cpu_data, X86_FEATURE_RDRAND) )
-        asm ( ".byte 0x0f,0xc7,0xf0" : "+a" (val) );
+        asm volatile ( ".byte 0x0f,0xc7,0xf0" : "+a" (val) );
 
     return val;
 }