Skip to content
Open
57 changes: 10 additions & 47 deletions src/arch/aarch64/kernel/mmio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,7 @@ use volatile::VolatileRef;

use crate::arch::aarch64::kernel::interrupts::GIC;
use crate::arch::aarch64::mm::paging::{self, PageSize};
#[cfg(feature = "virtio-console")]
use crate::console::IoDevice;
use crate::drivers::InterruptHandlerMap;
#[cfg(feature = "virtio-console")]
use crate::drivers::console::VirtioConsoleDriver;
#[cfg(feature = "virtio-console")]
use crate::drivers::console::VirtioUART;
#[cfg(feature = "virtio-fs")]
use crate::drivers::fs::VirtioFsDriver;
#[cfg(feature = "virtio-net")]
Expand All @@ -43,41 +37,30 @@ use crate::mm::PhysAddr;

pub(crate) static MMIO_DRIVERS: InitCell<Vec<MmioDriver>> = InitCell::new(Vec::new());

#[allow(clippy::enum_variant_names)]
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
pub(crate) enum MmioDriver {
#[cfg(feature = "virtio-console")]
VirtioConsole(InterruptTicketMutex<VirtioConsoleDriver>),
#[cfg(feature = "virtio-fs")]
VirtioFs(InterruptTicketMutex<VirtioFsDriver>),
#[cfg(feature = "virtio-vsock")]
VirtioVsock(InterruptTicketMutex<VirtioVsockDriver>),
}

impl MmioDriver {
#[cfg(feature = "virtio-console")]
fn get_console_driver(&self) -> Option<&InterruptTicketMutex<VirtioConsoleDriver>> {
#[allow(unreachable_patterns)]
match self {
Self::VirtioConsole(drv) => Some(drv),
_ => None,
}
}

#[cfg(feature = "virtio-fs")]
fn get_filesystem_driver(&self) -> Option<&InterruptTicketMutex<VirtioFsDriver>> {
#[allow(unreachable_patterns)]
match self {
Self::VirtioFs(drv) => Some(drv),
_ => None,
if let Self::VirtioFs(drv) = self {
Some(drv)
} else {
None
}
}

#[cfg(feature = "virtio-vsock")]
fn get_vsock_driver(&self) -> Option<&InterruptTicketMutex<VirtioVsockDriver>> {
#[allow(unreachable_patterns)]
match self {
Self::VirtioVsock(drv) => Some(drv),
_ => None,
if let Self::VirtioVsock(drv) = self {
Some(drv)
} else {
None
}
}
}
Expand All @@ -94,14 +77,6 @@ pub(crate) fn register_driver(drv: MmioDriver) {
#[cfg(feature = "virtio-net")]
pub(crate) type NetworkDevice = VirtioNetDriver;

#[cfg(feature = "virtio-console")]
pub(crate) fn get_console_driver() -> Option<&'static InterruptTicketMutex<VirtioConsoleDriver>> {
MMIO_DRIVERS
.get()?
.iter()
.find_map(|drv| drv.get_console_driver())
}

#[cfg(feature = "virtio-fs")]
pub(crate) fn get_filesystem_driver() -> Option<&'static InterruptTicketMutex<VirtioFsDriver>> {
MMIO_DRIVERS
Expand Down Expand Up @@ -231,9 +206,7 @@ pub fn init_drivers(handlers: &mut InterruptHandlerMap) {

match drv {
#[cfg(feature = "virtio-console")]
VirtioDriver::Console(drv) => register_driver(MmioDriver::VirtioConsole(
InterruptTicketMutex::new(*drv),
)),
VirtioDriver::Console(drv) => crate::console::switch_to_virtio(*drv),
#[cfg(feature = "virtio-fs")]
VirtioDriver::Fs(drv) => {
register_driver(MmioDriver::VirtioFs(InterruptTicketMutex::new(*drv)));
Expand All @@ -251,14 +224,4 @@ pub fn init_drivers(handlers: &mut InterruptHandlerMap) {
});

MMIO_DRIVERS.finalize();

#[cfg(feature = "virtio-console")]
{
if get_console_driver().is_some() {
info!("Switch to virtio console");
crate::console::CONSOLE
.lock()
.replace_device(IoDevice::Virtio(VirtioUART::new()));
}
}
}
24 changes: 1 addition & 23 deletions src/arch/riscv64/kernel/devicetree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,9 @@ use crate::arch::riscv64::kernel::interrupts::init_plic;
))]
use crate::arch::riscv64::kernel::mmio::MmioDriver;
use crate::arch::riscv64::mm::paging::{self, PageSize};
#[cfg(feature = "virtio-console")]
use crate::console::IoDevice;
use crate::drivers::InterruptHandlerMap;
#[cfg(feature = "virtio-console")]
use crate::drivers::console::VirtioUART;
#[cfg(all(feature = "virtio-console", not(feature = "pci")))]
use crate::drivers::mmio::get_console_driver;
#[cfg(all(feature = "gem-net", not(feature = "pci")))]
use crate::drivers::net::gem;
#[cfg(all(feature = "virtio-console", feature = "pci"))]
use crate::drivers::pci::get_console_driver;
#[cfg(all(feature = "virtio", not(feature = "pci")))]
use crate::drivers::virtio::transport::mmio as mmio_virtio;
#[cfg(all(
Expand Down Expand Up @@ -259,11 +251,7 @@ pub fn init_drivers(handlers: &mut InterruptHandlerMap) {

match mmio_virtio::init_device(mmio, irq.try_into().unwrap(), handlers) {
#[cfg(feature = "virtio-console")]
Ok(VirtioDriver::Console(drv)) => {
register_driver(MmioDriver::VirtioConsole(
hermit_sync::InterruptSpinMutex::new(*drv),
));
}
Ok(VirtioDriver::Console(drv)) => crate::console::switch_to_virtio(*drv),
#[cfg(feature = "virtio-fs")]
Ok(VirtioDriver::Fs(drv)) => {
register_driver(MmioDriver::VirtioFs(
Expand All @@ -288,14 +276,4 @@ pub fn init_drivers(handlers: &mut InterruptHandlerMap) {

#[cfg(all(any(feature = "virtio", feature = "gem-net"), not(feature = "pci")))]
super::mmio::MMIO_DRIVERS.finalize();

#[cfg(feature = "virtio-console")]
{
if get_console_driver().is_some() {
info!("Switch to virtio console");
crate::console::CONSOLE
.lock()
.replace_device(IoDevice::Virtio(VirtioUART::new()));
}
}
}
39 changes: 9 additions & 30 deletions src/arch/riscv64/kernel/mmio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ use alloc::vec::Vec;
))]
use hermit_sync::InterruptSpinMutex;

#[cfg(feature = "virtio-console")]
use crate::drivers::console::VirtioConsoleDriver;
#[cfg(feature = "virtio-fs")]
use crate::drivers::fs::VirtioFsDriver;
#[cfg(feature = "gem-net")]
Expand All @@ -21,41 +19,30 @@ use crate::init_cell::InitCell;

pub(crate) static MMIO_DRIVERS: InitCell<Vec<MmioDriver>> = InitCell::new(Vec::new());

#[allow(clippy::enum_variant_names)]
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
pub(crate) enum MmioDriver {
#[cfg(feature = "virtio-console")]
VirtioConsole(InterruptSpinMutex<VirtioConsoleDriver>),
#[cfg(feature = "virtio-fs")]
VirtioFs(InterruptSpinMutex<VirtioFsDriver>),
#[cfg(feature = "virtio-vsock")]
VirtioVsock(InterruptSpinMutex<VirtioVsockDriver>),
}

impl MmioDriver {
#[cfg(feature = "virtio-console")]
fn get_console_driver(&self) -> Option<&InterruptSpinMutex<VirtioConsoleDriver>> {
#[allow(unreachable_patterns)]
match self {
Self::VirtioConsole(drv) => Some(drv),
_ => None,
}
}

#[cfg(feature = "virtio-fs")]
fn get_filesystem_driver(&self) -> Option<&InterruptSpinMutex<VirtioFsDriver>> {
#[allow(unreachable_patterns)]
match self {
Self::VirtioFs(drv) => Some(drv),
_ => None,
if let Self::VirtioFs(drv) = self {
Some(drv)
} else {
None
}
}

#[cfg(feature = "virtio-vsock")]
fn get_vsock_driver(&self) -> Option<&InterruptSpinMutex<VirtioVsockDriver>> {
#[allow(unreachable_patterns)]
match self {
Self::VirtioVsock(drv) => Some(drv),
_ => None,
if let Self::VirtioVsock(drv) = self {
Some(drv)
} else {
None
}
}
}
Expand All @@ -75,14 +62,6 @@ pub(crate) type NetworkDevice = GEMDriver;
#[cfg(all(not(feature = "gem-net"), feature = "virtio-net"))]
pub(crate) type NetworkDevice = VirtioNetDriver;

#[cfg(feature = "virtio-console")]
pub(crate) fn get_console_driver() -> Option<&'static InterruptSpinMutex<VirtioConsoleDriver>> {
MMIO_DRIVERS
.get()?
.iter()
.find_map(|drv| drv.get_console_driver())
}

#[cfg(feature = "virtio-fs")]
pub(crate) fn get_filesystem_driver() -> Option<&'static InterruptSpinMutex<VirtioFsDriver>> {
MMIO_DRIVERS
Expand Down
52 changes: 10 additions & 42 deletions src/arch/x86_64/kernel/mmio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ use crate::arch::x86_64::mm::paging::{
BasePageSize, PageSize, PageTableEntryFlags, PageTableEntryFlagsExt,
};
use crate::drivers::InterruptHandlerMap;
#[cfg(feature = "virtio-console")]
use crate::drivers::console::VirtioConsoleDriver;
#[cfg(feature = "virtio-fs")]
use crate::drivers::fs::VirtioFsDriver;
#[cfg(feature = "virtio-net")]
Expand All @@ -47,41 +45,30 @@ pub const MAGIC_VALUE: u32 = 0x7472_6976;

static MMIO_DRIVERS: InitCell<Vec<MmioDriver>> = InitCell::new(Vec::new());

#[allow(clippy::enum_variant_names)]
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
pub(crate) enum MmioDriver {
#[cfg(feature = "virtio-console")]
VirtioConsole(InterruptTicketMutex<VirtioConsoleDriver>),
#[cfg(feature = "virtio-fs")]
VirtioFs(InterruptTicketMutex<VirtioFsDriver>),
#[cfg(feature = "virtio-vsock")]
VirtioVsock(InterruptTicketMutex<VirtioVsockDriver>),
}

impl MmioDriver {
#[cfg(feature = "virtio-console")]
fn get_console_driver(&self) -> Option<&InterruptTicketMutex<VirtioConsoleDriver>> {
#[allow(unreachable_patterns)]
match self {
Self::VirtioConsole(drv) => Some(drv),
_ => None,
}
}

#[cfg(feature = "virtio-fs")]
fn get_filesystem_driver(&self) -> Option<&InterruptTicketMutex<VirtioFsDriver>> {
#[allow(unreachable_patterns)]
match self {
Self::VirtioFs(drv) => Some(drv),
_ => None,
if let Self::VirtioFs(drv) = self {
Some(drv)
} else {
None
}
}

#[cfg(feature = "virtio-vsock")]
fn get_vsock_driver(&self) -> Option<&InterruptTicketMutex<VirtioVsockDriver>> {
#[allow(unreachable_patterns)]
match self {
Self::VirtioVsock(drv) => Some(drv),
_ => None,
if let Self::VirtioVsock(drv) = self {
Some(drv)
} else {
None
}
}
}
Expand Down Expand Up @@ -194,14 +181,6 @@ pub(crate) fn register_driver(drv: MmioDriver) {
#[cfg(feature = "virtio-net")]
pub(crate) type NetworkDevice = VirtioNetDriver;

#[cfg(feature = "virtio-console")]
pub(crate) fn get_console_driver() -> Option<&'static InterruptTicketMutex<VirtioConsoleDriver>> {
MMIO_DRIVERS
.get()?
.iter()
.find_map(|drv| drv.get_console_driver())
}

#[cfg(feature = "virtio-fs")]
pub(crate) fn get_filesystem_driver() -> Option<&'static InterruptTicketMutex<VirtioFsDriver>> {
MMIO_DRIVERS
Expand All @@ -226,7 +205,7 @@ fn register_mmio(
match mmio_virtio::init_device(mmio, irq, handlers) {
#[cfg(feature = "virtio-console")]
Ok(VirtioDriver::Console(drv)) => {
register_driver(MmioDriver::VirtioConsole(InterruptTicketMutex::new(*drv)));
crate::console::switch_to_virtio(*drv);
}
#[cfg(feature = "virtio-fs")]
Ok(VirtioDriver::Fs(drv)) => {
Expand Down Expand Up @@ -263,16 +242,5 @@ pub(crate) fn init_drivers(handlers: &mut InterruptHandlerMap) {
}

MMIO_DRIVERS.finalize();

#[cfg(feature = "virtio-console")]
if get_console_driver().is_some() {
use crate::console::IoDevice;
use crate::drivers::console::VirtioUART;

info!("Switch to virtio console");
crate::console::CONSOLE
.lock()
.replace_device(IoDevice::Virtio(VirtioUART::new()));
}
});
}
16 changes: 9 additions & 7 deletions src/console/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,19 @@ use hermit_sync::{InterruptTicketMutex, Lazy};

use crate::arch::kernel::serial::SerialDevice;
#[cfg(feature = "virtio-console")]
use crate::drivers::console::VirtioUART;
use crate::drivers::console::VirtioConsoleDriver;
use crate::errno::Errno;
use crate::executor::WakerRegistration;

const SERIAL_BUFFER_SIZE: usize = 256;

#[allow(clippy::large_enum_variant)]
pub(crate) enum IoDevice {
#[cfg(feature = "uhyve")]
Uhyve(uhyve::UhyveSerial),
Uart(SerialDevice),
#[cfg(feature = "virtio-console")]
Virtio(VirtioUART),
Virtio(VirtioConsoleDriver),
}

impl ErrorType for IoDevice {
Expand Down Expand Up @@ -77,7 +78,7 @@ impl Write for IoDevice {
}

pub(crate) struct Console {
device: IoDevice,
pub device: IoDevice,
buffer: Vec<u8, SERIAL_BUFFER_SIZE>,
}

Expand All @@ -88,11 +89,12 @@ impl Console {
buffer: Vec::new(),
}
}
}

#[cfg(feature = "virtio-console")]
pub fn replace_device(&mut self, device: IoDevice) {
self.device = device;
}
#[cfg(feature = "virtio-console")]
pub(crate) fn switch_to_virtio(device: VirtioConsoleDriver) {
info!("Switch to virtio console");
CONSOLE.lock().device = IoDevice::Virtio(device);
}

impl ErrorType for Console {
Expand Down
Loading
Loading