Ignore:
File:
1 edited

Legend:

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

    rf35749e r128359eb  
    11/*
    2  * Copyright (c) 2025 Jiri Svoboda
    32 * Copyright (c) 2001-2004 Jakub Jermar
    43 * All rights reserved.
     
    8180#include <arch/arch.h>
    8281#include <arch.h>
     82#include <arch/faddr.h>
    8383#include <ipc/ipc.h>
    8484#include <macros.h>
     
    111111CHECK_INT_TYPE(64);
    112112
    113 task_t *kernel_task;
    114 
    115113/** Global configuration structure. */
    116114config_t config = {
     
    134132};
    135133
    136 static context_t ctx;
    137 
    138 // NOTE: All kernel stacks must be aligned to STACK_SIZE, see CURRENT.
    139 static const size_t bootstrap_stack_size = STACK_SIZE;
    140 static _Alignas(STACK_SIZE) uint8_t bootstrap_stack[STACK_SIZE];
    141 
    142 /* Just a convenient value for some assembly code. */
    143 uint8_t *const bootstrap_stack_top = bootstrap_stack + STACK_SIZE;
     134context_t ctx;
     135
     136/** Lowest safe stack virtual address. */
     137uintptr_t stack_safe = 0;
    144138
    145139/*
     
    176170            ALIGN_UP((uintptr_t) kdata_end - config.base, PAGE_SIZE);
    177171
    178         context_create(&ctx, main_bsp_separated_stack,
    179             bootstrap_stack, bootstrap_stack_size);
     172        /*
     173         * NOTE: All kernel stacks must be aligned to STACK_SIZE,
     174         *       see CURRENT.
     175         */
     176
     177        /* Place the stack after the kernel, init and ballocs. */
     178        config.stack_base =
     179            ALIGN_UP(config.base + config.kernel_size, STACK_SIZE);
     180        config.stack_size = STACK_SIZE;
     181
     182        /* Avoid placing stack on top of init */
     183        size_t i;
     184        for (i = 0; i < init.cnt; i++) {
     185                uintptr_t p = init.tasks[i].paddr + init.tasks[i].size;
     186                uintptr_t bottom = PA2KA(ALIGN_UP(p, STACK_SIZE));
     187
     188                if (config.stack_base < bottom)
     189                        config.stack_base = bottom;
     190        }
     191
     192        /* Avoid placing stack on top of boot allocations. */
     193        if (ballocs.size) {
     194                uintptr_t bottom =
     195                    ALIGN_UP(ballocs.base + ballocs.size, STACK_SIZE);
     196                if (config.stack_base < bottom)
     197                        config.stack_base = bottom;
     198        }
     199
     200        if (config.stack_base < stack_safe)
     201                config.stack_base = ALIGN_UP(stack_safe, STACK_SIZE);
     202
     203        context_save(&ctx);
     204        context_set(&ctx, FADDR(main_bsp_separated_stack),
     205            config.stack_base, STACK_SIZE);
    180206        context_restore(&ctx);
    181207        /* not reached */
     
    194220        version_print();
    195221
    196         LOG("\nconfig.base=%p config.kernel_size=%zu",
    197             (void *) config.base, config.kernel_size);
     222        LOG("\nconfig.base=%p config.kernel_size=%zu"
     223            "\nconfig.stack_base=%p config.stack_size=%zu",
     224            (void *) config.base, config.kernel_size,
     225            (void *) config.stack_base, config.stack_size);
    198226
    199227#ifdef CONFIG_KCONSOLE
     
    276304                panic("Cannot create kernel task.");
    277305
    278         kernel_task = kernel;
    279 
    280306        /*
    281307         * Create the first thread.
     
    285311        if (!kinit_thread)
    286312                panic("Cannot create kinit thread.");
    287         thread_start(kinit_thread);
    288         thread_detach(kinit_thread);
    289 
    290         /*
    291          * This call to scheduler_run() will return to kinit,
     313        thread_ready(kinit_thread);
     314
     315        /*
     316         * This call to scheduler() will return to kinit,
    292317         * starting the thread of kernel threads.
    293318         */
    294         current_copy(CURRENT, (current_t *) CPU_LOCAL->stack);
    295         context_replace(scheduler_run, CPU_LOCAL->stack, STACK_SIZE);
     319        scheduler();
    296320        /* not reached */
    297321}
     
    333357        ARCH_OP(post_cpu_init);
    334358
     359        current_copy(CURRENT, (current_t *) CPU->stack);
     360
    335361        /*
    336362         * If we woke kmp up before we left the kernel stack, we could
     
    338364         * switch to this cpu's private stack prior to waking kmp up.
    339365         */
    340         current_copy(CURRENT, (current_t *) CPU_LOCAL->stack);
    341         context_replace(main_ap_separated_stack, CPU_LOCAL->stack, STACK_SIZE);
     366        context_save(&CPU->saved_context);
     367        context_set(&CPU->saved_context, FADDR(main_ap_separated_stack),
     368            (uintptr_t) CPU->stack, STACK_SIZE);
     369        context_restore(&CPU->saved_context);
    342370        /* not reached */
    343371}
     
    355383        timeout_init();
    356384
    357         semaphore_up(&ap_completion_semaphore);
    358         scheduler_run();
     385        waitq_wakeup(&ap_completion_wq, WAKEUP_FIRST);
     386        scheduler();
    359387        /* not reached */
    360388}
Note: See TracChangeset for help on using the changeset viewer.