bool ARMKernel::loadBootImage() { BootImage *image; DEBUG(""); Memory::Range range = m_tags.getInitRd2(); DEBUG("initrd = " << range.phys << " (" << range.size << ")"); // TODO: most of this code should be moved to the generic Kernel. image = (BootImage *) range.phys; // Verify this is a correct BootImage if (image->magic[0] == BOOTIMAGE_MAGIC0 && image->magic[1] == BOOTIMAGE_MAGIC1 && image->layoutRevision == BOOTIMAGE_REVISION) { m_bootImageAddress = range.phys; m_bootImageSize = range.size; // Mark its memory used for (Size i = 0; i < m_bootImageSize; i += PAGESIZE) m_alloc->allocate(m_bootImageAddress + i); // Loop BootPrograms for (Size i = 0; i < image->symbolTableCount; i++) loadBootProcess(image, m_bootImageAddress, i); } else ERROR("invalid magic on BootImage"); return true; }
bool IntelKernel::loadBootImage() { MultibootModule *mod; BootImage *image; Arch::Memory virt(0, m_memory); Arch::Memory::Range range; Address vaddr; // Startup boot modules for (Size n = 0; n < multibootInfo.modsCount; n++) { // Map MultibootModule struct // TODO: too many arguments. Make an easier wrapper. vaddr = virt.findFree(PAGESIZE, Memory::KernelPrivate); virt.map(multibootInfo.modsAddress, vaddr, Arch::Memory::Present | Arch::Memory::Readable); mod = (MultibootModule *)(vaddr + multibootInfo.modsAddress % PAGESIZE); mod += n; vaddr = virt.findFree(PAGESIZE, Memory::KernelPrivate), virt.map(mod->string, vaddr, Arch::Memory::Present | Arch::Memory::Readable); String str = (char *) (vaddr + mod->string % PAGESIZE); // Mark its memory used for (Address a = mod->modStart; a < mod->modEnd; a += PAGESIZE) m_memory->allocate(a); // Is this a BootImage? if (str.match("*.img.gz")) { // Map the BootImage into our address space range.phys = mod->modStart; range.size = mod->modEnd - mod->modStart; range.virt = virt.findFree(range.size, Memory::KernelPrivate); range.access = Arch::Memory::Present | Arch::Memory::Readable; virt.mapRange(&range); image = (BootImage *) range.virt; // Verify this is a correct BootImage if (image->magic[0] == BOOTIMAGE_MAGIC0 && image->magic[1] == BOOTIMAGE_MAGIC1 && image->layoutRevision == BOOTIMAGE_REVISION) { m_bootImageAddress = mod->modStart; m_bootImageSize = mod->modEnd - mod->modStart; // Loop BootPrograms for (Size i = 0; i < image->symbolTableCount; i++) loadBootProcess(image, mod->modStart, i); } return true; } } return false; }
Kernel::Result Kernel::loadBootImage() { BootImage *image = (BootImage *) (m_alloc->toVirtual(m_coreInfo->bootImageAddress)); // Verify this is a correct BootImage if (image->magic[0] == BOOTIMAGE_MAGIC0 && image->magic[1] == BOOTIMAGE_MAGIC1 && image->layoutRevision == BOOTIMAGE_REVISION) { // Loop BootPrograms for (Size i = 0; i < image->symbolTableCount; i++) loadBootProcess(image, m_coreInfo->bootImageAddress, i); return Success; } return InvalidBootImage; }
bool Kernel::loadBootImage() { MultibootModule *mod; BootImage *image; bool found = false; #warning Do not assume multiboot support for an architecture /* Startup boot modules. */ for (Size n = 0; n < multibootInfo.modsCount; n++) { mod = &((MultibootModule *) multibootInfo.modsAddress)[n]; String str = (char *) mod->string; /* Mark its memory used */ for (Address a = mod->modStart; a < mod->modEnd; a += PAGESIZE) { m_memory->allocatePhysicalAddress(a); } /* Is this a BootImage? */ if (str.match("*.img.gz")) { /* Map the BootImage into our address space. */ image = (BootImage *) m_memory->map(mod->modStart); m_memory->map(mod->modStart + PAGESIZE); found = true; /* Verify this is a correct BootImage. */ if (image->magic[0] == BOOTIMAGE_MAGIC0 && image->magic[1] == BOOTIMAGE_MAGIC1 && image->layoutRevision == BOOTIMAGE_REVISION) { /* Loop BootPrograms. */ for (Size i = 0; i < image->programsTableCount; i++) { loadBootProcess(image, mod->modStart, i); } } } } /* Done */ return found; }
bool IntelKernel::loadBootImage() { MultibootModule *mod; BootImage *image; // Startup boot modules for (Size n = 0; n < multibootInfo.modsCount; n++) { // Map MultibootModule struct // TODO: too many arguments. Make an easier wrapper. mod = (MultibootModule *) multibootInfo.modsAddress; mod += n; String str((char *)(mod->string)); // Mark its memory used for (Address a = mod->modStart; a < mod->modEnd; a += PAGESIZE) m_alloc->allocate(a); // Is this a BootImage? if (str.match("*.img.gz")) { image = (BootImage *) mod->modStart; // Verify this is a correct BootImage if (image->magic[0] == BOOTIMAGE_MAGIC0 && image->magic[1] == BOOTIMAGE_MAGIC1 && image->layoutRevision == BOOTIMAGE_REVISION) { m_bootImageAddress = mod->modStart; m_bootImageSize = mod->modEnd - mod->modStart; // TODO: move this to Kernel.cpp // Loop BootPrograms for (Size i = 0; i < image->symbolTableCount; i++) loadBootProcess(image, mod->modStart, i); } return true; } } return false; }