From a9f3182de3aabbb43076f01a7c8ce3c1a1dd37e6 Mon Sep 17 00:00:00 2001 From: Xiao Xiong Date: Fri, 21 Aug 2026 15:24:31 -0400 Subject: [PATCH] more stuff! --- .gitignore | 1 + src/arch/x86_64/cpu.rs | 13 +++++++++++ src/arch/x86_64/mod.rs | 6 ++++- src/driver/mod.rs | 1 + src/driver/serial.rs | 52 ++++++++++++++++++++++++++++++++++++++++++ src/kernel/init.rs | 5 +++- src/kernel/log.rs | 36 +++++++++++++++++++++++++++++ src/kernel/mod.rs | 3 ++- src/main.rs | 3 ++- 9 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 src/arch/x86_64/cpu.rs create mode 100644 src/driver/mod.rs create mode 100644 src/driver/serial.rs create mode 100644 src/kernel/log.rs diff --git a/.gitignore b/.gitignore index ea8c4bf..334c109 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +/tests \ No newline at end of file diff --git a/src/arch/x86_64/cpu.rs b/src/arch/x86_64/cpu.rs new file mode 100644 index 0000000..e766474 --- /dev/null +++ b/src/arch/x86_64/cpu.rs @@ -0,0 +1,13 @@ +use core::arch::x86_64::__cpuid; + +pub fn init() { + let cpuid = unsafe { __cpuid(0) }; + + let mut vendor = [0u8;12]; + + vendor[0..4].copy_from_slice(&cpuid.ebx.to_le_bytes()); + vendor[4..8].copy_from_slice(&cpuid.edx.to_le_bytes()); + vendor[8..12].copy_from_slice(&cpuid.ecx.to_le_bytes()); + + crate::kprintln!("CPU Vendor: {}", core::str::from_utf8(&vendor).unwrap_or("Unknown")); +} \ No newline at end of file diff --git a/src/arch/x86_64/mod.rs b/src/arch/x86_64/mod.rs index ab0c014..61b0cf1 100644 --- a/src/arch/x86_64/mod.rs +++ b/src/arch/x86_64/mod.rs @@ -1 +1,5 @@ -// \ No newline at end of file +pub mod cpu; + +pub fn init() { + cpu::init(); +} \ No newline at end of file diff --git a/src/driver/mod.rs b/src/driver/mod.rs new file mode 100644 index 0000000..85b9b05 --- /dev/null +++ b/src/driver/mod.rs @@ -0,0 +1 @@ +pub mod serial; \ No newline at end of file diff --git a/src/driver/serial.rs b/src/driver/serial.rs new file mode 100644 index 0000000..27c2d64 --- /dev/null +++ b/src/driver/serial.rs @@ -0,0 +1,52 @@ +use core::arch::asm; + +const SERIAL_COM1: u16 = 0x3F8; + +pub unsafe fn init() { + outb(SERIAL_COM1 + 1, 0x00); // Disable interrupts + + outb(SERIAL_COM1 + 3, 0x80); + + outb(SERIAL_COM1, 0x03); // 38400 baud (divisor = 3) + outb(SERIAL_COM1 + 1, 0x00); + + outb(SERIAL_COM1 + 3, 0x03); + + outb(SERIAL_COM1 + 2, 0xC7); + + outb(SERIAL_COM1 + 4, 0x0B); +} + +pub unsafe fn write_byte(byte: u8) { + while (inb(SERIAL_COM1 + 5) & 0x20) == 0 {} + outb(SERIAL_COM1, byte); +} + +pub unsafe fn write_bytes(bytes: &[u8]) { + for &byte in bytes { + write_byte(byte); + } +} + +pub unsafe fn write_str(string: &str) { + write_bytes(string.as_bytes()); +} + +unsafe fn outb(port: u16, value: u8) { + asm!( + "out dx, al", + in("dx") port, + in("al") value, + options(nostack, nomem, preserves_flags) + ); +} + +unsafe fn inb(port: u16) -> u8 { + let value: u8; + + unsafe { + asm!("in al, dx",in("dx") port,out("al") value,options(nostack, nomem, preserves_flags)); + } + + value +} \ No newline at end of file diff --git a/src/kernel/init.rs b/src/kernel/init.rs index b5673eb..817d708 100644 --- a/src/kernel/init.rs +++ b/src/kernel/init.rs @@ -1,3 +1,6 @@ pub fn init() { - // something something init kernel + unsafe { + crate::driver::serial::init(); + } + crate::arch::x86_64::init(); } \ No newline at end of file diff --git a/src/kernel/log.rs b/src/kernel/log.rs new file mode 100644 index 0000000..5956230 --- /dev/null +++ b/src/kernel/log.rs @@ -0,0 +1,36 @@ +use core::fmt::{self, Write}; + +struct Logger; + +impl Write for Logger { + fn write_str(&mut self, string: &str) -> fmt::Result { + unsafe { + crate::driver::serial::write_str(string); + } + + Ok(()) + } +} + +pub fn print(args: fmt::Arguments) { + let mut logger = Logger; + logger.write_fmt(args).ok(); +} + +#[macro_export] +macro_rules! kprint { + ($($arg:tt)*) => { + $crate::kernel::log::print(core::format_args!($($arg)*)) + }; +} + +#[macro_export] +macro_rules! kprintln { + () => { + $crate::kprint!("\r\n") + }; + + ($($arg:tt)*) => { + $crate::kprint!("{}\r\n", core::format_args!($($arg)*)) + }; +} \ No newline at end of file diff --git a/src/kernel/mod.rs b/src/kernel/mod.rs index 639a6c5..300d111 100644 --- a/src/kernel/mod.rs +++ b/src/kernel/mod.rs @@ -1 +1,2 @@ -pub mod init; \ No newline at end of file +pub mod init; +pub mod log; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 4e17f08..c89bb4b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,12 +2,13 @@ #![no_main] mod arch; +mod driver; mod kernel; #[unsafe(no_mangle)] pub extern "C" fn _start() -> ! { kernel::init::init(); - + loop {} }