Fix badly loaded TSS descriptor
Some checks failed
Continuous Integration / Check (push) Failing after 1m56s
Continuous Integration / Clippy (push) Failing after 50s

This commit is contained in:
August 2026-10-08 18:33:18 +00:00
parent 088a7e3fc8
commit 63edda1d28
Signed by: shibedrill
SSH Key Fingerprint: SHA256:M0m3JW1s38BgO2t0fG146Yxd9OJ2IOqkvCAsuRHQ6Pw
4 changed files with 27 additions and 12 deletions

View File

@ -79,16 +79,18 @@ lazy_static! {
let sel_tss = gdt.append(
{
let tss_addr = addr_of!(TSS) as u128;
let tss_size = size_of_val(&TSS) as u128;
log_trace!("TSS address: 0x{:032x}", tss_addr);
let tss_size = size_of::<TaskStateSegment>() as u128 - 1;
log_trace!("TSS size: 0x{:x}", tss_size);
let mut tss_descriptor: u128 = 0;
tss_descriptor.set_bits(0..=15, tss_size.bits(0..=15)); // Limit bits 0..=15
tss_descriptor.set_bits(56..=95, tss_addr.bits(24..=63)); // Base bits 24..=63
tss_descriptor.set_bits(52..=55, 0b0000); // Flags: 1-byte granularity
tss_descriptor.set_bits(48..=51, tss_size.bits(16..=19)); // Limit bits 16..=19
tss_descriptor.set_bits(16..=39, tss_addr.bits(0..=24)); // Base bits 0..=24
tss_descriptor.set_bits(56..=95, tss_addr.bits(25..=63)); // Base bits 25..=63
tss_descriptor.set_bits(40..=47, 0b10110001);
tss_descriptor.set_bits(52..=55, 0b1010);
log_info!("TSS descriptor (calculated manually): 0x{:032x}", tss_descriptor);
Descriptor::SystemSegment(tss_descriptor.bits(64..=127) as u64, tss_descriptor.bits(0..=63) as u64)
tss_descriptor.set_bits(40..=47, 0b10001001); // Access: Present, ring 0, system segment
tss_descriptor.set_bits(16..=39, tss_addr.bits(0..=23)); // Base bits 0..=23
tss_descriptor.set_bits(0..=15, tss_size.bits(0..=15)); // Limit bits 0..=15
// MAKE SURE that the lower half is the first byte! This is loaded little-endian into the GDT!
Descriptor::SystemSegment(tss_descriptor.bits(0..=63) as u64, tss_descriptor.bits(64..=127) as u64)
}
);
Selectors {

View File

@ -51,7 +51,11 @@ lazy_static! {
}
extern "x86-interrupt" fn div_zero(info: InterruptStackFrame) {
log_error!("Divide by zero error: 0x{:x}, {:?}", info.instruction_pointer, info.code_segment.rpl());
log_error!(
"Divide by zero error: 0x{:x}, {:?}",
info.instruction_pointer,
info.code_segment.rpl()
);
unsafe { info.iretq() }
}

View File

@ -1,4 +1,8 @@
use x86_64::{VirtAddr, registers::{rflags::RFlags, segmentation::Segment}, structures::idt::InterruptStackFrameValue};
use x86_64::{
VirtAddr,
registers::{rflags::RFlags, segmentation::Segment},
structures::idt::InterruptStackFrameValue,
};
use crate::{
arch::{
@ -28,8 +32,9 @@ pub fn init() -> Result<(), ()> {
x86_64::registers::segmentation::CS::set_reg(SELECTORS.sel_kernel_code);
x86_64::registers::segmentation::SS::set_reg(SELECTORS.sel_kernel_stack);
}
//ltr(SELECTORS.sel_tss.index()) // THIS WILL CAUSE A GPF, YOU STUPID WHORE
log_info!("Segment registers loaded!");
ltr(SELECTORS.sel_tss.0);
log_info!("Task register loaded!");
Ok(())
}

View File

@ -97,7 +97,11 @@ unsafe extern "C" fn main() -> ! {
memory::log_memory();
memory::log_address();
log_info!("TSS descriptor: 0x{:08x} {:08x}", SELECTORS.gdt.entries()[SELECTORS.sel_tss.index() as usize + 1].raw(), SELECTORS.gdt.entries()[SELECTORS.sel_tss.index() as usize].raw());
log_info!(
"TSS descriptor: 0x{:08x} {:08x}",
SELECTORS.gdt.entries()[SELECTORS.sel_tss.index() as usize + 1].raw(),
SELECTORS.gdt.entries()[SELECTORS.sel_tss.index() as usize].raw()
);
if let Some(modules_list) = *MODULE_RESPONSE
&& modules_list.modules()[0].path().ends_with("/userboot.bin")
{