]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
x86/cpu: Use RDRAND and RDSEED mnemonics in archrandom.h
authorUros Bizjak <ubizjak@gmail.com>
Fri, 8 May 2020 10:58:17 +0000 (12:58 +0200)
committerBorislav Petkov <bp@suse.de>
Mon, 18 May 2020 17:50:47 +0000 (19:50 +0200)
Current minimum required version of binutils is 2.23,
which supports RDRAND and RDSEED instruction mnemonics.

Replace the byte-wise specification of RDRAND and
RDSEED with these proper mnemonics.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20200508105817.207887-1-ubizjak@gmail.com
arch/x86/include/asm/archrandom.h

index 7a4bb1bd4bdb84356d18e814b704b37f62fbf980..ebc248e495493a62b35a34d90583c56c82dac35c 100644 (file)
 
 #define RDRAND_RETRY_LOOPS     10
 
-#define RDRAND_INT     ".byte 0x0f,0xc7,0xf0"
-#define RDSEED_INT     ".byte 0x0f,0xc7,0xf8"
-#ifdef CONFIG_X86_64
-# define RDRAND_LONG   ".byte 0x48,0x0f,0xc7,0xf0"
-# define RDSEED_LONG   ".byte 0x48,0x0f,0xc7,0xf8"
-#else
-# define RDRAND_LONG   RDRAND_INT
-# define RDSEED_LONG   RDSEED_INT
-#endif
-
 /* Unconditional execution of RDRAND and RDSEED */
 
 static inline bool __must_check rdrand_long(unsigned long *v)
@@ -32,9 +22,9 @@ static inline bool __must_check rdrand_long(unsigned long *v)
        bool ok;
        unsigned int retry = RDRAND_RETRY_LOOPS;
        do {
-               asm volatile(RDRAND_LONG
+               asm volatile("rdrand %[out]"
                             CC_SET(c)
-                            : CC_OUT(c) (ok), "=a" (*v));
+                            : CC_OUT(c) (ok), [out] "=r" (*v));
                if (ok)
                        return true;
        } while (--retry);
@@ -46,9 +36,9 @@ static inline bool __must_check rdrand_int(unsigned int *v)
        bool ok;
        unsigned int retry = RDRAND_RETRY_LOOPS;
        do {
-               asm volatile(RDRAND_INT
+               asm volatile("rdrand %[out]"
                             CC_SET(c)
-                            : CC_OUT(c) (ok), "=a" (*v));
+                            : CC_OUT(c) (ok), [out] "=r" (*v));
                if (ok)
                        return true;
        } while (--retry);
@@ -58,18 +48,18 @@ static inline bool __must_check rdrand_int(unsigned int *v)
 static inline bool __must_check rdseed_long(unsigned long *v)
 {
        bool ok;
-       asm volatile(RDSEED_LONG
+       asm volatile("rdseed %[out]"
                     CC_SET(c)
-                    : CC_OUT(c) (ok), "=a" (*v));
+                    : CC_OUT(c) (ok), [out] "=r" (*v));
        return ok;
 }
 
 static inline bool __must_check rdseed_int(unsigned int *v)
 {
        bool ok;
-       asm volatile(RDSEED_INT
+       asm volatile("rdseed %[out]"
                     CC_SET(c)
-                    : CC_OUT(c) (ok), "=a" (*v));
+                    : CC_OUT(c) (ok), [out] "=r" (*v));
        return ok;
 }