Files
slimbootloader/BootloaderCommonPkg/Include/Library/LinuxLib.h
T
Maurice Ma 19a0890a54 Break Load Linux BzImage into more functions
This patch splitted LoadBzImage() into two functions.  One is just
for kernel loading.  The other one UpdateLinuxBootParams() is for
Linux boot parameter updates. It is required to do so because when
kernel loading in Stage2 is enabled the loading occurs before all
HOBs are finalized. The Linux boot parameters depend on HOBs to fill
correct information, such as frame buffer. With this patch, the boot
parameters can be updated at the very end.

Signed-off-by: Maurice Ma <maurice.ma@intel.com>
2019-08-12 10:40:11 -07:00

245 lines
6.7 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 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))
#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 */
UINT8 Reserved[6]; /* 0x3a */
} SCREEN_INFO;
typedef struct {
SCREEN_INFO ScreenInfo;
UINT8 ApmBiosInfo[0x14];
UINT8 Pad2[4];
UINT64 TbootAddr;
UINT8 IstInfo[0x10];
UINT8 Pad3[16];
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.
@retval EFI_SUCCESS Linux boot parameters were updated successfully.
**/
VOID
EFIAPI
UpdateLinuxBootParams (
VOID
);
/**
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