/**
 * PROJECT:         ExectOS
 * COPYRIGHT:       See COPYING.md in the top level directory
 * FILE:            xtldr/includes/blmod.h
 * DESCRIPTION:     Top level header for XTLDR modules support
 * DEVELOPERS:      Rafal Kupiec <belliash@codingworkshop.eu.org>
 */

#ifndef __XTLDR_BLMOD_H
#define __XTLDR_BLMOD_H

#include <xtkmapi.h>
#include <bldefs.h>
#include <blproto.h>


/* Structures forward declarations */
typedef struct _XT_BOOT_PROTOCOL XT_BOOT_PROTOCOL, *PXT_BOOT_PROTOCOL;
typedef struct _XT_BOOT_PROTOCOL_PARAMETERS XT_BOOT_PROTOCOL_PARAMETERS, *PXT_BOOT_PROTOCOL_PARAMETERS;
typedef struct _XT_PECOFFF_IMAGE_PROTOCOL XT_PECOFF_IMAGE_PROTOCOL, *PXT_PECOFF_IMAGE_PROTOCOL;

/* Pointers to the routines provided by the modules */
typedef EFI_STATUS (*PXT_BOOTPROTO_BOOT_SYSTEM)(IN PXT_BOOT_PROTOCOL_PARAMETERS Parameters);
typedef VOID (*PXT_FRAMEBUFFER_GET_DISPLAY_DRIVER)(OUT PWCHAR *DriverName);
typedef VOID (*PXT_FRAMEBUFFER_GET_DISPLAY_INFORMATION)(OUT PLOADER_GRAPHICS_INFORMATION_BLOCK InformationBlock);
typedef EFI_STATUS (*PXT_FRAMEBUFFER_INITIALIZE)();
typedef VOID (*PXT_FRAMEBUFFER_PRINT_DISPLAY_INFORMATION)();
typedef EFI_STATUS (*PXT_PECOFF_GET_ENTRY_POINT)(IN PPECOFF_IMAGE_CONTEXT Image, OUT PVOID *EntryPoint);
typedef EFI_STATUS (*PXT_PECOFF_GET_MACHINE_TYPE)(IN PPECOFF_IMAGE_CONTEXT Image, OUT PUSHORT MachineType);
typedef EFI_STATUS (*PXT_PECOFF_GET_SUBSYSTEM)(IN PPECOFF_IMAGE_CONTEXT Image, OUT PUSHORT SubSystem);
typedef EFI_STATUS (*PXT_PECOFF_LOAD_IMAGE)(IN PEFI_FILE_HANDLE FileHandle, IN LOADER_MEMORY_TYPE MemoryType,
                                            IN PVOID VirtualAddress, OUT PPECOFF_IMAGE_CONTEXT *Image);
typedef EFI_STATUS (*PXT_PECOFF_RELOCATE_IMAGE)(IN PPECOFF_IMAGE_CONTEXT Image, IN EFI_VIRTUAL_ADDRESS Address);


/* XT common boot protocols */
typedef struct _XT_BOOT_PROTOCOL
{
    PXT_BOOTPROTO_BOOT_SYSTEM BootSystem;
} XT_BOOT_PROTOCOL, *PXT_BOOT_PROTOCOL;

/* XT common boot protocol parameters */
typedef struct _XT_BOOT_PROTOCOL_PARAMETERS
{
    PEFI_DEVICE_PATH_PROTOCOL DevicePath;
    PWCHAR ArcName;
    PWCHAR SystemPath;
    PWCHAR KernelFile;
    PWCHAR InitrdFile;
    PWCHAR HalFile;
    PWCHAR Arguments;
} XT_BOOT_PROTOCOL_PARAMETERS, *PXT_BOOT_PROTOCOL_PARAMETERS;

/* XT framebuffer support protocol */
typedef struct _XT_FRAMEBUFFER_PROTOCOL
{
    PXT_FRAMEBUFFER_GET_DISPLAY_DRIVER GetDisplayDriver;
    PXT_FRAMEBUFFER_GET_DISPLAY_INFORMATION GetDisplayInformation;
    PXT_FRAMEBUFFER_INITIALIZE Initialize;
    PXT_FRAMEBUFFER_PRINT_DISPLAY_INFORMATION PrintDisplayInformation;
} XT_FRAMEBUFFER_PROTOCOL, *PXT_FRAMEBUFFER_PROTOCOL;

/* XT framebuffer information structure definition */
typedef struct _XT_FRAMEBUFFER_INFORMATION
{
    BOOLEAN Initialized;
    EFI_GRAPHICS_PROTOCOL Protocol;
    union
    {
        PEFI_GRAPHICS_OUTPUT_PROTOCOL GOP;
        PEFI_UNIVERSAL_GRAPHICS_ADAPTER_PROTOCOL UGA;
    } Adapter;
    UINT HorizontalResolution;
    UINT VerticalResolution;
    UINT BitsPerPixel;
    UINT BytesPerPixel;
    UINT PixelsPerScanLine;
    UINT Pitch;
    EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
    EFI_PHYSICAL_ADDRESS FrameBufferBase;
    ULONG_PTR FrameBufferSize;
} XT_FRAMEBUFFER_INFORMATION, *PXT_FRAMEBUFFER_INFORMATION;

/* EFI XT PE/COFF Image Protocol */
typedef struct _XT_PECOFFF_IMAGE_PROTOCOL
{
    PXT_PECOFF_GET_ENTRY_POINT GetEntryPoint;
    PXT_PECOFF_GET_MACHINE_TYPE GetMachineType;
    PXT_PECOFF_GET_SUBSYSTEM GetSubSystem;
    PXT_PECOFF_LOAD_IMAGE Load;
    PXT_PECOFF_RELOCATE_IMAGE Relocate;
} XT_PECOFF_IMAGE_PROTOCOL, *PXT_PECOFF_IMAGE_PROTOCOL;

#endif /* __XTLDR_BLMOD_H */