/** @file Aarch64 specific code. Copyright (c) 2022, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include "RngDxeInternals.h" // Maximum number of Rng algorithms. #define RNG_AVAILABLE_ALGO_MAX 2 /** Allocate and initialize mAvailableAlgoArray with the available Rng algorithms. Also update mAvailableAlgoArrayCount. @retval EFI_SUCCESS The function completed successfully. @retval EFI_OUT_OF_RESOURCES Could not allocate memory. **/ EFI_STATUS EFIAPI GetAvailableAlgorithms ( VOID ) { UINT64 DummyRand; UINT16 MajorRevision; UINT16 MinorRevision; // Rng algorithms 2 times, one for the allocation, one to populate. mAvailableAlgoArray = AllocateZeroPool (RNG_AVAILABLE_ALGO_MAX); if (mAvailableAlgoArray == NULL) { return EFI_OUT_OF_RESOURCES; } // Check RngGetBytes() before advertising PcdCpuRngSupportedAlgorithm. if (!EFI_ERROR (RngGetBytes (sizeof (DummyRand), (UINT8 *)&DummyRand))) { CopyMem ( &mAvailableAlgoArray[mAvailableAlgoArrayCount], PcdGetPtr (PcdCpuRngSupportedAlgorithm), sizeof (EFI_RNG_ALGORITHM) ); mAvailableAlgoArrayCount++; DEBUG_CODE_BEGIN (); if (IsZeroGuid (PcdGetPtr (PcdCpuRngSupportedAlgorithm))) { DEBUG (( DEBUG_WARN, "PcdCpuRngSupportedAlgorithm should be a non-zero GUID\n" )); } DEBUG_CODE_END (); } // Raw algorithm (Trng) if (!EFI_ERROR (GetArmTrngVersion (&MajorRevision, &MinorRevision))) { CopyMem ( &mAvailableAlgoArray[mAvailableAlgoArrayCount], &gEfiRngAlgorithmRaw, sizeof (EFI_RNG_ALGORITHM) ); mAvailableAlgoArrayCount++; } return EFI_SUCCESS; }