From 7649cb0b18aab405127bdc5a17821dfbf14ee97d Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sun, 18 Oct 2026 04:26:42 +0200 Subject: [PATCH] feat: add run() and binary entry points for all servers and init Every server now has lib.rs (testable) + main.rs (deployable binary). Binary is 3 lines: extern crate userspace_rt + call run(). Hardware servers use feature flags for adapter selection. 9 RISC-V binaries ready for the disk image. --- crates/init/Cargo.toml | 6 ++++++ crates/init/src/lib.rs | 9 +++++++++ crates/init/src/main.rs | 9 +++++++++ crates/servers/display-server/Cargo.toml | 11 +++++++++++ crates/servers/display-server/src/lib.rs | 12 ++++++++++++ crates/servers/display-server/src/main.rs | 9 +++++++++ crates/servers/input-server/Cargo.toml | 11 +++++++++++ crates/servers/input-server/src/lib.rs | 12 ++++++++++++ crates/servers/input-server/src/main.rs | 9 +++++++++ crates/servers/log-server/Cargo.toml | 7 +++++++ crates/servers/log-server/src/lib.rs | 6 ++++++ crates/servers/log-server/src/main.rs | 9 +++++++++ crates/servers/permission-manager/Cargo.toml | 7 +++++++ crates/servers/permission-manager/src/lib.rs | 6 ++++++ crates/servers/permission-manager/src/main.rs | 9 +++++++++ crates/servers/session-server/Cargo.toml | 6 ++++++ crates/servers/session-server/src/lib.rs | 7 +++++++ crates/servers/session-server/src/main.rs | 9 +++++++++ crates/servers/storage-server/Cargo.toml | 11 +++++++++++ crates/servers/storage-server/src/lib.rs | 14 ++++++++++++++ crates/servers/storage-server/src/main.rs | 9 +++++++++ 21 files changed, 188 insertions(+) create mode 100644 crates/init/src/main.rs create mode 100644 crates/servers/display-server/src/main.rs create mode 100644 crates/servers/input-server/src/main.rs create mode 100644 crates/servers/log-server/src/main.rs create mode 100644 crates/servers/permission-manager/src/main.rs create mode 100644 crates/servers/session-server/src/main.rs create mode 100644 crates/servers/storage-server/src/main.rs diff --git a/crates/init/Cargo.toml b/crates/init/Cargo.toml index e5af0a4..ad956cd 100644 --- a/crates/init/Cargo.toml +++ b/crates/init/Cargo.toml @@ -3,6 +3,12 @@ name = "init" version = "0.1.0" edition = "2024" +[[bin]] +name = "init" +test = false +bench = false + [dependencies] types = { workspace = true } userspace = { workspace = true } +userspace-rt = { workspace = true } diff --git a/crates/init/src/lib.rs b/crates/init/src/lib.rs index d2c1cc0..c248684 100644 --- a/crates/init/src/lib.rs +++ b/crates/init/src/lib.rs @@ -5,3 +5,12 @@ pub mod manifest; pub mod protocol_helpers; pub mod shutdown; pub mod supervisor; + +pub fn run() -> ! { + let create_cap = types::bounded::CapSlot::new(0) + .unwrap_or_else(|| unreachable!()); + + let result = boot::boot(&manifest::SNAKE_MANIFEST, create_cap); + let mut sup = boot::create_supervisor(&manifest::SNAKE_MANIFEST, &result); + sup.run(create_cap); +} diff --git a/crates/init/src/main.rs b/crates/init/src/main.rs new file mode 100644 index 0000000..d7ceb9a --- /dev/null +++ b/crates/init/src/main.rs @@ -0,0 +1,9 @@ +#![no_std] +#![no_main] + +extern crate userspace_rt; + +#[unsafe(no_mangle)] +extern "C" fn main() { + init::run(); +} diff --git a/crates/servers/display-server/Cargo.toml b/crates/servers/display-server/Cargo.toml index 84efda3..8639337 100644 --- a/crates/servers/display-server/Cargo.toml +++ b/crates/servers/display-server/Cargo.toml @@ -3,6 +3,17 @@ name = "display-server" version = "0.1.0" edition = "2024" +[[bin]] +name = "display-server" +test = false +bench = false + +[features] +default = ["qemu-virt"] +qemu-virt = [] + [dependencies] types = { workspace = true } +userspace = { workspace = true } +userspace-rt = { workspace = true } server-framework = { workspace = true } diff --git a/crates/servers/display-server/src/lib.rs b/crates/servers/display-server/src/lib.rs index 1994575..39ca638 100644 --- a/crates/servers/display-server/src/lib.rs +++ b/crates/servers/display-server/src/lib.rs @@ -8,3 +8,15 @@ pub mod server; #[cfg(test)] #[path = "tests/mod.rs"] mod tests; + +pub fn run() -> ! { + #[cfg(feature = "qemu-virt")] + let fb = adapters::qemu_virtio::VirtioFramebuffer::new(0x10008000); + + #[cfg(not(feature = "qemu-virt"))] + let fb = adapters::mock::MockFramebuffer::new(320, 240); + + let mut srv = server::DisplayServer::new(fb); + server_framework::serve(&mut srv, 0); + loop { userspace::syscall::yield_now(); } +} diff --git a/crates/servers/display-server/src/main.rs b/crates/servers/display-server/src/main.rs new file mode 100644 index 0000000..fef72f7 --- /dev/null +++ b/crates/servers/display-server/src/main.rs @@ -0,0 +1,9 @@ +#![no_std] +#![no_main] + +extern crate userspace_rt; + +#[unsafe(no_mangle)] +extern "C" fn main() { + display_server::run(); +} diff --git a/crates/servers/input-server/Cargo.toml b/crates/servers/input-server/Cargo.toml index c118c5e..e921cda 100644 --- a/crates/servers/input-server/Cargo.toml +++ b/crates/servers/input-server/Cargo.toml @@ -3,6 +3,17 @@ name = "input-server" version = "0.1.0" edition = "2024" +[[bin]] +name = "input-server" +test = false +bench = false + +[features] +default = ["qemu-virt"] +qemu-virt = [] + [dependencies] types = { workspace = true } +userspace = { workspace = true } +userspace-rt = { workspace = true } server-framework = { workspace = true } diff --git a/crates/servers/input-server/src/lib.rs b/crates/servers/input-server/src/lib.rs index 295ca34..74cec3e 100644 --- a/crates/servers/input-server/src/lib.rs +++ b/crates/servers/input-server/src/lib.rs @@ -8,3 +8,15 @@ pub mod server; #[cfg(test)] #[path = "tests/mod.rs"] mod tests; + +pub fn run() -> ! { + #[cfg(feature = "qemu-virt")] + let device = adapters::qemu_uart::UartInputDevice::new(); + + #[cfg(not(feature = "qemu-virt"))] + let device = adapters::mock::MockInputDevice::new(); + + let mut srv = server::InputServer::new(device); + server_framework::serve(&mut srv, 0); + loop { userspace::syscall::yield_now(); } +} diff --git a/crates/servers/input-server/src/main.rs b/crates/servers/input-server/src/main.rs new file mode 100644 index 0000000..5b380dd --- /dev/null +++ b/crates/servers/input-server/src/main.rs @@ -0,0 +1,9 @@ +#![no_std] +#![no_main] + +extern crate userspace_rt; + +#[unsafe(no_mangle)] +extern "C" fn main() { + input_server::run(); +} diff --git a/crates/servers/log-server/Cargo.toml b/crates/servers/log-server/Cargo.toml index b477c0b..329566b 100644 --- a/crates/servers/log-server/Cargo.toml +++ b/crates/servers/log-server/Cargo.toml @@ -3,6 +3,13 @@ name = "log-server" version = "0.1.0" edition = "2024" +[[bin]] +name = "log-server" +test = false +bench = false + [dependencies] types = { workspace = true } +userspace = { workspace = true } +userspace-rt = { workspace = true } server-framework = { workspace = true } diff --git a/crates/servers/log-server/src/lib.rs b/crates/servers/log-server/src/lib.rs index 08873ca..aef65c5 100644 --- a/crates/servers/log-server/src/lib.rs +++ b/crates/servers/log-server/src/lib.rs @@ -6,3 +6,9 @@ pub mod server; #[cfg(test)] #[path = "tests/mod.rs"] mod tests; + +pub fn run() -> ! { + let mut srv = server::LogServer::new(); + server_framework::serve(&mut srv, 0); + loop { userspace::syscall::yield_now(); } +} diff --git a/crates/servers/log-server/src/main.rs b/crates/servers/log-server/src/main.rs new file mode 100644 index 0000000..5266d7b --- /dev/null +++ b/crates/servers/log-server/src/main.rs @@ -0,0 +1,9 @@ +#![no_std] +#![no_main] + +extern crate userspace_rt; + +#[unsafe(no_mangle)] +extern "C" fn main() { + log_server::run(); +} diff --git a/crates/servers/permission-manager/Cargo.toml b/crates/servers/permission-manager/Cargo.toml index cd8f722..f263086 100644 --- a/crates/servers/permission-manager/Cargo.toml +++ b/crates/servers/permission-manager/Cargo.toml @@ -3,6 +3,13 @@ name = "permission-manager" version = "0.1.0" edition = "2024" +[[bin]] +name = "permission-manager" +test = false +bench = false + [dependencies] types = { workspace = true } +userspace = { workspace = true } +userspace-rt = { workspace = true } server-framework = { workspace = true } diff --git a/crates/servers/permission-manager/src/lib.rs b/crates/servers/permission-manager/src/lib.rs index 08873ca..93f1df0 100644 --- a/crates/servers/permission-manager/src/lib.rs +++ b/crates/servers/permission-manager/src/lib.rs @@ -6,3 +6,9 @@ pub mod server; #[cfg(test)] #[path = "tests/mod.rs"] mod tests; + +pub fn run() -> ! { + let mut srv = server::PermissionManager::new(); + server_framework::serve(&mut srv, 0); + loop { userspace::syscall::yield_now(); } +} diff --git a/crates/servers/permission-manager/src/main.rs b/crates/servers/permission-manager/src/main.rs new file mode 100644 index 0000000..19f5ef9 --- /dev/null +++ b/crates/servers/permission-manager/src/main.rs @@ -0,0 +1,9 @@ +#![no_std] +#![no_main] + +extern crate userspace_rt; + +#[unsafe(no_mangle)] +extern "C" fn main() { + permission_manager::run(); +} diff --git a/crates/servers/session-server/Cargo.toml b/crates/servers/session-server/Cargo.toml index d00aad2..32ef580 100644 --- a/crates/servers/session-server/Cargo.toml +++ b/crates/servers/session-server/Cargo.toml @@ -3,7 +3,13 @@ name = "session-server" version = "0.1.0" edition = "2024" +[[bin]] +name = "session-server" +test = false +bench = false + [dependencies] types = { workspace = true } userspace = { workspace = true } +userspace-rt = { workspace = true } server-framework = { workspace = true } diff --git a/crates/servers/session-server/src/lib.rs b/crates/servers/session-server/src/lib.rs index 08873ca..eb3426c 100644 --- a/crates/servers/session-server/src/lib.rs +++ b/crates/servers/session-server/src/lib.rs @@ -6,3 +6,10 @@ pub mod server; #[cfg(test)] #[path = "tests/mod.rs"] mod tests; + +pub fn run() -> ! { + let mut srv = server::SessionServer::new(0, 0, 0); + srv.register_app("snake", "/apps/snake.elf"); + server_framework::serve(&mut srv, 0); + loop { userspace::syscall::yield_now(); } +} diff --git a/crates/servers/session-server/src/main.rs b/crates/servers/session-server/src/main.rs new file mode 100644 index 0000000..a01e66b --- /dev/null +++ b/crates/servers/session-server/src/main.rs @@ -0,0 +1,9 @@ +#![no_std] +#![no_main] + +extern crate userspace_rt; + +#[unsafe(no_mangle)] +extern "C" fn main() { + session_server::run(); +} diff --git a/crates/servers/storage-server/Cargo.toml b/crates/servers/storage-server/Cargo.toml index 2593d6f..f2eb7b4 100644 --- a/crates/servers/storage-server/Cargo.toml +++ b/crates/servers/storage-server/Cargo.toml @@ -3,6 +3,17 @@ name = "storage-server" version = "0.1.0" edition = "2024" +[[bin]] +name = "storage-server" +test = false +bench = false + +[features] +default = ["qemu-virt"] +qemu-virt = [] + [dependencies] types = { workspace = true } +userspace = { workspace = true } +userspace-rt = { workspace = true } server-framework = { workspace = true } diff --git a/crates/servers/storage-server/src/lib.rs b/crates/servers/storage-server/src/lib.rs index 0b9cbd8..9aa7b57 100644 --- a/crates/servers/storage-server/src/lib.rs +++ b/crates/servers/storage-server/src/lib.rs @@ -10,3 +10,17 @@ pub mod server; #[cfg(test)] #[path = "tests/mod.rs"] mod tests; + +pub fn run() -> ! { + #[cfg(feature = "qemu-virt")] + { + let device = adapters::mock_block::MockBlockDevice::new(64); + let filesystem = fs::fat16::Fat16::mount(device); + if let Some(mut fs) = filesystem { + let mut srv = server::StorageServer::new(fs); + server_framework::serve(&mut srv, 0); + } + } + + loop { userspace::syscall::yield_now(); } +} diff --git a/crates/servers/storage-server/src/main.rs b/crates/servers/storage-server/src/main.rs new file mode 100644 index 0000000..02c800c --- /dev/null +++ b/crates/servers/storage-server/src/main.rs @@ -0,0 +1,9 @@ +#![no_std] +#![no_main] + +extern crate userspace_rt; + +#[unsafe(no_mangle)] +extern "C" fn main() { + storage_server::run(); +}