/** @file
  LegacySmmSredir.h -- Header for LegacySmmSredir


Copyright (c) HR650X BIOS Decompilation Project
**/

#ifndef __LEGACYSMMSREDIR_H__
#define __LEGACYSMMSREDIR_H__

#include "../uefi_headers/Uefi.h"

//
// Global state recovered from module data recovery notes
//
extern EFI_SYSTEM_TABLE   *gST;                // 0x1A08
extern EFI_BOOT_SERVICES  *gBS;                // 0x1A10
extern EFI_HANDLE         gImageHandle;        // 0x1A18
extern EFI_RUNTIME_SERVICES *gRT;              // 0x1A20
extern VOID               *gSmst;              // 0x1A28
extern VOID               *gSmmDebugLib;       // 0x1A30
extern EFI_BOOT_SERVICES  *gBSLocal;           // 0x1A38
extern VOID               *gSmmInternalProtocol;// 0x1A40
extern VOID               *gSmmBase2Protocol;  // 0x1A48
extern UINT8              gSmmMode;            // 0x1A50
extern VOID               *gSmmIoProtocol;     // 0x1A58
extern UINT8              gSmmIoPhase;         // 0x1A60
extern VOID               *gSmmDebugLibAlt;    // 0x1A68
extern VOID               *gDxeIoProtocol;     // 0x1A70
extern EFI_RUNTIME_SERVICES *gRTLocal;          // 0x1A78
extern VOID               *gDxeDebugLib;       // 0x1A80
extern EFI_SYSTEM_TABLE   *gSTLocal;           // 0x1A88
extern VOID               *gAmiBufferValidation;// 0x1A90
extern UINT8              gCmosValue;          // 0x1A98
extern UINTN              gDriverStatus;       // 0x1B98
extern VOID               *gSmmCommunication;  // 0x1BA0
extern VOID               *gSmmCommunicationProtocol; // 0x19F0
extern UINT8              gDataWidth;          // 0x19F8
extern UINT8              gCommunicateDisabled; // 0x19F9
extern VOID               *gSmmCommunicateBuffer; // 0x1A00

//
// Function Prototypes
//

///
/// _ModuleEntryPoint -- UEFI SMM entry point recovered name
///
EFI_STATUS
EFIAPI
_ModuleEntryPoint(
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
);

///
/// ModuleEntryPoint -- legacy compatibility alias
///
EFI_STATUS
EFIAPI
ModuleEntryPoint(
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
);

///
/// _ModuleEntryPoint sub-helpers
///
EFI_STATUS
EFIAPI
LegacySmmSredirAutoGenInit(
  VOID
);

///
/// LegacySmmSredirDriverEntry -- recovered driver entry routine
///
EFI_STATUS
EFIAPI
LegacySmmSredirDriverEntry(
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
);

///
/// Additional recovered internal entry helpers
///
EFI_STATUS EFIAPI
LegacySmmSredirRegisterCommunicationServices(
  VOID
);

EFI_STATUS EFIAPI
LegacySmmSredirMainDispatch(
  VOID
);

EFI_STATUS EFIAPI
LegacySmmSredirHandleCommunicate(
  IN VOID   *Context,
  IN VOID   *CommBuffer,
  IN UINTN  *CommBufferSize,
  OUT VOID  *CommBufferData
);

VOID EFIAPI
LegacySmmSredirDisableCommunicateHandler(
  IN EFI_HANDLE  Protocol,
  IN VOID       *Context,
  IN VOID       *Registration
);

EFI_STATUS EFIAPI
LegacySmmSredirRegisterProtocolNotification(
  VOID
);

VOID EFIAPI
LegacySmmSredirNotificationCallback(
  IN EFI_HANDLE  Protocol,
  IN VOID       *Context,
  IN VOID       *Communication
);

EFI_STATUS EFIAPI
LegacySmmSredirSaveJumpContext(
  IN VOID  *JumpBuffer
);

VOID
LegacySmmSredirRestoreJumpContext(
  IN VOID  *JumpBuffer
);

VOID
LegacySmmSredirValidateJumpContext(
  IN VOID  *JumpBuffer
);

EFI_STATUS EFIAPI
LegacySmmSredirLocateDebugLib(
  VOID
);

VOID
LegacySmmSredirDebugPrint(
  IN UINTN   ErrorLevel,
  IN CHAR8  *Format,
  ...
);

VOID
LegacySmmSredirDebugAssert(
  IN CHAR16  *FileName,
  IN INTN     LineNumber,
  IN CHAR8   *Description,
  IN CHAR8   *Assertion,
  IN BOOLEAN  AssertType
);

VOID *
LegacySmmSredirGetIoProtocol(
  VOID
);

VOID *
LegacySmmSredirGetDebugProtocol(
  VOID
);

EFI_STATUS EFIAPI
LegacySmmSredirFindRuntimeServices(
  VOID
);

BOOLEAN
LegacySmmSredirComparePattern(
  IN VOID  *Left,
  IN VOID  *Right,
  IN UINTN  Size
);

EFI_STATUS
LegacySmmSredirValidateBuffer(
  IN VOID  *Address,
  IN UINTN  Length,
  IN BOOLEAN ForWrite
);

EFI_STATUS
LegacySmmSredirDetectPlatform(
  VOID
);

///
/// Decompiler compatibility aliases
///
EFI_STATUS EFIAPI
sub_44C(
  VOID
);

EFI_STATUS EFIAPI
sub_618(
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
);

VOID EFIAPI
sub_93C(
  IN EFI_HANDLE  Protocol,
  IN VOID       *Context,
  IN VOID       *Registration
);


#endif /* __LEGACYSMMSREDIR_H__ */
