public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Qin Long <qin.long@intel.com>
To: edk2-devel@lists.01.org, liming.gao@intel.com
Subject: [Patch] MdePkg/BaseLib: Add one wrapper on RdRand access for parameter check.
Date: Fri,  4 Nov 2016 16:02:56 +0800	[thread overview]
Message-ID: <20161104080256.10728-1-qin.long@intel.com> (raw)

Add one wrapper implementation over assembly RdRand access to check
possible NULL parameter, for better alignment with comment description.

Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Qin Long <qin.long@intel.com>
---
 MdePkg/Library/BaseLib/BaseLib.inf        |  2 +
 MdePkg/Library/BaseLib/BaseLibInternals.h | 48 ++++++++++++++++++-
 MdePkg/Library/BaseLib/Ia32/RdRand.S      | 20 ++++----
 MdePkg/Library/BaseLib/Ia32/RdRand.asm    | 20 ++++----
 MdePkg/Library/BaseLib/Ia32/RdRand.nasm   | 20 ++++----
 MdePkg/Library/BaseLib/X64/RdRand.S       | 20 ++++----
 MdePkg/Library/BaseLib/X64/RdRand.asm     | 20 ++++----
 MdePkg/Library/BaseLib/X64/RdRand.nasm    | 20 ++++----
 MdePkg/Library/BaseLib/X86RdRand.c        | 79 +++++++++++++++++++++++++++++++
 9 files changed, 188 insertions(+), 61 deletions(-)
 create mode 100644 MdePkg/Library/BaseLib/X86RdRand.c

diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf
index 1ffe870..320ac45 100644
--- a/MdePkg/Library/BaseLib/BaseLib.inf
+++ b/MdePkg/Library/BaseLib/BaseLib.inf
@@ -428,6 +428,7 @@
   X86EnablePaging32.c
   X86DisablePaging64.c
   X86DisablePaging32.c
+  X86RdRand.c
 
 [Sources.X64]
   X64/Thunk16.nasm
@@ -752,6 +753,7 @@
   X86EnablePaging32.c
   X86DisablePaging64.c
   X86DisablePaging32.c
+  X86RdRand.c
   X64/GccInline.c | GCC
   X64/Thunk16.S | XCODE 
   X64/SwitchStack.nasm| GCC
diff --git a/MdePkg/Library/BaseLib/BaseLibInternals.h b/MdePkg/Library/BaseLib/BaseLibInternals.h
index fe416a0..a8f712b 100644
--- a/MdePkg/Library/BaseLib/BaseLibInternals.h
+++ b/MdePkg/Library/BaseLib/BaseLibInternals.h
@@ -1,7 +1,7 @@
 /** @file
   Declaration of internal functions in BaseLib.
 
-  Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD License
   which accompanies this distribution.  The full text of the license may be found at
@@ -728,6 +728,52 @@ InternalX86DisablePaging64 (
   IN      UINT32                    NewStack
   );
 
+/**
+  Generates a 16-bit random number through RDRAND instruction.
+
+  @param[out]  Rand     Buffer pointer to store the random result.
+
+  @retval TRUE          RDRAND call was successful.
+  @retval FALSE         Failed attempts to call RDRAND.
+
+ **/
+BOOLEAN
+EFIAPI
+InternalX86RdRand16 (
+  OUT     UINT16                    *Rand
+  );
+
+/**
+  Generates a 32-bit random number through RDRAND instruction.
+
+  @param[out]  Rand     Buffer pointer to store the random result.
+
+  @retval TRUE          RDRAND call was successful.
+  @retval FALSE         Failed attempts to call RDRAND.
+
+**/
+BOOLEAN
+EFIAPI
+InternalX86RdRand32 (
+  OUT     UINT32                    *Rand
+  );
+
+/**
+  Generates a 64-bit random number through RDRAND instruction.
+
+
+  @param[out]  Rand     Buffer pointer to store the random result.
+
+  @retval TRUE          RDRAND call was successful.
+  @retval FALSE         Failed attempts to call RDRAND.
+
+**/
+BOOLEAN
+EFIAPI
+InternalX86RdRand64  (
+  OUT     UINT64                    *Rand
+  );
+
 
 #elif defined (MDE_CPU_IPF)
 //
diff --git a/MdePkg/Library/BaseLib/Ia32/RdRand.S b/MdePkg/Library/BaseLib/Ia32/RdRand.S
index 503f65a..d00075a 100644
--- a/MdePkg/Library/BaseLib/Ia32/RdRand.S
+++ b/MdePkg/Library/BaseLib/Ia32/RdRand.S
@@ -1,5 +1,5 @@
 #------------------------------------------------------------------------------ ;
-# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
 # This program and the accompanying materials
 # are licensed and made available under the terms and conditions of the BSD License
 # which accompanies this distribution.  The full text of the license may be found at
@@ -24,10 +24,10 @@
 //  Generates a 16 bit random number through RDRAND instruction.
 //  Return TRUE if Rand generated successfully, or FALSE if not.
 //
-//  BOOLEAN EFIAPI AsmRdRand16 (UINT16 *Rand);
+//  BOOLEAN EFIAPI InternalX86RdRand16 (UINT16 *Rand);
 //------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX(AsmRdRand16)
-ASM_PFX(AsmRdRand16):
+ASM_GLOBAL ASM_PFX(InternalX86RdRand16)
+ASM_PFX(InternalX86RdRand16):
     .byte  0x0f, 0xc7, 0xf0        // rdrand r16: "0f c7 /6  ModRM:r/m(w)"
     jc     rn16_ok                 // jmp if CF=1
     xor    %eax, %eax              // reg=0 if CF=0
@@ -42,10 +42,10 @@ rn16_ok:
 //  Generates a 32 bit random number through RDRAND instruction.
 //  Return TRUE if Rand generated successfully, or FALSE if not.
 //
-//  BOOLEAN EFIAPI AsmRdRand32 (UINT32 *Rand);
+//  BOOLEAN EFIAPI InternalX86RdRand32 (UINT32 *Rand);
 //------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX(AsmRdRand32)
-ASM_PFX(AsmRdRand32):
+ASM_GLOBAL ASM_PFX(InternalX86RdRand32)
+ASM_PFX(InternalX86RdRand32):
     .byte  0x0f, 0xc7, 0xf0        // rdrand r32: "0f c7 /6  ModRM:r/m(w)"
     jc     rn32_ok                 // jmp if CF=1
     xor    %eax, %eax              // reg=0 if CF=0
@@ -60,10 +60,10 @@ rn32_ok:
 //  Generates a 64 bit random number through RDRAND instruction.
 //  Return TRUE if Rand generated successfully, or FALSE if not.
 //
-//  BOOLEAN EFIAPI AsmRdRand64 (UINT64 *Rand);
+//  BOOLEAN EFIAPI InternalX86RdRand64 (UINT64 *Rand);
 //------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX(AsmRdRand64)
-ASM_PFX(AsmRdRand64):
+ASM_GLOBAL ASM_PFX(InternalX86RdRand64)
+ASM_PFX(InternalX86RdRand64):
     .byte  0x0f, 0xc7, 0xf0        // rdrand r32: "0f c7 /6  ModRM:r/m(w)"
     jnc    rn64_ret                // jmp if CF=0
     mov    0x4(%esp), %edx
diff --git a/MdePkg/Library/BaseLib/Ia32/RdRand.asm b/MdePkg/Library/BaseLib/Ia32/RdRand.asm
index 21349b0..cb4e811 100644
--- a/MdePkg/Library/BaseLib/Ia32/RdRand.asm
+++ b/MdePkg/Library/BaseLib/Ia32/RdRand.asm
@@ -1,6 +1,6 @@
 ;------------------------------------------------------------------------------
 ;
-; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+; Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
 ; This program and the accompanying materials
 ; are licensed and made available under the terms and conditions of the BSD License
 ; which accompanies this distribution.  The full text of the license may be found at
@@ -30,9 +30,9 @@
 ;  Generates a 16 bit random number through RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand16 (UINT16 *Rand);
+;  BOOLEAN EFIAPI InternalX86RdRand16 (UINT16 *Rand);
 ;------------------------------------------------------------------------------
-AsmRdRand16  PROC
+InternalX86RdRand16  PROC
     ; rdrand   ax                  ; generate a 16 bit RN into ax
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     0fh, 0c7h, 0f0h         ; rdrand r16: "0f c7 /6  ModRM:r/m(w)"
@@ -44,15 +44,15 @@ rn16_ok:
     mov    [edx], ax
     mov    eax,  1
     ret
-AsmRdRand16 ENDP
+InternalX86RdRand16 ENDP
 
 ;------------------------------------------------------------------------------
 ;  Generates a 32 bit random number through RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand32 (UINT32 *Rand);
+;  BOOLEAN EFIAPI InternalX86RdRand32 (UINT32 *Rand);
 ;------------------------------------------------------------------------------
-AsmRdRand32  PROC
+InternalX86RdRand32  PROC
     ; rdrand   eax                 ; generate a 32 bit RN into eax
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     0fh, 0c7h, 0f0h         ; rdrand r32: "0f c7 /6  ModRM:r/m(w)"
@@ -64,15 +64,15 @@ rn32_ok:
     mov    [edx], eax
     mov    eax,  1
     ret
-AsmRdRand32 ENDP
+InternalX86RdRand32 ENDP
 
 ;------------------------------------------------------------------------------
 ;  Generates a 64 bit random number through RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand64 (UINT64 *Rand);
+;  BOOLEAN EFIAPI InternalX86RdRand64 (UINT64 *Rand);
 ;------------------------------------------------------------------------------
-AsmRdRand64  PROC
+InternalX86RdRand64  PROC
     ; rdrand   eax                 ; generate a 32 bit RN into eax
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     0fh, 0c7h, 0f0h         ; rdrand r32: "0f c7 /6  ModRM:r/m(w)"
@@ -89,6 +89,6 @@ AsmRdRand64  PROC
 rn64_ret:
     xor    eax, eax
     ret                            ; return with failure status
-AsmRdRand64 ENDP
+InternalX86RdRand64 ENDP
 
     END
diff --git a/MdePkg/Library/BaseLib/Ia32/RdRand.nasm b/MdePkg/Library/BaseLib/Ia32/RdRand.nasm
index 1365dfc..64e8cdb 100644
--- a/MdePkg/Library/BaseLib/Ia32/RdRand.nasm
+++ b/MdePkg/Library/BaseLib/Ia32/RdRand.nasm
@@ -1,6 +1,6 @@
 ;------------------------------------------------------------------------------
 ;
-; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+; Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
 ; This program and the accompanying materials
 ; are licensed and made available under the terms and conditions of the BSD License
 ; which accompanies this distribution.  The full text of the license may be found at
@@ -27,10 +27,10 @@ SECTION .text
 ;  Generates a 16 bit random number through RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand16 (UINT16 *Rand);
+;  BOOLEAN EFIAPI InternalX86RdRand16 (UINT16 *Rand);
 ;------------------------------------------------------------------------------
-global ASM_PFX(AsmRdRand16)
-ASM_PFX(AsmRdRand16):
+global ASM_PFX(InternalX86RdRand16)
+ASM_PFX(InternalX86RdRand16):
     ; rdrand   ax                  ; generate a 16 bit RN into ax
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     0xf, 0xc7, 0xf0         ; rdrand r16: "0f c7 /6  ModRM:r/m(w)"
@@ -47,10 +47,10 @@ rn16_ok:
 ;  Generates a 32 bit random number through RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand32 (UINT32 *Rand);
+;  BOOLEAN EFIAPI InternalX86RdRand32 (UINT32 *Rand);
 ;------------------------------------------------------------------------------
-global ASM_PFX(AsmRdRand32)
-ASM_PFX(AsmRdRand32):
+global ASM_PFX(InternalX86RdRand32)
+ASM_PFX(InternalX86RdRand32):
     ; rdrand   eax                 ; generate a 32 bit RN into eax
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     0xf, 0xc7, 0xf0         ; rdrand r32: "0f c7 /6  ModRM:r/m(w)"
@@ -67,10 +67,10 @@ rn32_ok:
 ;  Generates a 64 bit random number through RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand64 (UINT64 *Rand);
+;  BOOLEAN EFIAPI InternalX86RdRand64 (UINT64 *Rand);
 ;------------------------------------------------------------------------------
-global ASM_PFX(AsmRdRand64)
-ASM_PFX(AsmRdRand64):
+global ASM_PFX(InternalX86RdRand64)
+ASM_PFX(InternalX86RdRand64):
     ; rdrand   eax                 ; generate a 32 bit RN into eax
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     0xf, 0xc7, 0xf0         ; rdrand r32: "0f c7 /6  ModRM:r/m(w)"
diff --git a/MdePkg/Library/BaseLib/X64/RdRand.S b/MdePkg/Library/BaseLib/X64/RdRand.S
index 49b50e6..55724c0 100644
--- a/MdePkg/Library/BaseLib/X64/RdRand.S
+++ b/MdePkg/Library/BaseLib/X64/RdRand.S
@@ -1,5 +1,5 @@
 #------------------------------------------------------------------------------ ;
-# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
 # This program and the accompanying materials
 # are licensed and made available under the terms and conditions of the BSD License
 # which accompanies this distribution.  The full text of the license may be found at
@@ -24,10 +24,10 @@
 //  Generates a 16 bit random number through RDRAND instruction.
 //  Return TRUE if Rand generated successfully, or FALSE if not.
 //
-//  BOOLEAN EFIAPI AsmRdRand16 (UINT16 *Rand);
+//  BOOLEAN EFIAPI InternalX86RdRand16 (UINT16 *Rand);
 //------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX(AsmRdRand16)
-ASM_PFX(AsmRdRand16):
+ASM_GLOBAL ASM_PFX(InternalX86RdRand16)
+ASM_PFX(InternalX86RdRand16):
     .byte  0x0f, 0xc7, 0xf0        // rdrand r16: "0f c7 /6  ModRM:r/m(w)"
     jc     rn16_ok                 // jmp if CF=1
     xor    %rax, %rax              // reg=0 if CF=0
@@ -41,10 +41,10 @@ rn16_ok:
 //  Generates a 32 bit random number through RDRAND instruction.
 //  Return TRUE if Rand generated successfully, or FALSE if not.
 //
-//  BOOLEAN EFIAPI AsmRdRand32 (UINT32 *Rand);
+//  BOOLEAN EFIAPI InternalX86RdRand32 (UINT32 *Rand);
 //------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX(AsmRdRand32)
-ASM_PFX(AsmRdRand32):
+ASM_GLOBAL ASM_PFX(InternalX86RdRand32)
+ASM_PFX(InternalX86RdRand32):
     .byte  0x0f, 0xc7, 0xf0        // rdrand r32: "0f c7 /6  ModRM:r/m(w)"
     jc     rn32_ok                 // jmp if CF=1
     xor    %rax, %rax              // reg=0 if CF=0
@@ -58,10 +58,10 @@ rn32_ok:
 //  Generates a 64 bit random number through RDRAND instruction.
 //  Return TRUE if Rand generated successfully, or FALSE if not.
 //
-//  BOOLEAN EFIAPI AsmRdRand64 (UINT64 *Rand);
+//  BOOLEAN EFIAPI InternalX86RdRand64 (UINT64 *Rand);
 //------------------------------------------------------------------------------
-ASM_GLOBAL ASM_PFX(AsmRdRand64)
-ASM_PFX(AsmRdRand64):
+ASM_GLOBAL ASM_PFX(InternalX86RdRand64)
+ASM_PFX(InternalX86RdRand64):
     .byte  0x48, 0x0f, 0xc7, 0xf0  // rdrand r64: "REX.W + 0f c7 /6 ModRM:r/m(w)"
     jc     rn64_ok                 // jmp if CF=1
     xor    %rax, %rax              // reg=0 if CF=0
diff --git a/MdePkg/Library/BaseLib/X64/RdRand.asm b/MdePkg/Library/BaseLib/X64/RdRand.asm
index 370cdb6..8e2074e 100644
--- a/MdePkg/Library/BaseLib/X64/RdRand.asm
+++ b/MdePkg/Library/BaseLib/X64/RdRand.asm
@@ -1,6 +1,6 @@
 ;------------------------------------------------------------------------------
 ;
-; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+; Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
 ; This program and the accompanying materials
 ; are licensed and made available under the terms and conditions of the BSD License
 ; which accompanies this distribution.  The full text of the license may be found at
@@ -27,9 +27,9 @@
 ;  Generates a 16 bit random number through RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand16 (UINT16 *Rand);
+;  BOOLEAN EFIAPI InternalX86RdRand16 (UINT16 *Rand);
 ;------------------------------------------------------------------------------
-AsmRdRand16  PROC
+InternalX86RdRand16  PROC
     ; rdrand   ax                  ; generate a 16 bit RN into eax,
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     0fh, 0c7h, 0f0h         ; rdrand r16: "0f c7 /6  ModRM:r/m(w)"
@@ -40,15 +40,15 @@ rn16_ok:
     mov    [rcx], ax
     mov    rax,  1
     ret
-AsmRdRand16 ENDP
+InternalX86RdRand16 ENDP
 
 ;------------------------------------------------------------------------------
 ;  Generates a 32 bit random number through RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand32 (UINT32 *Rand);
+;  BOOLEAN EFIAPI InternalX86RdRand32 (UINT32 *Rand);
 ;------------------------------------------------------------------------------
-AsmRdRand32  PROC
+InternalX86RdRand32  PROC
     ; rdrand   eax                 ; generate a 32 bit RN into eax,
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     0fh, 0c7h, 0f0h         ; rdrand r32: "0f c7 /6  ModRM:r/m(w)"
@@ -59,15 +59,15 @@ rn32_ok:
     mov    [rcx], eax
     mov    rax,  1
     ret
-AsmRdRand32 ENDP
+InternalX86RdRand32 ENDP
 
 ;------------------------------------------------------------------------------
 ;  Generates a 64 bit random number through one RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand64 (UINT64 *Random);
+;  BOOLEAN EFIAPI InternalX86RdRand64 (UINT64 *Random);
 ;------------------------------------------------------------------------------
-AsmRdRand64  PROC
+InternalX86RdRand64  PROC
     ; rdrand   rax                 ; generate a 64 bit RN into rax,
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     048h, 0fh, 0c7h, 0f0h   ; rdrand r64: "REX.W + 0f c7 /6 ModRM:r/m(w)"
@@ -78,6 +78,6 @@ rn64_ok:
     mov    [rcx], rax
     mov    rax, 1
     ret
-AsmRdRand64 ENDP
+InternalX86RdRand64 ENDP
 
     END
diff --git a/MdePkg/Library/BaseLib/X64/RdRand.nasm b/MdePkg/Library/BaseLib/X64/RdRand.nasm
index f6d83a3..b9050d2 100644
--- a/MdePkg/Library/BaseLib/X64/RdRand.nasm
+++ b/MdePkg/Library/BaseLib/X64/RdRand.nasm
@@ -1,6 +1,6 @@
 ;------------------------------------------------------------------------------
 ;
-; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+; Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
 ; This program and the accompanying materials
 ; are licensed and made available under the terms and conditions of the BSD License
 ; which accompanies this distribution.  The full text of the license may be found at
@@ -28,10 +28,10 @@
 ;  Generates a 16 bit random number through RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand16 (UINT16 *Rand);
+;  BOOLEAN EFIAPI InternalX86RdRand16 (UINT16 *Rand);
 ;------------------------------------------------------------------------------
-global ASM_PFX(AsmRdRand16)
-ASM_PFX(AsmRdRand16):
+global ASM_PFX(InternalX86RdRand16)
+ASM_PFX(InternalX86RdRand16):
     ; rdrand   ax                  ; generate a 16 bit RN into eax,
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     0xf, 0xc7, 0xf0         ; rdrand r16: "0f c7 /6  ModRM:r/m(w)"
@@ -47,10 +47,10 @@ rn16_ok:
 ;  Generates a 32 bit random number through RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand32 (UINT32 *Rand);
+;  BOOLEAN EFIAPI InternalX86RdRand32 (UINT32 *Rand);
 ;------------------------------------------------------------------------------
-global ASM_PFX(AsmRdRand32)
-ASM_PFX(AsmRdRand32):
+global ASM_PFX(InternalX86RdRand32)
+ASM_PFX(InternalX86RdRand32):
     ; rdrand   eax                 ; generate a 32 bit RN into eax,
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     0xf, 0xc7, 0xf0         ; rdrand r32: "0f c7 /6  ModRM:r/m(w)"
@@ -66,10 +66,10 @@ rn32_ok:
 ;  Generates a 64 bit random number through one RDRAND instruction.
 ;  Return TRUE if Rand generated successfully, or FALSE if not.
 ;
-;  BOOLEAN EFIAPI AsmRdRand64 (UINT64 *Random);
+;  BOOLEAN EFIAPI InternalX86RdRand64 (UINT64 *Random);
 ;------------------------------------------------------------------------------
-global ASM_PFX(AsmRdRand64)
-ASM_PFX(AsmRdRand64):
+global ASM_PFX(InternalX86RdRand64)
+ASM_PFX(InternalX86RdRand64):
     ; rdrand   rax                 ; generate a 64 bit RN into rax,
                                    ; CF=1 if RN generated ok, otherwise CF=0
     db     0x48, 0xf, 0xc7, 0xf0   ; rdrand r64: "REX.W + 0f c7 /6 ModRM:r/m(w)"
diff --git a/MdePkg/Library/BaseLib/X86RdRand.c b/MdePkg/Library/BaseLib/X86RdRand.c
new file mode 100644
index 0000000..36d5457
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X86RdRand.c
@@ -0,0 +1,79 @@
+/** @file
+  IA-32/x64 AsmRdRandxx()
+  Generates random number through CPU RdRand instruction.
+
+  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php.
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "BaseLibInternals.h"
+
+/**
+  Generates a 16-bit random number through RDRAND instruction.
+
+  if Rand is NULL, then ASSERT().
+
+  @param[out]  Rand     Buffer pointer to store the random result.
+
+  @retval TRUE          RDRAND call was successful.
+  @retval FALSE         Failed attempts to call RDRAND.
+
+ **/
+BOOLEAN
+EFIAPI
+AsmRdRand16 (
+  OUT     UINT16                    *Rand
+  )
+{
+  ASSERT (Rand != NULL);
+  return InternalX86RdRand16 (Rand);
+}
+
+/**
+  Generates a 32-bit random number through RDRAND instruction.
+
+  if Rand is NULL, then ASSERT().
+
+  @param[out]  Rand     Buffer pointer to store the random result.
+
+  @retval TRUE          RDRAND call was successful.
+  @retval FALSE         Failed attempts to call RDRAND.
+
+**/
+BOOLEAN
+EFIAPI
+AsmRdRand32 (
+  OUT     UINT32                    *Rand
+  )
+{
+  ASSERT (Rand != NULL);
+  return InternalX86RdRand32 (Rand);
+}
+
+/**
+  Generates a 64-bit random number through RDRAND instruction.
+
+  if Rand is NULL, then ASSERT().
+
+  @param[out]  Rand     Buffer pointer to store the random result.
+
+  @retval TRUE          RDRAND call was successful.
+  @retval FALSE         Failed attempts to call RDRAND.
+
+**/
+BOOLEAN
+EFIAPI
+AsmRdRand64  (
+  OUT     UINT64                    *Rand
+  )
+{
+  ASSERT (Rand != NULL);
+  return InternalX86RdRand64 (Rand);
+}
-- 
2.10.1.windows.1



             reply	other threads:[~2016-11-04  8:02 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-04  8:02 Qin Long [this message]
2016-11-15  5:17 ` [Patch] MdePkg/BaseLib: Add one wrapper on RdRand access for parameter check Gao, Liming

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161104080256.10728-1-qin.long@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox