123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627 |
- /** @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
|