/*++ @file Reset Architectural Protocol as defined in UEFI/PI under Emulation Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.
Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include VOID EFIAPI EmuResetSystem ( IN EFI_RESET_TYPE ResetType, IN EFI_STATUS ResetStatus, IN UINTN DataSize, IN VOID *ResetData OPTIONAL ) { EFI_STATUS Status; UINTN HandleCount; EFI_HANDLE *HandleBuffer; UINTN Index; // // Disconnect all // Status = gBS->LocateHandleBuffer ( AllHandles, NULL, NULL, &HandleCount, &HandleBuffer ); if (!EFI_ERROR (Status)) { for (Index = 0; Index < HandleCount; Index++) { Status = gBS->DisconnectController (HandleBuffer[Index], NULL, NULL); } gBS->FreePool (HandleBuffer); } // // Discard ResetType, always return 0 as exit code // gEmuThunk->Exit (0); // // Should never go here // ASSERT (FALSE); return; } EFI_STATUS EFIAPI InitializeEmuReset ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) /*++ Routine Description: Arguments: ImageHandle of the loaded driver Pointer to the System Table Returns: Status **/ { EFI_STATUS Status; EFI_HANDLE Handle; SystemTable->RuntimeServices->ResetSystem = EmuResetSystem; Handle = NULL; Status = gBS->InstallMultipleProtocolInterfaces ( &Handle, &gEfiResetArchProtocolGuid, NULL, NULL ); ASSERT_EFI_ERROR (Status); return Status; }