summaryrefslogtreecommitdiffstats
path: root/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.h
diff options
context:
space:
mode:
Diffstat (limited to 'UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.h')
-rw-r--r--UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.h627
1 files changed, 627 insertions, 0 deletions
diff --git a/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.h b/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.h
new file mode 100644
index 0000000000..abbbd2faba
--- /dev/null
+++ b/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.h
@@ -0,0 +1,627 @@
+/** @file
+ Common header file for EfiMpServiceProtocolUnitTest DXE driver.
+
+ Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef EFI_MP_SERVICES_UNIT_TEST_COMMOM_H_
+#define EFI_MP_SERVICES_UNIT_TEST_COMMOM_H_
+
+#include <PiPei.h>
+#include <Ppi/MpServices2.h>
+#include <Protocol/MpService.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/ReportStatusCodeLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UnitTestLib.h>
+
+#define RUN_PROCEDURE_TIMEOUT_VALUE 100000 // microseconds
+
+typedef union {
+ EDKII_PEI_MP_SERVICES2_PPI *Ppi;
+ EFI_MP_SERVICES_PROTOCOL *Protocol;
+} MP_SERVICES;
+
+typedef struct {
+ MP_SERVICES MpServices;
+ UINTN BspNumber;
+ UINTN ApNumber;
+ UINTN NumberOfProcessors;
+ UINTN NumberOfEnabledProcessors;
+ UINTN *CommonBuffer;
+ EFI_STATUS ApProcedureReturnStatus;
+ UINTN *DisabledApNumber;
+} MP_SERVICE_UT_CONTEXT;
+
+/**
+ Get EFI_MP_SERVICES_PROTOCOL pointer.
+
+ @param[out] MpServices Pointer to the buffer where EFI_MP_SERVICES_PROTOCOL is stored
+
+ @retval EFI_SUCCESS EFI_MP_SERVICES_PROTOCOL interface is returned
+ @retval EFI_NOT_FOUND EFI_MP_SERVICES_PROTOCOL interface is not found
+**/
+EFI_STATUS
+MpServicesUnitTestGetMpServices (
+ OUT MP_SERVICES *MpServices
+ );
+
+/**
+ Retrieve the number of logical processor in the platform and the number of those logical processors that
+ are enabled on this boot.
+
+ @param[in] MpServices MP_SERVICES structure.
+ @param[out] NumberOfProcessors Pointer to the total number of logical processors in the system, including
+ the BSP and disabled APs.
+ @param[out] NumberOfEnabledProcessors Pointer to the number of processors in the system that are enabled.
+
+ @retval EFI_SUCCESS Retrieve the number of logical processor successfully
+ @retval Others Retrieve the number of logical processor unsuccessfully
+**/
+EFI_STATUS
+MpServicesUnitTestGetNumberOfProcessors (
+ IN MP_SERVICES MpServices,
+ OUT UINTN *NumberOfProcessors,
+ OUT UINTN *NumberOfEnabledProcessors
+ );
+
+/**
+ Get detailed information on the requested logical processor.
+
+ @param[in] MpServices MP_SERVICES structure.
+ @param[in] ProcessorNumber The handle number of the processor.
+ @param[out] ProcessorInfoBuffer Pointer to the buffer where the processor information is stored.
+
+ @retval EFI_SUCCESS Get information on the requested logical processor successfully
+ @retval Others Get information on the requested logical processor unsuccessfully
+**/
+EFI_STATUS
+MpServicesUnitTestGetProcessorInfo (
+ IN MP_SERVICES MpServices,
+ IN UINTN ProcessorNumber,
+ OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer
+ );
+
+/**
+ Execute a caller provided function on all enabled APs.
+
+ @param[in] MpServices MP_SERVICES structure.
+ @param[in] Procedure Pointer to the function to be run on enabled APs of the system.
+ @param[in] SingleThread If TRUE, then all the enabled APs execute the function specified by Procedure
+ one by one, in ascending order of processor handle number.
+ If FALSE, then all the enabled APs execute the function specified by Procedure
+ simultaneously.
+ @param[in] TimeoutInMicroSeconds Indicates the time limit in microseconds for APs to return from Procedure,
+ for blocking mode only. Zero means infinity.
+ @param[in] ProcedureArgument The parameter passed into Procedure for all APs.
+
+ @retval EFI_SUCCESS Execute a caller provided function on all enabled APs successfully
+ @retval Others Execute a caller provided function on all enabled APs unsuccessfully
+**/
+EFI_STATUS
+MpServicesUnitTestStartupAllAPs (
+ IN MP_SERVICES MpServices,
+ IN EFI_AP_PROCEDURE Procedure,
+ IN BOOLEAN SingleThread,
+ IN UINTN TimeoutInMicroSeconds,
+ IN VOID *ProcedureArgument
+ );
+
+/**
+ Caller gets one enabled AP to execute a caller-provided function.
+
+ @param[in] MpServices MP_SERVICES structure.
+ @param[in] Procedure Pointer to the function to be run on enabled APs of the system.
+ @param[in] ProcessorNumber The handle number of the AP.
+ @param[in] TimeoutInMicroSeconds Indicates the time limit in microseconds for APs to return from Procedure,
+ for blocking mode only. Zero means infinity.
+ @param[in] ProcedureArgument The parameter passed into Procedure for all APs.
+
+ @retval EFI_SUCCESS Caller gets one enabled AP to execute a caller-provided function successfully
+ @retval Others Caller gets one enabled AP to execute a caller-provided function unsuccessfully
+**/
+EFI_STATUS
+MpServicesUnitTestStartupThisAP (
+ IN MP_SERVICES MpServices,
+ IN EFI_AP_PROCEDURE Procedure,
+ IN UINTN ProcessorNumber,
+ IN UINTN TimeoutInMicroSeconds,
+ IN VOID *ProcedureArgument
+ );
+
+/**
+ Switch the requested AP to be the BSP from that point onward.
+
+ @param[in] MpServices MP_SERVICES structure.
+ @param[in] ProcessorNumber The handle number of AP that is to become the new BSP.
+ @param[in] EnableOldBSP If TRUE, the old BSP will be listed as an enabled AP. Otherwise, it will be disabled.
+
+ @retval EFI_SUCCESS Switch the requested AP to be the BSP successfully
+ @retval Others Switch the requested AP to be the BSP unsuccessfully
+**/
+EFI_STATUS
+MpServicesUnitTestSwitchBSP (
+ IN MP_SERVICES MpServices,
+ IN UINTN ProcessorNumber,
+ IN BOOLEAN EnableOldBSP
+ );
+
+/**
+ Caller enables or disables an AP from this point onward.
+
+ @param[in] MpServices MP_SERVICES structure.
+ @param[in] ProcessorNumber The handle number of the AP.
+ @param[in] EnableAP Specifies the new state for the processor for enabled, FALSE for disabled.
+ @param[in] HealthFlag If not NULL, a pointer to a value that specifies the new health status of the AP.
+
+ @retval EFI_SUCCESS Caller enables or disables an AP successfully.
+ @retval Others Caller enables or disables an AP unsuccessfully.
+**/
+EFI_STATUS
+MpServicesUnitTestEnableDisableAP (
+ IN MP_SERVICES MpServices,
+ IN UINTN ProcessorNumber,
+ IN BOOLEAN EnableAP,
+ IN UINT32 *HealthFlag
+ );
+
+/**
+ Get the handle number for the calling processor.
+
+ @param[in] MpServices MP_SERVICES structure.
+ @param[out] ProcessorNumber The handle number for the calling processor.
+
+ @retval EFI_SUCCESS Get the handle number for the calling processor successfully.
+ @retval Others Get the handle number for the calling processor unsuccessfully.
+**/
+EFI_STATUS
+MpServicesUnitTestWhoAmI (
+ IN MP_SERVICES MpServices,
+ OUT UINTN *ProcessorNumber
+ );
+
+/**
+ Empty procedure to be run on specified CPU.
+
+ @param[in,out] Buffer The pointer to private data buffer.
+**/
+VOID
+EmptyProcedure (
+ IN OUT VOID *Buffer
+ );
+
+/**
+ Produce to store ProcessorNumber in CommonBuffer and be run on specified CPU.
+
+ @param[in,out] Buffer The pointer to private data buffer.
+**/
+VOID
+StoreCpuNumbers (
+ IN OUT VOID *Buffer
+ );
+
+/**
+ Prep routine for Unit test function.
+ To save the ProcessorNumber of disabled AP and temporarily enable it.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED Prep routine runs successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED Prep routine runs unsuccessful.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+InitUTContext (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Cleanup routine for Unit test function.
+ If any processor is disabled unexpectedly then reenable it.
+
+ @param[in] Context Context pointer for this test.
+**/
+VOID
+EFIAPI
+CheckUTContext (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Cleanup routine for Unit test function.
+ It will be called by the last "AddTestCase" to restore AP state and free pointer.
+
+ @param[in] Context Context pointer for this test.
+**/
+VOID
+EFIAPI
+FreeUTContext (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service WhoAmI.
+ The range of ProcessorNumber should be from 0 to NumberOfCPUs minus 1.
+ The ProcessorNumbers of all CPUs are unique.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestWhoAmI1 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service GetNumberOfProcessors.
+ NumberOfProcessors should be greater that 0 and not less than NumberOfEnabledProcessors.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestGetNumberOfProcessors1 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service GetNumberOfProcessors.
+ When this service is called from an AP, the return status should be EFI_DEVICE_ERROR.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestGetNumberOfProcessors2 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service GetNumberOfProcessors.
+ Call EnableDisableAP() to change the number of enabled AP.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestGetNumberOfProcessors3 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service GetProcessorInfo.
+ When all the parameters are valid, all reserved bits of StatusFlag in ProcessorInfoBuffer should be set to zero.
+ When all the parameters are valid, the StatusFlag should not have an invalid value (The BSP can never be in the disabled state.).
+ When called with nonexistent processor handle, the return status should be EFI_NOT_FOUND.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestGetProcessorInfo1 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service GetProcessorInfo.
+ When this service is called from an AP, the return status should be EFI_DEVICE_ERROR.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestGetProcessorInfo2 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service EnableDisableAP.
+ When called with BSP number, the return status should be EFI_INVALID_PARAMETER.
+ When called with a nonexistent processor handle, the return status should be EFI_NOT_FOUND.
+ The AP should be really Enable/Disabled.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestEnableDisableAP1 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service EnableDisableAP.
+ When run this procedure on AP, the return status should be EFI_DEVICE_ERROR.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestEnableDisableAP2 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service EnableDisableAP.
+ When run this procedure on AP, the return status should be EFI_DEVICE_ERROR.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestEnableDisableAP3 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service StartupThisAP.
+ When called to startup a BSP, the return status should be EFI_INVALID_PARAMETER.
+ When called with a nonexistent processor handle, the return status should be EFI_NOT_FOUND.
+ The requested AP should execute the Procedure when called by StartupThisAP.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestStartupThisAP1 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service StartupThisAP.
+ When this service is called from an AP, the return status should be EFI_DEVICE_ERROR.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestStartupThisAP2 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service StartupThisAP.
+ When timeout expired before the requested AP has finished, the return status should be EFI_TIMEOUT.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestStartupThisAP3 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service StartupThisAP.
+ When called with disabled AP, the return status should be EFI_INVALID_PARAMETER.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestStartupThisAP4 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service StartupAllAPs.
+ All APs should execute the Procedure when called by StartupAllAPs.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestStartupAllAPs1 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service StartupAllAPs.
+ When called in single thread, the return status should be EFI_SUCCESS and AP executes in ascending order
+ of processor handle number.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestStartupAllAPs2 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service StartupAllAPs.
+ When this service is called from an AP, the return status should be EFI_DEVICE_ERROR.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestStartupAllAPs3 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service StartupAllAPs.
+ When called with all AP timeout, the return status should be EFI_TIMEOUT.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestStartupAllAPs4 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service StartupAllAPs.
+ When called with the empty Procedure on all disabled APs, the return status should be EFI_NOT_STARTED.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestStartupAllAPs5 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service SwitchBSP.
+ When switch current BSP to be BSP, the return status should be EFI_INVALID_PARAMETER.
+ When switch nonexistent processor to be BSP, the return status should be EFI_NOT_FOUND.
+ After switch BSP, all APs(includes new AP) should execute the Procedure when called by StartupAllAP.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestSwitchBSP1 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service SwitchBSP.
+ When run this procedure on AP, the return status should be EFI_DEVICE_ERROR.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestSwitchBSP2 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service SwitchBSP.
+ When switch a disabled AP to be BSP, the return status should be EFI_INVALID_PARAMETER.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestSwitchBSP3 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Unit test of MP service SwitchBSP.
+ When SwitchBSP and EnableOldBSP is TRUE, the new BSP should be in the enabled state and the old BSP should
+ be in the enabled state.
+ When SwitchBSP and EnableOldBSP is False, the new BSP should be in the enabled state and the old BSP should
+ be in the disabled state.
+
+ @param[in] Context Context pointer for this test.
+
+ @retval UNIT_TEST_PASSED The Unit test has completed and the test
+ case was successful.
+ @retval UNIT_TEST_ERROR_TEST_FAILED A test case assertion has failed.
+**/
+UNIT_TEST_STATUS
+EFIAPI
+TestSwitchBSP4 (
+ IN UNIT_TEST_CONTEXT Context
+ );
+
+/**
+ Create test suite and unit tests for both EdkiiPeiMpServices2Ppi and EfiMpServiceProtocol.
+
+ @param[in] Framework A pointer to the framework that is being persisted.
+ @param[in] Context A pointer to the private data buffer.
+
+ @retval EFI_SUCCESS Create test suite and unit tests successfully.
+ @retval Others Create test suite and unit tests unsuccessfully.
+**/
+EFI_STATUS
+AddCommonTestCase (
+ IN UNIT_TEST_FRAMEWORK_HANDLE Framework,
+ IN MP_SERVICE_UT_CONTEXT *Context
+ );
+
+#endif