components/
process_info_driver.rs1use 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}