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/TrEEPpVendorLi
>> > 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/PeiTcg2PhysicalPresenceLib
>> > /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