From ad1167f32b0e1b5d9656539aa22c7c4a8e56d82f Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Fri, 5 Aug 2016 12:20:09 +0200 Subject: [PATCH] Transmit tss as early memory --- kernel/include/early_memory.hpp | 2 ++ kernel/include/gdt.hpp | 4 ++-- kernel/src/boot/boot_16.cpp | 14 ++++++-------- kernel/src/gdt.cpp | 5 +++++ kernel/src/scheduler.cpp | 4 ++-- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/kernel/include/early_memory.hpp b/kernel/include/early_memory.hpp index c62ef019..45f5acca 100644 --- a/kernel/include/early_memory.hpp +++ b/kernel/include/early_memory.hpp @@ -65,4 +65,6 @@ inline void vesa_enabled(bool value){ *reinterpret_cast(vesa_enabled_address) = value ? 1 : 0; } +constexpr const uint32_t tss_address = 0x904A0; // 104 bytes (aligned to 128) + #endif diff --git a/kernel/include/gdt.hpp b/kernel/include/gdt.hpp index a982b729..c024f2bb 100644 --- a/kernel/include/gdt.hpp +++ b/kernel/include/gdt.hpp @@ -105,10 +105,10 @@ struct task_state_segment_t { uint16_t io_map_base_address; }; -extern task_state_segment_t tss; - void flush_tss(); +task_state_segment_t& tss(); + } //end of namespace gdt #endif diff --git a/kernel/src/boot/boot_16.cpp b/kernel/src/boot/boot_16.cpp index 570a48ce..06d63dac 100644 --- a/kernel/src/boot/boot_16.cpp +++ b/kernel/src/boot/boot_16.cpp @@ -10,16 +10,15 @@ #include "boot/code16gcc.h" #include "boot/boot_32.hpp" -#include "gdt.hpp" +#include "gdt.hpp" // For the types #include "e820.hpp" // For the types #include "vesa.hpp" // For the types #include "early_memory.hpp" -//The Task State Segment -gdt::task_state_segment_t gdt::tss; - e820::bios_e820_entry bios_e820_entries[e820::MAX_E820_ENTRIES]; +gdt::task_state_segment_t tss; // TODO Remove this (causes relocation errors for now) + namespace { vesa::vbe_info_block_t vbe_info_block; @@ -411,7 +410,7 @@ void setup_gdt(){ //2. Init TSS Descriptor - uint32_t base = reinterpret_cast(&gdt::tss); + uint32_t base = tss_address;; uint32_t limit = base + sizeof(gdt::task_state_segment_t); auto tss_selector = reinterpret_cast(&gdt[6]); @@ -441,9 +440,8 @@ void setup_gdt(){ asm volatile("lgdt [%0]" : : "m" (gdtr)); //5. Zero-out the TSS - auto tss_ptr = reinterpret_cast(&gdt::tss); - for(unsigned int i = 0; i < sizeof(gdt::task_state_segment_t); ++i){ - *tss_ptr++ = 0; + for(uint16_t i = 0; i < 128; i += 4){ + early_write_32(tss_address + i * 4, 0); } } diff --git a/kernel/src/gdt.cpp b/kernel/src/gdt.cpp index 33f5c5b3..19f9937f 100644 --- a/kernel/src/gdt.cpp +++ b/kernel/src/gdt.cpp @@ -6,7 +6,12 @@ //======================================================================= #include "gdt.hpp" +#include "early_memory.hpp" void gdt::flush_tss(){ asm volatile("mov ax, %0; ltr ax;" : : "i" (gdt::TSS_SELECTOR + 0x3) : "rax"); } + +gdt::task_state_segment_t& gdt::tss(){ + return *reinterpret_cast(tss_address); +} diff --git a/kernel/src/scheduler.cpp b/kernel/src/scheduler.cpp index c9b312af..99095bc1 100644 --- a/kernel/src/scheduler.cpp +++ b/kernel/src/scheduler.cpp @@ -289,8 +289,8 @@ void switch_to_process(size_t pid){ process.state = scheduler::process_state::RUNNING; - gdt::tss.rsp0_low = process.process.kernel_rsp & 0xFFFFFFFF; - gdt::tss.rsp0_high = process.process.kernel_rsp >> 32; + gdt::tss().rsp0_low = process.process.kernel_rsp & 0xFFFFFFFF; + gdt::tss().rsp0_high = process.process.kernel_rsp >> 32; task_switch(old_pid, current_pid); }