From 12e9a068e9bde1ef6c28db44e2986f08bc34d5b4 Mon Sep 17 00:00:00 2001 From: MCorange Date: Mon, 2 Sep 2024 17:51:10 +0300 Subject: [PATCH] clippy stuff --- Cargo.lock | 86 ++++++++++++++ Cargo.toml | 5 + boot/multiboot.s | 19 ++- build.sh | 3 + kernel/Cargo.toml | 6 +- kernel/src/events/mod.rs | 10 +- kernel/src/gdt/mod.rs | 6 +- kernel/src/interrupts/handlers/mod.rs | 2 +- .../src/interrupts/handlers/ps2_keyboard.rs | 6 +- kernel/src/lib.rs | 58 +++------ kernel/src/logger/mod.rs | 110 +++++++++++------- kernel/src/logger/vga/macros.rs | 30 ----- kernel/src/mem/heap/mod.rs | 2 +- kernel/src/mem/mod.rs | 12 +- kernel/src/mem/paging/entry.rs | 6 +- kernel/src/mem/paging/mapper.rs | 2 +- kernel/src/mem/paging/mod.rs | 10 +- kernel/src/mem/paging/tables.rs | 4 +- kernel/src/mem/paging/temporary.rs | 2 +- kernel/src/scheduler/executor.rs | 6 +- kernel/src/scheduler/mod.rs | 1 + kernel/src/std/input.rs | 7 +- kernel/src/std/mod.rs | 2 +- kernel/src/std/vga/mod.rs | 2 + .../src/{logger/vga => std/vga/text}/mod.rs | 15 ++- kernel/src/std/vga/video/mod.rs | 41 +++++++ kernel/src/std/vga/video/util.rs | 9 ++ 27 files changed, 292 insertions(+), 170 deletions(-) delete mode 100644 kernel/src/logger/vga/macros.rs create mode 100644 kernel/src/std/vga/mod.rs rename kernel/src/{logger/vga => std/vga/text}/mod.rs (93%) create mode 100644 kernel/src/std/vga/video/mod.rs create mode 100644 kernel/src/std/vga/video/util.rs diff --git a/Cargo.lock b/Cargo.lock index 9393da9..3955c15 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,6 +20,15 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + [[package]] name = "autocfg" version = "1.3.0" @@ -111,11 +120,13 @@ name = "kernel" version = "0.1.0" dependencies = [ "bitflags 2.5.0", + "cfg-if", "crossbeam", "hashbrown", "lazy_static", "log", "multiboot2", + "nalgebra", "once", "pc-keyboard", "pic8259", @@ -164,6 +175,57 @@ dependencies = [ "uefi-raw", ] +[[package]] +name = "nalgebra" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c4b5f057b303842cf3262c27e465f4c303572e7f6b0648f60e16248ac3397f4" +dependencies = [ + "approx", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "once" version = "0.3.4" @@ -176,6 +238,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pc-keyboard" version = "0.7.0" @@ -250,6 +318,18 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "simba" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", +] + [[package]] name = "spin" version = "0.5.2" @@ -296,6 +376,12 @@ dependencies = [ "lock_api", ] +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "uart_16550" version = "0.3.0" diff --git a/Cargo.toml b/Cargo.toml index 73f0eb7..fb06871 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,8 @@ members = [ exclude = ["boot"] resolver = "2" + + +[profile.release] +strip = false + diff --git a/boot/multiboot.s b/boot/multiboot.s index 9a9289c..c5180e1 100644 --- a/boot/multiboot.s +++ b/boot/multiboot.s @@ -1,3 +1,10 @@ +%define VIDEO_MODE 1 + +section .data +global __VIDEO_MODE +__VIDEO_MODE: db VIDEO_MODE + + section .multiboot_header header_start: dd 0xe85250d6 ; magic number (multiboot 2) @@ -8,7 +15,17 @@ header_start: ; insert optional multiboot tags here - ; required end tag +%if VIDEO_MODE + dw 5 ; type + dw 1 ; flags + dd 20 ; size + dd 0 ; width + dd 0 ; height + dd 24 ; depth + ; grub 2 expects 8 byte alignment + dw 0 ; padding + dw 0 ; padding +%endif dw 0 ; type dw 0 ; flags dd 8 ; size diff --git a/build.sh b/build.sh index 5742933..22542c7 100755 --- a/build.sh +++ b/build.sh @@ -2,6 +2,9 @@ BUILD_DIR="./target" BIN="$BUILD_DIR/poppin.bin" ISO="$BUILD_DIR/poppin.iso" +# config +VIDEO_MODE=true; + set -e function cmd_exists() { diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index 46f350a..ca9e0fb 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -2,7 +2,6 @@ name = "kernel" version = "0.1.0" edition = "2021" -test=false [lib] name="kernel" @@ -10,16 +9,15 @@ test=false crate-type=["staticlib"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[profile.release] -strip = false - [dependencies] bitflags = "2.5.0" +cfg-if = "1.0.0" crossbeam = { version = "0.8.4", default-features = false, features = ["alloc"] } hashbrown = "0.14.5" lazy_static = { version = "1.4.0", features = ["spin_no_std"] } log = "0.4.21" multiboot2 = "0.20.2" +nalgebra = { version = "0.33.0", default-features = false } once = "0.3.4" pc-keyboard = "0.7.0" pic8259 = "0.11.0" diff --git a/kernel/src/events/mod.rs b/kernel/src/events/mod.rs index 205f16b..9d90a03 100644 --- a/kernel/src/events/mod.rs +++ b/kernel/src/events/mod.rs @@ -37,12 +37,10 @@ impl EventManager { } pub fn dispatch(&self, ev: &Event){ - for listener in &self.listeners { - if let Some(l) = listener { - if discriminant(ev) == discriminant(&l.typ) { - // TODO: Do something with the result - let _ = (l.func)(ev); - } + for listener in self.listeners.iter().flatten() { + if discriminant(ev) == discriminant(&listener.typ) { + // TODO: Do something with the result + let _ = (listener.func)(ev); } } } diff --git a/kernel/src/gdt/mod.rs b/kernel/src/gdt/mod.rs index 20e8d06..38cade2 100644 --- a/kernel/src/gdt/mod.rs +++ b/kernel/src/gdt/mod.rs @@ -21,14 +21,12 @@ lazy_static! { #[allow(unused_unsafe)] let stack_start = VirtAddr::from_ptr(unsafe { addr_of!(STACK) }); - let stack_end = stack_start + STACK_SIZE as u64; - stack_end + stack_start + STACK_SIZE as u64 }; tss.privilege_stack_table[0] = { #[allow(unused_unsafe)] let stack_start = VirtAddr::from_ptr(unsafe { addr_of!(PRIV_TSS_STACK) }); - let stack_end = stack_start + STACK_SIZE as u64; - stack_end + stack_start + STACK_SIZE as u64 }; tss }; diff --git a/kernel/src/interrupts/handlers/mod.rs b/kernel/src/interrupts/handlers/mod.rs index 4b2c4cb..92fb4dc 100644 --- a/kernel/src/interrupts/handlers/mod.rs +++ b/kernel/src/interrupts/handlers/mod.rs @@ -1,5 +1,5 @@ use x86_64::structures::idt::{InterruptStackFrame, PageFaultErrorCode}; -use crate::{events::EVENTMAN, interrupts::InterruptIndex}; +use crate::interrupts::InterruptIndex; mod ps2_keyboard; diff --git a/kernel/src/interrupts/handlers/ps2_keyboard.rs b/kernel/src/interrupts/handlers/ps2_keyboard.rs index af174b5..c802563 100644 --- a/kernel/src/interrupts/handlers/ps2_keyboard.rs +++ b/kernel/src/interrupts/handlers/ps2_keyboard.rs @@ -1,14 +1,10 @@ -use hashbrown::HashSet; -use pc_keyboard::{DecodedKey, KeyState}; -use spin::Mutex; use x86_64::structures::idt::InterruptStackFrame; use crate::{events::EVENTMAN, interrupts::PICS}; -pub struct Ps2KbPressEvent(DecodedKey); pub extern "x86-interrupt" fn ps2_kb_int(_sf: InterruptStackFrame){ - use pc_keyboard::{layouts, DecodedKey, HandleControl, Keyboard, ScancodeSet1}; + use pc_keyboard::{layouts, HandleControl, Keyboard, ScancodeSet1}; use spin::Mutex; use x86_64::instructions::port::Port; diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 303a616..dc37813 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -6,13 +6,10 @@ #![feature(ptr_internals)] #![feature(allocator_api)] -use core::ptr::addr_of; +use mem::paging::ActivePageTable; +use multiboot2::{BootInformation, BootInformationHeader}; +use pc_keyboard::KeyCode; -use alloc::vec::Vec; -use pc_keyboard::{DecodedKey, KeyCode}; -use x86_64::instructions::nop; - -use crate::{gdt::PRIV_TSS_STACK, scheduler::{executor::Executor, Task}, utils::jmp_to_usermode}; extern crate alloc; @@ -27,50 +24,24 @@ mod mem; mod scheduler; mod std; - - -#[no_mangle] -extern "C" fn kmain(mb2_info_addr: usize) -> ! { - // Init +fn init(mb2p: *const BootInformationHeader) -> ActivePageTable { logger::init(log::LevelFilter::Trace).unwrap(); gdt::init(); interrupts::init_idt(); utils::enable_nxe_bit(); utils::enable_write_protect_bit(); std::init(); - - let active_table = mem::init(mb2_info_addr); - - //unsafe { - // jmp_to_usermode(active_table, usermode_code as *const () as usize, addr_of!(PRIV_TSS_STACK) as *const () as usize); - //} + mem::init(mb2p) +} - //let mut executor = Executor::new(); - //executor.spawn(Task::new(usermode_code())); - //executor.run(); +#[no_mangle] +extern "C" fn kmain(mb2p: *const BootInformationHeader) -> ! { + let _ = init(mb2p); // active table - //let mut a = Vec::new(); - - - //a.push(6); - //a.push(9); - //a.push(4); - //a.push(2); - //a.push(0); - - //log::error!("{:?}", a); - - - - // EVENTMAN.lock().add_listener(events::Event::Ps2KeyPress(None), |k| { - // let Event::Ps2KeyPress(v) = k else {panic!()}; - // - // log::debug!("Keypress event received! ({:?})", v.unwrap()); - // Ok(()) - // }); - - // let (level_4_page_table, _) = Cr3::read(); - // println!("Level 4 page table at: {:?}", level_4_page_table.start_address()); + let boot_info = unsafe { BootInformation::load(mb2p).unwrap() }; + let fb = boot_info.framebuffer_tag().unwrap().unwrap(); + log::debug!("{fb:?}"); + log::debug!("{}", std::vga::video::is_video_mode_enabled()); log::info!("end of work"); loop { if std::input::is_key_down(KeyCode::A) { @@ -88,6 +59,3 @@ fn panic(pi: &core::panic::PanicInfo) -> ! { } -async fn usermode_code() { - log::info!("Hello from usermode!"); -} diff --git a/kernel/src/logger/mod.rs b/kernel/src/logger/mod.rs index 42827b8..973bcba 100644 --- a/kernel/src/logger/mod.rs +++ b/kernel/src/logger/mod.rs @@ -1,12 +1,9 @@ - +use core::fmt::Write; use log::{Level, LevelFilter, Metadata, Record, SetLoggerError}; - use crate::logger::serial::{write_com, ANSI_COLORS, COM0}; +use crate::std::vga::text::{Color, ColorCode, WRITER}; -use self::vga::{Color, ColorCode, WRITER}; -#[macro_use] -pub mod vga; pub mod serial; #[macro_use] pub mod macros; @@ -16,7 +13,6 @@ pub static LOGGER: KLogger = KLogger; pub struct KLogger; - const C_TRACE: ColorCode = ColorCode::new(Color::Cyan, Color::Black); const C_DEBUG: ColorCode = ColorCode::new(Color::Blue, Color::Black); const C_INFO: ColorCode = ColorCode::new(Color::Green, Color::Black); @@ -32,51 +28,77 @@ impl log::Log for KLogger { fn log(&self, record: &Record) { if self.enabled(record.metadata()) { - {WRITER.lock().set_color(Color::Magenta, Color::Black); } - print!("["); - write_com(&COM0, format_args!("{}[", ANSI_COLORS::MAGENTA)); - match record.level() { - Level::Trace => { - {WRITER.lock().set_color_code(C_TRACE); } - print!("TRACE"); - write_com(&COM0, format_args!("{}TRACE", ANSI_COLORS::BLUE2)); - } - Level::Debug => { - {WRITER.lock().set_color_code(C_DEBUG); } - print!("DEBUG"); - write_com(&COM0, format_args!("{}DEBUG", ANSI_COLORS::BLUE)); - } - Level::Info => { - {WRITER.lock().set_color_code(C_INFO); } - print!("INFO"); - write_com(&COM0, format_args!("{}INFO", ANSI_COLORS::GREEN)); - } - Level::Warn => { - {WRITER.lock().set_color_code(C_WARN); } - print!("WARN"); - write_com(&COM0, format_args!("{}WARN", ANSI_COLORS::YELLOW)); - } - Level::Error => { - {WRITER.lock().set_color_code(C_ERROR); } - print!("ERROR"); - write_com(&COM0, format_args!("{}ERROR", ANSI_COLORS::RED)); - } + if !crate::std::vga::video::is_video_mode_enabled() { + self.log_vga(record).unwrap(); } - {WRITER.lock().set_color(Color::Magenta, Color::Black); } - print!("]"); - {WRITER.lock().set_color_code(C_NORMAL); } - - write_com(&COM0, format_args!("{}]", ANSI_COLORS::MAGENTA)); - - println!(" {}: {}", record.module_path().unwrap_or(""), record.args()); - - write_com(&COM0, format_args!(" {}{}: {}\n", ANSI_COLORS::RESET, record.module_path().unwrap_or(""), record.args())); + self.log_serial(record) } } fn flush(&self) {} } +impl KLogger { + fn log_vga(&self, record: &Record) -> core::fmt::Result { + let mut f = WRITER.lock(); + f.set_color(Color::Magenta, Color::Black); + write!(f, "[")?; + match record.level() { + Level::Trace => { + f.set_color_code(C_TRACE); + write!(f, "TRACE")?; + } + Level::Debug => { + f.set_color_code(C_DEBUG); + write!(f, "DEBUG")?; + } + Level::Info => { + f.set_color_code(C_INFO); + write!(f, "INFO")?; + } + Level::Warn => { + f.set_color_code(C_WARN); + write!(f, "WARN")?; + } + Level::Error => { + f.set_color_code(C_ERROR); + write!(f, "ERROR")?; + } + } + f.set_color(Color::Magenta, Color::Black); + write!(f, "]")?; + f.set_color_code(C_NORMAL); + + writeln!(f, " {}: {}", record.module_path().unwrap_or(""), record.args())?; + Ok(()) + } + fn log_serial(&self, record: &Record) { + {WRITER.lock().set_color(Color::Magenta, Color::Black); } + write_com(&COM0, format_args!("{}[", ANSI_COLORS::MAGENTA)); + match record.level() { + Level::Trace => { + write_com(&COM0, format_args!("{}TRACE", ANSI_COLORS::BLUE2)); + } + Level::Debug => { + write_com(&COM0, format_args!("{}DEBUG", ANSI_COLORS::BLUE)); + } + Level::Info => { + write_com(&COM0, format_args!("{}INFO", ANSI_COLORS::GREEN)); + } + Level::Warn => { + write_com(&COM0, format_args!("{}WARN", ANSI_COLORS::YELLOW)); + } + Level::Error => { + write_com(&COM0, format_args!("{}ERROR", ANSI_COLORS::RED)); + } + } + + write_com(&COM0, format_args!("{}]", ANSI_COLORS::MAGENTA)); + write_com(&COM0, format_args!(" {}{}: {}\n", ANSI_COLORS::RESET, record.module_path().unwrap_or(""), record.args())); + + } +} + pub fn init(lvl: LevelFilter) -> Result<(), SetLoggerError> { log::set_logger(&LOGGER)?; log::set_max_level(lvl); diff --git a/kernel/src/logger/vga/macros.rs b/kernel/src/logger/vga/macros.rs deleted file mode 100644 index c1861cf..0000000 --- a/kernel/src/logger/vga/macros.rs +++ /dev/null @@ -1,30 +0,0 @@ -use core::fmt; -use x86_64::instructions::interrupts; - -use crate::logger::vga::Writer; - -impl fmt::Write for Writer { - fn write_str(&mut self, s: &str) -> fmt::Result { - self.write_string(s); - Ok(()) - } -} - -#[macro_export] -macro_rules! print { - ($($arg:tt)*) => ($crate::logger::vga::macros::_print(format_args!($($arg)*))); -} - -#[macro_export] -macro_rules! println { - () => ($crate::print!("\n")); - ($($arg:tt)*) => ($crate::print!("{}\n", format_args!($($arg)*))); -} - -#[doc(hidden)] -pub fn _print(args: fmt::Arguments) { - use core::fmt::Write; - interrupts::without_interrupts(|| { - crate::logger::vga::WRITER.lock().write_fmt(args).unwrap(); - }); -} diff --git a/kernel/src/mem/heap/mod.rs b/kernel/src/mem/heap/mod.rs index 14a100a..0623b90 100644 --- a/kernel/src/mem/heap/mod.rs +++ b/kernel/src/mem/heap/mod.rs @@ -2,7 +2,7 @@ //use x86_64::align_up; -pub const HEAP_START: usize = 0o_000_001_000_000_0000; // 0x40000000 - 0x40019000 +pub const HEAP_START: usize = 0x40000000; // 0x40000000 - 0x40019000 pub const HEAP_SIZE: usize = 100 * 1024; // 100 KiB // A simple allocator that allocates memory linearly and ignores freed memory. diff --git a/kernel/src/mem/mod.rs b/kernel/src/mem/mod.rs index 30272a5..d8ce018 100644 --- a/kernel/src/mem/mod.rs +++ b/kernel/src/mem/mod.rs @@ -20,7 +20,9 @@ static GLOBAL_ALLOCATOR: Talck, ErrOnOom> = Talc::new(ErrOnOom). pub struct DummyAlloc; unsafe impl GlobalAlloc for DummyAlloc { - unsafe fn alloc(&self, _: Layout) -> *mut u8 { 0 as *mut u8 } + unsafe fn alloc(&self, _: Layout) -> *mut u8 { + core::ptr::null_mut::() + } unsafe fn dealloc(&self, _ptr: *mut u8, _: Layout) {} } @@ -125,9 +127,9 @@ pub struct MemInfo<'a>{ } impl MemInfo<'_> { - pub fn load(mb_ptr: usize) -> Self { + pub fn load(mb_ptr: *const BootInformationHeader) -> Self { let boot_info = unsafe { - multiboot2::BootInformation::load(mb_ptr as *const BootInformationHeader).unwrap() + multiboot2::BootInformation::load(mb_ptr).unwrap() }; let mmap_tag = boot_info.memory_map_tag().unwrap(); @@ -151,7 +153,7 @@ impl MemInfo<'_> { //log::debug!("Multiboot: start: 0x{:x} sz: 0x{:x}", mi.mb_start, mi.mb_end - mi.mb_start); Self { - boot_info:unsafe { multiboot2::BootInformation::load(mb_ptr as *const BootInformationHeader).unwrap()}, + boot_info: unsafe { multiboot2::BootInformation::load(mb_ptr).unwrap()}, mem_area_iter: MemoryAreaIter::new(mmap_tag), kernel_start, kernel_end, @@ -161,7 +163,7 @@ impl MemInfo<'_> { } } -pub fn init(mb_ptr: usize) -> paging::ActivePageTable { +pub fn init(mb_ptr: *const BootInformationHeader) -> paging::ActivePageTable { once::assert_has_not_been_called!("mem::init must be called only once"); let mem_info = MemInfo::load(mb_ptr); let mut frame_alloc = area_frame_alloc::AreaFrameAllocator::new(&mem_info); diff --git a/kernel/src/mem/paging/entry.rs b/kernel/src/mem/paging/entry.rs index 9033a6e..0f21c22 100644 --- a/kernel/src/mem/paging/entry.rs +++ b/kernel/src/mem/paging/entry.rs @@ -28,13 +28,13 @@ impl EntryFlags { if section.flags().contains(ElfSectionFlags::ALLOCATED) { // section is loaded to memory - flags = flags | EntryFlags::PRESENT; + flags |= EntryFlags::PRESENT; } if section.flags().contains(ElfSectionFlags::WRITABLE) { - flags = flags | EntryFlags::WRITABLE; + flags |= EntryFlags::WRITABLE; } if !section.flags().contains(ElfSectionFlags::EXECUTABLE) { - flags = flags | EntryFlags::NO_EXECUTE; + flags |= EntryFlags::NO_EXECUTE; } flags diff --git a/kernel/src/mem/paging/mapper.rs b/kernel/src/mem/paging/mapper.rs index 4cbee25..d9a4464 100644 --- a/kernel/src/mem/paging/mapper.rs +++ b/kernel/src/mem/paging/mapper.rs @@ -7,7 +7,7 @@ use super::{ Frame, FrameAllocator, PAGE_SIZE, PhysicalAddress, VirtualAddress, Page, - ENTRY_COUNT, InactivePageTable + ENTRY_COUNT, }; use core::ptr::Unique; diff --git a/kernel/src/mem/paging/mod.rs b/kernel/src/mem/paging/mod.rs index 470bc4c..84d7298 100644 --- a/kernel/src/mem/paging/mod.rs +++ b/kernel/src/mem/paging/mod.rs @@ -1,3 +1,4 @@ +#![allow(unexpected_cfgs)] use core::ops::{Deref, DerefMut}; use self::{entry::*, mapper::Mapper, temporary::TemporaryPage}; use super::{Frame, FrameAllocator, MemInfo, PAGE_SIZE}; @@ -119,8 +120,8 @@ impl InactivePageTable { impl Page { pub fn containing_address(address: VirtualAddress) -> Page { - assert!(address < 0x0000_8000_0000_0000 || - address >= 0xffff_8000_0000_0000, + assert!( + !(0x0000_8000_0000_0000..0xffff_8000_0000_0000).contains(&address), "invalid address: 0x{:x}", address); Page { number: address / PAGE_SIZE } } @@ -137,7 +138,7 @@ impl Page { (self.number >> 9) & 0o777 } fn p1_index(&self) -> usize { - (self.number >> 0) & 0o777 + self.number & 0o777 } pub fn range_inclusive(start: Page, end: Page) -> PageIter { PageIter { @@ -225,8 +226,7 @@ pub fn remap_the_kernel(allocator: &mut A, mem_info: &MemInfo) -> ActivePageT active_table } - - +#[cfg(disabled)] pub fn test_paging(allocator: &mut A) where A: FrameAllocator { diff --git a/kernel/src/mem/paging/tables.rs b/kernel/src/mem/paging/tables.rs index 52603fc..1509dfb 100644 --- a/kernel/src/mem/paging/tables.rs +++ b/kernel/src/mem/paging/tables.rs @@ -44,12 +44,12 @@ impl Table where L: HierarchicalLevel { self.next_table_mut(index).unwrap() } - pub fn next_table<'a>(&'a self, index: usize) -> Option<&'a Table> { + pub fn next_table(&self, index: usize) -> Option<&Table> { self.next_table_address(index) .map(|address| unsafe { &*(address as *const _) }) } - pub fn next_table_mut<'a>(&'a mut self, index: usize) -> Option<&'a mut Table> { + pub fn next_table_mut(&mut self, index: usize) -> Option<&mut Table> { self.next_table_address(index) .map(|address| unsafe { &mut *(address as *mut _) }) } diff --git a/kernel/src/mem/paging/temporary.rs b/kernel/src/mem/paging/temporary.rs index 1b62e8a..d5da6fe 100644 --- a/kernel/src/mem/paging/temporary.rs +++ b/kernel/src/mem/paging/temporary.rs @@ -18,7 +18,7 @@ impl TemporaryPage { where A: FrameAllocator { TemporaryPage { - page: page, + page, allocator: TinyAllocator::new(allocator), } } diff --git a/kernel/src/scheduler/executor.rs b/kernel/src/scheduler/executor.rs index 3779e5b..492efcf 100644 --- a/kernel/src/scheduler/executor.rs +++ b/kernel/src/scheduler/executor.rs @@ -1,3 +1,4 @@ +#![allow(dead_code)] use core::task::{Context, Poll, Waker}; use super::{Task, TaskId}; @@ -53,7 +54,7 @@ impl Executor { }; let waker = waker_cache .entry(task_id) - .or_insert_with(|| TaskWaker::new(task_id, task_queue.clone())); + .or_insert_with(|| TaskWaker::new_waker(task_id, task_queue.clone())); let mut context = Context::from_waker(waker); match task.poll(&mut context) { Poll::Ready(()) => { @@ -77,7 +78,7 @@ impl TaskWaker { fn wake_task(&self) { self.task_queue.push(self.task_id).expect("task_queue full"); } - fn new(task_id: TaskId, task_queue: Arc>) -> Waker { + fn new_waker(task_id: TaskId, task_queue: Arc>) -> Waker { Waker::from(Arc::new(TaskWaker { task_id, task_queue, @@ -96,3 +97,4 @@ impl Wake for TaskWaker { } + diff --git a/kernel/src/scheduler/mod.rs b/kernel/src/scheduler/mod.rs index ff09c65..37f6029 100644 --- a/kernel/src/scheduler/mod.rs +++ b/kernel/src/scheduler/mod.rs @@ -1,3 +1,4 @@ +#![allow(dead_code)] use core::{future::Future, pin::Pin, sync::atomic::{AtomicU64, Ordering}, task::{Context, Poll}}; use alloc::boxed::Box; diff --git a/kernel/src/std/input.rs b/kernel/src/std/input.rs index d7e340a..8cb1b1b 100644 --- a/kernel/src/std/input.rs +++ b/kernel/src/std/input.rs @@ -1,9 +1,6 @@ -use alloc::{boxed::Box, collections::{btree_set::BTreeSet, vec_deque::VecDeque}, sync::Arc, vec::Vec}; -use hashbrown::HashSet; -use lazy_static::lazy_static; -use pc_keyboard::{DecodedKey, KeyCode, KeyEvent, KeyState}; +use alloc::collections::{btree_set::BTreeSet, vec_deque::VecDeque}; +use pc_keyboard::{KeyCode, KeyEvent, KeyState}; use spin::Mutex; -use x86_64::instructions::nop; use crate::events::{Event, EVENTMAN}; static mut KEYS_PRESSED: Mutex> = Mutex::new(BTreeSet::new()); diff --git a/kernel/src/std/mod.rs b/kernel/src/std/mod.rs index e9f79e0..dbb2d2c 100644 --- a/kernel/src/std/mod.rs +++ b/kernel/src/std/mod.rs @@ -1,5 +1,5 @@ pub mod input; - +pub mod vga; diff --git a/kernel/src/std/vga/mod.rs b/kernel/src/std/vga/mod.rs new file mode 100644 index 0000000..5aadc1f --- /dev/null +++ b/kernel/src/std/vga/mod.rs @@ -0,0 +1,2 @@ +pub mod text; +pub mod video; diff --git a/kernel/src/logger/vga/mod.rs b/kernel/src/std/vga/text/mod.rs similarity index 93% rename from kernel/src/logger/vga/mod.rs rename to kernel/src/std/vga/text/mod.rs index 77cab02..8c80eb1 100644 --- a/kernel/src/logger/vga/mod.rs +++ b/kernel/src/std/vga/text/mod.rs @@ -1,9 +1,7 @@ use x86::io::{outb, inb}; use spin::Mutex; - -#[macro_use] -pub mod macros; +use x86_64::instructions::interrupts; lazy_static::lazy_static!{ pub static ref WRITER: Mutex = Mutex::new(Writer::new()); @@ -93,7 +91,7 @@ impl Writer { } } - pub fn write_string(&mut self, s: &str) { + fn write_string(&mut self, s: &str) { for c in s.as_bytes() { match c { // printable ASCII byte or newline @@ -197,3 +195,12 @@ pub fn get_cursor_position() -> (u16, u16) { } (pos / (BUFFER_WIDTH as u16), pos % (BUFFER_WIDTH as u16)) } + +impl core::fmt::Write for Writer { + fn write_str(&mut self, s: &str) -> core::fmt::Result { + interrupts::without_interrupts(|| { + self.write_string(s); + }); + Ok(()) + } +} diff --git a/kernel/src/std/vga/video/mod.rs b/kernel/src/std/vga/video/mod.rs new file mode 100644 index 0000000..5918ce8 --- /dev/null +++ b/kernel/src/std/vga/video/mod.rs @@ -0,0 +1,41 @@ +mod util; +use core::{borrow::BorrowMut, ops::Deref}; + +use alloc::boxed::Box; +use lazy_static::lazy_static; +use multiboot2::{BootInformation, BootInformationHeader, FramebufferTag, FramebufferType, TagTrait}; +use nalgebra::Vector2; +use spin::{Mutex, MutexGuard}; +pub use util::is_video_mode_enabled; + + + +pub struct VideoControler{ + component_size: u8, + r_ofs: u8, + g_ofs: u8, + b_ofs: u8, + buf_addr: u64, + size: Vector2, +} + +impl VideoControler { + pub fn new(mb2p: *const BootInformationHeader) -> Self { + let boot_info = unsafe { BootInformation::load(mb2p).unwrap() }; + let fbt = boot_info.framebuffer_tag().unwrap().unwrap(); + let FramebufferType::RGB { red, green, blue } = fbt.buffer_type().unwrap() else { + panic!(); + }; + assert!(red.size == green.size && green.size == blue.size); + + Self { + component_size: red.size, + r_ofs: red.position, + g_ofs: green.position, + b_ofs: blue.position, + buf_addr: fbt.address(), + size: Vector2::new(fbt.width() as usize, fbt.height() as usize) + } + } + +} diff --git a/kernel/src/std/vga/video/util.rs b/kernel/src/std/vga/video/util.rs new file mode 100644 index 0000000..d4a547c --- /dev/null +++ b/kernel/src/std/vga/video/util.rs @@ -0,0 +1,9 @@ +extern "C" { + static __VIDEO_MODE: u8; +} + +pub fn is_video_mode_enabled() -> bool { + unsafe { + __VIDEO_MODE == 1 + } +}