Move proc_man exit call into kernel

This commit is contained in:
pjht 2024-11-08 14:51:40 -06:00
parent fb58d2c7c4
commit b3cc54fddf
Signed by: pjht
GPG Key ID: CA239FC6934E6F3A
3 changed files with 31 additions and 5 deletions

View File

@ -102,7 +102,7 @@ extern "x86-interrupt" fn page_fault_handler(
} else {
println!("page faulted {error_code:#?} at {:#x}\n{stack_frame:#?}", faulting_addr);
}
TASKING.exit();
TASKING.exit(254);
}
#[expect(clippy::needless_pass_by_value, reason = "Signature dictated by external crate")]
@ -118,7 +118,7 @@ fn exc_handler(_stack_frame: InterruptStackFrame, _index: u8, _error_code: Optio
print!("Kernel init ");
}
println!("had exception, exiting");
TASKING.exit();
TASKING.exit(254);
}
pub struct EoiGuard(u8);
@ -358,7 +358,7 @@ extern "C" fn syscall_handler() {
};
retval = rval;
}
1 => TASKING.exit(),
1 => TASKING.exit(regs.rcx.wrapping_cast()),
2 => {
retval = if regs.rcx == 0 {
ACTIVE_SPACE

View File

@ -13,5 +13,5 @@ entry_point!(start, config = &BOOTLOADER_CONFIG);
fn start(bootinfo: &'static mut BootInfo) -> ! {
BOOTINFO.set(bootinfo);
main();
TASKING.exit();
TASKING.exit(0);
}

View File

@ -325,7 +325,33 @@ impl Tasking {
*self.current_pid.read()
}
pub fn exit(&self) -> ! {
pub fn exit(&self, code: u8) -> ! {
if let Some(current_pid) = *self.current_pid.read() {
if let Some(&proc_man_pid) = REGISTERD_PIDS.read().get(&3) {
let mut len: usize;
let rounded_size = 32usize.next_multiple_of(4096);
let mut buffer = Vec::with_capacity_in(rounded_size, &*ACTIVE_SPACE);
buffer.resize(rounded_size, 0);
let mut buffer = buffer.into_boxed_slice();
buffer[0..8].copy_from_slice(&u64::MAX.to_le_bytes());
buffer[8..10].copy_from_slice(&0u16.to_le_bytes());
buffer[10] = 0;
buffer[11..19].copy_from_slice(&0u64.to_le_bytes());
buffer[19..21].copy_from_slice(&8u16.to_le_bytes());
buffer[21..23].copy_from_slice(&4u16.to_le_bytes());
len = 23;
len += unsigned_varint::encode::u64(
u64(current_pid),
(&mut buffer[len..len + 10]).try_into().unwrap(),
)
.len();
buffer[len] = code;
len += 1;
send_ipc_to(usize(proc_man_pid), buffer, len);
} else {
println!("[TASKING] No process manager when PID {} exited with code {code}", current_pid);
}
}
loop {
let next_process_pid = self.ready_to_run.lock().pop_front();
if let Some(next_process_pid) = next_process_pid {