#include #include #include #include "task.h" #include struct arch_register_context { uint64_t r15, r14, r13, r12, r11, r10, r9, r8, rsi, rdi, rdx, rcx, rbx, rax, rbp, rsp; }; extern uint64_t *get_tss_rsp0(void); struct arch_thread_context { struct arch_register_context register_context; void *return_address; }; extern void arch_swap_thread_stack( void * volatile *outgoing_stack, void *incoming_stack); extern void arch_begin_thread( void *(func)(void *), void *params); void arch_create_thread( struct kc_thread *thread, void *(*func)(void *), void *params) { uintptr_t stack_pointer = (uintptr_t)thread->kernel_stack_pointer; struct arch_thread_context *context = (struct arch_thread_context *) (stack_pointer -= sizeof(*context)); thread->kernel_stack_pointer = (void *)stack_pointer; context->return_address = (void *)arch_begin_thread; context->register_context.rdi = (uint64_t)func; context->register_context.rsi = (uint64_t)params; context->register_context.rdx = (uint64_t)thread; context->register_context.rsp = (uint64_t)&context->return_address; } void arch_swap_thread( struct kc_thread *outgoing, struct kc_thread *incoming) { kprintf("swapping thread...\n"); kprintf("stack pointer %p\n", incoming->kernel_stack_pointer); arch_swap_thread_stack(&outgoing->kernel_stack_pointer, incoming->kernel_stack_pointer); } void *arch_idle_loop(void *) { for (;;) __asm__ ("hlt"); return nullptr; } noreturn void arch_terminate_thread(void *result, struct kc_thread *thread) { thread->result = (union kc_thread_result){ .pointer = result }; thread->status = TERMINATED; thread->kernel_stack_pointer = thread->kernel_stack_head; task_schedule(); for (;;) __asm__ ("hlt"); }