diff options
| author | Ada Christine <adachristine18@gmail.com> | 2026-05-20 23:04:06 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2026-05-20 23:04:06 +0000 |
| commit | edc42358664e9d70227e274273321ab032394a7e (patch) | |
| tree | 54fd2de509c9c3cae911cad04328308f28afb0cc /kc/core/arch_thread.c | |
| parent | 0e61096ab498c12ffd0fd2eb993deb31a0a50b09 (diff) | |
new thread code works fine
Diffstat (limited to 'kc/core/arch_thread.c')
| -rw-r--r-- | kc/core/arch_thread.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/kc/core/arch_thread.c b/kc/core/arch_thread.c new file mode 100644 index 0000000..8f5f8d3 --- /dev/null +++ b/kc/core/arch_thread.c @@ -0,0 +1,84 @@ +#include <stdint.h> +#include <stddef.h> +#include <stdnoreturn.h> +#include "task.h" +#include <lib/kstdio.h> + +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"); +} + |
