Ignore:
File:
1 edited

Legend:

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

    r128359eb rf35749e  
    11/*
     2 * Copyright (c) 2025 Jiri Svoboda
    23 * Copyright (c) 2001-2004 Jakub Jermar
    34 * All rights reserved.
     
    8081#include <arch/arch.h>
    8182#include <arch.h>
    82 #include <arch/faddr.h>
    8383#include <ipc/ipc.h>
    8484#include <macros.h>
     
    111111CHECK_INT_TYPE(64);
    112112
     113task_t *kernel_task;
     114
    113115/** Global configuration structure. */
    114116config_t config = {
     
    132134};
    133135
    134 context_t ctx;
    135 
    136 /** Lowest safe stack virtual address. */
    137 uintptr_t stack_safe = 0;
     136static context_t ctx;
     137
     138// NOTE: All kernel stacks must be aligned to STACK_SIZE, see CURRENT.
     139static const size_t bootstrap_stack_size = STACK_SIZE;
     140static _Alignas(STACK_SIZE) uint8_t bootstrap_stack[STACK_SIZE];
     141
     142/* Just a convenient value for some assembly code. */
     143uint8_t *const bootstrap_stack_top = bootstrap_stack + STACK_SIZE;
    138144
    139145/*
     
    170176            ALIGN_UP((uintptr_t) kdata_end - config.base, PAGE_SIZE);
    171177
    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);
     178        context_create(&ctx, main_bsp_separated_stack,
     179            bootstrap_stack, bootstrap_stack_size);
    206180        context_restore(&ctx);
    207181        /* not reached */
     
    220194        version_print();
    221195
    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);
     196        LOG("\nconfig.base=%p config.kernel_size=%zu",
     197            (void *) config.base, config.kernel_size);
    226198
    227199#ifdef CONFIG_KCONSOLE
     
    304276                panic("Cannot create kernel task.");
    305277
     278        kernel_task = kernel;
     279
    306280        /*
    307281         * Create the first thread.
     
    311285        if (!kinit_thread)
    312286                panic("Cannot create kinit thread.");
    313         thread_ready(kinit_thread);
    314 
    315         /*
    316          * This call to scheduler() will return to kinit,
     287        thread_start(kinit_thread);
     288        thread_detach(kinit_thread);
     289
     290        /*
     291         * This call to scheduler_run() will return to kinit,
    317292         * starting the thread of kernel threads.
    318293         */
    319         scheduler();
     294        current_copy(CURRENT, (current_t *) CPU_LOCAL->stack);
     295        context_replace(scheduler_run, CPU_LOCAL->stack, STACK_SIZE);
    320296        /* not reached */
    321297}
     
    357333        ARCH_OP(post_cpu_init);
    358334
    359         current_copy(CURRENT, (current_t *) CPU->stack);
    360 
    361335        /*
    362336         * If we woke kmp up before we left the kernel stack, we could
     
    364338         * switch to this cpu's private stack prior to waking kmp up.
    365339         */
    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);
     340        current_copy(CURRENT, (current_t *) CPU_LOCAL->stack);
     341        context_replace(main_ap_separated_stack, CPU_LOCAL->stack, STACK_SIZE);
    370342        /* not reached */
    371343}
     
    383355        timeout_init();
    384356
    385         waitq_wakeup(&ap_completion_wq, WAKEUP_FIRST);
    386         scheduler();
     357        semaphore_up(&ap_completion_semaphore);
     358        scheduler_run();
    387359        /* not reached */
    388360}
Note: See TracChangeset for help on using the changeset viewer.