1 /*++ @file 2 Reset Architectural Protocol as defined in UEFI/PI under Emulation 3 4 Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR> 5 Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved. 6 This program and the accompanying materials 7 are licensed and made available under the terms and conditions of the BSD License 8 which accompanies this distribution. The full text of the license may be found at 9 http://opensource.org/licenses/bsd-license.php 10 11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 14 **/ 15 16 #include <PiDxe.h> 17 18 #include <Library/BaseLib.h> 19 #include <Library/DebugLib.h> 20 #include <Library/UefiLib.h> 21 #include <Library/UefiDriverEntryPoint.h> 22 #include <Library/MemoryAllocationLib.h> 23 #include <Library/UefiBootServicesTableLib.h> 24 #include <Library/EmuThunkLib.h> 25 26 #include <Protocol/Reset.h> 27 28 29 VOID 30 EFIAPI 31 EmuResetSystem ( 32 IN EFI_RESET_TYPE ResetType, 33 IN EFI_STATUS ResetStatus, 34 IN UINTN DataSize, 35 IN VOID *ResetData OPTIONAL 36 ) 37 { 38 EFI_STATUS Status; 39 UINTN HandleCount; 40 EFI_HANDLE *HandleBuffer; 41 UINTN Index; 42 43 // 44 // Disconnect all 45 // 46 Status = gBS->LocateHandleBuffer ( 47 AllHandles, 48 NULL, 49 NULL, 50 &HandleCount, 51 &HandleBuffer 52 ); 53 if (!EFI_ERROR (Status)) { 54 for (Index = 0; Index < HandleCount; Index++) { 55 Status = gBS->DisconnectController (HandleBuffer[Index], NULL, NULL); 56 } 57 58 gBS->FreePool (HandleBuffer); 59 } 60 61 62 // 63 // Discard ResetType, always return 0 as exit code 64 // 65 gEmuThunk->Exit (0); 66 67 // 68 // Should never go here 69 // 70 ASSERT (FALSE); 71 72 return; 73 } 74 75 76 77 EFI_STATUS 78 EFIAPI 79 InitializeEmuReset ( 80 IN EFI_HANDLE ImageHandle, 81 IN EFI_SYSTEM_TABLE *SystemTable 82 ) 83 /*++ 84 85 Routine Description: 86 87 88 Arguments: 89 90 ImageHandle of the loaded driver 91 Pointer to the System Table 92 93 Returns: 94 95 Status 96 **/ 97 { 98 EFI_STATUS Status; 99 EFI_HANDLE Handle; 100 101 SystemTable->RuntimeServices->ResetSystem = EmuResetSystem; 102 103 Handle = NULL; 104 Status = gBS->InstallMultipleProtocolInterfaces ( 105 &Handle, 106 &gEfiResetArchProtocolGuid, 107 NULL, 108 NULL 109 ); 110 ASSERT_EFI_ERROR (Status); 111 112 return Status; 113 } 114 115