diff --git a/src/arch/mod.rs b/src/arch/mod.rs new file mode 100644 index 0000000..1abbd03 --- /dev/null +++ b/src/arch/mod.rs @@ -0,0 +1,5 @@ +#[cfg(target_arch = "x86_64")] +#[macro_use] +pub mod x86_64; +#[cfg(target_arch = "x86_64")] +pub use self::x86_64::*; \ No newline at end of file diff --git a/src/device/cpu.rs b/src/arch/x86_64/device/cpu.rs similarity index 100% rename from src/device/cpu.rs rename to src/arch/x86_64/device/cpu.rs diff --git a/src/device/hpet.rs b/src/arch/x86_64/device/hpet.rs similarity index 100% rename from src/device/hpet.rs rename to src/arch/x86_64/device/hpet.rs diff --git a/src/device/local_apic.rs b/src/arch/x86_64/device/local_apic.rs similarity index 100% rename from src/device/local_apic.rs rename to src/arch/x86_64/device/local_apic.rs diff --git a/src/device/mod.rs b/src/arch/x86_64/device/mod.rs similarity index 100% rename from src/device/mod.rs rename to src/arch/x86_64/device/mod.rs diff --git a/src/device/pic.rs b/src/arch/x86_64/device/pic.rs similarity index 100% rename from src/device/pic.rs rename to src/arch/x86_64/device/pic.rs diff --git a/src/device/pit.rs b/src/arch/x86_64/device/pit.rs similarity index 100% rename from src/device/pit.rs rename to src/arch/x86_64/device/pit.rs diff --git a/src/device/rtc.rs b/src/arch/x86_64/device/rtc.rs similarity index 100% rename from src/device/rtc.rs rename to src/arch/x86_64/device/rtc.rs diff --git a/src/arch/x86_64/device/serial.rs b/src/arch/x86_64/device/serial.rs new file mode 100644 index 0000000..05905a7 --- /dev/null +++ b/src/arch/x86_64/device/serial.rs @@ -0,0 +1,11 @@ +use devices::uart_16550::SerialPort; +use syscall::io::Pio; +use spin::Mutex; + +pub static COM1: Mutex>> = Mutex::new(SerialPort::>::new(0x3F8)); +pub static COM2: Mutex>> = Mutex::new(SerialPort::>::new(0x2F8)); + +pub unsafe fn init() { + COM1.lock().init(); + COM2.lock().init(); +} diff --git a/src/gdt.rs b/src/arch/x86_64/gdt.rs similarity index 100% rename from src/gdt.rs rename to src/arch/x86_64/gdt.rs diff --git a/src/idt.rs b/src/arch/x86_64/idt.rs similarity index 100% rename from src/idt.rs rename to src/arch/x86_64/idt.rs diff --git a/src/interrupt/exception.rs b/src/arch/x86_64/interrupt/exception.rs similarity index 100% rename from src/interrupt/exception.rs rename to src/arch/x86_64/interrupt/exception.rs diff --git a/src/interrupt/ipi.rs b/src/arch/x86_64/interrupt/ipi.rs similarity index 100% rename from src/interrupt/ipi.rs rename to src/arch/x86_64/interrupt/ipi.rs diff --git a/src/interrupt/irq.rs b/src/arch/x86_64/interrupt/irq.rs similarity index 100% rename from src/interrupt/irq.rs rename to src/arch/x86_64/interrupt/irq.rs diff --git a/src/interrupt/mod.rs b/src/arch/x86_64/interrupt/mod.rs similarity index 100% rename from src/interrupt/mod.rs rename to src/arch/x86_64/interrupt/mod.rs diff --git a/src/interrupt/syscall.rs b/src/arch/x86_64/interrupt/syscall.rs similarity index 100% rename from src/interrupt/syscall.rs rename to src/arch/x86_64/interrupt/syscall.rs diff --git a/src/interrupt/trace.rs b/src/arch/x86_64/interrupt/trace.rs similarity index 100% rename from src/interrupt/trace.rs rename to src/arch/x86_64/interrupt/trace.rs diff --git a/src/macros.rs b/src/arch/x86_64/macros.rs similarity index 91% rename from src/macros.rs rename to src/arch/x86_64/macros.rs index 2c8d133..ff4f79c 100644 --- a/src/macros.rs +++ b/src/arch/x86_64/macros.rs @@ -3,7 +3,7 @@ macro_rules! print { ($($arg:tt)*) => ({ use core::fmt::Write; - let _ = write!($crate::device::serial::COM1.lock(), $($arg)*); + let _ = write!($crate::arch::device::serial::COM1.lock(), $($arg)*); }); } @@ -85,7 +85,7 @@ macro_rules! interrupt_stack { #[naked] pub unsafe extern fn $name () { #[inline(never)] - unsafe fn inner($stack: &mut $crate::macros::InterruptStack) { + unsafe fn inner($stack: &mut $crate::arch::x86_64::macros::InterruptStack) { $func } @@ -109,7 +109,7 @@ macro_rules! interrupt_stack { asm!("" : "={rsp}"(rsp) : : : "intel", "volatile"); // Call inner rust function - inner(&mut *(rsp as *mut $crate::macros::InterruptStack)); + inner(&mut *(rsp as *mut $crate::arch::x86_64::macros::InterruptStack)); // Pop scratch registers and return asm!("pop fs @@ -153,7 +153,7 @@ macro_rules! interrupt_error { #[naked] pub unsafe extern fn $name () { #[inline(never)] - unsafe fn inner($stack: &$crate::macros::InterruptErrorStack) { + unsafe fn inner($stack: &$crate::arch::x86_64::macros::InterruptErrorStack) { $func } @@ -177,7 +177,7 @@ macro_rules! interrupt_error { asm!("" : "={rsp}"(rsp) : : : "intel", "volatile"); // Call inner rust function - inner(&*(rsp as *const $crate::macros::InterruptErrorStack)); + inner(&*(rsp as *const $crate::arch::x86_64::macros::InterruptErrorStack)); // Pop scratch registers, error code, and return asm!("pop fs diff --git a/src/arch/x86_64/mod.rs b/src/arch/x86_64/mod.rs new file mode 100644 index 0000000..7ae1a8e --- /dev/null +++ b/src/arch/x86_64/mod.rs @@ -0,0 +1,23 @@ +#[macro_use] +pub mod macros; + +/// Devices +pub mod device; + +/// Global descriptor table +pub mod gdt; + +/// Interrupt descriptor table +pub mod idt; + +/// Interrupt instructions +pub mod interrupt; + +/// Paging +pub mod paging; + +/// Initialization and start function +pub mod start; + +/// Stop function +pub mod stop; \ No newline at end of file diff --git a/src/paging/entry.rs b/src/arch/x86_64/paging/entry.rs similarity index 100% rename from src/paging/entry.rs rename to src/arch/x86_64/paging/entry.rs diff --git a/src/paging/mapper.rs b/src/arch/x86_64/paging/mapper.rs similarity index 100% rename from src/paging/mapper.rs rename to src/arch/x86_64/paging/mapper.rs diff --git a/src/paging/mod.rs b/src/arch/x86_64/paging/mod.rs similarity index 100% rename from src/paging/mod.rs rename to src/arch/x86_64/paging/mod.rs diff --git a/src/paging/table.rs b/src/arch/x86_64/paging/table.rs similarity index 100% rename from src/paging/table.rs rename to src/arch/x86_64/paging/table.rs diff --git a/src/paging/temporary_page.rs b/src/arch/x86_64/paging/temporary_page.rs similarity index 100% rename from src/paging/temporary_page.rs rename to src/arch/x86_64/paging/temporary_page.rs diff --git a/src/start.rs b/src/arch/x86_64/start.rs similarity index 100% rename from src/start.rs rename to src/arch/x86_64/start.rs diff --git a/src/stop.rs b/src/arch/x86_64/stop.rs similarity index 100% rename from src/stop.rs rename to src/arch/x86_64/stop.rs diff --git a/src/devices/mod.rs b/src/devices/mod.rs new file mode 100644 index 0000000..9dc8d5b --- /dev/null +++ b/src/devices/mod.rs @@ -0,0 +1 @@ +pub mod uart_16550; \ No newline at end of file diff --git a/src/device/serial.rs b/src/devices/uart_16550.rs similarity index 74% rename from src/device/serial.rs rename to src/devices/uart_16550.rs index b29c8b0..8dfb356 100644 --- a/src/device/serial.rs +++ b/src/devices/uart_16550.rs @@ -1,16 +1,7 @@ use core::fmt::{self, Write}; -use spin::Mutex; use scheme::debug::debug_input; -use syscall::io::{Io, Pio, ReadOnly}; - -pub static COM1: Mutex = Mutex::new(SerialPort::new(0x3F8)); -pub static COM2: Mutex = Mutex::new(SerialPort::new(0x2F8)); - -pub unsafe fn init() { - COM1.lock().init(); - COM2.lock().init(); -} +use syscall::io::{Io, Pio, Mmio, ReadOnly}; bitflags! { /// Interrupt enable flags @@ -34,25 +25,25 @@ bitflags! { } #[allow(dead_code)] -pub struct SerialPort { +pub struct SerialPort> { /// Data register, read to receive, write to send - data: Pio, + data: T, /// Interrupt enable - int_en: Pio, + int_en: T, /// FIFO control - fifo_ctrl: Pio, + fifo_ctrl: T, /// Line control - line_ctrl: Pio, + line_ctrl: T, /// Modem control - modem_ctrl: Pio, + modem_ctrl: T, /// Line status - line_sts: ReadOnly>, + line_sts: ReadOnly, /// Modem status - modem_sts: ReadOnly>, + modem_sts: ReadOnly, } -impl SerialPort { - const fn new(base: u16) -> SerialPort { +impl SerialPort> { + pub const fn new(base: u16) -> SerialPort> { SerialPort { data: Pio::new(base), int_en: Pio::new(base + 1), @@ -63,8 +54,24 @@ impl SerialPort { modem_sts: ReadOnly::new(Pio::new(base + 6)) } } +} - fn init(&mut self) { +impl SerialPort> { + pub fn new(base: usize) -> SerialPort> { + SerialPort { + data: Mmio::new(), + int_en: Mmio::new(), + fifo_ctrl: Mmio::new(), + line_ctrl: Mmio::new(), + modem_ctrl: Mmio::new(), + line_sts: ReadOnly::new(Mmio::new()), + modem_sts: ReadOnly::new(Mmio::new()) + } + } +} + +impl> SerialPort { + pub fn init(&mut self) { //TODO: Cleanup self.int_en.write(0x00); self.line_ctrl.write(0x80); @@ -104,7 +111,7 @@ impl SerialPort { } } -impl Write for SerialPort { +impl> Write for SerialPort { fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> { for byte in s.bytes() { self.send(byte); diff --git a/src/lib.rs b/src/lib.rs index 533b9e4..33e746a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -42,9 +42,10 @@ pub use consts::*; /// Shared data structures pub mod common; -/// Macros like print, println, and interrupt +/// Architecture-dependent stuff #[macro_use] -pub mod macros; +pub mod arch; +pub use arch::*; /// Constants like memory locations pub mod consts; @@ -55,8 +56,8 @@ mod acpi; /// Context management pub mod context; -/// Devices -pub mod device; +/// Architecture-independent devices +pub mod devices; /// ELF file parsing pub mod elf; @@ -64,33 +65,15 @@ pub mod elf; /// External functions pub mod externs; -/// Global descriptor table -pub mod gdt; - -/// Interrupt descriptor table -mod idt; - -/// Interrupt instructions -pub mod interrupt; - /// Memory management pub mod memory; -/// Paging -pub mod paging; - /// Panic pub mod panic; /// Schemes, filesystem handlers pub mod scheme; -/// Initialization and start function -pub mod start; - -/// Shutdown function -pub mod stop; - /// Synchronization primitives pub mod sync;