MdePkg BaseLib: Convert X64/RdRand.asm to NASM

The BaseTools/Scripts/ConvertMasmToNasm.py script was used to convert
X64/RdRand.asm to X64/RdRand.nasm

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf
index 51e3103..26f6b10 100644
--- a/MdePkg/Library/BaseLib/BaseLib.inf
+++ b/MdePkg/Library/BaseLib/BaseLib.inf
@@ -447,6 +447,7 @@
   X64/CpuBreakpoint.c | MSFT 

   X64/WriteMsr64.c | MSFT 

   X64/ReadMsr64.c | MSFT 

+  X64/RdRand.nasm| MSFT

   X64/RdRand.asm | MSFT

   X64/CpuPause.asm | MSFT

   X64/EnableDisableInterrupts.asm | MSFT

@@ -520,6 +521,7 @@
   X64/CpuBreakpoint.asm | INTEL 

   X64/WriteMsr64.asm | INTEL 

   X64/ReadMsr64.asm | INTEL 

+  X64/RdRand.nasm| INTEL

   X64/RdRand.asm | INTEL

   X64/CpuPause.asm | INTEL

   X64/EnableDisableInterrupts.asm | INTEL

@@ -626,6 +628,7 @@
   X64/EnableCache.S | GCC

   X64/DisableCache.nasm| GCC

   X64/DisableCache.S | GCC

+  X64/RdRand.nasm| GCC

   X64/RdRand.S | GCC

   ChkStkGcc.c  | GCC 

 

diff --git a/MdePkg/Library/BaseLib/X64/RdRand.nasm b/MdePkg/Library/BaseLib/X64/RdRand.nasm
new file mode 100644
index 0000000..f6d83a3
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/RdRand.nasm
@@ -0,0 +1,83 @@
+;------------------------------------------------------------------------------

+;

+; Copyright (c) 2015, 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.

+;

+; Module Name:

+;

+;   RdRand.nasm

+;

+; Abstract:

+;

+;   Generates random number through CPU RdRand instruction under 64-bit platform.

+;

+; Notes:

+;

+;------------------------------------------------------------------------------

+

+    DEFAULT REL

+    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);

+;------------------------------------------------------------------------------

+global ASM_PFX(AsmRdRand16)

+ASM_PFX(AsmRdRand16):

+    ; 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)"

+    jc     rn16_ok                 ; jmp if CF=1

+    xor    rax, rax                ; reg=0 if CF=0

+    ret                            ; return with failure status

+rn16_ok:

+    mov    [rcx], ax

+    mov    rax,  1

+    ret

+

+;------------------------------------------------------------------------------

+;  Generates a 32 bit random number through RDRAND instruction.

+;  Return TRUE if Rand generated successfully, or FALSE if not.

+;

+;  BOOLEAN EFIAPI AsmRdRand32 (UINT32 *Rand);

+;------------------------------------------------------------------------------

+global ASM_PFX(AsmRdRand32)

+ASM_PFX(AsmRdRand32):

+    ; 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)"

+    jc     rn32_ok                 ; jmp if CF=1

+    xor    rax, rax                ; reg=0 if CF=0

+    ret                            ; return with failure status

+rn32_ok:

+    mov    [rcx], eax

+    mov    rax,  1

+    ret

+

+;------------------------------------------------------------------------------

+;  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);

+;------------------------------------------------------------------------------

+global ASM_PFX(AsmRdRand64)

+ASM_PFX(AsmRdRand64):

+    ; 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)"

+    jc     rn64_ok                 ; jmp if CF=1

+    xor    rax, rax                ; reg=0 if CF=0

+    ret                            ; return with failure status

+rn64_ok:

+    mov    [rcx], rax

+    mov    rax, 1

+    ret

+