diff --git a/kernel/include/process.hpp b/kernel/include/process.hpp index 453cc83f..9d410640 100644 --- a/kernel/include/process.hpp +++ b/kernel/include/process.hpp @@ -44,14 +44,11 @@ struct process_t { constexpr const size_t program_base = 0x8000000000; -constexpr const auto user_stack_start = program_base + 0x700000; -constexpr const auto kernel_stack_start = program_base + 0x800000; - constexpr const auto user_stack_size = 2 * paging::PAGE_SIZE; constexpr const auto kernel_stack_size = 2 * paging::PAGE_SIZE; +constexpr const auto user_stack_start = program_base + 0x700000; constexpr const auto user_rsp = user_stack_start + (user_stack_size - 8); -constexpr const auto kernel_rsp = kernel_stack_start + (user_stack_size - 8); } //end of namespace scheduler diff --git a/kernel/src/scheduler.cpp b/kernel/src/scheduler.cpp index 1289f9bd..5a4dc87f 100644 --- a/kernel/src/scheduler.cpp +++ b/kernel/src/scheduler.cpp @@ -58,7 +58,6 @@ void switch_to_process(size_t index){ k_printf("Switched to %u\n", index); - //TODO Move that to scheduler auto& process = processes[current_index]; gdt::tss.rsp0_low = process.kernel_rsp & 0xFFFFFFFF; @@ -71,11 +70,10 @@ void switch_to_process(size_t index){ asm volatile("mov cr3, %0" : : "r" (process.physical_cr3) : "memory"); - //TODO Check if user_rsp is correctly passed asm volatile("xor rax, rax; mov ax, %0; push rax; mov rax, %1; push rax; pushfq; xor rax, rax; mov ax, %2; push rax; mov rax, %3; push rax; iretq" : //No outputs : "r" (process.data_selector), "r" (process.user_rsp), "r" (process.code_selector), "r" (process.rip) - : "rax"); + : "rax", "memory"); } size_t select_next_process(){ diff --git a/kernel/src/shell.cpp b/kernel/src/shell.cpp index a1654aec..c8fb9274 100644 --- a/kernel/src/shell.cpp +++ b/kernel/src/shell.cpp @@ -809,11 +809,9 @@ bool create_paging(char* buffer, scheduler::process_t& process){ //2.1 Allocate user stack allocate_user_memory(process, scheduler::user_stack_start, scheduler::user_stack_size, process.physical_user_stack); + process.user_rsp = scheduler::user_rsp; - //2.2 Allocate kernel stack - allocate_user_memory(process, scheduler::kernel_stack_start, scheduler::kernel_stack_size, process.physical_kernel_stack); - - //2.3 Allocate all user segments + //2.2 Allocate all user segments auto header = reinterpret_cast(buffer); auto program_header_table = reinterpret_cast(buffer + header->e_phoff); @@ -849,6 +847,17 @@ bool create_paging(char* buffer, scheduler::process_t& process){ } } + //2.3 Allocate kernel stack + auto virtual_kernel_stack = virtual_allocator::allocate(scheduler::kernel_stack_size / paging::PAGE_SIZE); + auto physical_kernel_stack = physical_allocator::allocate(scheduler::kernel_stack_size / paging::PAGE_SIZE); + + if(!paging::map_pages(virtual_kernel_stack, physical_kernel_stack, scheduler::kernel_stack_size / paging::PAGE_SIZE)){ + return false; + } + + process.physical_kernel_stack = physical_kernel_stack; + process.kernel_rsp = virtual_kernel_stack + (scheduler::user_stack_size - 8); + //3. Clear stacks clear_physical_memory(process.physical_user_stack, scheduler::user_stack_size / paging::PAGE_SIZE); clear_physical_memory(process.physical_kernel_stack, scheduler::kernel_stack_size / paging::PAGE_SIZE); @@ -887,9 +896,6 @@ void exec_command(const std::vector& params){ return; } - process.kernel_rsp = scheduler::kernel_rsp; - process.user_rsp = scheduler::user_rsp; - process.rip = header->e_entry; process.code_selector = gdt::USER_CODE_SELECTOR + 3; diff --git a/kernel/src/system_calls.cpp b/kernel/src/system_calls.cpp index d0c92118..d8b0f206 100644 --- a/kernel/src/system_calls.cpp +++ b/kernel/src/system_calls.cpp @@ -7,6 +7,7 @@ #include "system_calls.hpp" #include "console.hpp" +#include "scheduler.hpp" namespace { @@ -41,7 +42,7 @@ void system_call_entry(const interrupt::syscall_regs& regs){ break; case 0x666: - //TODO Indicate to the scheduler that the process is over + scheduler::kill_current_process(); break; default: