/*++ @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;
}