slimbootloader/BootloaderCommonPkg/Include/Library/LinuxLib.h

253 lines
6.9 KiB
C

/** @file
Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef __LINUX_LIB_H__
#define __LINUX_LIB_H__
#define BOOTSIG 0x1FE
#define SETUP_HDR 0x53726448 // "HdrS"
#define BOOT_PARAMS_BASE 0x00090000
#define LINUX_KERNEL_BASE 0x00100000
#define CMDLINE_OFFSET 0xF000
#define CMDLINE_LENGTH_MAX 0x800
#define E820_RAM 1
#define E820_RESERVED 2
#define E820_ACPI 3
#define E820_NVS 4
#define E820_UNUSABLE 5
#define VIDEO_TYPE_EFI 0x70
#define GET_POS_FROM_MASK(mask) (mask & 0x0FF)?0:((mask & 0x0FF00)?8:((mask & 0x0FF0000)?16:24))
#define VIDEO_CAPABILITY_SKIP_QUIRKS (1 << 0)
#define VIDEO_CAPABILITY_64BIT_BASE (1 << 1) /* Frame buffer base is 64-bit */
#pragma pack(1)
typedef struct {
UINT8 SetupSectorss; /* Sectors for setup code */
UINT16 RootFlags;
UINT32 SysSize;
UINT16 RamSize;
UINT16 VideoMode;
UINT16 RootDev;
UINT16 Signature; /* Boot Signature */
UINT16 Jump;
UINT32 Header;
UINT16 Version;
UINT16 SuSwitch;
UINT16 SetupSeg;
UINT16 StartSys;
UINT16 KernalVer;
UINT8 LoaderId;
UINT8 LoadFlags;
UINT16 MoveSize;
UINT32 Code32Start; /* Start of code loaded high */
UINT32 RamDiskStart; /* Start of initial ramdisk */
UINT32 RamDisklen; /* Length of initial ramdisk */
UINT32 BootsectorKludge;
UINT16 HeapEnd;
UINT8 ExtLoaderVer; /* Extended boot loader version */
UINT8 ExtLoaderType; /* Extended boot loader ID */
UINT32 CmdLinePtr; /* 32-bit pointer to the kernel command line */
UINT32 RamDiskMax; /* Highest legal initrd address */
UINT32 KernelAlignment; /* Physical addr alignment required for kernel */
UINT8 RelocatableKernel; /* Whether kernel is relocatable or not */
UINT8 MinAlignment;
UINT16 XloadFlags;
UINT32 CmdlineSize;
UINT32 HardwareSubarch;
UINT64 HardwareSubarchData;
UINT32 PayloadOffset;
UINT32 PayloadLength;
UINT64 SetupData;
UINT64 PrefAddress;
UINT32 InitSize;
UINT32 HandoverOffset;
} SETUP_HEADER;
typedef struct {
UINT32 EfiLoaderSignature;
UINT32 EfiSystab;
UINT32 EfiMemdescSize;
UINT32 EfiMemdescVersion;
UINT32 EfiMemmap;
UINT32 EfiMemmapSize;
UINT32 EfiSystabHi;
UINT32 EfiMemmapHi;
} EFI_INFO;
typedef struct {
UINT64 Addr; /* start of memory segment */
UINT64 Size; /* size of memory segment */
UINT32 Type; /* Type of memory segment */
} E820_ENTRY;
typedef struct {
UINT8 OrigX; /* 0x00 */
UINT8 OrigY; /* 0x01 */
UINT16 ExtMemK; /* 0x02 */
UINT16 OrigVideoPage; /* 0x04 */
UINT8 OrigVideoMode; /* 0x06 */
UINT8 OrigVideoCols; /* 0x07 */
UINT8 Flags; /* 0x08 */
UINT8 Unused2; /* 0x09 */
UINT16 OrigVideoEgaBx; /* 0x0a */
UINT16 Unused3; /* 0x0c */
UINT8 OrigVideoLines; /* 0x0e */
UINT8 OrigVideoIsVGA; /* 0x0f */
UINT16 OrigVideoPoints; /* 0x10 */
/* VESA graphic mode -- linear frame buffer */
UINT16 LfbWidth; /* 0x12 */
UINT16 LfbHeight; /* 0x14 */
UINT16 LfbDepth; /* 0x16 */
UINT32 LfbBase; /* 0x18 */
UINT32 LfbSize; /* 0x1c */
UINT16 ClMagic, ClOffset; /* 0x20 */
UINT16 LfbLinelength; /* 0x24 */
UINT8 RedSize; /* 0x26 */
UINT8 RedPos; /* 0x27 */
UINT8 GreenSize; /* 0x28 */
UINT8 GreenPos; /* 0x29 */
UINT8 BlueSize; /* 0x2a */
UINT8 BluePos; /* 0x2b */
UINT8 RsvdSize; /* 0x2c */
UINT8 RsvdPos; /* 0x2d */
UINT16 VesapmSeg; /* 0x2e */
UINT16 VesapmOff; /* 0x30 */
UINT16 Pages; /* 0x32 */
UINT16 VesaAttributes; /* 0x34 */
UINT32 Capabilities; /* 0x36 */
UINT32 ExtLfbBase; /* 0x3a */
UINT8 Reserved[2]; /* 0x3e */
} SCREEN_INFO;
typedef struct {
SCREEN_INFO ScreenInfo;
UINT8 ApmBiosInfo[0x14];
UINT8 Pad2[4];
UINT64 TbootAddr;
UINT8 IstInfo[0x10];
UINT64 AcpiRsdpAddr;
UINT8 Pad3[8];
UINT8 Hd0Info[16];
UINT8 Hd1Info[16];
UINT8 SysDescTable[0x10];
UINT8 OlpcOfwHeader[0x10];
UINT8 Pad4[128];
UINT8 EdidInfo[0x80];
EFI_INFO EfiInfo;
UINT32 AltMemk;
UINT32 Scratch;
UINT8 E820Entries;
UINT8 EddbufEntries;
UINT8 EddMbrSigBufEntries;
UINT8 Pad6[6];
SETUP_HEADER Hdr;
UINT8 Pad7[0x290 - 0x1f1 - sizeof (SETUP_HEADER)];
UINT32 EddMbrSigBuffer[16];
E820_ENTRY E820Map[128];
UINT8 Pad8[48];
UINT8 Eddbuf[0x1ec];
UINT8 Pad9[276];
} BOOT_PARAMS;
typedef struct {
UINT16 Limit;
UINT64 *Base;
} DT_ADDR;
#pragma pack()
/**
Dumps kernel boot parameters.
@param[in] Bp Pointer to boot parameter structure.
**/
VOID
DumpLinuxBootParams (
IN BOOT_PARAMS *Bp
);
/**
Return kernel boot parameters.
@retval Pointer to boot parameter structure.
**/
BOOT_PARAMS *
EFIAPI
GetLinuxBootParams (
VOID
);
/**
Check if the image is a bootable Linux image.
@param[in] ImageBase Memory address of an image
@retval TRUE Image is a bootable kernel image
@retval FALSE Not a bootable kernel image
**/
BOOLEAN
EFIAPI
IsBzImage (
IN CONST VOID *ImageBase
);
/**
Load linux kernel image to specified address and setup boot parameters.
@param[in] KernelBase Memory address of an kernel image.
@param[in] InitRdBase Memory address of an InitRd image.
@param[in] InitRdLen InitRd image size.
@param[in] CmdLineBase Memory address of command line buffer.
@param[in] CmdLineLen Command line buffer size.
@retval EFI_INVALID_PARAMETER Input parameters are not valid.
@retval EFI_UNSUPPORTED Unsupported binary type.
@retval EFI_SUCCESS Kernel is loaded successfully.
**/
EFI_STATUS
EFIAPI
LoadBzImage (
IN CONST VOID *KernelBase,
IN CONST VOID *InitRdBase,
IN UINT32 InitRdLen,
IN CONST VOID *CmdLineBase,
IN UINT32 CmdLineLen
);
/**
Update linux kernel boot parameters.
@param[in] Bp BootParams address to be updated
**/
VOID
EFIAPI
UpdateLinuxBootParams (
IN BOOT_PARAMS *Bp
);
/**
Load linux kernel image to specified address and setup boot parameters.
@param[in] HobList HOB list pointer. Not used for now.
@param[in] Params Extra parameters. Not used for now.
**/
VOID
EFIAPI
LinuxBoot (
IN VOID *HobList,
IN VOID *Params
);
#endif