feat: basic IPC

This commit is contained in:
Zoe
2026-09-06 10:53:45 -05:00
parent dd596d5378
commit 028ac8fb13
19 changed files with 674 additions and 373 deletions
+12
View File
@@ -0,0 +1,12 @@
[package]
name = "client"
version = "0.1.0"
edition = "2024"
[dependencies]
dusk-sys = { path = "../dusk-sys" }
[[bin]]
name = "client"
test = false
bench = false
+26
View File
@@ -0,0 +1,26 @@
#![no_std]
#![no_main]
use dusk_sys::{println, sys_exit, sys_recv, sys_send};
#[unsafe(no_mangle)]
pub extern "C" fn _start() -> ! {
let msg = "Hello from client!";
println!("[client] Sent: {}", msg);
sys_send(0, msg.as_ptr() as usize, msg.len()).unwrap();
let out = [0u8; 128];
let out_ptr = out.as_ptr() as usize;
let max_len = out.len();
let (actual_len, sender) = sys_recv(out_ptr, max_len).unwrap();
println!(
"[client] Received: {}",
core::str::from_utf8(&out[..actual_len]).unwrap()
);
sys_exit(0);
}
#[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! {
println!("{info}");
sys_exit(1);
}
@@ -1,9 +1,8 @@
[package]
name = "init"
name = "dusk-sys"
version = "0.1.0"
edition = "2024"
[[bin]]
name = "init"
[lib]
test = false
bench = false
+151
View File
@@ -0,0 +1,151 @@
#![no_std]
use core::arch::asm;
#[derive(Debug, PartialEq, Eq)]
pub enum Status {
// Success = 0,
InvalidArgument = 1,
BadAddress = 2,
BadFileDescriptor = 3,
NoSuchTask = 4,
OutOfMemory = 5,
}
impl From<usize> for Status {
fn from(value: usize) -> Self {
match value {
1 => Self::InvalidArgument,
2 => Self::BadAddress,
3 => Self::BadFileDescriptor,
4 => Self::NoSuchTask,
5 => Self::OutOfMemory,
_ => Self::InvalidArgument,
}
}
}
pub fn sys_yield() {
unsafe {
asm!(
"syscall",
in("rax") 1usize,
lateout("rcx") _,
lateout("r11") _,
);
}
}
fn debug_write(buf: &str) -> Result<(), Status> {
unsafe {
let status: usize;
asm!(
"syscall",
in("rdi") 1,
in("rsi") buf.as_ptr(),
in("rdx") buf.len(),
in("r10") 0,
inlateout("rax") 3usize => status,
lateout("rcx") _,
lateout("r11") _
);
if status != 0 {
Err(status.into())
} else {
Ok(())
}
}
}
struct DebugWriter;
impl core::fmt::Write for DebugWriter {
fn write_str(&mut self, value: &str) -> core::fmt::Result {
debug_write(value).map_err(|_| core::fmt::Error)
}
}
#[doc(hidden)]
pub fn __print(arguments: core::fmt::Arguments<'_>) {
use core::fmt::Write;
let _ = DebugWriter.write_fmt(arguments);
}
#[macro_export]
macro_rules! print {
($($arg:tt)*) => {{
$crate::__print(core::format_args!($($arg)*));
}};
}
#[macro_export]
macro_rules! println {
() => {{
$crate::print!("\n");
}};
($($arg:tt)*) => {{
$crate::print!("{}\n", core::format_args!($($arg)*));
}};
}
pub fn sys_exit(exit_code: usize) -> ! {
unsafe {
asm!(
"syscall",
in("rdi") exit_code,
in("rax") 2usize,
options(noreturn)
);
}
}
pub fn sys_send(dest_task_id: usize, msg_ptr: usize, len: usize) -> Result<(), Status> {
unsafe {
let status: usize;
asm!(
"syscall",
in("rdi") dest_task_id,
in("rsi") msg_ptr,
in("rdx") len,
inlateout("rax") 4usize => status,
lateout("rcx") _,
lateout("r11") _,
);
if status != 0 {
Err(status.into())
} else {
Ok(())
}
}
}
pub fn sys_recv(buf_ptr: usize, max_len: usize) -> Result<(usize, usize), Status> {
let mut actual_len: usize = 0;
let mut sender: usize = 0;
unsafe {
let status: usize;
asm!(
"syscall",
in("rdi") buf_ptr,
in("rsi") max_len,
in("rdx") &raw mut actual_len as usize,
in("r10") &raw mut sender as usize,
inlateout("rax") 5usize => status,
lateout("rcx") _,
lateout("r11") _,
);
if status != 0 {
Err(status.into())
} else {
Ok((actual_len, sender))
}
}
}
-115
View File
@@ -1,115 +0,0 @@
#![no_std]
#![no_main]
use core::arch::asm;
use core::cell::UnsafeCell;
use core::fmt::Write;
fn sys_yield() {
unsafe {
asm!("mov rax, 1", "syscall");
}
}
fn sys_write(fd: usize, buf: &str) -> Result<(), usize> {
unsafe {
let status;
asm!(
"mov rax, 3",
"syscall",
in("rdi") fd,
in("rsi") buf.as_ptr(),
in("rdx") buf.len(),
in("r10") 0,
lateout("rax") status,
);
if status != 0 { Err(status) } else { Ok(()) }
}
}
struct Writer;
impl core::fmt::Write for Writer {
fn write_str(&mut self, s: &str) -> core::fmt::Result {
sys_write(1, s).map_err(|_| core::fmt::Error)?;
Ok(())
}
}
#[macro_export]
macro_rules! print {
($($arg:tt)*) => (let _ = $crate::Writer.write_fmt(format_args!($($arg)*)););
}
#[macro_export]
macro_rules! println {
() => ($crate::print!("\n"));
($($arg:tt)*) => ($crate::print!("{}\n", format_args!($($arg)*)));
}
pub fn sys_exit(exit_code: usize) -> ! {
unsafe {
asm!(
"mov rax, 2",
"syscall",
in("rdi") exit_code,
options(noreturn)
);
}
}
struct Heap {
pub data: UnsafeCell<[u8; 1024]>,
}
impl Heap {
const fn new() -> Self {
Self {
data: UnsafeCell::new([0; 1024]),
}
}
fn len(&self) -> usize {
unsafe { (*self.data.get()).len() }
}
}
impl core::ops::Deref for Heap {
type Target = [u8];
fn deref(&self) -> &Self::Target {
unsafe { (*self.data.get()).as_ref() }
}
}
unsafe impl Sync for Heap {}
static HEAP: Heap = Heap::new();
#[unsafe(no_mangle)]
pub extern "C" fn _start() -> ! {
(0..100).for_each(|i| {
println!("Hello {}", i);
sys_yield();
});
let len = HEAP.len();
for i in 0..len {
unsafe { HEAP.data.get().as_mut().unwrap()[i] = i as u8 };
}
(0..1024).for_each(|i| {
println!("{}", unsafe { HEAP.data.get().as_ref().unwrap()[i] });
sys_yield();
});
sys_exit(0);
}
#[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! {
println!("{info}");
sys_exit(1);
}
+12
View File
@@ -0,0 +1,12 @@
[package]
name = "omega3"
version = "0.1.0"
edition = "2024"
[dependencies]
dusk-sys = { path = "../dusk-sys" }
[[bin]]
name = "omega3"
test = false
bench = false
+36
View File
@@ -0,0 +1,36 @@
#![no_std]
#![no_main]
use dusk_sys::{println, sys_exit, sys_recv, sys_send};
#[unsafe(no_mangle)]
pub extern "C" fn _start() -> ! {
println!(r#"-----------------------------"#);
println!(r#" .d88888888b. .d88888b. "#);
println!(r#" d88P" "Y88b 88P" "Y88 "#);
println!(r#" 888 888 .od88P "#);
println!(r#" Y88b d88P "Y88b "#);
println!(r#" "88bo od88" 88b d88 "#);
println!(r#" d88888 88888b "Y88888P" "#);
println!(r#"----- Omega3 Dusk Root Server"#);
let buf = [0u8; 128];
let buf_ptr = buf.as_ptr() as usize;
let max_len = buf.len();
loop {
let (actual_len, sender) = sys_recv(buf_ptr, max_len).unwrap();
println!(
"[server] Received: {}",
core::str::from_utf8(&buf[..actual_len]).unwrap()
);
sys_send(sender, buf_ptr, actual_len).unwrap();
}
sys_exit(0);
}
#[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! {
println!("{info}");
sys_exit(1);
}