Mike,

This 10us delay should come from the published  code sample in "Intel(r) 
Digital Random Number Generator Software Implementation Guide".

The document can be found at 
"https://software.intel.com/sites/default/files/m/d/4/1/d/8/441_Intel_R__DRNG_Software_Implementation_Guide_final_Aug7.pdf";


Best Regards & Thanks,
LONG, Qin

> -----Original Message-----
> From: Kinney, Michael D
> Sent: Thursday, October 8, 2015 11:12 PM
> To: Long, Qin; Justen, Jordan L; Thomas Palmer; edk2-devel@lists.01.org;
> Kinney, Michael D
> Subject: RE: [edk2] [PATCH v3] Pkg-Module: Integrate new RngLib into
> RngDxe
> 
> LONG, Qin,
> 
> Do you know if the 10uS delay required in RdRandGetSeed128()?
> 
> Thanks,
> 
> Mike
> 
> >-----Original Message-----
> >From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of
> >Long, Qin
> >Sent: Wednesday, October 07, 2015 8:44 PM
> >To: Justen, Jordan L; Thomas Palmer; edk2-devel@lists.01.org
> >Subject: Re: [edk2] [PATCH v3] Pkg-Module: Integrate new RngLib into
> >RngDxe
> >
> >Thomas,
> >
> >Thanks for doing this.
> >I think it's better to separate your patch into two parts (one for
> >MdePkg, and the other for SecurityPkg). Then you can CC me as Jordan's
> suggestion.
> >
> >
> >Best Regards & Thanks,
> >LONG, Qin
> >
> >> -----Original Message-----
> >> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf
> >> Of Jordan Justen
> >> Sent: Thursday, October 08, 2015 11:36 AM
> >> To: Thomas Palmer; edk2-devel@lists.01.org
> >> Subject: Re: [edk2] [PATCH v3] Pkg-Module: Integrate new RngLib into
> >> RngDxe
> >>
> >> In the subject line, 'Pkg-Module' should be something like 'MdePkg:'
> >> or 'SecurityPkg/RandomNumberGenerator:'.
> >>
> >> On 2015-10-07 18:55:42, Thomas Palmer wrote:
> >> > Use the new RngLib to provide the IA32/X64 random data for RngDxe.
> >> > Remove x86 specific functions from RdRand files.
> >> > Clean up files in RngDxe/IA32 and RngDxe/X64 that are subsumed by
> >> > files
> >> in BaseRngLib.
> >> > Simplify RngDxe by using WriteUnaligned64 for both IA32 and X64
> >> platforms.
> >> > Create and use GetRandomNumber128 in RngDxe to leverage 128 bit
> >> > support found in some HW RNG devices
> >>
> >> It sounds like you are doing about 5 things here. How about 5 patches?
> >>
> >> Each patch should only touch one package whenever possiable.
> >>
> >> Also, consider adding 'Cc:' near your Signed-off-by for the
> >> maintainers of a package. (see Maintainers.txt)
> >>
> >> -Jordan
> >>
> >> > Contributed-under: TianoCore Contribution Agreement 1.0
> >> > Signed-off-by: Thomas Palmer <thomas.pal...@hpe.com>
> >> > ---
> >> >  MdePkg/Include/Library/RngLib.h                    |   17 ++
> >> >  MdePkg/Library/BaseRngLib/BaseRng.c                |   32 +++
> >> >  .../RngDxe/IA32/AsmRdRand.asm                      |   67 -----
> >> >  .../RandomNumberGenerator/RngDxe/IA32/GccRdRand.c  |   69 ------
> >> >  .../RandomNumberGenerator/RngDxe/IA32/RdRandWord.c |  104 ------
> --
> >> > SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.c  |  256
> >> > ++------------------
> >> SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.h  |  151
> >> +-----------
> >> >  SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c  |    9 +-
> >> >  .../RandomNumberGenerator/RngDxe/RngDxe.inf        |   14 +-
> >> >  .../RandomNumberGenerator/RngDxe/X64/AsmRdRand.asm |   83 -----
> --
> >> >  .../RandomNumberGenerator/RngDxe/X64/GccRdRand.c   |   95 --------
> >> >  .../RandomNumberGenerator/RngDxe/X64/RdRandWord.c  |   70 ------
> >> >  SecurityPkg/SecurityPkg.dsc                        |    3 +
> >> >  13 files changed, 75 insertions(+), 895 deletions(-)  delete mode
> >> > 100644
> >> SecurityPkg/RandomNumberGenerator/RngDxe/IA32/AsmRdRand.asm
> >> >  delete mode 100644
> >> > SecurityPkg/RandomNumberGenerator/RngDxe/IA32/GccRdRand.c
> >> >  delete mode 100644
> >> > SecurityPkg/RandomNumberGenerator/RngDxe/IA32/RdRandWord.c
> >> >  delete mode 100644
> >> > SecurityPkg/RandomNumberGenerator/RngDxe/X64/AsmRdRand.asm
> >> >  delete mode 100644
> >> > SecurityPkg/RandomNumberGenerator/RngDxe/X64/GccRdRand.c
> >> >  delete mode 100644
> >> > SecurityPkg/RandomNumberGenerator/RngDxe/X64/RdRandWord.c
> >> >
> >> > diff --git a/MdePkg/Include/Library/RngLib.h
> >> > b/MdePkg/Include/Library/RngLib.h index 157a931..ece4394 100644
> >> > --- a/MdePkg/Include/Library/RngLib.h
> >> > +++ b/MdePkg/Include/Library/RngLib.h
> >> > @@ -66,4 +66,21 @@ GetRandomNumber64 (
> >> >    OUT     UINT64                    *Rand
> >> >    );
> >> >
> >> > +/**
> >> > +  Generates a 128-bit random number.
> >> > +
> >> > +  if Rand is NULL, then ASSERT().
> >> > +
> >> > +  @param[out] Rand     Buffer pointer to store the 128-bit random value.
> >> > +
> >> > +  @retval TRUE         Random number generated successfully.
> >> > +  @retval FALSE        Failed to generate the random number.
> >> > +
> >> > +**/
> >> > +BOOLEAN
> >> > +EFIAPI
> >> > +GetRandomNumber128 (
> >> > +  OUT     UINT64                    *Rand
> >> > +  );
> >> > +
> >> >  #endif  // __RNG_LIB_H__
> >> > diff --git a/MdePkg/Library/BaseRngLib/BaseRng.c
> >> > b/MdePkg/Library/BaseRngLib/BaseRng.c
> >> > index 279df30..2c8df56 100644
> >> > --- a/MdePkg/Library/BaseRngLib/BaseRng.c
> >> > +++ b/MdePkg/Library/BaseRngLib/BaseRng.c
> >> > @@ -155,3 +155,35 @@ GetRandomNumber64 (
> >> >
> >> >    return FALSE;
> >> >  }
> >> > +
> >> > +/**
> >> > +  Generates a 128-bit random number.
> >> > +
> >> > +  if Rand is NULL, then ASSERT().
> >> > +
> >> > +  @param[out] Rand     Buffer pointer to store the 128-bit random value.
> >> > +
> >> > +  @retval TRUE         Random number generated successfully.
> >> > +  @retval FALSE        Failed to generate the random number.
> >> > +
> >> > +**/
> >> > +BOOLEAN
> >> > +EFIAPI
> >> > +GetRandomNumber128 (
> >> > +  OUT     UINT64                    *Rand
> >> > +  )
> >> > +{
> >> > +  ASSERT (Rand != NULL);
> >> > +
> >> > +  //
> >> > +  // Read first 64 bits
> >> > +  //
> >> > +  if (!GetRandomNumber64 (Rand)) {
> >> > +    return FALSE;
> >> > +  }
> >> > +
> >> > +  //
> >> > +  // Read second 64 bits
> >> > +  //
> >> > +  return GetRandomNumber64 (++Rand); }
> >> > diff --git
> >> >
> a/SecurityPkg/RandomNumberGenerator/RngDxe/IA32/AsmRdRand.asm
> >> >
> b/SecurityPkg/RandomNumberGenerator/RngDxe/IA32/AsmRdRand.asm
> >> > deleted file mode 100644
> >> > index 37b3830..0000000
> >> > ---
> >> a/SecurityPkg/RandomNumberGenerator/RngDxe/IA32/AsmRdRand.asm
> >> > +++ /dev/null
> >> > @@ -1,67 +0,0 @@
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -;
> >> > -; Copyright (c) 2013, 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:
> >> > -;
> >> > -;   AsmRdRand.Asm
> >> > -;
> >> > -; Abstract:
> >> > -;
> >> > -;   Implementation for 16-, and 32- invocations of RDRAND instruction
> >> under 32bit platform.
> >> > -;
> >> > -; Notes:
> >> > -;
> >> > -;   Visual Studio coding practices do not use inline asm since multiple
> >> compilers and
> >> > -;   architectures are supported assembler not recognizing rdrand
> >> instruction so using DB's.
> >> > -;
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -
> >> > -    .586P
> >> > -    .model flat, C
> >> > -    .code
> >> > -
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -;  Generate a 16 bit random number -;  Return TRUE if Rand
> >> > generated successfully, or FALSE if not -;
> >> > -;  BOOLEAN EFIAPI RdRand16Step (UINT16 *Rand);   ECX
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -RdRand16Step  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)"
> >> > -    jb     rn16_ok                 ; jmp if CF=1
> >> > -    xor    eax, eax                ; reg=0 if CF=0
> >> > -    ret                            ; return with failure status
> >> > -rn16_ok:
> >> > -    mov    [ecx], ax
> >> > -    mov    eax, 1
> >> > -    ret
> >> > -RdRand16Step ENDP
> >> > -
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -;  Generate a 32 bit random number
> >> > -;    Return TRUE if Rand generated successfully, or FALSE if not
> >> > -;
> >> > -;  BOOLEAN EFIAPI RdRand32Step (UINT32 *Rand);   ECX
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -RdRand32Step  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)"
> >> > -    jb     rn32_ok                 ; jmp if CF=1
> >> > -    xor    eax, eax                ; reg=0 if CF=0
> >> > -    ret                            ; return with failure status
> >> > -rn32_ok:
> >> > -    mov    [ecx], eax
> >> > -    mov    eax,  1
> >> > -    ret
> >> > -RdRand32Step  ENDP
> >> > -
> >> > -    END
> >> > diff --git
> >> a/SecurityPkg/RandomNumberGenerator/RngDxe/IA32/GccRdRand.c
> >> > b/SecurityPkg/RandomNumberGenerator/RngDxe/IA32/GccRdRand.c
> >> > deleted file mode 100644
> >> > index f42302a..0000000
> >> > ---
> a/SecurityPkg/RandomNumberGenerator/RngDxe/IA32/GccRdRand.c
> >> > +++ /dev/null
> >> > @@ -1,69 +0,0 @@
> >> > -/** @file
> >> > -  RDRAND Support Routines for GCC environment.
> >> > -
> >> > -Copyright (c) 2013, 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.
> >> > -
> >> > -**/
> >> > -
> >> > -/**
> >> > -  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
> >> > -RdRand16Step (
> >> > -  OUT UINT16       *Rand
> >> > -  )
> >> > -{
> >> > -  UINT8  Carry;
> >> > -
> >> > -  //
> >> > -  // Uses byte code for RDRAND instruction,
> >> > -  // in case that GCC version has no direct support on RDRAND assembly.
> >> > -  //
> >> > -  __asm__ __volatile__ (
> >> > -    ".byte 0x66; .byte 0x0f; .byte 0xc7; .byte 0xf0; setc %1"
> >> > -    :"=a"  (*Rand),
> >> > -     "=qm" (Carry)
> >> > -    );
> >> > -
> >> > -  return (BOOLEAN) Carry;
> >> > -}
> >> > -
> >> > -/**
> >> > -  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
> >> > -RdRand32Step (
> >> > -  OUT UINT32       *Rand
> >> > -  )
> >> > -{
> >> > -  UINT8  Carry;
> >> > -
> >> > -  __asm__ __volatile__ (
> >> > -    ".byte 0x0f; .byte 0xc7; .byte 0xf0; setc %1"
> >> > -    :"=a"  (*Rand),
> >> > -     "=qm" (Carry)
> >> > -    );
> >> > -
> >> > -  return (BOOLEAN) Carry;
> >> > -}
> >> > \ No newline at end of file
> >> > diff --git
> >> > a/SecurityPkg/RandomNumberGenerator/RngDxe/IA32/RdRandWord.c
> >> > b/SecurityPkg/RandomNumberGenerator/RngDxe/IA32/RdRandWord.c
> >> > deleted file mode 100644
> >> > index 125c53b..0000000
> >> > ---
> a/SecurityPkg/RandomNumberGenerator/RngDxe/IA32/RdRandWord.c
> >> > +++ /dev/null
> >> > @@ -1,104 +0,0 @@
> >> > -/** @file
> >> > -  RDRAND Support Routines.
> >> > -
> >> > -Copyright (c) 2013, 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 "RdRand.h"
> >> > -
> >> > -/**
> >> > -  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
> >> > -RdRand64Step  (
> >> > -  OUT UINT64   *Rand
> >> > -  )
> >> > -{
> >> > -  UINT32  RandLow;
> >> > -  UINT32  RandHigh;
> >> > -
> >> > -  //
> >> > -  // Generating a 64-bit rand on a 32-bit system by
> >> > -  // mapping two 32-bit RDRAND instructions.
> >> > -  //
> >> > -  if (!RdRand32Step (&RandLow)) {
> >> > -    return FALSE;
> >> > -  }
> >> > -  if (!RdRand32Step (&RandHigh)) {
> >> > -    return FALSE;
> >> > -  }
> >> > -
> >> > -  *Rand = (UINT64) RandLow | LShiftU64 ((UINT64)RandHigh, 32);
> >> > -
> >> > -  return TRUE;
> >> > -}
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to request a word-length random number.
> >> > -
> >> > -  @param[out]  Rand          Buffer pointer to store the random number.
> >> > -  @param[in]   NeedRetry     Determine whether or not to loop retry.
> >> > -
> >> > -  @retval EFI_SUCCESS        Random word generation succeeded.
> >> > -  @retval EFI_NOT_READY      Failed to request random word.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRandWord (
> >> > -  OUT UINTN        *Rand,
> >> > -  IN BOOLEAN       NeedRetry
> >> > -  )
> >> > -{
> >> > -  return RdRand32 (Rand, NeedRetry); -}
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to request multiple word-length random numbers.
> >> > -
> >> > -  @param[in]   Length        Size of the buffer, in words, to fill with.
> >> > -  @param[out]  RandBuffer    Pointer to the buffer to store the random
> >> result.
> >> > -
> >> > -  @retval EFI_SUCCESS        Random words generation succeeded.
> >> > -  @retval EFI_NOT_READY      Failed to request random words.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRandGetWords (
> >> > -  IN UINTN         Length,
> >> > -  OUT UINTN        *RandBuffer
> >> > -  )
> >> > -{
> >> > -  EFI_STATUS  Status;
> >> > -  UINT32      Index;
> >> > -
> >> > -  for (Index = 0; Index < Length; Index++) {
> >> > -    //
> >> > -    // Obtain one word-length (32-bit) Random Number with possible
> >retry-
> >> loop.
> >> > -    //
> >> > -    Status = RdRand32 (RandBuffer, TRUE);
> >> > -    if (EFI_ERROR (Status)) {
> >> > -      return Status;
> >> > -    }
> >> > -
> >> > -    RandBuffer++;
> >> > -  }
> >> > -
> >> > -  return EFI_SUCCESS;
> >> > -}
> >> > diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.c
> >> > b/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.c
> >> > index 7e618dc..d76c86e 100644
> >> > --- a/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.c
> >> > +++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.c
> >> > @@ -2,6 +2,7 @@
> >> >    Support routines for RDRAND instruction access.
> >> >
> >> >  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
> >> > +(C) Copyright 2015 Hewlett Packard Enterprise Development LP<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 @@ -11,177 +12,11 @@ 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 <Library/RngLib.h>
> >> >
> >> >  #include "RdRand.h"
> >> >  #include "AesCore.h"
> >> >
> >> > -//
> >> > -// Bit mask used to determine if RdRand instruction is supported.
> >> > -//
> >> > -#define RDRAND_MASK    0x40000000
> >> > -
> >> > -/**
> >> > -  Determines whether or not RDRAND instruction is supported by the
> >host
> >> hardware.
> >> > -
> >> > -  @retval EFI_SUCCESS          RDRAND instruction supported.
> >> > -  @retval EFI_UNSUPPORTED      RDRAND instruction not supported.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -IsRdRandSupported (
> >> > -  VOID
> >> > -  )
> >> > -{
> >> > -  EFI_STATUS  Status;
> >> > -  UINT32      RegEax;
> >> > -  UINT32      RegEbx;
> >> > -  UINT32      RegEcx;
> >> > -  UINT32      RegEdx;
> >> > -  BOOLEAN     IsIntelCpu;
> >> > -
> >> > -  Status     = EFI_UNSUPPORTED;
> >> > -  IsIntelCpu = FALSE;
> >> > -
> >> > -  //
> >> > -  // Checks whether the current processor is an Intel product by CPUID.
> >> > -  //
> >> > -  AsmCpuid (0, &RegEax, &RegEbx, &RegEcx, &RegEdx);
> >> > -  if ((CompareMem ((CHAR8 *)(&RegEbx), "Genu", 4) == 0) &&
> >> > -      (CompareMem ((CHAR8 *)(&RegEdx), "ineI", 4) == 0) &&
> >> > -      (CompareMem ((CHAR8 *)(&RegEcx), "ntel", 4) == 0)) {
> >> > -    IsIntelCpu = TRUE;
> >> > -  }
> >> > -
> >> > -  if (IsIntelCpu) {
> >> > -    //
> >> > -    // Determine RDRAND support by examining bit 30 of the ECX
> register
> >> returned by CPUID.
> >> > -    // A value of 1 indicates that processor supports RDRAND 
> >> > instruction.
> >> > -    //
> >> > -    AsmCpuid (1, 0, 0, &RegEcx, 0);
> >> > -
> >> > -    if ((RegEcx & RDRAND_MASK) == RDRAND_MASK) {
> >> > -      Status = EFI_SUCCESS;
> >> > -    }
> >> > -  }
> >> > -
> >> > -  return Status;
> >> > -}
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to obtain a 16-bit random number.
> >> > -
> >> > -  @param[out]  Rand          Buffer pointer to store the random result.
> >> > -  @param[in]   NeedRetry     Determine whether or not to loop retry.
> >> > -
> >> > -  @retval EFI_SUCCESS        RDRAND call was successful.
> >> > -  @retval EFI_NOT_READY      Failed attempts to call RDRAND.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRand16 (
> >> > -  OUT UINT16       *Rand,
> >> > -  IN BOOLEAN       NeedRetry
> >> > -  )
> >> > -{
> >> > -  UINT32      Index;
> >> > -  UINT32      RetryCount;
> >> > -
> >> > -  if (NeedRetry) {
> >> > -    RetryCount = RETRY_LIMIT;
> >> > -  } else {
> >> > -    RetryCount = 1;
> >> > -  }
> >> > -
> >> > -  //
> >> > -  // Perform a single call to RDRAND, or enter a loop call until
> >> > RDRAND
> >> succeeds.
> >> > -  //
> >> > -  for (Index = 0; Index < RetryCount; Index++) {
> >> > -    if (RdRand16Step (Rand)) {
> >> > -      return EFI_SUCCESS;
> >> > -    }
> >> > -  }
> >> > -
> >> > -  return EFI_NOT_READY;
> >> > -}
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to obtain a 32-bit random number.
> >> > -
> >> > -  @param[out]  Rand          Buffer pointer to store the random result.
> >> > -  @param[in]   NeedRetry     Determine whether or not to loop retry.
> >> > -
> >> > -  @retval EFI_SUCCESS        RDRAND call was successful.
> >> > -  @retval EFI_NOT_READY      Failed attempts to call RDRAND.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRand32 (
> >> > -  OUT UINT32       *Rand,
> >> > -  IN BOOLEAN       NeedRetry
> >> > -  )
> >> > -{
> >> > -  UINT32      Index;
> >> > -  UINT32      RetryCount;
> >> > -
> >> > -  if (NeedRetry) {
> >> > -    RetryCount = RETRY_LIMIT;
> >> > -  } else {
> >> > -    RetryCount = 1;
> >> > -  }
> >> > -
> >> > -  //
> >> > -  // Perform a single call to RDRAND, or enter a loop call until
> >> > RDRAND
> >> succeeds.
> >> > -  //
> >> > -  for (Index = 0; Index < RetryCount; Index++) {
> >> > -    if (RdRand32Step (Rand)) {
> >> > -      return EFI_SUCCESS;
> >> > -    }
> >> > -  }
> >> > -
> >> > -  return EFI_NOT_READY;
> >> > -}
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to obtain a 64-bit random number.
> >> > -
> >> > -  @param[out]  Rand          Buffer pointer to store the random result.
> >> > -  @param[in]   NeedRetry     Determine whether or not to loop retry.
> >> > -
> >> > -  @retval EFI_SUCCESS        RDRAND call was successful.
> >> > -  @retval EFI_NOT_READY      Failed attempts to call RDRAND.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRand64 (
> >> > -  OUT UINT64       *Rand,
> >> > -  IN BOOLEAN       NeedRetry
> >> > -  )
> >> > -{
> >> > -  UINT32      Index;
> >> > -  UINT32      RetryCount;
> >> > -
> >> > -  if (NeedRetry) {
> >> > -    RetryCount = RETRY_LIMIT;
> >> > -  } else {
> >> > -    RetryCount = 1;
> >> > -  }
> >> > -
> >> > -  //
> >> > -  // Perform a single call to RDRAND, or enter a loop call until
> >> > RDRAND
> >> succeeds.
> >> > -  //
> >> > -  for (Index = 0; Index < RetryCount; Index++) {
> >> > -    if (RdRand64Step (Rand)) {
> >> > -      return EFI_SUCCESS;
> >> > -    }
> >> > -  }
> >> > -
> >> > -  return EFI_NOT_READY;
> >> > -}
> >> > -
> >> >  /**
> >> >    Calls RDRAND to fill a buffer of arbitrary size with random bytes.
> >> >
> >> > @@ -199,80 +34,23 @@ RdRandGetBytes (
> >> >    OUT UINT8        *RandBuffer
> >> >    )
> >> >  {
> >> > -  EFI_STATUS  Status;
> >> > -  UINT8       *Start;
> >> > -  UINT8       *ResidualStart;
> >> > -  UINTN       *BlockStart;
> >> > -  UINTN       TempRand;
> >> > -  UINTN       Count;
> >> > -  UINTN       Residual;
> >> > -  UINTN       StartLen;
> >> > -  UINTN       BlockNum;
> >> > -  UINTN       Index;
> >> > -
> >> > -  ResidualStart = NULL;
> >> > -  TempRand      = 0;
> >> > +  BOOLEAN     IsRandom;
> >> > +  UINT64      TempRand[2];
> >> >
> >> > -  //
> >> > -  // Compute the address of the first word aligned (32/64-bit)
> >> > block in the
> >> > -  // destination buffer, depending on whether we are in 32- or
> >> > 64-bit
> >mode.
> >> > -  //
> >> > -  Start = RandBuffer;
> >> > -  if (((UINT32)(UINTN)Start % (UINT32)sizeof(UINTN)) == 0) {
> >> > -    BlockStart = (UINTN *)Start;
> >> > -    Count      = Length;
> >> > -    StartLen   = 0;
> >> > -  } else {
> >> > -    BlockStart = (UINTN *)(((UINTN)Start & ~(UINTN)(sizeof(UINTN) - 1))
> +
> >> (UINTN)sizeof(UINTN));
> >> > -    Count      = Length - (sizeof (UINTN) - (UINT32)((UINTN)Start % 
> >> > sizeof
> >> (UINTN)));
> >> > -    StartLen   = (UINT32)((UINTN)BlockStart - (UINTN)Start);
> >> > -  }
> >> > -
> >> > -  //
> >> > -  // Compute the number of word blocks and the remaining number of
> >> bytes.
> >> > -  //
> >> > -  Residual = Count % sizeof (UINTN);
> >> > -  BlockNum = Count / sizeof (UINTN);
> >> > -  if (Residual != 0) {
> >> > -    ResidualStart = (UINT8 *) (BlockStart + BlockNum);
> >> > -  }
> >> > -
> >> > -  //
> >> > -  // Obtain a temporary random number for use in the residuals.
> >> > Failout if
> >> retry fails.
> >> > -  //
> >> > -  if (StartLen > 0) {
> >> > -    Status = RdRandWord ((UINTN *) &TempRand, TRUE);
> >> > -    if (EFI_ERROR (Status)) {
> >> > -      return Status;
> >> > -    }
> >> > -  }
> >> > -
> >> > -  //
> >> > -  // Populate the starting mis-aligned block.
> >> > -  //
> >> > -  for (Index = 0; Index < StartLen; Index++) {
> >> > -    Start[Index] = (UINT8)(TempRand & 0xff);
> >> > -    TempRand     = TempRand >> 8;
> >> > -  }
> >> > -
> >> > -  //
> >> > -  // Populate the central aligned block. Fail out if retry fails.
> >> > -  //
> >> > -  Status = RdRandGetWords (BlockNum, (UINTN *)(BlockStart));
> >> > -  if (EFI_ERROR (Status)) {
> >> > -    return Status;
> >> > -  }
> >> > -  //
> >> > -  // Populate the final mis-aligned block.
> >> > -  //
> >> > -  if (Residual > 0) {
> >> > -    Status = RdRandWord ((UINTN *)&TempRand, TRUE);
> >> > -    if (EFI_ERROR (Status)) {
> >> > -      return Status;
> >> > +  while (Length > 0) {
> >> > +    IsRandom = GetRandomNumber128 (TempRand);
> >> > +    if (!IsRandom) {
> >> > +      return EFI_NOT_READY;
> >> >      }
> >> > -    for (Index = 0; Index < Residual; Index++) {
> >> > -      ResidualStart[Index] = (UINT8)(TempRand & 0xff);
> >> > -      TempRand             = TempRand >> 8;
> >> > +    if (Length >= sizeof (TempRand)) {
> >> > +      WriteUnaligned64 ((UINT64*)RandBuffer, TempRand[0]);
> >> > +      RandBuffer += sizeof (UINT64);
> >> > +      WriteUnaligned64 ((UINT64*)RandBuffer, TempRand[1]);
> >> > +      RandBuffer += sizeof (TempRand[1]);
> >> > +      Length -= sizeof (TempRand);
> >> > +    } else {
> >> > +      CopyMem (RandBuffer, TempRand, Length);
> >> > +      Length = 0;
> >> >      }
> >> >    }
> >> >
> >> > diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.h
> >> > b/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.h
> >> > index 20fd9fb..d637877 100644
> >> > --- a/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.h
> >> > +++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.h
> >> > @@ -9,6 +9,7 @@
> >> >    Secure Key technology.
> >> >
> >> >  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
> >> > +(C) Copyright 2015 Hewlett Packard Enterprise Development LP<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,154 +29,6 @@ WITHOUT WARRANTIES OR
> >> REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> >> >  #include <Library/TimerLib.h>
> >> >  #include <Protocol/Rng.h>
> >> >
> >> > -//
> >> > -// The maximun number of retries to obtain one available random
> >number.
> >> > -//
> >> > -#define RETRY_LIMIT    10
> >> > -
> >> > -/**
> >> > -  Determines whether or not RDRAND instruction is supported by the
> >host
> >> hardware.
> >> > -
> >> > -  @retval EFI_SUCCESS          RDRAND instruction supported.
> >> > -  @retval EFI_UNSUPPORTED      RDRAND instruction not supported.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -IsRdRandSupported (
> >> > -  VOID
> >> > -  );
> >> > -
> >> > -/**
> >> > -  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
> >> > -RdRand16Step (
> >> > -  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
> >> > -RdRand32Step (
> >> > -  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
> >> > -RdRand64Step  (
> >> > -  OUT UINT64   *Rand
> >> > -  );
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to obtain a 16-bit random number.
> >> > -
> >> > -  @param[out]  Rand          Buffer pointer to store the random result.
> >> > -  @param[in]   NeedRetry     Determine whether or not to loop retry.
> >> > -
> >> > -  @retval EFI_SUCCESS        RDRAND call was successful.
> >> > -  @retval EFI_NOT_READY      Failed attempts to call RDRAND.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRand16 (
> >> > -  OUT UINT16       *Rand,
> >> > -  IN BOOLEAN       NeedRetry
> >> > -  );
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to obtain a 32-bit random number.
> >> > -
> >> > -  @param[out]  Rand          Buffer pointer to store the random result.
> >> > -  @param[in]   NeedRetry     Determine whether or not to loop retry.
> >> > -
> >> > -  @retval EFI_SUCCESS        RDRAND call was successful.
> >> > -  @retval EFI_NOT_READY      Failed attempts to call RDRAND.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRand32 (
> >> > -  OUT UINT32       *Rand,
> >> > -  IN BOOLEAN       NeedRetry
> >> > -  );
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to obtain a 64-bit random number.
> >> > -
> >> > -  @param[out]  Rand          Buffer pointer to store the random result.
> >> > -  @param[in]   NeedRetry     Determine whether or not to loop retry.
> >> > -
> >> > -  @retval EFI_SUCCESS        RDRAND call was successful.
> >> > -  @retval EFI_NOT_READY      Failed attempts to call RDRAND.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRand64 (
> >> > -  OUT UINT64       *Rand,
> >> > -  IN BOOLEAN       NeedRetry
> >> > -  );
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to request a word-length random number.
> >> > -
> >> > -  @param[out]  Rand          Buffer pointer to store the random number.
> >> > -  @param[in]   NeedRetry     Determine whether or not to loop retry.
> >> > -
> >> > -  @retval EFI_SUCCESS        Random word generation succeeded.
> >> > -  @retval EFI_NOT_READY      Failed to request random word.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRandWord (
> >> > -  OUT UINTN        *Rand,
> >> > -  IN BOOLEAN       NeedRetry
> >> > -  );
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to request multiple word-length random numbers.
> >> > -
> >> > -  @param[in]   Length        Size of the buffer, in words, to fill with.
> >> > -  @param[out]  RandBuffer    Pointer to the buffer to store the random
> >> result.
> >> > -
> >> > -  @retval EFI_SUCCESS        Random words generation succeeded.
> >> > -  @retval EFI_NOT_READY      Failed to request random words.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRandGetWords (
> >> > -  IN UINTN         Length,
> >> > -  OUT UINTN        *RandBuffer
> >> > -  );
> >> > -
> >> >  /**
> >> >    Calls RDRAND to fill a buffer of arbitrary size with random bytes.
> >> >
> >> > @@ -210,4 +63,4 @@ RdRandGenerateEntropy (
> >> >    OUT UINT8        *Entropy
> >> >    );
> >> >
> >> > -#endif  // __RD_RAND_H__
> >> > \ No newline at end of file
> >> > +#endif  // __RD_RAND_H__
> >> > diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
> >> > b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
> >> > index 98ef3b3..5c04673 100644
> >> > --- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
> >> > +++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
> >> > @@ -15,6 +15,7 @@
> >> >     - EFI_RNG_ALGORITHM_X9_31_AES_GUID         - Unsupported
> >> >
> >> >  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
> >> > +(C) Copyright 2015 Hewlett Packard Enterprise Development LP<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 @@ -197,14 +198,6 @@ RngDriverEntry (
> >> >    EFI_HANDLE    Handle;
> >> >
> >> >    //
> >> > -  // Verify RdRand support on Platform.
> >> > -  //
> >> > -  Status = IsRdRandSupported ();
> >> > -  if (EFI_ERROR (Status)) {
> >> > -    return Status;
> >> > -  }
> >> > -
> >> > -  //
> >> >    // Install UEFI RNG (Random Number Generator) Protocol
> >> >    //
> >> >    Handle = NULL;
> >> > diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
> >> > b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
> >> > index d57c2d8..4d668a1 100644
> >> > --- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
> >> > +++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
> >> > @@ -9,6 +9,7 @@
> >> >  #  Secure Key technology.
> >> >  #
> >> >  #  Copyright (c) 2013 - 2014, Intel Corporation. All rights
> >> > reserved.<BR>
> >> > +#  (C) Copyright 2015 Hewlett Packard Enterprise Development
> >> > +LP<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 @@ -41,16 +42,6 @@
> >> >    AesCore.c
> >> >    AesCore.h
> >> >
> >> > -[Sources.IA32]
> >> > -  IA32/RdRandWord.c
> >> > -  IA32/AsmRdRand.asm
> >> > -  IA32/GccRdRand.c          | GCC
> >> > -
> >> > -[Sources.X64]
> >> > -  X64/RdRandWord.c
> >> > -  X64/AsmRdRand.asm
> >> > -  X64/GccRdRand.c           | GCC
> >> > -
> >> >  [Packages]
> >> >    MdePkg/MdePkg.dec
> >> >    SecurityPkg/SecurityPkg.dec
> >> > @@ -62,6 +53,7 @@
> >> >    DebugLib
> >> >    UefiDriverEntryPoint
> >> >    TimerLib
> >> > +  RngLib
> >> >
> >> >  [Guids]
> >> >    gEfiRngAlgorithmSp80090Ctr256Guid   ## SOMETIMES_PRODUCES    ##
> >> GUID        # Unique ID of the algorithm for RNG
> >> > @@ -77,4 +69,4 @@
> >> >    XCODE:*_*_*_CC_FLAGS = -mmmx -msse
> >> >
> >> >  [UserExtensions.TianoCore."ExtraFiles"]
> >> > -  RngDxeExtra.uni
> >> > \ No newline at end of file
> >> > +  RngDxeExtra.uni
> >> > diff --git
> >> >
> a/SecurityPkg/RandomNumberGenerator/RngDxe/X64/AsmRdRand.asm
> >> >
> b/SecurityPkg/RandomNumberGenerator/RngDxe/X64/AsmRdRand.asm
> >> > deleted file mode 100644
> >> > index 8a4fe65..0000000
> >> > ---
> >> a/SecurityPkg/RandomNumberGenerator/RngDxe/X64/AsmRdRand.asm
> >> > +++ /dev/null
> >> > @@ -1,83 +0,0 @@
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -;
> >> > -; Copyright (c) 2013, 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:
> >> > -;
> >> > -;   AsmRdRand.Asm
> >> > -;
> >> > -; Abstract:
> >> > -;
> >> > -;   Implementation for 16-, 32-, and 64-bit invocations of RDRAND
> >> instruction under 64bit platform.
> >> > -;
> >> > -; Notes:
> >> > -;
> >> > -;   Visual Studio coding practices do not use inline asm since multiple
> >> compilers and
> >> > -;   architectures are supported assembler not recognizing rdrand
> >> instruction so using DB's.
> >> > -;
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -
> >> > -    .code
> >> > -
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -;  Generate a 16 bit random number -;  Return TRUE if Rand
> >> > generated successfully, or FALSE if not -;
> >> > -;  BOOLEAN EFIAPI RdRand16Step (UINT16 *Rand);   RCX
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -RdRand16Step  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)"
> >> > -    jb     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
> >> > -RdRand16Step ENDP
> >> > -
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -;  Generate a 32 bit random number
> >> > -;    Return TRUE if Rand generated successfully, or FALSE if not
> >> > -;
> >> > -;  BOOLEAN EFIAPI RdRand32Step (UINT32 *Rand);   RCX
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -RdRand32Step  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)"
> >> > -    jb     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
> >> > -RdRand32Step ENDP
> >> > -
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -;  Generate a 64 bit random number
> >> > -;    Return TRUE if RN generated successfully, or FALSE if not
> >> > -;
> >> > -;  BOOLEAN EFIAPI RdRand64Step (UINT64 *Random);   RCX
> >> > -;-----------------------------------------------------------------
> >> > ---
> >> > ----------
> >> > -RdRand64Step  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)"
> >> > -    jb     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
> >> > -RdRand64Step ENDP
> >> > -
> >> > -    END
> >> > diff --git
> >> a/SecurityPkg/RandomNumberGenerator/RngDxe/X64/GccRdRand.c
> >> > b/SecurityPkg/RandomNumberGenerator/RngDxe/X64/GccRdRand.c
> >> > deleted file mode 100644
> >> > index d28336d..0000000
> >> > --- a/SecurityPkg/RandomNumberGenerator/RngDxe/X64/GccRdRand.c
> >> > +++ /dev/null
> >> > @@ -1,95 +0,0 @@
> >> > -/** @file
> >> > -  RDRAND Support Routines for GCC environment.
> >> > -
> >> > -Copyright (c) 2013, 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.
> >> > -
> >> > -**/
> >> > -
> >> > -/**
> >> > -  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
> >> > -RdRand16Step (
> >> > -  OUT UINT16       *Rand
> >> > -  )
> >> > -{
> >> > -  UINT8  Carry;
> >> > -
> >> > -  //
> >> > -  // Uses byte code for RDRAND instruction,
> >> > -  // in case that GCC version has no direct support on RDRAND assembly.
> >> > -  //
> >> > -  __asm__ __volatile__ (
> >> > -    ".byte 0x66; .byte 0x0f; .byte 0xc7; .byte 0xf0; setc %1"
> >> > -    :"=a"  (*Rand),
> >> > -     "=qm" (Carry)
> >> > -    );
> >> > -
> >> > -  return (BOOLEAN) Carry;
> >> > -}
> >> > -
> >> > -/**
> >> > -  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
> >> > -RdRand32Step (
> >> > -  OUT UINT32       *Rand
> >> > -  )
> >> > -{
> >> > -  UINT8  Carry;
> >> > -
> >> > -  __asm__ __volatile__ (
> >> > -    ".byte 0x0f; .byte 0xc7; .byte 0xf0; setc %1"
> >> > -    :"=a"  (*Rand),
> >> > -     "=qm" (Carry)
> >> > -    );
> >> > -
> >> > -  return (BOOLEAN) Carry;
> >> > -}
> >> > -
> >> > -/**
> >> > -  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
> >> > -RdRand64Step  (
> >> > -  OUT UINT64   *Rand
> >> > -  )
> >> > -{
> >> > -  UINT8  Carry;
> >> > -
> >> > -  __asm__ __volatile__ (
> >> > -    ".byte 0x48; .byte 0x0f; .byte 0xc7; .byte 0xf0; setc %1"
> >> > -    :"=a"  (*Rand),
> >> > -     "=qm" (Carry)
> >> > -    );
> >> > -
> >> > -  return (BOOLEAN) Carry;
> >> > -}
> >> > diff --git
> >> a/SecurityPkg/RandomNumberGenerator/RngDxe/X64/RdRandWord.c
> >> > b/SecurityPkg/RandomNumberGenerator/RngDxe/X64/RdRandWord.c
> >> > deleted file mode 100644
> >> > index 946e5ba..0000000
> >> > ---
> a/SecurityPkg/RandomNumberGenerator/RngDxe/X64/RdRandWord.c
> >> > +++ /dev/null
> >> > @@ -1,70 +0,0 @@
> >> > -/** @file
> >> > -  RDRAND Support Routines.
> >> > -
> >> > -Copyright (c) 2013, 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 "RdRand.h"
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to request a word-length random number.
> >> > -
> >> > -  @param[out]  Rand          Buffer pointer to store the random number.
> >> > -  @param[in]   NeedRetry     Determine whether or not to loop retry.
> >> > -
> >> > -  @retval EFI_SUCCESS        Random word generation succeeded.
> >> > -  @retval EFI_NOT_READY      Failed to request random word.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRandWord (
> >> > -  OUT UINTN        *Rand,
> >> > -  IN BOOLEAN       NeedRetry
> >> > -  )
> >> > -{
> >> > -  return RdRand64 (Rand, NeedRetry); -}
> >> > -
> >> > -/**
> >> > -  Calls RDRAND to request multiple word-length random numbers.
> >> > -
> >> > -  @param[in]   Length        Size of the buffer, in words, to fill with.
> >> > -  @param[out]  RandBuffer    Pointer to the buffer to store the random
> >> result.
> >> > -
> >> > -  @retval EFI_SUCCESS        Random words generation succeeded.
> >> > -  @retval EFI_NOT_READY      Failed to request random words.
> >> > -
> >> > -**/
> >> > -EFI_STATUS
> >> > -EFIAPI
> >> > -RdRandGetWords (
> >> > -  IN UINTN         Length,
> >> > -  OUT UINTN        *RandBuffer
> >> > -  )
> >> > -{
> >> > -  EFI_STATUS  Status;
> >> > -  UINT32      Index;
> >> > -
> >> > -  for (Index = 0; Index < Length; Index++) {
> >> > -    //
> >> > -    // Obtain one word-length (64-bit) Random Number with possible
> >retry-
> >> loop.
> >> > -    //
> >> > -    Status = RdRand64 (RandBuffer, TRUE);
> >> > -    if (EFI_ERROR (Status)) {
> >> > -      return Status;
> >> > -    }
> >> > -
> >> > -    RandBuffer++;
> >> > -  }
> >> > -
> >> > -  return EFI_SUCCESS;
> >> > -}
> >> > \ No newline at end of file
> >> > diff --git a/SecurityPkg/SecurityPkg.dsc
> >> > b/SecurityPkg/SecurityPkg.dsc index 6e2ca5c..0908b26 100644
> >> > --- a/SecurityPkg/SecurityPkg.dsc
> >> > +++ b/SecurityPkg/SecurityPkg.dsc
> >> > @@ -2,6 +2,7 @@
> >> >  #  Security Module Package for All Architectures.
> >> >  #
> >> >  # Copyright (c) 2009 - 2015, Intel Corporation. All rights
> >> > reserved.<BR>
> >> > +# (C) Copyright 2015 Hewlett Packard Enterprise Development LP<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 @@ -61,6 +62,7 @@
> >> >
> >>
> TcgPpVendorLib|SecurityPkg/Library/TcgPpVendorLibNull/TcgPpVendorLibN
> >> ull.inf
> >> >
> >>
> Tcg2PpVendorLib|SecurityPkg/Library/Tcg2PpVendorLibNull/Tcg2PpVendorL
> >> ibNull.inf
> >> >
> >> >
> >>
> TrEEPpVendorLib|SecurityPkg/Library/TrEEPpVendorLibNull/TrEEPpVendorL
> >> TrEEPpVendorLib|i
> >> > bNull.inf
> >> > +  RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf
> >> >
> >> >  [LibraryClasses.common.PEIM]
> >> >    PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
> >> > @@ -74,6 +76,7 @@
> >> >
> >>
> Tpm12DeviceLib|SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12DeviceLib
> >> DTpm.inf
> >> >
> >>
> Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDT
> >> pm.inf
> >> >
> >> > Tcg2PhysicalPresenceLib|SecurityPkg/Library/PeiTcg2PhysicalPresence
> >> > Tcg2PhysicalPresenceLib|Lib
> >> > /PeiTcg2PhysicalPresenceLib.inf
> >> > +  RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf
> >> >
> >> >  [LibraryClasses.common.DXE_DRIVER]
> >> >    HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> >> > --
> >> > 1.7.9.5
> >> >
> >> > _______________________________________________
> >> > edk2-devel mailing list
> >> > edk2-devel@lists.01.org
> >> > https://lists.01.org/mailman/listinfo/edk2-devel
> >> _______________________________________________
> >> edk2-devel mailing list
> >> edk2-devel@lists.01.org
> >> https://lists.01.org/mailman/listinfo/edk2-devel
> >_______________________________________________
> >edk2-devel mailing list
> >edk2-devel@lists.01.org
> >https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to