Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}