From df5208827c73cd33f43d99376fd155e611ab99e8 Mon Sep 17 00:00:00 2001 From: August Date: Fri, 3 Jul 2026 03:09:37 +0000 Subject: [PATCH] Debugging triple fault --- .tlb.txt.kate-swp | Bin 108 -> 0 bytes Makefile.toml | 2 +- configs/limine.conf | 12 ++++++------ src/kernel/arch/x86_64/asm.rs | 21 ++++++++++++++++++++- src/kernel/arch/x86_64/gdt.rs | 21 +++++++++++++++++++-- src/kernel/main.rs | 17 ++++++++--------- 6 files changed, 54 insertions(+), 19 deletions(-) delete mode 100644 .tlb.txt.kate-swp diff --git a/.tlb.txt.kate-swp b/.tlb.txt.kate-swp deleted file mode 100644 index 8cb5ffbe695a4508e1e9259dba51e345158c6b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?Vnc{caa>`fQ1IeT|&t}Bnaap*};@WfzG xpbQKs=$GUc=;vit=oV+B=H%!anwwY{nCqGt8JJj@m>HWHxdsQp)B 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();