feat(userspace): Call/ReplyRecv IPC, malformed-request replies, servers exit on dead endpoint; drop send/receive compat, select!, async_syscall

This commit is contained in:
2026-10-27 12:06:10 +01:00
parent 2a8a5b0c27
commit e8a2963b24
18 changed files with 96 additions and 101 deletions

View File

@@ -17,6 +17,5 @@ pub fn run() -> ! {
let mut srv = server::InputServer::new(device);
let ep = types::bounded::CapSlot::new(0).unwrap();
server_framework::serve(&mut srv, ep);
loop { libkos::syscall::yield_now(); }
server_framework::serve(&mut srv, ep)
}

View File

@@ -10,6 +10,5 @@ mod tests;
pub fn run() -> ! {
let mut srv = server::LogServer::new();
let ep = types::bounded::CapSlot::new(0).unwrap();
server_framework::serve(&mut srv, ep);
loop { libkos::syscall::yield_now(); }
server_framework::serve(&mut srv, ep)
}

View File

@@ -10,6 +10,5 @@ mod tests;
pub fn run() -> ! {
let mut srv = server::PermissionManager::new();
let ep = types::bounded::CapSlot::new(0).unwrap();
server_framework::serve(&mut srv, ep);
loop { libkos::syscall::yield_now(); }
server_framework::serve(&mut srv, ep)
}

View File

@@ -12,6 +12,5 @@ pub fn run() -> ! {
let mut srv = server::SessionServer::new(create_cap);
srv.register_app("snake", "/apps/snake.elf");
let ep = types::bounded::CapSlot::new(0).unwrap();
server_framework::serve(&mut srv, ep);
loop { libkos::syscall::yield_now(); }
server_framework::serve(&mut srv, ep)
}

View File

@@ -36,10 +36,17 @@ pub fn run() -> ! {
let ep = types::bounded::CapSlot::new(0).unwrap();
let mut next = syscall::receive_msg(ep);
loop {
let (w0, w1, _w2, _w3) = syscall::receive(ep);
match w0 {
let message = match next {
Ok(m) => m,
Err(e) => {
libkos::println!("storage: endpoint unusable ({:?}), exiting", e);
syscall::exit();
}
};
let [w0, w1, _, _] = message.words();
let reply = match w0 {
CMD_READ_FILE => {
let filename_len = w1;
let buf = shared_buf();
@@ -60,12 +67,14 @@ pub fn run() -> ! {
libkos::println!("NOT FOUND");
}
syscall::send(ep, file_size, 0, 0, 0);
[file_size, 0, 0, 0]
}
_ => {
syscall::send(ep, 0, 0, 0, 0);
}
}
_ => [0, 0, 0, 0],
};
next = match message {
syscall::Received::Call { .. } => syscall::reply_recv(ep, reply, None),
_ => syscall::receive_msg(ep),
};
}
}