components/loader/
sequential.rs
1use core::mem::MaybeUninit;
12use kernel::component::Component;
13use kernel::deferred_call::DeferredCallClient;
14use kernel::platform::chip::Chip;
15use kernel::process::ProcessLoadingAsync;
16use kernel::process::ProcessStandardDebug;
17
18#[macro_export]
19macro_rules! process_loader_sequential_component_static {
20 ($C:ty, $D:ty, $NUMPROCS:expr $(,)?) => {{
21 let loader = kernel::static_buf!(kernel::process::SequentialProcessLoaderMachine<
22 $C, $D
23 >);
24 let process_binary_array = kernel::static_buf!(
25 [Option<kernel::process::ProcessBinary>; $NUMPROCS]
26 );
27
28 (loader, process_binary_array)
29 };};
30}
31
32pub type ProcessLoaderSequentialComponentType<C, D> =
33 kernel::process::SequentialProcessLoaderMachine<'static, C, D>;
34
35pub struct ProcessLoaderSequentialComponent<
36 C: Chip + 'static,
37 D: ProcessStandardDebug + 'static,
38 const NUM_PROCS: usize,
39> {
40 checker: &'static kernel::process::ProcessCheckerMachine,
41 processes: &'static mut [Option<&'static dyn kernel::process::Process>],
42 kernel: &'static kernel::Kernel,
43 chip: &'static C,
44 fault_policy: &'static dyn kernel::process::ProcessFaultPolicy,
45 appid_policy: &'static dyn kernel::process_checker::AppIdPolicy,
46 storage_policy: &'static dyn kernel::process::ProcessStandardStoragePermissionsPolicy<C, D>,
47 app_flash: &'static [u8],
48 app_memory: &'static mut [u8],
49}
50
51impl<C: Chip, D: ProcessStandardDebug, const NUM_PROCS: usize>
52 ProcessLoaderSequentialComponent<C, D, NUM_PROCS>
53{
54 pub fn new(
55 checker: &'static kernel::process::ProcessCheckerMachine,
56 processes: &'static mut [Option<&'static dyn kernel::process::Process>],
57 kernel: &'static kernel::Kernel,
58 chip: &'static C,
59 fault_policy: &'static dyn kernel::process::ProcessFaultPolicy,
60 appid_policy: &'static dyn kernel::process_checker::AppIdPolicy,
61 storage_policy: &'static dyn kernel::process::ProcessStandardStoragePermissionsPolicy<C, D>,
62 app_flash: &'static [u8],
63 app_memory: &'static mut [u8],
64 ) -> Self {
65 Self {
66 checker,
67 processes,
68 kernel,
69 chip,
70 fault_policy,
71 appid_policy,
72 storage_policy,
73 app_flash,
74 app_memory,
75 }
76 }
77}
78
79impl<C: Chip, D: ProcessStandardDebug, const NUM_PROCS: usize> Component
80 for ProcessLoaderSequentialComponent<C, D, NUM_PROCS>
81{
82 type StaticInput = (
83 &'static mut MaybeUninit<kernel::process::SequentialProcessLoaderMachine<'static, C, D>>,
84 &'static mut MaybeUninit<[Option<kernel::process::ProcessBinary>; NUM_PROCS]>,
85 );
86
87 type Output = &'static kernel::process::SequentialProcessLoaderMachine<'static, C, D>;
88
89 fn finalize(self, s: Self::StaticInput) -> Self::Output {
90 let proc_manage_cap =
91 kernel::create_capability!(kernel::capabilities::ProcessManagementCapability);
92
93 const ARRAY_REPEAT_VALUE: Option<kernel::process::ProcessBinary> = None;
94 let process_binary_array = s.1.write([ARRAY_REPEAT_VALUE; NUM_PROCS]);
95
96 let loader =
97 s.0.write(kernel::process::SequentialProcessLoaderMachine::new(
98 self.checker,
99 self.processes,
100 process_binary_array,
101 self.kernel,
102 self.chip,
103 self.app_flash,
104 self.app_memory,
105 self.fault_policy,
106 self.storage_policy,
107 self.appid_policy,
108 &proc_manage_cap,
109 ));
110 self.checker.set_client(loader);
111 loader.register();
112 loader.start();
113 loader
114 }
115}