diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..1d953f4 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use nix diff --git a/.vscode/settings.json b/.vscode/settings.json index fadddf4..ffad315 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,7 @@ { "rust-analyzer.cargo.target": "x86_64-unknown-none", "rust-analyzer.check.allTargets": false, + "nixEnvPicker.terminalActivateCommand": "nix-shell", + "nixEnvSelector.nixFile": "${workspaceFolder}/shell.nix", + "nixEnvSelector.useFlakes": false, } diff --git a/kernel/src/arch/x86_64/asm.rs b/kernel/src/arch/x86_64/asm.rs index 5a70055..180ed09 100644 --- a/kernel/src/arch/x86_64/asm.rs +++ b/kernel/src/arch/x86_64/asm.rs @@ -11,10 +11,12 @@ pub fn nop() { pub fn long_mode() -> bool { let mut output: u32; - unsafe { asm!( - "mov eax, 0x80000001", - "cpuid", - out("edx") output, - ) } + unsafe { + asm!( + "mov eax, 0x80000001", + "cpuid", + out("edx") output, + ) + } output.bit(29) -} \ No newline at end of file +} diff --git a/kernel/src/arch/x86_64/gdt.rs b/kernel/src/arch/x86_64/gdt.rs index 54d9651..0503439 100644 --- a/kernel/src/arch/x86_64/gdt.rs +++ b/kernel/src/arch/x86_64/gdt.rs @@ -8,8 +8,8 @@ use intbits::Bits; use x86_64::structures::gdt; use x86_64::structures::gdt::*; -use crate::log_info; use crate::log::*; +use crate::log_info; use crate::memory::alloc::format; #[allow(dead_code)] @@ -74,7 +74,6 @@ pub fn dump_gdt() { entry.access() ); } - } #[derive(Debug)] @@ -97,20 +96,32 @@ impl TryFrom<&gdt::Entry> for SegmentType { let flags = x86_64::structures::gdt::DescriptorFlags::from_bits_retain(value.raw()); if value.access().bit(4) { if value.access().bit(3) { - Ok(SegmentType::Code) - } else { - Ok(SegmentType::Data) - } + Ok(SegmentType::Code) } else { - match value.access().bits(0..=3) { - 0b0000 => Ok(SegmentType::Null), - 0b0001 => Ok(SegmentType::Tss16Avail), - 0b0010 => Ok(SegmentType::Ldt), - 0b0011 => Ok(SegmentType::Tss16Busy), - 0b1001 => {if flags.contains(gdt::DescriptorFlags::LONG_MODE) { Ok(SegmentType::Tss64Avail) } else { Ok(SegmentType::Tss32Avail) }}, - 0b1011 => {if flags.contains(gdt::DescriptorFlags::LONG_MODE) { Ok(SegmentType::Tss64Busy) } else { Ok(SegmentType::Tss32Busy) }}, - _ => Err(()), - } + Ok(SegmentType::Data) } + } else { + match value.access().bits(0..=3) { + 0b0000 => Ok(SegmentType::Null), + 0b0001 => Ok(SegmentType::Tss16Avail), + 0b0010 => Ok(SegmentType::Ldt), + 0b0011 => Ok(SegmentType::Tss16Busy), + 0b1001 => { + if flags.contains(gdt::DescriptorFlags::LONG_MODE) { + Ok(SegmentType::Tss64Avail) + } else { + Ok(SegmentType::Tss32Avail) + } + } + 0b1011 => { + if flags.contains(gdt::DescriptorFlags::LONG_MODE) { + Ok(SegmentType::Tss64Busy) + } else { + Ok(SegmentType::Tss32Busy) + } + } + _ => Err(()), + } + } } -} \ No newline at end of file +} diff --git a/kernel/src/main.rs b/kernel/src/main.rs index 1a84a86..dc0496f 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -29,9 +29,14 @@ use limine::firmware_type::FirmwareType; use spin::mutex::Mutex; use crate::{ - arch::{asm, x86_64::{ - cpuid::{CPUID, virt_supported}, gdt::dump_gdt, - }}, memory::HHDM_RESPONSE, + arch::{ + asm, + x86_64::{ + cpuid::{CPUID, virt_supported}, + gdt::dump_gdt, + }, + }, + memory::HHDM_RESPONSE, }; lazy_static! {