This should make it possible to use RngDxe on non-Intel platforms.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jonathan Doman <jonathan.do...@hp.com>
---
 .../RngDxe/IA32/AsmRdRand.asm                      |  67 ------
 .../RandomNumberGenerator/RngDxe/IA32/GccRdRand.c  |  69 ------
 .../RandomNumberGenerator/RngDxe/IA32/RdRandWord.c | 104 --------
 SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.c  | 267 +--------------------
 SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.h  | 165 +------------
 .../RandomNumberGenerator/RngDxe/RngDxe.inf        |  17 +-
 .../RandomNumberGenerator/RngDxe/X64/AsmRdRand.asm |  83 -------
 .../RandomNumberGenerator/RngDxe/X64/GccRdRand.c   |  95 --------
 .../RandomNumberGenerator/RngDxe/X64/RdRandWord.c  |  70 ------
 9 files changed, 12 insertions(+), 925 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/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..69e68ce 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.c
@@ -1,6 +1,8 @@
 /** @file
   Support routines for RDRAND instruction access.
 
+  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
+
 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
@@ -11,274 +13,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/RandLib.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.
-
-  @param[in]   Length        Size of the buffer, in bytes,  to fill with.
-  @param[out]  RandBuffer    Pointer to the buffer to store the random result.
-
-  @retval EFI_SUCCESS        Random bytes generation succeeded.
-  @retval EFI_NOT_READY      Failed to request random bytes.
-
-**/
-EFI_STATUS
-EFIAPI
-RdRandGetBytes (
-  IN UINTN         Length,
-  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;
-
-  //
-  // 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;
-    }
-    for (Index = 0; Index < Residual; Index++) {
-      ResidualStart[Index] = (UINT8)(TempRand & 0xff);
-      TempRand             = TempRand >> 8;
-    }
-  }
-
-  return EFI_SUCCESS;
-}
-
 /**
   Creates a 128bit random value that is fully forward and backward prediction 
resistant,
   suitable for seeding a NIST SP800-90 Compliant, FIPS 1402-2 certifiable SW 
DRBG.
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.h 
b/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.h
index 20fd9fb..0bb84c0 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.h
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RdRand.h
@@ -8,6 +8,8 @@
   -generator-drng-software-implementation-guide/ for more information about 
Intel
   Secure Key technology.
 
+  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
+
 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
@@ -26,6 +28,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
EXPRESS OR IMPLIED.
 #include <Library/BaseMemoryLib.h>
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/TimerLib.h>
+#include <Library/RandLib.h>
 #include <Protocol/Rng.h>
 
 //
@@ -34,166 +37,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
EXPRESS OR IMPLIED.
 #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.
-
-  @param[in]   Length        Size of the buffer, in bytes,  to fill with.
-  @param[out]  RandBuffer    Pointer to the buffer to store the random result.
-
-  @retval EFI_SUCCESS        Random bytes generation succeeded.
-  @retval EFI_NOT_READY      Failed to request random bytes.
-
-**/
-EFI_STATUS
-EFIAPI
-RdRandGetBytes (
-  IN UINTN         Length,
-  OUT UINT8        *RandBuffer
-  );
-
-/**
   Generate high-quality entropy source through RDRAND.
 
   @param[in]   Length        Size of the buffer, in bytes, to fill with.
@@ -210,4 +53,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.inf 
b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
index d57c2d8..23cd715 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
@@ -8,6 +8,8 @@
 #  -generator-drng-software-implementation-guide/ for more information about 
Intel
 #  Secure Key technology.
 #
+#  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
+#
 #  Copyright (c) 2013 - 2014, 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
@@ -31,7 +33,7 @@
 #
 # The following information is for reference only and not required by the 
build tools.
 #
-#  VALID_ARCHITECTURES           = IA32 X64
+#  VALID_ARCHITECTURES           = IA32 X64 AARCH64
 #
 
 [Sources.common]
@@ -41,16 +43,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 +54,7 @@
   DebugLib     
   UefiDriverEntryPoint
   TimerLib
+  RandLib
 
 [Guids]
   gEfiRngAlgorithmSp80090Ctr256Guid   ## SOMETIMES_PRODUCES    ## GUID        
# Unique ID of the algorithm for RNG
@@ -77,4 +70,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
-- 
2.4.3


------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to