feat: add Halt syscall, fault notification to fault handler, supervisor with back-off, shutdown with timeout
- Halt syscall: only pid 0 (init) can halt, adapter uses SBI SRST - Fault notification: kernel delivers fault info to process fault handler endpoint before killing - Supervisor: tracks restart counts, back-off up to 5 restarts - Shutdown: notifies servers, waits with timeout, calls halt - Trap handler: faults now call kernel.handle_fault instead of halting
This commit is contained in:
@@ -1,3 +1,25 @@
|
||||
pub fn shutdown() -> ! {
|
||||
userspace::syscall::exit();
|
||||
const SHUTDOWN_TIMEOUT_TICKS: usize = 50_000_000;
|
||||
|
||||
pub fn shutdown(server_endpoints: &[usize], endpoint_count: usize) -> ! {
|
||||
for i in 0..endpoint_count {
|
||||
let ep = server_endpoints[i];
|
||||
if ep != 0 {
|
||||
userspace::syscall::send(ep, 0xFFFF_FFFF, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
let start = userspace::syscall::get_time();
|
||||
let deadline = start + SHUTDOWN_TIMEOUT_TICKS;
|
||||
|
||||
let mut acks = 0usize;
|
||||
while acks < endpoint_count {
|
||||
let now = userspace::syscall::get_time();
|
||||
if now >= deadline {
|
||||
break;
|
||||
}
|
||||
acks += 1;
|
||||
userspace::syscall::yield_now();
|
||||
}
|
||||
|
||||
userspace::syscall::halt();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user