/** * prepare_kernel * * Prepare and load the Kernel from a concatenated image3 object. */ int prepare_kernel(void) { void *kernelData, *kernelImage; uint32_t kernelSize; loader_context_t ctx; uintptr_t kernelBase; kernelImage = get_image3(kImage3TypeKernel); assert(kernelImage != NULL); image3_get_tag_data(kernelImage, kImage3TagData, &kernelData, &kernelSize); assert((kernelData != NULL) && (kernelSize > 0)); assert(!macho_initialize(&ctx, kernelData)); assert(!macho_set_vm_bias(&ctx, KERNEL_VMADDR)); assert((kernelSize = macho_get_vmsize(&ctx)) > 0); kernelBase = (uintptr_t) memory_region_reserve(&kernel_region, kernelSize, 0); printf("Loading kernel at 0x%08x\n", kernelBase, kernelSize); assert(!macho_file_map(&ctx, kernelBase)); assert(!macho_get_entrypoint(&ctx, &kernel_entrypoint)); kernel_entrypoint = vtophys(kernel_entrypoint, KERNEL_VMADDR, kernel_region.base); return true; }
/** * dtre_init * * Initialize the device tree. */ int dtre_init(void) { void *dt_image, *dt_data; if ((dt_image = image3_get_image(kImage3TypeJsonDeviceTree)) == NULL) { panic("Invalid or missing device tree!\n"); /* NOREACH */ return -1; } image3_get_tag_data(dt_image, kImage3TagData, &dt_data, NULL); if (!parse_jsdt_device_tree(dt_data)) { panic("Failed to parse device tree!\n"); /* NOREACH */ return -1; } return 0; }
/** * prepare_devicetree * * Prepare and flatten the devicetree. */ int prepare_devicetree(void) { void *deviceTreeImage, *deviceTreeData; uint32_t deviceTreeSize, length, pos = 0; Node *root; TagPtr tag; char *xmlRepresentation; deviceTreeImage = get_image3(kImage3TypeXmlDeviceTree); assert(deviceTreeImage != NULL); image3_get_tag_data(deviceTreeImage, kImage3TagData, &deviceTreeData, &deviceTreeSize); /* Create root of DT */ DT__Initialize(); root = DT__RootNode(); xmlRepresentation = (char *)deviceTreeData; /* Enter everything into the DeviceTree. (not mine) */ assert(root); while (1) { length = XMLParseNextTag(xmlRepresentation + pos, &tag); if (length == -1) break; pos += length; if (!tag) continue; if (tag->type == kTagTypeDict) { PopulateDeviceTreeNode(tag, root); XMLFreeTag(tag); return true; } XMLFreeTag(tag); } return false; }