components/storage_permissions/
individual.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 storage permissions policy that grants applications
6//! access to their own stored state.
7//!
8//! ```rust
9//! let storage_permissions_policy =
10//!     components::storage_permissions::individual::StoragePermissionsIndividualComponent::new()
11//!         .finalize(
12//!             components::storage_permissions_individual_component_static!(nrf52840dk_lib::Chip),
13//!         );
14//! ```
15
16use core::mem::MaybeUninit;
17use kernel::capabilities;
18use kernel::component::Component;
19use kernel::platform::chip::Chip;
20use kernel::process::ProcessStandardDebug;
21
22#[macro_export]
23macro_rules! storage_permissions_individual_component_static {
24    ($C:ty, $D:ty $(,)?) => {{
25        kernel::static_buf!(
26            capsules_system::storage_permissions::individual::IndividualStoragePermissions<
27                $C,
28                $D,
29                components::storage_permissions::individual::AppStoreCapability
30            >
31        )
32    };};
33}
34
35pub struct AppStoreCapability;
36unsafe impl capabilities::ApplicationStorageCapability for AppStoreCapability {}
37
38pub type StoragePermissionsIndividualComponentType<C, D> =
39    capsules_system::storage_permissions::individual::IndividualStoragePermissions<
40        C,
41        D,
42        AppStoreCapability,
43    >;
44
45pub struct StoragePermissionsIndividualComponent<C: Chip, D: ProcessStandardDebug> {
46    _chip: core::marker::PhantomData<C>,
47    _debug: core::marker::PhantomData<D>,
48}
49
50impl<C: Chip, D: ProcessStandardDebug> StoragePermissionsIndividualComponent<C, D> {
51    pub fn new() -> Self {
52        Self {
53            _chip: core::marker::PhantomData,
54            _debug: core::marker::PhantomData,
55        }
56    }
57}
58
59impl<C: Chip + 'static, D: ProcessStandardDebug + 'static> Component
60    for StoragePermissionsIndividualComponent<C, D>
61{
62    type StaticInput = &'static mut MaybeUninit<
63        capsules_system::storage_permissions::individual::IndividualStoragePermissions<
64            C,
65            D,
66            AppStoreCapability,
67        >,
68    >;
69    type Output =
70        &'static capsules_system::storage_permissions::individual::IndividualStoragePermissions<
71            C,
72            D,
73            AppStoreCapability,
74        >;
75
76    fn finalize(self, s: Self::StaticInput) -> Self::Output {
77        s.write(
78            capsules_system::storage_permissions::individual::IndividualStoragePermissions::new(
79                AppStoreCapability,
80            ),
81        )
82    }
83}