components/loader/
sequential.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2024.
4
5//! Component for creating a sequential process loader.
6//!
7//! `ProcessLoaderSequentialComponent` uses the standard Tock assumptions about
8//! where processes are stored in flash and what RAM is allocated for process
9//! use.
10
11use 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}