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.
This commit is contained in:
2026-10-18 04:26:42 +02:00
parent d43c6a7e74
commit 7649cb0b18
21 changed files with 188 additions and 0 deletions

View File

@@ -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 }

View File

@@ -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);
}

9
crates/init/src/main.rs Normal file
View File

@@ -0,0 +1,9 @@
#![no_std]
#![no_main]
extern crate userspace_rt;
#[unsafe(no_mangle)]
extern "C" fn main() {
init::run();
}

View File

@@ -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 }

View File

@@ -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(); }
}

View File

@@ -0,0 +1,9 @@
#![no_std]
#![no_main]
extern crate userspace_rt;
#[unsafe(no_mangle)]
extern "C" fn main() {
display_server::run();
}

View File

@@ -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 }

View File

@@ -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(); }
}

View File

@@ -0,0 +1,9 @@
#![no_std]
#![no_main]
extern crate userspace_rt;
#[unsafe(no_mangle)]
extern "C" fn main() {
input_server::run();
}

View File

@@ -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 }

View File

@@ -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(); }
}

View File

@@ -0,0 +1,9 @@
#![no_std]
#![no_main]
extern crate userspace_rt;
#[unsafe(no_mangle)]
extern "C" fn main() {
log_server::run();
}

View File

@@ -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 }

View File

@@ -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(); }
}

View File

@@ -0,0 +1,9 @@
#![no_std]
#![no_main]
extern crate userspace_rt;
#[unsafe(no_mangle)]
extern "C" fn main() {
permission_manager::run();
}

View File

@@ -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 }

View File

@@ -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(); }
}

View File

@@ -0,0 +1,9 @@
#![no_std]
#![no_main]
extern crate userspace_rt;
#[unsafe(no_mangle)]
extern "C" fn main() {
session_server::run();
}

View File

@@ -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 }

View File

@@ -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(); }
}

View File

@@ -0,0 +1,9 @@
#![no_std]
#![no_main]
extern crate userspace_rt;
#[unsafe(no_mangle)]
extern "C" fn main() {
storage_server::run();
}