Changeset deaa22f in mainline for kernel/generic/src/main/main.c


Ignore:
Timestamp:
2006-08-02T00:42:30Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bf78569
Parents:
adf7f9c
Message:

more sophisticated initial stack handling

File:
1 edited

Legend:

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

    radf7f9c rdeaa22f  
    106106size_t hardcoded_kdata_size = 0;        /**< Size of the kernel data in bytes. */
    107107
     108uintptr_t stack_safe = 0;       /**< Lowest safe stack virtual address */
     109
    108110void main_bsp(void);
    109111void main_ap(void);
     
    133135void main_bsp(void)
    134136{
    135         uintptr_t stackaddr;
    136 
    137137        config.cpu_count = 1;
    138138        config.cpu_active = 1;
     
    142142       
    143143        config.kernel_size = ALIGN_UP(hardcoded_ktext_size + hardcoded_kdata_size, PAGE_SIZE);
    144         stackaddr = config.base + config.kernel_size;
    145        
    146         /* Avoid placing kernel on top of init */
     144        config.stack_size = CONFIG_STACK_SIZE;
     145       
     146        /* Initialy the stack is placed just after the kernel */
     147        config.stack_base = config.base + config.kernel_size;
     148       
     149        /* Avoid placing stack on top of init */
    147150        count_t i;
    148         bool overlap = false;
    149         for (i = 0; i < init.cnt; i++)
    150                 if (PA_overlaps(stackaddr, CONFIG_STACK_SIZE, init.tasks[i].addr, init.tasks[i].size)) {
    151                         stackaddr = ALIGN_UP(init.tasks[i].addr + init.tasks[i].size, CONFIG_STACK_SIZE);
    152                         init.tasks[i].size = ALIGN_UP(init.tasks[i].size, CONFIG_STACK_SIZE) + CONFIG_STACK_SIZE;
    153                         overlap = true;
    154                 }
    155        
    156         if (!overlap)
    157                 config.kernel_size += CONFIG_STACK_SIZE;
     151        for (i = 0; i < init.cnt; i++) {
     152                if (PA_overlaps(config.stack_base, config.stack_size, init.tasks[i].addr, init.tasks[i].size))
     153                        config.stack_base = ALIGN_UP(init.tasks[i].addr + init.tasks[i].size, config.stack_size);
     154        }
     155       
     156        if (config.stack_base < stack_safe)
     157                config.stack_base = ALIGN_UP(stack_safe, PAGE_SIZE);
    158158       
    159159        context_save(&ctx);
    160         context_set(&ctx, FADDR(main_bsp_separated_stack), stackaddr, THREAD_STACK_SIZE);
     160        context_set(&ctx, FADDR(main_bsp_separated_stack), config.stack_base, THREAD_STACK_SIZE);
    161161        context_restore(&ctx);
    162162        /* not reached */
     
    203203
    204204        version_print();
    205         printf("%.*p: hardcoded_ktext_size=%zdK, hardcoded_kdata_size=%zdK\n", sizeof(uintptr_t) * 2, config.base, hardcoded_ktext_size >> 10, hardcoded_kdata_size >> 10);
     205        printf("kernel: %.*p hardcoded_ktext_size=%zdK, hardcoded_kdata_size=%zdK\n", sizeof(uintptr_t) * 2, config.base, hardcoded_ktext_size >> 10, hardcoded_kdata_size >> 10);
     206        printf("stack:  %.*p size=%zdK\n", sizeof(uintptr_t) * 2, config.stack_base, config.stack_size >> 10);
    206207
    207208        arch_pre_smp_init();
Note: See TracChangeset for help on using the changeset viewer.