Skip to main content

arm_sysregs/
fake.rs

1// SPDX-FileCopyrightText: Copyright The arm-sysregs Contributors.
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4//! Fake implementations of system register getters and setters for unit tests.
5
6mod generated;
7
8pub use self::generated::SystemRegisters;
9use std::sync::Mutex;
10
11/// Generates a public function named `read_$sysreg` to read the fake system register `$sysreg` of
12/// type `$type`.
13#[macro_export]
14macro_rules! read_sysreg {
15    ($sysreg:ident $(: $asm_sysreg:tt)?, $type:ty, safe, $fake_sysregs:expr) => {
16        $crate::_paste::paste! {
17            #[doc = "Returns the value of the `"]
18            #[doc = stringify!($sysreg)]
19            #[doc = "` system register."]
20            pub fn [< read_ $sysreg >]() -> $type {
21                $fake_sysregs.lock().unwrap().$sysreg
22            }
23        }
24    };
25    ($(#[$attributes:meta])* $sysreg:ident $(: $asm_sysreg:tt)?, $type:ty, $fake_sysregs:expr) => {
26        $crate::_paste::paste! {
27            #[doc = "Returns the value of the `"]
28            #[doc = stringify!($sysreg)]
29            #[doc = "` system register."]
30            $(#[$attributes])*
31            pub unsafe fn [< read_ $sysreg >]() -> $type {
32                $fake_sysregs.lock().unwrap().$sysreg
33            }
34        }
35    };
36    ($sysreg:ident $(: $asm_sysreg:tt)?, $type:ty : $bitflags_type:ty, safe, $fake_sysregs:expr) => {
37        $crate::_paste::paste! {
38            #[doc = "Returns the value of the `"]
39            #[doc = stringify!($sysreg)]
40            #[doc = "` system register."]
41            pub fn [< read_ $sysreg >]() -> $bitflags_type {
42                $fake_sysregs.lock().unwrap().$sysreg
43            }
44        }
45    };
46    ($(#[$attributes:meta])* $sysreg:ident $(: $asm_sysreg:tt)?, $type:ty : $bitflags_type:ty, $fake_sysregs:expr) => {
47        $crate::_paste::paste! {
48            #[doc = "Returns the value of the `"]
49            #[doc = stringify!($sysreg)]
50            #[doc = "` system register."]
51            $(#[$attributes])*
52            pub unsafe fn [< read_ $sysreg >]() -> $bitflags_type {
53                $fake_sysregs.lock().unwrap().$sysreg
54            }
55        }
56    };
57}
58
59/// Generates a public function named `write_$sysreg` to write to the fake system register `$sysreg`
60/// of type `$type`.
61#[macro_export]
62macro_rules! write_sysreg {
63    ($sysreg:ident $(: $asm_sysreg:tt)?, $type:ty, safe, $fake_sysregs:expr) => {
64        $crate::_paste::paste! {
65            #[doc = "Writes `value` to the `"]
66            #[doc = stringify!($sysreg)]
67            #[doc = "` system register."]
68            pub fn [< write_ $sysreg >](value: $type) {
69                $fake_sysregs.lock().unwrap().$sysreg = value;
70            }
71        }
72    };
73    (
74        $(#[$attributes:meta])*
75        $sysreg:ident $(: $asm_sysreg:tt)?, $type:ty, $fake_sysregs:expr
76    ) => {
77        $crate::_paste::paste! {
78            #[doc = "Writes `value` to the `"]
79            #[doc = stringify!($sysreg)]
80            #[doc = "` system register."]
81            $(#[$attributes])*
82            pub unsafe fn [< write_ $sysreg >](value: $type) {
83                $fake_sysregs.lock().unwrap().$sysreg = value;
84            }
85        }
86    };
87    ($sysreg:ident $(: $asm_sysreg:tt)?, $type:ty : $bitflags_type:ty, safe, $fake_sysregs:expr) => {
88        $crate::_paste::paste! {
89            #[doc = "Writes `value` to the `"]
90            #[doc = stringify!($sysreg)]
91            #[doc = "` system register."]
92            pub fn [< write_ $sysreg >](value: $bitflags_type) {
93                $fake_sysregs.lock().unwrap().$sysreg = value;
94            }
95        }
96    };
97    (
98        $(#[$attributes:meta])*
99        $sysreg:ident $(: $asm_sysreg:tt)?, $type:ty : $bitflags_type:ty, $fake_sysregs:expr
100    ) => {
101        $crate::_paste::paste! {
102            #[doc = "Writes `value` to the `"]
103            #[doc = stringify!($sysreg)]
104            #[doc = "` system register."]
105            $(#[$attributes])*
106            pub unsafe fn [< write_ $sysreg >](value: $bitflags_type) {
107                $fake_sysregs.lock().unwrap().$sysreg = value;
108            }
109        }
110    };
111}
112
113/// Values of fake system registers.
114pub static SYSREGS: Mutex<SystemRegisters> = Mutex::new(SystemRegisters::new());
115
116impl SystemRegisters {
117    /// Resets the fake system registers to their initial state.
118    pub fn reset(&mut self) {
119        *self = Self::new();
120    }
121}
122
123impl Default for SystemRegisters {
124    fn default() -> Self {
125        Self::new()
126    }
127}