text: /** @file
    Reset System Library functions for OVMF
  
    Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
    SPDX-License-Identifier: BSD-2-Clause-Patent
  
  **/
  
  #include <Base.h>                   // BIT1
  
  #include <Library/BaseLib.h>        // CpuDeadLoop()
  #include <Library/DebugLib.h>       // ASSERT()
  #include <Library/IoLib.h>          // IoWrite8()
  #include <Library/ResetSystemLib.h> // ResetCold()
  #include <Library/TimerLib.h>       // MicroSecondDelay()
  #include <Library/UefiRuntimeLib.h> // EfiGoneVirtual()
  #include <OvmfPlatforms.h>          // PIIX4_PMBA_VALUE
  
  static UINTN
  MicrovmGedBase (
    VOID
    )
  {
    VOID  *Address = (VOID *)(UINTN)MICROVM_GED_MMIO_BASE_REGS;
  
    if (EfiGoneVirtual ()) {
      EfiConvertPointer (0, &Address);
      DEBUG ((DEBUG_INFO, "%a: virtual -> 0x%x\n", __FUNCTION__, Address));
    } else {
      DEBUG ((DEBUG_INFO, "%a: physical -> 0x%x\n", __FUNCTION__, Address));
    }
  
    return (UINTN)Address;
  }
  
  static VOID
  MicrovmReset (
    VOID
    )
  {
    UINTN  Address = MicrovmGedBase ();
  
    DEBUG ((DEBUG_INFO, "%a: microvm reset via ged\n", __FUNCTION__));
    MmioWrite8 (
      Address + MICROVM_ACPI_GED_REG_RESET,
      MICROVM_ACPI_GED_RESET_VALUE
      );
    CpuDeadLoop ();
  }
  
  static VOID
  MicrovmShutdown (
    VOID
    )
  {
    UINTN  Address = MicrovmGedBase ();
  
    DEBUG ((DEBUG_INFO, "%a: microvm poweroff via ged\n", __FUNCTION__));
    MmioWrite8 (
      Address + MICROVM_ACPI_GED_REG_SLEEP_CTL,
      (1 << 5) /* enable bit */ |
      (5 << 2)           /* typ == S5  */
      );
    CpuDeadLoop ();
  }
  
  VOID EFIAPI
  ResetCold (
    VOID
    )
  {
    MicrovmReset ();
  }
  
  VOID EFIAPI
  ResetWarm (
    VOID
    )
  {
    MicrovmReset ();
  }
  
  VOID
  EFIAPI
  ResetPlatformSpecific (
    IN UINTN  DataSize,
    IN VOID   *ResetData
    )
  {
    MicrovmReset ();
  }
  
  VOID
  EFIAPI
  ResetSystem (
    IN EFI_RESET_TYPE  ResetType,
    IN EFI_STATUS      ResetStatus,
    IN UINTN           DataSize,
    IN VOID            *ResetData OPTIONAL
    )
  {
    MicrovmReset ();
  }
  
  VOID EFIAPI
  ResetShutdown (
    VOID
    )
  {
    MicrovmShutdown ();
  }
  