diff --git a/crates/examples/microkit/http-server/http-server.system b/crates/examples/microkit/http-server/http-server.system index f8e8f9700..ee7a48033 100644 --- a/crates/examples/microkit/http-server/http-server.system +++ b/crates/examples/microkit/http-server/http-server.system @@ -27,7 +27,6 @@ - @@ -35,7 +34,6 @@ - @@ -45,21 +43,17 @@ - - - - @@ -73,14 +67,11 @@ - - - diff --git a/crates/examples/microkit/http-server/pds/server/src/config.rs b/crates/examples/microkit/http-server/pds/server/src/config.rs new file mode 100644 index 000000000..b4e383181 --- /dev/null +++ b/crates/examples/microkit/http-server/pds/server/src/config.rs @@ -0,0 +1,16 @@ +// +// Copyright 2023, Colias Group, LLC +// +// SPDX-License-Identifier: BSD-2-Clause +// + +pub mod channels { + use sel4_microkit::Channel; + + pub const TIMER_DRIVER: Channel = Channel::new(0); + pub const NET_DRIVER: Channel = Channel::new(1); + pub const BLOCK_DRIVER: Channel = Channel::new(2); +} + +pub const VIRTIO_NET_CLIENT_DMA_SIZE: usize = 0x200_000; +pub const VIRTIO_BLK_CLIENT_DMA_SIZE: usize = 0x200_000; diff --git a/crates/examples/microkit/http-server/pds/server/src/main.rs b/crates/examples/microkit/http-server/pds/server/src/main.rs index ffd52ef28..da150df08 100644 --- a/crates/examples/microkit/http-server/pds/server/src/main.rs +++ b/crates/examples/microkit/http-server/pds/server/src/main.rs @@ -29,7 +29,7 @@ use sel4_async_block_io::{ use sel4_bounce_buffer_allocator::{Basic, BounceBufferAllocator}; use sel4_externally_shared::{ExternallySharedRef, ExternallySharedRefExt}; use sel4_logging::{LevelFilter, Logger, LoggerBuilder}; -use sel4_microkit::{memory_region_symbol, protection_domain, var, Channel, Handler}; +use sel4_microkit::{memory_region_symbol, protection_domain, Handler}; use sel4_shared_ring_buffer::RingBuffers; use sel4_shared_ring_buffer_block_io::SharedRingBufferBlockIO; use sel4_shared_ring_buffer_smoltcp::DeviceImpl; @@ -37,11 +37,13 @@ use sel4_shared_ring_buffer_smoltcp::DeviceImpl; use microkit_http_server_example_server_core::run_server; mod block_client; +mod config; mod handler; mod net_client; mod timer_client; use block_client::BlockClient; +use config::channels; use handler::HandlerImpl; use net_client::NetClient; use timer_client::TimerClient; @@ -66,10 +68,6 @@ static LOGGER: Logger = LoggerBuilder::const_default() .write(|s| sel4::debug_print!("{}", s)) .build(); -const TIMER_DRIVER: Channel = Channel::new(0); -const NET_DRIVER: Channel = Channel::new(1); -const BLOCK_DRIVER: Channel = Channel::new(2); - #[protection_domain( heap_size = 16 * 1024 * 1024, )] @@ -78,17 +76,17 @@ fn init() -> impl Handler { setup_newlib(); - let timer_client = TimerClient::new(TIMER_DRIVER); - let net_client = NetClient::new(NET_DRIVER); - let block_client = BlockClient::new(BLOCK_DRIVER); + let timer_client = TimerClient::new(channels::TIMER_DRIVER); + let net_client = NetClient::new(channels::NET_DRIVER); + let block_client = BlockClient::new(channels::BLOCK_DRIVER); - let notify_net: fn() = || NET_DRIVER.notify(); - let notify_block: fn() = || BLOCK_DRIVER.notify(); + let notify_net: fn() = || channels::NET_DRIVER.notify(); + let notify_block: fn() = || channels::BLOCK_DRIVER.notify(); let net_device = { let dma_region = unsafe { ExternallySharedRef::<'static, _>::new( - memory_region_symbol!(virtio_net_client_dma_vaddr: *mut [u8], n = *var!(virtio_net_client_dma_size: usize = 0)), + memory_region_symbol!(virtio_net_client_dma_vaddr: *mut [u8], n = config::VIRTIO_NET_CLIENT_DMA_SIZE), ) }; @@ -137,7 +135,7 @@ fn init() -> impl Handler { let shared_block_io = { let dma_region = unsafe { ExternallySharedRef::<'static, _>::new( - memory_region_symbol!(virtio_blk_client_dma_vaddr: *mut [u8], n = *var!(virtio_blk_client_dma_size: usize = 0)), + memory_region_symbol!(virtio_blk_client_dma_vaddr: *mut [u8], n = config::VIRTIO_BLK_CLIENT_DMA_SIZE), ) }; @@ -158,9 +156,9 @@ fn init() -> impl Handler { }; HandlerImpl::new( - TIMER_DRIVER, - NET_DRIVER, - BLOCK_DRIVER, + channels::TIMER_DRIVER, + channels::NET_DRIVER, + channels::BLOCK_DRIVER, timer_client, net_device, net_config, diff --git a/crates/examples/microkit/http-server/pds/sp804-driver/src/config.rs b/crates/examples/microkit/http-server/pds/sp804-driver/src/config.rs new file mode 100644 index 000000000..da8579126 --- /dev/null +++ b/crates/examples/microkit/http-server/pds/sp804-driver/src/config.rs @@ -0,0 +1,14 @@ +// +// Copyright 2023, Colias Group, LLC +// +// SPDX-License-Identifier: BSD-2-Clause +// + +pub mod channels { + use sel4_microkit::Channel; + + pub const DEVICE: Channel = Channel::new(0); + pub const CLIENT: Channel = Channel::new(1); +} + +pub const FREQ: u64 = 1_000_000; diff --git a/crates/examples/microkit/http-server/pds/sp804-driver/src/main.rs b/crates/examples/microkit/http-server/pds/sp804-driver/src/main.rs index 7aba7792b..85783bcb3 100644 --- a/crates/examples/microkit/http-server/pds/sp804-driver/src/main.rs +++ b/crates/examples/microkit/http-server/pds/sp804-driver/src/main.rs @@ -10,21 +10,22 @@ use core::time::Duration; -use sel4_microkit::{memory_region_symbol, protection_domain, var, Channel, Handler, MessageInfo}; +use sel4_microkit::{memory_region_symbol, protection_domain, Channel, Handler, MessageInfo}; use sel4_microkit_message::MessageInfoExt as _; use microkit_http_server_example_sp804_driver_core::Driver; use microkit_http_server_example_sp804_driver_interface_types::*; -const DEVICE: Channel = Channel::new(0); -const CLIENT: Channel = Channel::new(1); +mod config; + +use config::channels; #[protection_domain] fn init() -> HandlerImpl { let driver = unsafe { Driver::new( memory_region_symbol!(sp804_mmio_vaddr: *mut ()).as_ptr(), - (*var!(freq: usize = 0)).try_into().unwrap(), + config::FREQ, ) }; HandlerImpl { driver } @@ -39,10 +40,10 @@ impl Handler for HandlerImpl { fn notified(&mut self, channel: Channel) -> Result<(), Self::Error> { match channel { - DEVICE => { + channels::DEVICE => { self.driver.handle_interrupt(); - DEVICE.irq_ack().unwrap(); - CLIENT.notify(); + channels::DEVICE.irq_ack().unwrap(); + channels::CLIENT.notify(); } _ => { unreachable!() @@ -57,7 +58,7 @@ impl Handler for HandlerImpl { msg_info: MessageInfo, ) -> Result { Ok(match channel { - CLIENT => match msg_info.recv_using_postcard::() { + channels::CLIENT => match msg_info.recv_using_postcard::() { Ok(req) => match req { Request::Now => { let now = self.driver.now(); diff --git a/crates/examples/microkit/http-server/pds/virtio-blk-driver/src/config.rs b/crates/examples/microkit/http-server/pds/virtio-blk-driver/src/config.rs new file mode 100644 index 000000000..a4e6a01b4 --- /dev/null +++ b/crates/examples/microkit/http-server/pds/virtio-blk-driver/src/config.rs @@ -0,0 +1,16 @@ +// +// Copyright 2023, Colias Group, LLC +// +// SPDX-License-Identifier: BSD-2-Clause +// + +pub mod channels { + use sel4_microkit::Channel; + + pub const DEVICE: Channel = Channel::new(0); + pub const CLIENT: Channel = Channel::new(1); +} + +pub const VIRTIO_BLK_MMIO_OFFSET: usize = 0xc00; +pub const VIRTIO_BLK_DRIVER_DMA_SIZE: usize = 0x200_000; +pub const VIRTIO_BLK_CLIENT_DMA_SIZE: usize = 0x200_000; diff --git a/crates/examples/microkit/http-server/pds/virtio-blk-driver/src/main.rs b/crates/examples/microkit/http-server/pds/virtio-blk-driver/src/main.rs index 22cfda96e..c57ddf6bc 100644 --- a/crates/examples/microkit/http-server/pds/virtio-blk-driver/src/main.rs +++ b/crates/examples/microkit/http-server/pds/virtio-blk-driver/src/main.rs @@ -34,8 +34,9 @@ use sel4_shared_ring_buffer_block_io_types::{ use microkit_http_server_example_virtio_blk_driver_interface_types::*; use microkit_http_server_example_virtio_hal_impl::HalImpl; -const DEVICE: Channel = Channel::new(0); -const CLIENT: Channel = Channel::new(1); +mod config; + +use config::channels; // HACK hard-coded in virtio-drivers const QUEUE_SIZE: usize = 4; @@ -45,14 +46,14 @@ const QUEUE_SIZE: usize = 4; )] fn init() -> HandlerImpl { HalImpl::init( - *var!(virtio_blk_driver_dma_size: usize = 0), + config::VIRTIO_BLK_DRIVER_DMA_SIZE, *var!(virtio_blk_driver_dma_vaddr: usize = 0), *var!(virtio_blk_driver_dma_paddr: usize = 0), ); let mut dev = { let header = NonNull::new( - (*var!(virtio_blk_mmio_vaddr: usize = 0) + *var!(virtio_blk_mmio_offset: usize = 0)) + (*var!(virtio_blk_mmio_vaddr: usize = 0) + config::VIRTIO_BLK_MMIO_OFFSET) as *mut VirtIOHeader, ) .unwrap(); @@ -63,11 +64,11 @@ fn init() -> HandlerImpl { let client_region = unsafe { ExternallySharedRef::<'static, _>::new( - memory_region_symbol!(virtio_blk_client_dma_vaddr: *mut [u8], n = *var!(virtio_blk_client_dma_size: usize = 0)), + memory_region_symbol!(virtio_blk_client_dma_vaddr: *mut [u8], n = config::VIRTIO_BLK_CLIENT_DMA_SIZE), ) }; - let notify_client: fn() = || CLIENT.notify(); + let notify_client: fn() = || channels::CLIENT.notify(); let ring_buffers = RingBuffers::<'_, Use, fn(), BlockIORequest>::from_ptrs_using_default_initialization_strategy_for_role( @@ -77,7 +78,7 @@ fn init() -> HandlerImpl { ); dev.ack_interrupt(); - DEVICE.irq_ack().unwrap(); + channels::DEVICE.irq_ack().unwrap(); HandlerImpl { dev, @@ -105,7 +106,7 @@ impl Handler for HandlerImpl { fn notified(&mut self, channel: Channel) -> Result<(), Self::Error> { match channel { - DEVICE | CLIENT => { + channels::DEVICE | channels::CLIENT => { let mut notify = false; while self.dev.peek_used().is_some() { @@ -191,7 +192,7 @@ impl Handler for HandlerImpl { } self.dev.ack_interrupt(); - DEVICE.irq_ack().unwrap(); + channels::DEVICE.irq_ack().unwrap(); } _ => { unreachable!() @@ -206,7 +207,7 @@ impl Handler for HandlerImpl { msg_info: MessageInfo, ) -> Result { Ok(match channel { - CLIENT => match msg_info.recv_using_postcard::() { + channels::CLIENT => match msg_info.recv_using_postcard::() { Ok(req) => match req { Request::GetNumBlocks => { let num_blocks = self.dev.capacity(); diff --git a/crates/examples/microkit/http-server/pds/virtio-net-driver/src/config.rs b/crates/examples/microkit/http-server/pds/virtio-net-driver/src/config.rs new file mode 100644 index 000000000..b39a74057 --- /dev/null +++ b/crates/examples/microkit/http-server/pds/virtio-net-driver/src/config.rs @@ -0,0 +1,16 @@ +// +// Copyright 2023, Colias Group, LLC +// +// SPDX-License-Identifier: BSD-2-Clause +// + +pub mod channels { + use sel4_microkit::Channel; + + pub const DEVICE: Channel = Channel::new(0); + pub const CLIENT: Channel = Channel::new(1); +} + +pub const VIRTIO_NET_MMIO_OFFSET: usize = 0xe00; +pub const VIRTIO_NET_DRIVER_DMA_SIZE: usize = 0x200_000; +pub const VIRTIO_NET_CLIENT_DMA_SIZE: usize = 0x200_000; diff --git a/crates/examples/microkit/http-server/pds/virtio-net-driver/src/main.rs b/crates/examples/microkit/http-server/pds/virtio-net-driver/src/main.rs index 483c63649..82c0cf004 100644 --- a/crates/examples/microkit/http-server/pds/virtio-net-driver/src/main.rs +++ b/crates/examples/microkit/http-server/pds/virtio-net-driver/src/main.rs @@ -26,8 +26,9 @@ use sel4_shared_ring_buffer::{roles::Use, RingBuffers}; use microkit_http_server_example_virtio_hal_impl::HalImpl; use microkit_http_server_example_virtio_net_driver_interface_types::*; -const DEVICE: Channel = Channel::new(0); -const CLIENT: Channel = Channel::new(1); +mod config; + +use config::channels; const NET_QUEUE_SIZE: usize = 16; const NET_BUFFER_LEN: usize = 2048; @@ -37,14 +38,14 @@ const NET_BUFFER_LEN: usize = 2048; )] fn init() -> HandlerImpl { HalImpl::init( - *var!(virtio_net_driver_dma_size: usize = 0), + config::VIRTIO_NET_DRIVER_DMA_SIZE, *var!(virtio_net_driver_dma_vaddr: usize = 0), *var!(virtio_net_driver_dma_paddr: usize = 0), ); let mut dev = { let header = NonNull::new( - (*var!(virtio_net_mmio_vaddr: usize = 0) + *var!(virtio_net_mmio_offset: usize = 0)) + (*var!(virtio_net_mmio_vaddr: usize = 0) + config::VIRTIO_NET_MMIO_OFFSET) as *mut VirtIOHeader, ) .unwrap(); @@ -55,11 +56,11 @@ fn init() -> HandlerImpl { let client_region = unsafe { ExternallySharedRef::<'static, _>::new( - memory_region_symbol!(virtio_net_client_dma_vaddr: *mut [u8], n = *var!(virtio_net_client_dma_size: usize = 0)), + memory_region_symbol!(virtio_net_client_dma_vaddr: *mut [u8], n = config::VIRTIO_NET_CLIENT_DMA_SIZE), ) }; - let notify_client: fn() = || CLIENT.notify(); + let notify_client: fn() = || channels::CLIENT.notify(); let rx_ring_buffers = RingBuffers::<'_, Use, fn()>::from_ptrs_using_default_initialization_strategy_for_role( @@ -76,7 +77,7 @@ fn init() -> HandlerImpl { ); dev.ack_interrupt(); - DEVICE.irq_ack().unwrap(); + channels::DEVICE.irq_ack().unwrap(); HandlerImpl { dev, @@ -98,7 +99,7 @@ impl Handler for HandlerImpl { fn notified(&mut self, channel: Channel) -> Result<(), Self::Error> { match channel { - DEVICE | CLIENT => { + channels::DEVICE | channels::CLIENT => { let mut notify_rx = false; while self.dev.can_recv() && !self.rx_ring_buffers.free_mut().is_empty().unwrap() { @@ -154,7 +155,7 @@ impl Handler for HandlerImpl { } self.dev.ack_interrupt(); - DEVICE.irq_ack().unwrap(); + channels::DEVICE.irq_ack().unwrap(); } _ => { unreachable!() @@ -169,7 +170,7 @@ impl Handler for HandlerImpl { msg_info: MessageInfo, ) -> Result { Ok(match channel { - CLIENT => match msg_info.recv_using_postcard::() { + channels::CLIENT => match msg_info.recv_using_postcard::() { Ok(req) => match req { Request::GetMacAddress => { let mac_address = self.dev.mac_address(); diff --git a/hacking/nix/scope/sources.nix b/hacking/nix/scope/sources.nix index 4bbf381ff..b839b69d0 100644 --- a/hacking/nix/scope/sources.nix +++ b/hacking/nix/scope/sources.nix @@ -65,7 +65,7 @@ in rec { microkit = fetchGit { url = "https://github.com/coliasgroup/microkit.git"; - rev = "3dbabd1205cbee933b1ef42534d7a446f78821d0"; # branch "rust-nix" + rev = "1e561e5b11970a3b61167225ebcaf11aa7ad4959"; # branch "rust-nix" local = localRoot + "/microkit"; # useLocal = true; };