mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-25 16:37:42 +01:00
163 lines
4.9 KiB
C
163 lines
4.9 KiB
C
|
/**
|
||
|
|
||
|
Methods for finding, checking and fixing boot args
|
||
|
|
||
|
by dmazar (defs from Clover)
|
||
|
|
||
|
**/
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Video information..
|
||
|
*/
|
||
|
|
||
|
struct Boot_Video {
|
||
|
UINT32 v_baseAddr; /* Base address of video memory */
|
||
|
UINT32 v_display; /* Display Code (if Applicable */
|
||
|
UINT32 v_rowBytes; /* Number of bytes per pixel row */
|
||
|
UINT32 v_width; /* Width */
|
||
|
UINT32 v_height; /* Height */
|
||
|
UINT32 v_depth; /* Pixel Depth */
|
||
|
};
|
||
|
|
||
|
typedef struct Boot_Video Boot_Video;
|
||
|
|
||
|
/* Values for v_display */
|
||
|
|
||
|
#define GRAPHICS_MODE 1
|
||
|
#define FB_TEXT_MODE 2
|
||
|
|
||
|
/* Boot argument structure - passed into Mach kernel at boot time.
|
||
|
* "Revision" can be incremented for compatible changes
|
||
|
*/
|
||
|
#define kBootArgsRevision 0
|
||
|
#define kBootArgsVersion 2
|
||
|
|
||
|
/* Snapshot constants of previous revisions that are supported */
|
||
|
#define kBootArgsVersion1 1
|
||
|
#define kBootArgsRevision1_4 4
|
||
|
#define kBootArgsRevision1_5 5
|
||
|
#define kBootArgsRevision1_6 6
|
||
|
|
||
|
#define kBootArgsVersion2 2
|
||
|
#define kBootArgsRevision2_0 0
|
||
|
|
||
|
#define kBootArgsEfiMode32 32
|
||
|
#define kBootArgsEfiMode64 64
|
||
|
|
||
|
/* Bitfields for boot_args->flags */
|
||
|
#define kBootArgsFlagRebootOnPanic (1 << 0)
|
||
|
#define kBootArgsFlagHiDPI (1 << 1)
|
||
|
|
||
|
#define BOOT_LINE_LENGTH 1024
|
||
|
|
||
|
/* version 1 before Lion */
|
||
|
typedef struct {
|
||
|
UINT16 Revision; /* Revision of boot_args structure */
|
||
|
UINT16 Version; /* Version of boot_args structure */
|
||
|
|
||
|
CHAR8 CommandLine[BOOT_LINE_LENGTH]; /* Passed in command line */
|
||
|
|
||
|
UINT32 MemoryMap; /* Physical address of memory map */
|
||
|
UINT32 MemoryMapSize;
|
||
|
UINT32 MemoryMapDescriptorSize;
|
||
|
UINT32 MemoryMapDescriptorVersion;
|
||
|
|
||
|
Boot_Video Video; /* Video Information */
|
||
|
|
||
|
UINT32 deviceTreeP; /* Physical address of flattened device tree */
|
||
|
UINT32 deviceTreeLength; /* Length of flattened tree */
|
||
|
|
||
|
UINT32 kaddr; /* Physical address of beginning of kernel text */
|
||
|
UINT32 ksize; /* Size of combined kernel text+data+efi */
|
||
|
|
||
|
UINT32 efiRuntimeServicesPageStart; /* physical address of defragmented runtime pages */
|
||
|
UINT32 efiRuntimeServicesPageCount;
|
||
|
UINT32 efiSystemTable; /* physical address of system table in runtime area */
|
||
|
|
||
|
UINT8 efiMode; /* 32 = 32-bit, 64 = 64-bit */
|
||
|
UINT8 __reserved1[3];
|
||
|
UINT32 __reserved2[1];
|
||
|
UINT32 performanceDataStart; /* physical address of log */
|
||
|
UINT32 performanceDataSize;
|
||
|
UINT64 efiRuntimeServicesVirtualPageStart; /* virtual address of defragmented runtime pages */
|
||
|
UINT32 __reserved3[2];
|
||
|
|
||
|
} BootArgs1;
|
||
|
|
||
|
/* version2 as used in Lion */
|
||
|
typedef struct {
|
||
|
|
||
|
UINT16 Revision; /* Revision of boot_args structure */
|
||
|
UINT16 Version; /* Version of boot_args structure */
|
||
|
|
||
|
UINT8 efiMode; /* 32 = 32-bit, 64 = 64-bit */
|
||
|
UINT8 debugMode; /* Bit field with behavior changes */
|
||
|
UINT16 flags;
|
||
|
|
||
|
CHAR8 CommandLine[BOOT_LINE_LENGTH]; /* Passed in command line */
|
||
|
|
||
|
UINT32 MemoryMap; /* Physical address of memory map */
|
||
|
UINT32 MemoryMapSize;
|
||
|
UINT32 MemoryMapDescriptorSize;
|
||
|
UINT32 MemoryMapDescriptorVersion;
|
||
|
|
||
|
Boot_Video Video; /* Video Information */
|
||
|
|
||
|
UINT32 deviceTreeP; /* Physical address of flattened device tree */
|
||
|
UINT32 deviceTreeLength; /* Length of flattened tree */
|
||
|
|
||
|
UINT32 kaddr; /* Physical address of beginning of kernel text */
|
||
|
UINT32 ksize; /* Size of combined kernel text+data+efi */
|
||
|
|
||
|
UINT32 efiRuntimeServicesPageStart; /* physical address of defragmented runtime pages */
|
||
|
UINT32 efiRuntimeServicesPageCount;
|
||
|
UINT64 efiRuntimeServicesVirtualPageStart; /* virtual address of defragmented runtime pages */
|
||
|
|
||
|
UINT32 efiSystemTable; /* physical address of system table in runtime area */
|
||
|
UINT32 kslide;
|
||
|
|
||
|
UINT32 performanceDataStart; /* physical address of log */
|
||
|
UINT32 performanceDataSize;
|
||
|
|
||
|
UINT32 keyStoreDataStart; /* physical address of key store data */
|
||
|
UINT32 keyStoreDataSize;
|
||
|
UINT64 bootMemStart; /* physical address of interpreter boot memory */
|
||
|
UINT64 bootMemSize;
|
||
|
UINT64 PhysicalMemorySize;
|
||
|
UINT64 FSBFrequency;
|
||
|
UINT64 pciConfigSpaceBaseAddress;
|
||
|
UINT32 pciConfigSpaceStartBusNumber;
|
||
|
UINT32 pciConfigSpaceEndBusNumber;
|
||
|
UINT32 __reserved4[730];
|
||
|
|
||
|
} BootArgs2;
|
||
|
|
||
|
|
||
|
/** Our internal structure to hold boot args params to make the code independent of the boot args version. */
|
||
|
typedef struct _BootArgs {
|
||
|
UINT32 *MemoryMap; /* We will change this value so we need pointer to original field. */
|
||
|
UINT32 *MemoryMapSize;
|
||
|
UINT32 *MemoryMapDescriptorSize;
|
||
|
UINT32 *MemoryMapDescriptorVersion;
|
||
|
|
||
|
UINT32 *deviceTreeP;
|
||
|
UINT32 *deviceTreeLength;
|
||
|
|
||
|
UINT32 *kaddr;
|
||
|
UINT32 *ksize;
|
||
|
|
||
|
UINT32 *efiRuntimeServicesPageStart;
|
||
|
UINT32 *efiRuntimeServicesPageCount;
|
||
|
UINT64 *efiRuntimeServicesVirtualPageStart;
|
||
|
UINT32 *efiSystemTable;
|
||
|
} BootArgs;
|
||
|
|
||
|
|
||
|
VOID EFIAPI BootArgsPrint(VOID *bootArgs);
|
||
|
BootArgs* EFIAPI GetBootArgs(VOID *bootArgs);
|
||
|
VOID EFIAPI BootArgsFix(BootArgs *BA, EFI_PHYSICAL_ADDRESS gRellocBase);
|
||
|
VOID* EFIAPI BootArgsFind(IN EFI_PHYSICAL_ADDRESS Start);
|
||
|
|
||
|
|