#include "bootstruct.h"␊ |
␊ |
#ifndef DEBUG_BOOTSTRUCT␊ |
#define DEBUG_BOOTSTRUCT 0␊ |
␉#define DEBUG_BOOTSTRUCT 0␊ |
#endif␊ |
␊ |
#if DEBUG_BOOTSTRUCT␊ |
#define DBG(x...)␉printf(x)␊ |
␉#define DBG(x...)␉printf(x)␊ |
#else␊ |
#define DBG(x...)␉msglog(x)␊ |
␉#define DBG(x...)␉msglog(x)␊ |
#endif␊ |
␊ |
/*==========================================================================␊ |
|
* the kernel by the booter.␊ |
*/␊ |
␊ |
boot_args␉␉*bootArgs;␊ |
boot_args_pre_lion␉*bootArgsPreLion;␊ |
boot_args␉␉*bootArgs␉= NULL;␊ |
boot_args_legacy␉*bootArgsLegacy␉= NULL;␊ |
␊ |
PrivateBootInfo_t␉*bootInfo;␊ |
PrivateBootInfo_t␉*bootInfo␉= NULL;␊ |
Node␉␉␉*gMemoryMapNode;␊ |
␊ |
static char platformName[64];␊ |
|
{␊ |
␉Node *node;␊ |
␉int nameLen;␊ |
␊ |
␉static int init_done = 0;␊ |
␊ |
␉if ( !init_done )␊ |
␉{␊ |
␉␉bootArgs = (boot_args *)malloc(sizeof(boot_args));␊ |
␉␉bootArgsPreLion = (boot_args_pre_lion *)malloc(sizeof(boot_args_pre_lion));␊ |
␉␉bootArgsLegacy = (boot_args_legacy *)malloc(sizeof(boot_args_legacy));␊ |
␉␉bootInfo = (PrivateBootInfo_t *)malloc(sizeof(PrivateBootInfo_t));␊ |
␉␉if (bootArgs == 0 || bootArgsPreLion == 0 || bootInfo == 0)␊ |
␊ |
␉␉if (bootArgs == 0 || bootArgsLegacy == 0 || bootInfo == 0)␊ |
␉␉{␊ |
␉␉␉stop("Couldn't allocate boot info\n");␊ |
␉␉}␊ |
␊ |
␉␉bzero(bootArgs, sizeof(boot_args));␊ |
␉␉bzero(bootArgsPreLion, sizeof(boot_args_pre_lion));␊ |
␉␉bzero(bootArgsLegacy, sizeof(boot_args_legacy));␊ |
␉␉bzero(bootInfo, sizeof(PrivateBootInfo_t));␊ |
␊ |
␉␉// Get system memory map. Also update the size of the␊ |
|
␉␉DT__Initialize();␊ |
␊ |
␉␉node = DT__FindNode("/", true);␊ |
␉␉if (node == 0) {␊ |
␉␉if (node == 0)␊ |
␉␉{␊ |
␉␉␉stop("Couldn't create root node");␊ |
␉␉}␊ |
␊ |
␉␉getPlatformName(platformName, sizeof(platformName));␊ |
␊ |
␉␉nameLen = strlen(platformName) + 1;␊ |
␉␉DT__AddProperty(node, "compatible", nameLen, platformName);␊ |
␉␉DT__AddProperty(node, "model", nameLen, platformName);␊ |
|
␉␉bootArgs->Version = kBootArgsVersion;␊ |
␉␉bootArgs->Revision = kBootArgsRevision;␊ |
␊ |
␉␉bootArgsPreLion->Version = kBootArgsPreLionVersion;␊ |
␉␉bootArgsPreLion->Revision = kBootArgsPreLionRevision;␊ |
␉␉bootArgsLegacy->Version = kBootArgsLegacyVersion;␊ |
␉␉bootArgsLegacy->Revision = kBootArgsLegacyRevision;␊ |
␊ |
␉␉init_done = 1;␊ |
␉}␊ |
|
␉if ( TIGER || LEOPARD || SNOW_LEOPARD )␊ |
␉{␊ |
␉␉// for 10.4 10.5 10.6␊ |
␉␉void *oldAddr = bootArgsPreLion;␊ |
␉␉bootArgsPreLion = (boot_args_pre_lion *)AllocateKernelMemory(sizeof(boot_args_pre_lion));␊ |
␉␉bcopy(oldAddr, bootArgsPreLion, sizeof(boot_args_pre_lion));␊ |
␉␉void *oldAddr = bootArgsLegacy;␊ |
␉␉bootArgsLegacy = (boot_args_legacy *)AllocateKernelMemory(sizeof(boot_args_legacy));␊ |
␉␉bcopy(oldAddr, bootArgsLegacy, sizeof(boot_args_legacy));␊ |
␉}␊ |
␉else␊ |
␉{␊ |
|
␉uint32_t size;␊ |
␉void *addr;␊ |
␉int i;␊ |
␉EfiMemoryRange *memoryMap;␊ |
␉MemoryRange *range;␊ |
␊ |
␉EfiMemoryRange *memoryMap␉= NULL;␊ |
␉MemoryRange *range␉␉= NULL;␊ |
␉int memoryMapCount = bootInfo->memoryMapCount;␊ |
␊ |
␉if (memoryMapCount == 0)␊ |
|
␉// convert memory map to boot_args memory map␊ |
␉memoryMap = (EfiMemoryRange *)AllocateKernelMemory(sizeof(EfiMemoryRange) * memoryMapCount);␊ |
␊ |
␉bootArgs->MemoryMap␉␉␉␉␉␉= (uint32_t)memoryMap;␊ |
␉bootArgs->MemoryMapSize␉␉␉␉␉␉= sizeof(EfiMemoryRange) * memoryMapCount;␊ |
␉bootArgs->MemoryMapDescriptorSize␉␉␉␉= sizeof(EfiMemoryRange);␊ |
␉bootArgs->MemoryMapDescriptorVersion␉␉␉␉= 0;␊ |
␉bootArgs->MemoryMap␉␉␉= (uint32_t)memoryMap;␊ |
␉bootArgs->MemoryMapSize␉␉␉= sizeof(EfiMemoryRange) * memoryMapCount;␊ |
␉bootArgs->MemoryMapDescriptorSize␉= sizeof(EfiMemoryRange);␊ |
␉bootArgs->MemoryMapDescriptorVersion␉= 0;␊ |
␊ |
␉for (i = 0; i < memoryMapCount; i++, memoryMap++)␊ |
␉{␊ |
|
␉// Flatten device tree␊ |
␉DT__FlattenDeviceTree(0, &size);␊ |
␉addr = (void *)AllocateKernelMemory(size);␊ |
␊ |
␉if (addr == 0)␊ |
␉{␊ |
␉␉stop("Couldn't allocate device tree\n");␊ |
|
␊ |
␉// Copy BootArgs values to older structure␊ |
␊ |
␉memcpy(&bootArgsPreLion->CommandLine, &bootArgs->CommandLine, BOOT_LINE_LENGTH);␊ |
␉memcpy(&bootArgsPreLion->Video, &bootArgs->Video, sizeof(Boot_Video));␊ |
␉memcpy(&bootArgsLegacy->CommandLine, &bootArgs->CommandLine, BOOT_LINE_LENGTH);␊ |
␉memcpy(&bootArgsLegacy->Video, &bootArgs->Video, sizeof(Boot_Video));␊ |
␊ |
␉bootArgsPreLion->MemoryMap = bootArgs->MemoryMap;␊ |
␉bootArgsPreLion->MemoryMapSize = bootArgs->MemoryMapSize;␊ |
␉bootArgsPreLion->MemoryMapDescriptorSize = bootArgs->MemoryMapDescriptorSize;␊ |
␉bootArgsPreLion->MemoryMapDescriptorVersion = bootArgs->MemoryMapDescriptorVersion;␊ |
␉bootArgsLegacy->MemoryMap = bootArgs->MemoryMap;␊ |
␉bootArgsLegacy->MemoryMapSize = bootArgs->MemoryMapSize;␊ |
␉bootArgsLegacy->MemoryMapDescriptorSize = bootArgs->MemoryMapDescriptorSize;␊ |
␉bootArgsLegacy->MemoryMapDescriptorVersion = bootArgs->MemoryMapDescriptorVersion;␊ |
␊ |
␉bootArgsPreLion->deviceTreeP = bootArgs->deviceTreeP;␊ |
␉bootArgsPreLion->deviceTreeLength = bootArgs->deviceTreeLength;␊ |
␉bootArgsLegacy->deviceTreeP = bootArgs->deviceTreeP;␊ |
␉bootArgsLegacy->deviceTreeLength = bootArgs->deviceTreeLength;␊ |
␊ |
␉bootArgsPreLion->kaddr = bootArgs->kaddr;␊ |
␉bootArgsPreLion->ksize = bootArgs->ksize;␊ |
␉bootArgsLegacy->kaddr = bootArgs->kaddr;␊ |
␉bootArgsLegacy->ksize = bootArgs->ksize;␊ |
␊ |
␉bootArgsPreLion->efiRuntimeServicesPageStart = bootArgs->efiRuntimeServicesPageStart;␊ |
␉bootArgsPreLion->efiRuntimeServicesPageCount = bootArgs->efiRuntimeServicesPageCount;␊ |
␉bootArgsPreLion->efiSystemTable = bootArgs->efiSystemTable;␊ |
␉bootArgsLegacy->efiRuntimeServicesPageStart = bootArgs->efiRuntimeServicesPageStart;␊ |
␉bootArgsLegacy->efiRuntimeServicesPageCount = bootArgs->efiRuntimeServicesPageCount;␊ |
␉bootArgsLegacy->efiSystemTable = bootArgs->efiSystemTable;␊ |
␊ |
␉bootArgsPreLion->efiMode = bootArgs->efiMode;␊ |
␉bootArgsLegacy->efiMode = bootArgs->efiMode;␊ |
␊ |
␉bootArgsPreLion->performanceDataStart = bootArgs->performanceDataStart;␊ |
␉bootArgsPreLion->performanceDataSize = bootArgs->performanceDataSize;␊ |
␉bootArgsPreLion->efiRuntimeServicesVirtualPageStart = bootArgs->efiRuntimeServicesVirtualPageStart;␊ |
␉bootArgsLegacy->performanceDataStart = bootArgs->performanceDataStart;␊ |
␉bootArgsLegacy->performanceDataSize = bootArgs->performanceDataSize;␊ |
␉bootArgsLegacy->efiRuntimeServicesVirtualPageStart = bootArgs->efiRuntimeServicesVirtualPageStart;␊ |
}␊ |