mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-27 12:15:19 +01:00
f35acfa5ab
Signed-off-by: Sergey Isakov <isakov-sl@bk.ru>
293 lines
11 KiB
C
293 lines
11 KiB
C
/**
|
|
|
|
Methods for finding, checking and fixing boot args
|
|
|
|
by dmazar
|
|
|
|
**/
|
|
|
|
#include <Library/UefiLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
|
|
#include "BootArgs.h"
|
|
#include "Lib.h"
|
|
#include "NVRAMDebug.h"
|
|
|
|
// DBG_TO: 0=no debug, 1=serial, 2=console
|
|
// serial requires
|
|
// [PcdsFixedAtBuild]
|
|
// gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x07
|
|
// gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0xFFFFFFFF
|
|
// in package DSC file
|
|
#define DBG_TO 0
|
|
|
|
#if DBG_TO == 2
|
|
#define DBG(...) AsciiPrint(__VA_ARGS__);
|
|
#elif DBG_TO == 1
|
|
#define DBG(...) DebugPrint(1, __VA_ARGS__);
|
|
#else
|
|
#define DBG(...)
|
|
#endif
|
|
|
|
|
|
VOID
|
|
EFIAPI
|
|
BootArgsPrint(VOID *bootArgs)
|
|
{
|
|
|
|
#if (DBG_TO > 0) || (DEBUG_TO_NVRAM > 0)
|
|
|
|
BootArgs1 *BA1 = bootArgs;
|
|
BootArgs2 *BA2 = bootArgs;
|
|
|
|
if (BA1->Version == kBootArgsVersion1) {
|
|
|
|
// pre Lion
|
|
DBG("BootArgs at 0x%p\n", BA1);
|
|
DBGnvr("BootArgs at 0x%p\n", BA1);
|
|
|
|
DBG(" Revision: 0x%x, Version: 0x%x, efiMode: 0x%x (%d), res10: %x, res11: %x, res12: %x, res20: %x\n",
|
|
BA1->Revision, BA1->Version, BA1->efiMode, BA1->efiMode,
|
|
BA1->__reserved1[0], BA1->__reserved1[1], BA1->__reserved1[2],
|
|
BA1->__reserved2[0]
|
|
);
|
|
DBGnvr(" Revision: 0x%x, Version: 0x%x, efiMode: 0x%x (%d), res10: %x, res11: %x, res12: %x, res20: %x\n",
|
|
BA1->Revision, BA1->Version, BA1->efiMode, BA1->efiMode,
|
|
BA1->__reserved1[0], BA1->__reserved1[1], BA1->__reserved1[2],
|
|
BA1->__reserved2[0]
|
|
);
|
|
|
|
DBG(" CommandLine: %a\n", BA1->CommandLine);
|
|
DBGnvr(" CommandLine: %a\n", BA1->CommandLine);
|
|
|
|
DBG(" MemoryMap: 0x%x, MMSize: 0x%x, MMDescSize: 0x%x, MMDescVersion: 0x%x\n",
|
|
BA1->MemoryMap, BA1->MemoryMapSize, BA1->MemoryMapDescriptorSize, BA1->MemoryMapDescriptorVersion
|
|
);
|
|
DBGnvr(" MemoryMap: 0x%x, MMSize: 0x%x, MMDescSize: 0x%x, MMDescVersion: 0x%x\n",
|
|
BA1->MemoryMap, BA1->MemoryMapSize, BA1->MemoryMapDescriptorSize, BA1->MemoryMapDescriptorVersion
|
|
);
|
|
|
|
DBG(" Boot_Video v_baseAddr: 0x%x, v_display: 0x%x, v_rowBytes: 0x%x, v_width: %d, v_height: %d, v_depth: %d\n",
|
|
BA1->Video.v_baseAddr, BA1->Video.v_display,
|
|
BA1->Video.v_rowBytes, BA1->Video.v_width, BA1->Video.v_height, BA1->Video.v_depth
|
|
);
|
|
DBGnvr(" Boot_Video v_baseAddr: 0x%x, v_display: 0x%x, v_rowBytes: 0x%x, v_width: %d, v_height: %d, v_depth: %d\n",
|
|
BA1->Video.v_baseAddr, BA1->Video.v_display,
|
|
BA1->Video.v_rowBytes, BA1->Video.v_width, BA1->Video.v_height, BA1->Video.v_depth
|
|
);
|
|
|
|
DBG(" deviceTreeP: 0x%x, deviceTreeLength: 0x%x, kaddr: 0x%x, ksize: 0x%x\n",
|
|
BA1->deviceTreeP, BA1->deviceTreeLength, BA1->kaddr, BA1->ksize
|
|
);
|
|
DBGnvr(" deviceTreeP: 0x%x, deviceTreeLength: 0x%x, kaddr: 0x%x, ksize: 0x%x\n",
|
|
BA1->deviceTreeP, BA1->deviceTreeLength, BA1->kaddr, BA1->ksize
|
|
);
|
|
|
|
DBG(" efiRTServPgStart: 0x%x, efiRTServPgCount: 0x%x, efiRTServVPgStart: 0x%lx\n",
|
|
BA1->efiRuntimeServicesPageStart, BA1->efiRuntimeServicesPageCount, BA1->efiRuntimeServicesVirtualPageStart
|
|
);
|
|
DBGnvr(" efiRTServPgStart: 0x%x, efiRTServPgCount: 0x%x, efiRTServVPgStart: 0x%lx\n",
|
|
BA1->efiRuntimeServicesPageStart, BA1->efiRuntimeServicesPageCount, BA1->efiRuntimeServicesVirtualPageStart
|
|
);
|
|
|
|
DBG(" efiSystemTable: 0x%x, res2: 0x%x, perfDataStart: 0x%x, perfDataSize: 0x%x\n",
|
|
BA1->efiSystemTable, BA1->__reserved2, BA1->performanceDataStart, BA1->performanceDataSize
|
|
);
|
|
DBGnvr(" efiSystemTable: 0x%x, res2: 0x%x, perfDataStart: 0x%x, perfDataSize: 0x%x\n",
|
|
BA1->efiSystemTable, BA1->__reserved2, BA1->performanceDataStart, BA1->performanceDataSize
|
|
);
|
|
|
|
DBG(" res30: %x, res31: %x\n", BA1->__reserved3[0], BA1->__reserved3[1]);
|
|
DBGnvr(" res30: %x, res31: %x\n", BA1->__reserved3[0], BA1->__reserved3[1]);
|
|
|
|
} else {
|
|
// Lion and up
|
|
DBG("BootArgs at 0x%p\n", BA2);
|
|
DBGnvr("BootArgs at 0x%p\n", BA2);
|
|
|
|
DBG(" Revision: 0x%x, Version: 0x%x, efiMode: 0x%x (%d), debugMode: 0x%x, flags: 0x%x\n",
|
|
BA2->Revision, BA2->Version, BA2->efiMode, BA2->efiMode, BA2->debugMode, BA2->flags
|
|
);
|
|
DBGnvr(" Revision: 0x%x, Version: 0x%x, efiMode: 0x%x (%d), debugMode: 0x%x, flags: 0x%x\n",
|
|
BA2->Revision, BA2->Version, BA2->efiMode, BA2->efiMode, BA2->debugMode, BA2->flags
|
|
);
|
|
|
|
DBG(" CommandLine: %a\n", BA2->CommandLine);
|
|
DBGnvr(" CommandLine: %a\n", BA2->CommandLine);
|
|
|
|
DBG(" MemoryMap: 0x%x, MMSize: 0x%x, MMDescSize: 0x%x, MMDescVersion: 0x%x\n",
|
|
BA2->MemoryMap, BA2->MemoryMapSize, BA2->MemoryMapDescriptorSize, BA2->MemoryMapDescriptorVersion
|
|
);
|
|
DBGnvr(" MemoryMap: 0x%x, MMSize: 0x%x, MMDescSize: 0x%x, MMDescVersion: 0x%x\n",
|
|
BA2->MemoryMap, BA2->MemoryMapSize, BA2->MemoryMapDescriptorSize, BA2->MemoryMapDescriptorVersion
|
|
);
|
|
|
|
DBG(" Boot_Video v_baseAddr: 0x%x, v_display: 0x%x, v_rowBytes: 0x%x, v_width: %d, v_height: %d, v_depth: %d\n",
|
|
BA2->Video.v_baseAddr, BA2->Video.v_display,
|
|
BA2->Video.v_rowBytes, BA2->Video.v_width, BA2->Video.v_height, BA2->Video.v_depth
|
|
);
|
|
DBGnvr(" Boot_Video v_baseAddr: 0x%x, v_display: 0x%x, v_rowBytes: 0x%x, v_width: %d, v_height: %d, v_depth: %d\n",
|
|
BA2->Video.v_baseAddr, BA2->Video.v_display,
|
|
BA2->Video.v_rowBytes, BA2->Video.v_width, BA2->Video.v_height, BA2->Video.v_depth
|
|
);
|
|
|
|
DBG(" deviceTreeP: 0x%x, deviceTreeLength: 0x%x, kaddr: 0x%x, ksize: 0x%x\n",
|
|
BA2->deviceTreeP, BA2->deviceTreeLength, BA2->kaddr, BA2->ksize
|
|
);
|
|
DBGnvr(" deviceTreeP: 0x%x, deviceTreeLength: 0x%x, kaddr: 0x%x, ksize: 0x%x\n",
|
|
BA2->deviceTreeP, BA2->deviceTreeLength, BA2->kaddr, BA2->ksize
|
|
);
|
|
|
|
DBG(" efiRTServPgStart: 0x%x, efiRTServPgCount: 0x%x, efiRTServVPgStart: 0x%lx\n",
|
|
BA2->efiRuntimeServicesPageStart, BA2->efiRuntimeServicesPageCount, BA2->efiRuntimeServicesVirtualPageStart
|
|
);
|
|
DBGnvr(" efiRTServPgStart: 0x%x, efiRTServPgCount: 0x%x, efiRTServVPgStart: 0x%lx\n",
|
|
BA2->efiRuntimeServicesPageStart, BA2->efiRuntimeServicesPageCount, BA2->efiRuntimeServicesVirtualPageStart
|
|
);
|
|
|
|
DBG(" efiSystemTable: 0x%x, kslide: 0x%x, perfDataStart: 0x%x, perfDataSize: 0x%x\n",
|
|
BA2->efiSystemTable, BA2->kslide, BA2->performanceDataStart, BA2->performanceDataSize
|
|
);
|
|
DBGnvr(" efiSystemTable: 0x%x, kslide: 0x%x, perfDataStart: 0x%x, perfDataSize: 0x%x\n",
|
|
BA2->efiSystemTable, BA2->kslide, BA2->performanceDataStart, BA2->performanceDataSize
|
|
);
|
|
|
|
DBG(" keyStDtStart: 0x%x, keyStDtSize: 0x%x, bootMemStart: 0x%lx, bootMemSize: 0x%lx\n",
|
|
BA2->keyStoreDataStart, BA2->keyStoreDataSize, BA2->bootMemStart, BA2->bootMemSize
|
|
);
|
|
DBGnvr(" keyStDtStart: 0x%x, keyStDtSize: 0x%x, bootMemStart: 0x%lx, bootMemSize: 0x%lx\n",
|
|
BA2->keyStoreDataStart, BA2->keyStoreDataSize, BA2->bootMemStart, BA2->bootMemSize
|
|
);
|
|
|
|
DBG(" PhysicalMemorySize: 0x%lx (%d GB), FSBFrequency: 0x%lx (%d MHz)\n",
|
|
BA2->PhysicalMemorySize, BA2->PhysicalMemorySize / (1024 * 1024 * 1024),
|
|
BA2->FSBFrequency, BA2->FSBFrequency / 1000000
|
|
);
|
|
DBGnvr(" PhysicalMemorySize: 0x%lx (%d GB), FSBFrequency: 0x%lx (%d MHz)\n",
|
|
BA2->PhysicalMemorySize, BA2->PhysicalMemorySize / (1024 * 1024 * 1024),
|
|
BA2->FSBFrequency, BA2->FSBFrequency / 1000000
|
|
);
|
|
|
|
DBG(" pciConfigSpaceBaseAddress: 0x%lx, pciConfigSpaceStartBusNumber: 0x%x, pciConfigSpaceEndBusNumber: 0x%x\n",
|
|
BA2->pciConfigSpaceBaseAddress, BA2->pciConfigSpaceStartBusNumber, BA2->pciConfigSpaceEndBusNumber
|
|
);
|
|
DBGnvr(" pciConfigSpaceBaseAddress: 0x%lx, pciConfigSpaceStartBusNumber: 0x%x, pciConfigSpaceEndBusNumber: 0x%x\n",
|
|
BA2->pciConfigSpaceBaseAddress, BA2->pciConfigSpaceStartBusNumber, BA2->pciConfigSpaceEndBusNumber
|
|
);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
BootArgs gBootArgs;
|
|
|
|
BootArgs*
|
|
EFIAPI
|
|
GetBootArgs(VOID *bootArgs)
|
|
{
|
|
BootArgs1 *BA1 = bootArgs;
|
|
BootArgs2 *BA2 = bootArgs;
|
|
|
|
ZeroMem(&gBootArgs, sizeof(gBootArgs));
|
|
|
|
if (BA1->Version == kBootArgsVersion1) {
|
|
// pre Lion
|
|
gBootArgs.MemoryMap = &BA1->MemoryMap;
|
|
gBootArgs.MemoryMapSize = &BA1->MemoryMapSize;
|
|
gBootArgs.MemoryMapDescriptorSize = &BA1->MemoryMapDescriptorSize;
|
|
gBootArgs.MemoryMapDescriptorVersion = &BA1->MemoryMapDescriptorVersion;
|
|
|
|
gBootArgs.deviceTreeP = &BA1->deviceTreeP;
|
|
gBootArgs.deviceTreeLength = &BA1->deviceTreeLength;
|
|
|
|
gBootArgs.kaddr = &BA1->kaddr;
|
|
gBootArgs.ksize = &BA1->ksize;
|
|
|
|
gBootArgs.efiRuntimeServicesPageStart = &BA1->efiRuntimeServicesPageStart;
|
|
gBootArgs.efiRuntimeServicesPageCount = &BA1->efiRuntimeServicesPageCount;
|
|
gBootArgs.efiRuntimeServicesVirtualPageStart = &BA1->efiRuntimeServicesVirtualPageStart;
|
|
gBootArgs.efiSystemTable = &BA1->efiSystemTable;
|
|
} else {
|
|
// Lion and up
|
|
gBootArgs.MemoryMap = &BA2->MemoryMap;
|
|
gBootArgs.MemoryMapSize = &BA2->MemoryMapSize;
|
|
gBootArgs.MemoryMapDescriptorSize = &BA2->MemoryMapDescriptorSize;
|
|
gBootArgs.MemoryMapDescriptorVersion = &BA2->MemoryMapDescriptorVersion;
|
|
|
|
gBootArgs.deviceTreeP = &BA2->deviceTreeP;
|
|
gBootArgs.deviceTreeLength = &BA2->deviceTreeLength;
|
|
|
|
gBootArgs.kaddr = &BA2->kaddr;
|
|
gBootArgs.ksize = &BA2->ksize;
|
|
|
|
gBootArgs.efiRuntimeServicesPageStart = &BA2->efiRuntimeServicesPageStart;
|
|
gBootArgs.efiRuntimeServicesPageCount = &BA2->efiRuntimeServicesPageCount;
|
|
gBootArgs.efiRuntimeServicesVirtualPageStart = &BA2->efiRuntimeServicesVirtualPageStart;
|
|
gBootArgs.efiSystemTable = &BA2->efiSystemTable;
|
|
}
|
|
|
|
return &gBootArgs;
|
|
}
|
|
|
|
|
|
VOID
|
|
EFIAPI
|
|
BootArgsFix(BootArgs *BA, EFI_PHYSICAL_ADDRESS gRellocBase)
|
|
{
|
|
*BA->MemoryMap = *BA->MemoryMap - (UINT32)gRellocBase;
|
|
*BA->deviceTreeP = *BA->deviceTreeP - (UINT32)gRellocBase;
|
|
*BA->kaddr = *BA->kaddr - (UINT32)gRellocBase;
|
|
}
|
|
|
|
/** Searches for bootArgs from Start and returns pointer to bootArgs or ... does not return if can not be found. **/
|
|
VOID *
|
|
EFIAPI
|
|
BootArgsFind(IN EFI_PHYSICAL_ADDRESS Start)
|
|
{
|
|
UINT8 *ptr;
|
|
UINT8 archMode = sizeof(UINTN) * 8;
|
|
BootArgs1 *BA1;
|
|
BootArgs2 *BA2;
|
|
|
|
// start searching from 0x200000.
|
|
ptr = (UINT8*)(UINTN)Start;
|
|
|
|
|
|
while(TRUE) {
|
|
|
|
// check bootargs for 10.7 and up
|
|
BA2 = (BootArgs2*)ptr;
|
|
|
|
if (BA2->Version==2 && BA2->Revision==0
|
|
// plus additional checks - some values are not inited by boot.efi yet
|
|
&& BA2->efiMode == archMode
|
|
&& BA2->kaddr == 0 && BA2->ksize == 0
|
|
&& BA2->efiSystemTable == 0
|
|
)
|
|
{
|
|
break;
|
|
}
|
|
|
|
// check bootargs for 10.4 - 10.6.x
|
|
BA1 = (BootArgs1*)ptr;
|
|
|
|
if (BA1->Version==1
|
|
&& (BA1->Revision==6 || BA1->Revision==5 || BA1->Revision==4)
|
|
// plus additional checks - some values are not inited by boot.efi yet
|
|
&& BA1->efiMode == archMode
|
|
&& BA1->kaddr == 0 && BA1->ksize == 0
|
|
&& BA1->efiSystemTable == 0
|
|
)
|
|
{
|
|
break;
|
|
}
|
|
|
|
ptr += 0x1000;
|
|
}
|
|
|
|
DBG("Found bootArgs2 at %p\n", ptr);
|
|
return ptr;
|
|
}
|
|
|
|
|