Changeset 9970a5a in mainline for kernel/generic/src/main


Ignore:
Timestamp:
2012-01-27T23:24:27Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7b3b571, fe56c08a
Parents:
d81eaf94 (diff), 221c9ec (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge from lp:~jakub/helenos/mm.

Location:
kernel/generic/src/main
Files:
2 edited

Legend:

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

    rd81eaf94 r9970a5a  
    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                uintptr_t page = km_map(init.tasks[i].paddr,
     208                    init.tasks[i].size,
     209                    PAGE_READ | PAGE_WRITE | PAGE_CACHEABLE);
     210                ASSERT(page);
     211               
     212                int rc = program_create_from_image((void *) page, namebuf,
     213                    &programs[i]);
    204214               
    205215                if (rc == 0) {
     
    224234                         * Assume the last task is the RAM disk.
    225235                         */
    226                         init_rd((void *) init.tasks[i].addr, init.tasks[i].size);
     236                        init_rd((void *) init.tasks[i].paddr, init.tasks[i].size);
    227237                } else
    228238                        printf("init[%zu]: Init binary load failed (error %d)\n", i, rc);
  • kernel/generic/src/main/main.c

    rd81eaf94 r9970a5a  
    151151        size_t i;
    152152        for (i = 0; i < init.cnt; i++) {
    153                 if (PA_OVERLAPS(config.stack_base, config.stack_size,
    154                     init.tasks[i].addr, init.tasks[i].size))
    155                         config.stack_base = ALIGN_UP(init.tasks[i].addr +
    156                             init.tasks[i].size, config.stack_size);
     153                if (overlaps(KA2PA(config.stack_base), config.stack_size,
     154                    init.tasks[i].paddr, init.tasks[i].size)) {
     155                        /*
     156                         * The init task overlaps with the memory behind the
     157                         * kernel image so it must be in low memory and we can
     158                         * use PA2KA on the init task's physical address.
     159                         */
     160                        config.stack_base = ALIGN_UP(
     161                            PA2KA(init.tasks[i].paddr) + init.tasks[i].size,
     162                            config.stack_size);
     163                }
    157164        }
    158165       
Note: See TracChangeset for help on using the changeset viewer.