aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/pre/src
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/pre/src')
-rw-r--r--arch/x86_64/pre/src/context_switching/main.cpp66
-rw-r--r--arch/x86_64/pre/src/context_switching/syscall/main.cpp35
-rw-r--r--arch/x86_64/pre/src/context_switching/syscall/syscall_enable.cpp32
-rw-r--r--arch/x86_64/pre/src/context_switching/syscall/syscall_handler.cpp121
-rw-r--r--arch/x86_64/pre/src/kernel/main.cpp71
-rw-r--r--arch/x86_64/pre/src/user/main.cpp35
6 files changed, 0 insertions, 360 deletions
diff --git a/arch/x86_64/pre/src/context_switching/main.cpp b/arch/x86_64/pre/src/context_switching/main.cpp
deleted file mode 100644
index 0961499..0000000
--- a/arch/x86_64/pre/src/context_switching/main.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-#include <arch/context_switching/main.hpp>
-
-#include <arch/boot/pointers.hpp>
-#include <arch/context_switching/syscall/syscall_enable.hpp>
-#include <arch/kernel/cpu/call.hpp>
-#include <arch/kernel/cpu/if.hpp>
-#include <arch/kernel/cpu/segment_register.hpp>
-#include <arch/kernel/cpu/tr.hpp>
-#include <arch/user/main.hpp>
-
-namespace teachos::arch::context_switching
-{
- namespace
- {
- constexpr interrupt_descriptor_table::segment_selector KERNEL_CODE_SEGMENT_SELECTOR{
- 1U, interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_KERNEL};
- constexpr kernel::cpu::far_pointer KERNEL_CODE_POINTER{&kernel::cpu::reload_data_segment_registers,
- KERNEL_CODE_SEGMENT_SELECTOR};
- constexpr context_switching::interrupt_descriptor_table::segment_selector USER_CODE_SEGMENT_SELECTOR{
- 3U, context_switching::interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_USER};
- constexpr context_switching::interrupt_descriptor_table::segment_selector USER_DATA_SEGMENT_SELECTOR{
- 4U, context_switching::interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_USER};
-
- auto reload_gdtr() -> void
- {
- kernel::cpu::call(KERNEL_CODE_POINTER);
- }
- } // namespace
-
- auto initialize_descriptor_tables() -> descriptor_tables
- {
- bool static initalized = false;
-
- if (!initalized)
- {
- kernel::cpu::clear_interrupt_flag();
-
- segment_descriptor_table::update_gdtr();
- interrupt_descriptor_table::update_interrupt_descriptor_table_register();
-
- reload_gdtr();
- segment_descriptor_table::update_tss_register();
-
- kernel::cpu::set_interrupt_flag();
- initalized = true;
- }
-
- descriptor_tables tables = {segment_descriptor_table::get_or_create_gdt(),
- interrupt_descriptor_table::get_or_create_interrupt_descriptor_table()};
- return tables;
- }
-
- auto switch_to_user_mode() -> void
- {
- syscall::enable_syscall();
- switch_context(USER_DATA_SEGMENT_SELECTOR, USER_CODE_SEGMENT_SELECTOR, user::main);
- }
-
- auto switch_context(interrupt_descriptor_table::segment_selector data_segment,
- interrupt_descriptor_table::segment_selector code_segment, void (*return_function)()) -> void
- {
- (void)initialize_descriptor_tables();
- kernel::cpu::set_data_segment_registers(data_segment);
- kernel::cpu::set_code_segment_register(data_segment, code_segment, reinterpret_cast<uint64_t>(return_function));
- }
-} // namespace teachos::arch::context_switching
diff --git a/arch/x86_64/pre/src/context_switching/syscall/main.cpp b/arch/x86_64/pre/src/context_switching/syscall/main.cpp
deleted file mode 100644
index 10bd087..0000000
--- a/arch/x86_64/pre/src/context_switching/syscall/main.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <arch/context_switching/syscall/main.hpp>
-
-namespace teachos::arch::context_switching::syscall
-{
- auto syscall(type syscall_number, arguments args) -> response
- {
- asm volatile("mov %[input], %%rax"
- : /* no output from call */
- : [input] "m"(syscall_number)
- : "memory");
-
- asm volatile("mov %[input], %%rdi " : /* no output from call */ : [input] "m"(args.arg_0) : "memory");
- asm volatile("mov %[input], %%rsi" : /* no output from call */ : [input] "m"(args.arg_1) : "memory");
- asm volatile("mov %[input], %%rdx" : /* no output from call */ : [input] "m"(args.arg_2) : "memory");
- asm volatile("mov %[input], %%r10" : /* no output from call */ : [input] "m"(args.arg_3) : "memory");
- asm volatile("mov %[input], %%r8" : /* no output from call */ : [input] "m"(args.arg_4) : "memory");
- asm volatile("mov %[input], %%r9" : /* no output from call */ : [input] "m"(args.arg_5) : "memory");
-
- asm volatile("syscall");
-
- arguments values{};
- asm volatile("mov %%rdi, %[output]" : [output] "=m"(values.arg_0));
- asm volatile("mov %%rsi, %[output]" : [output] "=m"(values.arg_1));
- asm volatile("mov %%rdx, %[output]" : [output] "=m"(values.arg_2));
- asm volatile("mov %%r10, %[output]" : [output] "=m"(values.arg_3));
- asm volatile("mov %%r8, %[output]" : [output] "=m"(values.arg_4));
- asm volatile("mov %%r9, %[output]" : [output] "=m"(values.arg_5));
-
- error error_code{};
- asm volatile("mov %%al, %[output]" : [output] "=m"(error_code));
-
- return {error_code, values};
- }
-
-} // namespace teachos::arch::context_switching::syscall
diff --git a/arch/x86_64/pre/src/context_switching/syscall/syscall_enable.cpp b/arch/x86_64/pre/src/context_switching/syscall/syscall_enable.cpp
deleted file mode 100644
index f9f070a..0000000
--- a/arch/x86_64/pre/src/context_switching/syscall/syscall_enable.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <arch/context_switching/syscall/syscall_enable.hpp>
-
-#include <arch/context_switching/interrupt_descriptor_table/segment_selector.hpp>
-#include <arch/context_switching/syscall/syscall_handler.hpp>
-#include <arch/kernel/cpu/msr.hpp>
-
-namespace teachos::arch::context_switching::syscall
-{
- namespace
- {
- constexpr interrupt_descriptor_table::segment_selector KERNEL_CODE_SEGMENT_SELECTOR{
- 1U, interrupt_descriptor_table::segment_selector::REQUEST_LEVEL_KERNEL};
-
- constexpr auto IA32_STAR_ADDRESS = 0xC000'0081;
- constexpr auto IA32_LSTAR_ADDRESS = 0xC000'0082;
- constexpr auto IA32_FMASK_ADDRESS = 0xC000'0084;
-
- } // namespace
-
- auto enable_syscall() -> void
- {
- uint64_t const syscall_function = reinterpret_cast<uint64_t>(syscall_handler);
- kernel::cpu::write_msr(IA32_LSTAR_ADDRESS, syscall_function);
- kernel::cpu::write_msr(IA32_FMASK_ADDRESS, 0U);
-
- uint64_t const kernel_cs = KERNEL_CODE_SEGMENT_SELECTOR;
- uint64_t const star_value = (kernel_cs << 32) | (kernel_cs << 48);
- kernel::cpu::write_msr(IA32_STAR_ADDRESS, star_value);
-
- kernel::cpu::set_efer_bit(kernel::cpu::efer_flags::SCE);
- }
-} // namespace teachos::arch::context_switching::syscall
diff --git a/arch/x86_64/pre/src/context_switching/syscall/syscall_handler.cpp b/arch/x86_64/pre/src/context_switching/syscall/syscall_handler.cpp
deleted file mode 100644
index 430d65c..0000000
--- a/arch/x86_64/pre/src/context_switching/syscall/syscall_handler.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-#include <arch/context_switching/syscall/syscall_handler.hpp>
-
-#include <arch/context_switching/syscall/main.hpp>
-#include <arch/exception_handling/assert.hpp>
-#include <arch/exception_handling/panic.hpp>
-#include <arch/memory/heap/global_heap_allocator.hpp>
-#include <arch/memory/main.hpp>
-#include <arch/video/vga/text.hpp>
-
-namespace teachos::arch::context_switching::syscall
-{
-
- namespace
- {
- auto write_to_vga_buffer(uint64_t buffer) -> response
- {
- video::vga::text::write(reinterpret_cast<char const *>(buffer),
- video::vga::text::common_attributes::green_on_black);
- video::vga::text::newline();
- return {error::OK};
- }
-
- auto expand_user_heap() -> response
- {
- auto static current_heap_end = memory::heap::USER_HEAP_START;
- uint64_t const heap_start = current_heap_end;
- memory::remap_heap(heap_start, memory::heap::USER_HEAP_SIZE, memory::paging::entry::USER_ACCESSIBLE);
- current_heap_end += memory::heap::USER_HEAP_SIZE;
- return {
- error::OK,
- {heap_start, memory::heap::USER_HEAP_SIZE}
- };
- }
- } // namespace
-
- auto syscall_handler() -> void
- {
- // Saving state of rcx and r11 because it is required by sysretq to function.
- // Calls to other functions potentially overwrite these registers, because of
- // callee saved calling convention.
- uint64_t return_instruction_pointer, rflags = {};
- asm volatile("mov %%rcx, %[output]" : [output] "=m"(return_instruction_pointer));
- asm volatile("mov %%r11, %[output]" : [output] "=m"(rflags));
-
- uint64_t syscall_number, arg_0, arg_1, arg_2, arg_3, arg_4, arg_5 = {};
- asm volatile("mov %%rdi, %[output]" : [output] "=m"(arg_0));
- asm volatile("mov %%rsi, %[output]" : [output] "=m"(arg_1));
- asm volatile("mov %%rdx, %[output]" : [output] "=m"(arg_2));
- asm volatile("mov %%r10, %[output]" : [output] "=m"(arg_3));
- asm volatile("mov %%r8, %[output]" : [output] "=m"(arg_4));
- asm volatile("mov %%r9, %[output]" : [output] "=m"(arg_5));
-
- // RAX is read last, because paired with our type enum, we can use it to check
- // if the register has been written by the compiled code between executing the syscall
- // and now.
- asm volatile("mov %%rax, %[output]" : [output] "=m"(syscall_number));
-
- response result;
- switch (static_cast<type>(syscall_number))
- {
- case type::WRITE:
- result = write_to_vga_buffer(arg_0);
- break;
- case type::EXPAND_HEAP:
- result = expand_user_heap();
- break;
- case type::ASSERT:
- teachos::arch::exception_handling::assert(arg_0, reinterpret_cast<char const *>(arg_1));
- break;
- default:
- teachos::arch::exception_handling::panic("[Syscall Handler] Invalid syscall number");
- break;
- }
-
- asm volatile("mov %[input], %%rax"
- : /* no output from call */
- : [input] "m"(result.error_code)
- : "memory");
-
- asm volatile("mov %[input], %%rdi"
- : /* no output from call */
- : [input] "m"(result.values.arg_0)
- : "memory");
- asm volatile("mov %[input], %%rsi"
- : /* no output from call */
- : [input] "m"(result.values.arg_1)
- : "memory");
- asm volatile("mov %[input], %%rdx"
- : /* no output from call */
- : [input] "m"(result.values.arg_2)
- : "memory");
- asm volatile("mov %[input], %%r10"
- : /* no output from call */
- : [input] "m"(result.values.arg_3)
- : "memory");
- asm volatile("mov %[input], %%r8"
- : /* no output from call */
- : [input] "m"(result.values.arg_4)
- : "memory");
- asm volatile("mov %[input], %%r9"
- : /* no output from call */
- : [input] "m"(result.values.arg_5)
- : "memory");
-
- asm volatile("mov %[input], %%rcx"
- : /* no output from call */
- : [input] "m"(return_instruction_pointer)
- : "memory");
- asm volatile("mov %[input], %%r11"
- : /* no output from call */
- : [input] "m"(rflags)
- : "memory");
-
- // Additionally call leave, because x86 allocates stack space for the internal variables. If we do not clean up this
- // newly created stack frame the syscall instruction that landed in this syscall_handler, will never return to the
- // method that originally called it, because the RIP has not been restored from the previous stack frame.
- asm volatile("leave\n"
- "sysretq");
- }
-
-} // namespace teachos::arch::context_switching::syscall
diff --git a/arch/x86_64/pre/src/kernel/main.cpp b/arch/x86_64/pre/src/kernel/main.cpp
deleted file mode 100644
index 2658678..0000000
--- a/arch/x86_64/pre/src/kernel/main.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-#include <arch/kernel/main.hpp>
-
-#include <arch/boot/pointers.hpp>
-#include <arch/context_switching/interrupt_descriptor_table/segment_selector.hpp>
-#include <arch/context_switching/main.hpp>
-#include <arch/kernel/cpu/if.hpp>
-#include <arch/kernel/cpu/segment_register.hpp>
-#include <arch/memory/heap/bump_allocator.hpp>
-#include <arch/memory/heap/global_heap_allocator.hpp>
-#include <arch/memory/main.hpp>
-#include <arch/memory/multiboot/reader.hpp>
-#include <arch/stl/vector.hpp>
-#include <arch/video/vga/text.hpp>
-
-namespace teachos::arch::kernel
-{
- auto stack_overflow_test(int count) -> int
- {
- int test[5000] = {};
- if (test[0] == 0xFFFF)
- {
- return count;
- }
- count = stack_overflow_test(count);
- return count++;
- }
-
- auto heap_test() -> void
- {
- auto test2 = new memory::multiboot::memory_information{};
- auto test3 = new memory::multiboot::memory_information{};
- auto test4 = *test2;
- auto test5 = *test3;
- test4.kernel_end = 5000;
- test5.kernel_end = 3000;
- auto test6 = test4.kernel_end;
- auto test7 = test5.kernel_end;
- auto test8 = memory::multiboot::read_multiboot2();
- if (test6 && test7 && test8.kernel_end)
- {
- video::vga::text::write("Heap test successful", video::vga::text::common_attributes::green_on_black);
- }
- test2->kernel_end = 2000;
- test2->kernel_start = 1000;
- test2->multiboot_start = 2000;
- delete test2;
- delete test3;
-
- auto test9 = new int(50);
- delete test9;
- }
-
- auto main() -> void
- {
- video::vga::text::clear();
- video::vga::text::cursor(false);
- video::vga::text::write("TeachOS is starting up...", video::vga::text::common_attributes::green_on_black);
- video::vga::text::newline();
-
- memory::initialize_memory_management();
- // stack_overflow_test(0);
-
- memory::heap::global_heap_allocator::register_heap_allocator(memory::heap::heap_allocator_type::LINKED_LIST);
- // heap_test();
-
- auto address = memory::heap::global_heap_allocator::kmalloc(8U);
- (void)address;
-
- context_switching::switch_to_user_mode();
- }
-} // namespace teachos::arch::kernel
diff --git a/arch/x86_64/pre/src/user/main.cpp b/arch/x86_64/pre/src/user/main.cpp
deleted file mode 100644
index 10a17db..0000000
--- a/arch/x86_64/pre/src/user/main.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <arch/user/main.hpp>
-
-#include <arch/context_switching/syscall/main.hpp>
-#include <arch/memory/heap/global_heap_allocator.hpp>
-
-#include <algorithm>
-#include <array>
-#include <atomic>
-#include <ranges>
-
-namespace teachos::arch::user
-{
- auto main() -> void
- {
- constexpr char syscall_message[] = "Successfully entered user mode and wrote to VGA buffer via syscall!";
- context_switching::syscall::syscall(context_switching::syscall::type::WRITE,
- {reinterpret_cast<uint64_t>(&syscall_message)});
-
- // Test C++ standard library
- std::array<std::atomic<uint8_t>, 4> array_test = {std::atomic<uint8_t>{5}, std::atomic<uint8_t>{10},
- std::atomic<uint8_t>{15}, std::atomic<uint8_t>{20}};
- std::ranges::for_each(array_test, [](auto & item) {
- auto value = item.load();
- uint8_t max_value = std::max(value, uint8_t{10});
- item.exchange(max_value + 2);
- });
-
- auto address = new uint64_t{10U};
- (void)address;
-
- for (;;)
- {
- }
- }
-} // namespace teachos::arch::user