diff --git a/.tlb.txt.kate-swp b/.tlb.txt.kate-swp deleted file mode 100644 index 8cb5ffb..0000000 Binary files a/.tlb.txt.kate-swp and /dev/null differ diff --git a/Makefile.toml b/Makefile.toml index da6e0c4..0590bff 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -160,7 +160,7 @@ args = ["-display", "none", "-drive", "file=build/gila.iso,format=raw,index=0,me [tasks.debug_run] dependencies = ["iso"] command = "${QEMUCOMMAND}" -args = ["-s", "-S", "-display", "none", "-drive", "file=build/gila.iso,format=raw,index=0,media=disk", "-serial", "stdio"] +args = ["-s", "-S", "-display", "none", "-drive", "file=build/gila.iso,format=raw,index=0,media=disk", "-no-reboot", "-no-shutdown", "-serial", "stdio", "-d", "int"] [tasks.debug_view] dependencies = ["iso"] diff --git a/configs/limine.conf b/configs/limine.conf index dc7d9df..068fb0b 100644 --- a/configs/limine.conf +++ b/configs/limine.conf @@ -12,21 +12,21 @@ comment: The Gila microkernel. kernel_path: boot():/boot/${ARCH}/kernel cmdline: -loglevel=Trace -logdev=display,serial module_path: boot():/boot/${ARCH}/userboot.bin - kaslr: yes - randomize_hhdm_base: yes + kaslr: no + randomize_hhdm_base: no //Info protocol: limine kernel_path: boot():/boot/${ARCH}/kernel cmdline: -loglevel=Info -logdev=display,serial module_path: boot():/boot/${ARCH}/userboot.bin - kaslr: yes - randomize_hhdm_base: yes + kaslr: no + randomize_hhdm_base: no //Warn protocol: limine kernel_path: boot():/boot/${ARCH}/kernel cmdline: -loglevel=Warning -logdev=display,serial module_path: boot():/boot/${ARCH}/userboot.bin - kaslr: yes - randomize_hhdm_base: yes \ No newline at end of file + kaslr: no + randomize_hhdm_base: no \ No newline at end of file diff --git a/src/kernel/arch/x86_64/asm.rs b/src/kernel/arch/x86_64/asm.rs index 180ed09..9ffb2e5 100644 --- a/src/kernel/arch/x86_64/asm.rs +++ b/src/kernel/arch/x86_64/asm.rs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: MIT use core::arch::asm; - use intbits::Bits; pub fn nop() { @@ -20,3 +19,23 @@ pub fn long_mode() -> bool { } output.bit(29) } + +pub fn ltr(selector: u16) { + unsafe { + asm!( + "ltr ax", + in("ax") selector + ) + } +} + +pub fn str() -> u16 { + let result: u16; + unsafe { + asm!( + "str ax", + out("ax") result, + ) + } + result +} \ No newline at end of file diff --git a/src/kernel/arch/x86_64/gdt.rs b/src/kernel/arch/x86_64/gdt.rs index b6db642..2cd6400 100644 --- a/src/kernel/arch/x86_64/gdt.rs +++ b/src/kernel/arch/x86_64/gdt.rs @@ -33,6 +33,21 @@ impl ModifyFlags for Descriptor { } } +trait ModifyAccess { + fn set_access(self, access: u8) -> Self; +} + +impl ModifyAccess for Descriptor { + fn set_access(self, access: u8) -> Self { + match self { + Descriptor::UserSegment(_) => todo!(), + Descriptor::SystemSegment(a, b) => { + Descriptor::SystemSegment(a.with_bits(40..=47, access.bits(0..=7).into()), b) + }, + } + } +} + pub struct Selectors { pub sel_kernel_code: SegmentSelector, pub sel_kernel_stack: SegmentSelector, @@ -43,8 +58,10 @@ pub struct Selectors { pub gdt: GlobalDescriptorTable<48>, } +pub const TSS: TaskStateSegment = TaskStateSegment::new(); + lazy_static! { - pub static ref TSS: TaskStateSegment = TaskStateSegment::new(); + #[derive(Debug)] pub static ref SELECTORS: Selectors = { let mut gdt = GlobalDescriptorTable::empty(); // DO NOT REORDER @@ -141,7 +158,7 @@ pub fn dump_gdt() { } #[derive(Debug)] -enum SegmentType { +pub enum SegmentType { Null, Code, Data, diff --git a/src/kernel/main.rs b/src/kernel/main.rs index f18c116..12a18ab 100644 --- a/src/kernel/main.rs +++ b/src/kernel/main.rs @@ -42,15 +42,10 @@ use x86_64::{ use crate::{ arch::{ - asm, - x86_64::{ - cpuid::{CPUID, virt_supported}, - gdt::{SELECTORS, dump_gdt}, - interrupts::get_lapic_addr, + asm::{self, ltr, str}, x86_64::{ + cpuid::{CPUID, virt_supported}, gdt::{SELECTORS, SegmentType, TSS, dump_gdt}, interrupts::get_lapic_addr, }, - }, - boot::modules::MODULE_RESPONSE, - memory::paging::{self, active_root_table, map_page, phys_to_virt}, + }, boot::modules::MODULE_RESPONSE, memory::paging::{self, active_root_table, map_page, phys_to_virt}, }; lazy_static! { @@ -248,6 +243,7 @@ unsafe extern "C" fn main() -> ! { log_trace!("GDT_SELECTOR_USER_DATA: {}", SELECTORS.sel_user_stack.0); log_trace!("GDT_SELECTOR_KERNEL_CODE: {}", SELECTORS.sel_kernel_code.0); log_trace!("GDT_SELECTOR_KERNEL_DATA: {}", SELECTORS.sel_kernel_stack.0); + log_trace!("GDT_SELECTOR_TSS: {}", SELECTORS.sel_tss.0); x86_64::registers::model_specific::Star::write( SELECTORS.sel_user_code, SELECTORS.sel_user_stack, @@ -255,12 +251,15 @@ unsafe extern "C" fn main() -> ! { SELECTORS.sel_kernel_stack, ) .expect("fuck"); + log_trace!("STR before loading new TSS: {}", str()); + ltr(SELECTORS.sel_tss.0); + log_trace!("STR after loading new TSS: {}", str()); unsafe { InterruptStackFrameValue::new( VirtAddr::from_ptr(usermode_fn as *const fn()), SELECTORS.sel_user_code, RFlags::INTERRUPT_FLAG, - VirtAddr::new(0xffffffff8f000000), + VirtAddr::new(0xffffffff80000000), SELECTORS.sel_user_stack, ) .iretq();