components/
process_info_driver.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 2025.
4
5//! Component for the process info capsule.
6
7use capsules_extra::process_info_driver::{self, ProcessInfo};
8use core::mem::MaybeUninit;
9use kernel::capabilities;
10use kernel::capabilities::{ProcessManagementCapability, ProcessStartCapability};
11use kernel::component::Component;
12use kernel::create_capability;
13
14#[macro_export]
15macro_rules! process_info_component_static {
16    ($C:ty $(,)?) => {{
17        let process_info = kernel::static_buf!(
18            capsules_extra::process_info_driver::ProcessInfo<
19                $C,
20            >
21        );
22
23        process_info
24    };};
25}
26
27pub struct ProcessInfoComponent<C: ProcessManagementCapability + ProcessStartCapability> {
28    board_kernel: &'static kernel::Kernel,
29    driver_num: usize,
30    capability: C,
31}
32
33impl<C: ProcessManagementCapability + ProcessStartCapability> ProcessInfoComponent<C> {
34    pub fn new(board_kernel: &'static kernel::Kernel, driver_num: usize, capability: C) -> Self {
35        Self {
36            board_kernel,
37            driver_num,
38            capability,
39        }
40    }
41}
42
43impl<C: ProcessManagementCapability + ProcessStartCapability + 'static> Component
44    for ProcessInfoComponent<C>
45{
46    type StaticInput = &'static mut MaybeUninit<ProcessInfo<C>>;
47    type Output = &'static process_info_driver::ProcessInfo<C>;
48
49    fn finalize(self, static_buffer: Self::StaticInput) -> Self::Output {
50        let grant_cap = create_capability!(capabilities::MemoryAllocationCapability);
51
52        let process_info = static_buffer.write(ProcessInfo::new(
53            self.board_kernel,
54            self.board_kernel.create_grant(self.driver_num, &grant_cap),
55            self.capability,
56        ));
57
58        process_info
59    }
60}