Changeset 32817cc in mainline for kernel/generic/src/main/kinit.c


Ignore:
Timestamp:
2012-01-25T22:59:35Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4dee0cb
Parents:
7943c43
Message:

Make the kernel ready for init tasks loaded to high memory.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/main/kinit.c

    r7943c43 r32817cc  
    5757#include <mm/as.h>
    5858#include <mm/frame.h>
     59#include <mm/km.h>
    5960#include <print.h>
    6061#include <memstr.h>
     
    6869#include <str.h>
    6970#include <sysinfo/stats.h>
     71#include <align.h>
    7072
    7173#ifdef CONFIG_SMP
     
    178180       
    179181        for (i = 0; i < init.cnt; i++) {
    180                 if (init.tasks[i].addr % FRAME_SIZE) {
     182                if (init.tasks[i].paddr % FRAME_SIZE) {
    181183                        printf("init[%zu]: Address is not frame aligned\n", i);
    182184                        programs[i].task = NULL;
     
    199201                str_cpy(namebuf + INIT_PREFIX_LEN,
    200202                    TASK_NAME_BUFLEN - INIT_PREFIX_LEN, name);
    201                
    202                 int rc = program_create_from_image((void *) init.tasks[i].addr,
    203                     namebuf, &programs[i]);
     203
     204                /*
     205                 * Create virtual memory mappings for init task images.
     206                 */
     207                size_t size = ALIGN_UP(init.tasks[i].size, PAGE_SIZE);
     208                size_t offs;
     209                uintptr_t page = km_page_alloc(size, PAGE_SIZE);
     210                uintptr_t frame = init.tasks[i].paddr;
     211
     212                page_table_lock(AS_KERNEL, true);
     213                for (offs = 0; offs < size; offs += PAGE_SIZE) {
     214                        page_mapping_insert(AS_KERNEL, page + offs,
     215                            frame + offs,
     216                            PAGE_READ | PAGE_WRITE | PAGE_CACHEABLE |
     217                            PAGE_PRESENT);
     218                }
     219                page_table_unlock(AS_KERNEL, true);
     220               
     221                int rc = program_create_from_image((void *) page, namebuf,
     222                    &programs[i]);
    204223               
    205224                if (rc == 0) {
     
    224243                         * Assume the last task is the RAM disk.
    225244                         */
    226                         init_rd((void *) init.tasks[i].addr, init.tasks[i].size);
     245                        init_rd((void *) frame, init.tasks[i].size);
    227246                } else
    228247                        printf("init[%zu]: Init binary load failed (error %d)\n", i, rc);
Note: See TracChangeset for help on using the changeset viewer.