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 kernel: &'static kernel::Kernel,
42 chip: &'static C,
43 fault_policy: &'static dyn kernel::process::ProcessFaultPolicy,
44 appid_policy: &'static dyn kernel::process_checker::AppIdPolicy,
45 storage_policy: &'static dyn kernel::process::ProcessStandardStoragePermissionsPolicy<C, D>,
46 app_flash: &'static [u8],
47 app_memory: &'static mut [u8],
48}
49
50impl<C: Chip, D: ProcessStandardDebug, const NUM_PROCS: usize>
51 ProcessLoaderSequentialComponent<C, D, NUM_PROCS>
52{
53 pub fn new(
54 checker: &'static kernel::process::ProcessCheckerMachine,
55 kernel: &'static kernel::Kernel,
56 chip: &'static C,
57 fault_policy: &'static dyn kernel::process::ProcessFaultPolicy,
58 appid_policy: &'static dyn kernel::process_checker::AppIdPolicy,
59 storage_policy: &'static dyn kernel::process::ProcessStandardStoragePermissionsPolicy<C, D>,
60 app_flash: &'static [u8],
61 app_memory: &'static mut [u8],
62 ) -> Self {
63 Self {
64 checker,
65 kernel,
66 chip,
67 fault_policy,
68 appid_policy,
69 storage_policy,
70 app_flash,
71 app_memory,
72 }
73 }
74}
75
76impl<C: Chip, D: ProcessStandardDebug, const NUM_PROCS: usize> Component
77 for ProcessLoaderSequentialComponent<C, D, NUM_PROCS>
78{
79 type StaticInput = (
80 &'static mut MaybeUninit<kernel::process::SequentialProcessLoaderMachine<'static, C, D>>,
81 &'static mut MaybeUninit<[Option<kernel::process::ProcessBinary>; NUM_PROCS]>,
82 );
83
84 type Output = &'static kernel::process::SequentialProcessLoaderMachine<'static, C, D>;
85
86 fn finalize(self, s: Self::StaticInput) -> Self::Output {
87 let proc_manage_cap =
88 kernel::create_capability!(kernel::capabilities::ProcessManagementCapability);
89
90 const ARRAY_REPEAT_VALUE: Option<kernel::process::ProcessBinary> = None;
91 let process_binary_array = s.1.write([ARRAY_REPEAT_VALUE; NUM_PROCS]);
92
93 let loader =
94 s.0.write(kernel::process::SequentialProcessLoaderMachine::new(
95 self.checker,
96 process_binary_array,
97 self.kernel,
98 self.chip,
99 self.app_flash,
100 self.app_memory,
101 self.fault_policy,
102 self.storage_policy,
103 self.appid_policy,
104 &proc_manage_cap,
105 ));
106 self.checker.set_client(loader);
107 loader.register();
108 loader.start();
109 loader
110 }
111}