text: /*++ @file
    Reset Architectural Protocol as defined in UEFI/PI under Emulation
  
  Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
  Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
  SPDX-License-Identifier: BSD-2-Clause-Patent
  
  **/
  
  #include <PiDxe.h>
  
  #include <Library/BaseLib.h>
  #include <Library/DebugLib.h>
  #include <Library/UefiLib.h>
  #include <Library/UefiDriverEntryPoint.h>
  #include <Library/MemoryAllocationLib.h>
  #include <Library/UefiBootServicesTableLib.h>
  #include <Library/EmuThunkLib.h>
  
  #include <Protocol/Reset.h>
  
  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;
  }
  