2020-05-08 11:00:53

by Uros Bizjak

[permalink] [raw]
Subject: [PATCH] x86: Use RDRAND and RDSEED mnemonics in archrandom.h

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 <[email protected]>
CC: "H. Peter Anvin" <[email protected]>
CC: Ingo Molnar <[email protected]>
CC: Thomas Gleixner <[email protected]>
---
arch/x86/include/asm/archrandom.h | 26 ++++++++------------------
1 file changed, 8 insertions(+), 18 deletions(-)

diff --git a/arch/x86/include/asm/archrandom.h b/arch/x86/include/asm/archrandom.h
index 7a4bb1bd4bdb..ebc248e49549 100644
--- a/arch/x86/include/asm/archrandom.h
+++ b/arch/x86/include/asm/archrandom.h
@@ -15,16 +15,6 @@

#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;
}

--
2.25.4


2020-05-08 17:02:28

by H. Peter Anvin

[permalink] [raw]
Subject: Re: [PATCH] x86: Use RDRAND and RDSEED mnemonics in archrandom.h

On May 8, 2020 3:58:17 AM PDT, Uros Bizjak <[email protected]> wrote:
>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 <[email protected]>
>CC: "H. Peter Anvin" <[email protected]>
>CC: Ingo Molnar <[email protected]>
>CC: Thomas Gleixner <[email protected]>
>---
> arch/x86/include/asm/archrandom.h | 26 ++++++++------------------
> 1 file changed, 8 insertions(+), 18 deletions(-)
>
>diff --git a/arch/x86/include/asm/archrandom.h
>b/arch/x86/include/asm/archrandom.h
>index 7a4bb1bd4bdb..ebc248e49549 100644
>--- a/arch/x86/include/asm/archrandom.h
>+++ b/arch/x86/include/asm/archrandom.h
>@@ -15,16 +15,6 @@
>
> #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;
> }
>

Reviewed-by: H. Peter Anvin (Intel) <[email protected]>
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.

Subject: [tip: x86/cpu] x86/cpu: Use RDRAND and RDSEED mnemonics in archrandom.h

The following commit has been merged into the x86/cpu branch of tip:

Commit-ID: 3d81b3d1e55a518837c3d1f722c6d93abe34aa85
Gitweb: https://git.kernel.org/tip/3d81b3d1e55a518837c3d1f722c6d93abe34aa85
Author: Uros Bizjak <[email protected]>
AuthorDate: Fri, 08 May 2020 12:58:17 +02:00
Committer: Borislav Petkov <[email protected]>
CommitterDate: Mon, 18 May 2020 19:50:47 +02:00

x86/cpu: Use RDRAND and RDSEED mnemonics in archrandom.h

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 <[email protected]>
Signed-off-by: Borislav Petkov <[email protected]>
Reviewed-by: H. Peter Anvin (Intel) <[email protected]>
Acked-by: Peter Zijlstra (Intel) <[email protected]>
Link: https://lkml.kernel.org/r/[email protected]
---
arch/x86/include/asm/archrandom.h | 26 ++++++++------------------
1 file changed, 8 insertions(+), 18 deletions(-)

diff --git a/arch/x86/include/asm/archrandom.h b/arch/x86/include/asm/archrandom.h
index 7a4bb1b..ebc248e 100644
--- a/arch/x86/include/asm/archrandom.h
+++ b/arch/x86/include/asm/archrandom.h
@@ -15,16 +15,6 @@

#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;
}