From c55c201952cdeb9285e519869f0c0939c3a5be9c Mon Sep 17 00:00:00 2001 From: Ada Christine Date: Sun, 24 May 2026 11:37:59 +0000 Subject: arch file to cpu --- kc/core/Makefile | 2 +- kc/core/arch_thread.c | 81 ----------------------------------------------- kc/core/arch_thread.h | 12 ------- kc/core/cpu/arch_thread.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++ kc/core/cpu/arch_thread.h | 12 +++++++ 5 files changed, 94 insertions(+), 94 deletions(-) delete mode 100644 kc/core/arch_thread.c delete mode 100644 kc/core/arch_thread.h create mode 100644 kc/core/cpu/arch_thread.c create mode 100644 kc/core/cpu/arch_thread.h diff --git a/kc/core/Makefile b/kc/core/Makefile index 9791762..730eba7 100644 --- a/kc/core/Makefile +++ b/kc/core/Makefile @@ -6,7 +6,7 @@ VPATH := ../../lib ../../lib/libc ../ cpu/ memory/ TARGET := kernel.os .DEFAULT: $(TARGET) -CPPFLAGS += -I../../api -I../api -I../../lib/api -I. +CPPFLAGS += -I../../api -I../api -I../../lib/api -I. -Icpu/ CFLAGS += -mcmodel=small -Wno-unused-const-variable -Wno-unused-function -fvisibility=hidden -g AOBJS := entry_x86_64.o reloc_x86_64.o dynamic_x86_64.o diff --git a/kc/core/arch_thread.c b/kc/core/arch_thread.c deleted file mode 100644 index c0d707a..0000000 --- a/kc/core/arch_thread.c +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include -#include - -#include - -#include "task.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) -{ - 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(union kc_thread_result result, struct kc_thread *) -{ - kct_terminate(result); - for (;;) __asm__ ("hlt"); -} - diff --git a/kc/core/arch_thread.h b/kc/core/arch_thread.h deleted file mode 100644 index 2b8d0fb..0000000 --- a/kc/core/arch_thread.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -void * arch_idle_loop(void *); - -void arch_create_thread( - struct kc_thread *thread, - void *(kc_thread_func)(void *), - void *params); - -void arch_swap_thread( - struct kc_thread *outgoing, - struct kc_thread *incoming); diff --git a/kc/core/cpu/arch_thread.c b/kc/core/cpu/arch_thread.c new file mode 100644 index 0000000..c0d707a --- /dev/null +++ b/kc/core/cpu/arch_thread.c @@ -0,0 +1,81 @@ +#include +#include +#include + +#include + +#include "task.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) +{ + 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(union kc_thread_result result, struct kc_thread *) +{ + kct_terminate(result); + for (;;) __asm__ ("hlt"); +} + diff --git a/kc/core/cpu/arch_thread.h b/kc/core/cpu/arch_thread.h new file mode 100644 index 0000000..2b8d0fb --- /dev/null +++ b/kc/core/cpu/arch_thread.h @@ -0,0 +1,12 @@ +#pragma once + +void * arch_idle_loop(void *); + +void arch_create_thread( + struct kc_thread *thread, + void *(kc_thread_func)(void *), + void *params); + +void arch_swap_thread( + struct kc_thread *outgoing, + struct kc_thread *incoming); -- cgit v1.3.1-1-g115d