veridian_kernel/process/
loader.rs1#![allow(clippy::get_first)]
7
8use alloc::{string::String, vec::Vec};
9
10use crate::{
11 elf::ElfLoader,
12 error::KernelError,
13 process::{Process, ProcessId},
14};
15
16pub fn load_user_program(process: &mut Process, elf_data: &[u8]) -> Result<u64, KernelError> {
18 let vas = process
20 .memory_space_mut()
21 .ok_or(KernelError::NotInitialized {
22 subsystem: "process memory space",
23 })?;
24
25 let entry_point = ElfLoader::load(elf_data, vas)?;
27
28 Ok(entry_point)
29}
30
31pub fn create_process_from_elf(
33 name: String,
34 elf_data: &[u8],
35 _parent_pid: ProcessId,
36) -> Result<ProcessId, KernelError> {
37 use crate::process::lifecycle::create_process;
38
39 let pid = create_process(name, 0)?;
41
42 let process = crate::process::table::get_process_mut(pid)
44 .ok_or(KernelError::ProcessNotFound { pid: pid.0 })?;
45
46 let entry_point = load_user_program(process, elf_data)?;
48
49 if let Some(thread) = process.get_main_thread_mut() {
51 thread.set_entry_point(entry_point as usize);
52 }
53
54 Ok(pid)
55}
56
57pub fn exec_program(
59 process: &mut Process,
60 elf_data: &[u8],
61 args: Vec<String>,
62) -> Result<(), KernelError> {
63 if let Some(vas) = process.memory_space_mut() {
65 vas.clear_user_space()?;
66 }
67
68 let entry_point = load_user_program(process, elf_data)?;
70
71 process.set_name(
73 args.get(0)
74 .cloned()
75 .unwrap_or_else(|| String::from("unknown")),
76 );
77
78 if let Some(thread) = process.get_main_thread_mut() {
80 thread.set_entry_point(entry_point as usize);
81 thread.reset_context();
82 }
83
84 Ok(())
85}