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    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}