Skip to main content

arm_sysregs/
macros.rs

1// SPDX-FileCopyrightText: Copyright The arm-sysregs Contributors.
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4/// Generates public functions named `read_$sysreg` and `write_$sysreg` to read or write
5/// (respectively) a value of type `$type` from/to the system register `$sysreg`.
6///
7/// `safe_read` and `safe_write` should only be specified for system registers which are indeed safe
8/// to read from or write any value to.
9#[macro_export]
10macro_rules! read_write_sysreg {
11    ($sysreg:ident $(: $asm_sysreg:ident)?, $type:ident $(: $bitflags_type:ty)?, safe_read, safe_write $(, $fake_sysregs:expr)?) => {
12        $crate::read_sysreg!($sysreg $(: $asm_sysreg)?, $type $(: $bitflags_type)?, safe $(, $fake_sysregs)?);
13        $crate::write_sysreg!($sysreg $(: $asm_sysreg)?, $type $(: $bitflags_type)?, safe $(, $fake_sysregs)?);
14    };
15    ($sysreg:ident : ($coproc:ident, $opc1:literal, $crm:ident, $crn:ident, $opc2:literal), $type:ident $(: $bitflags_type:ty)?, safe_read, safe_write $(, $fake_sysregs:expr)?) => {
16        $crate::read_sysreg!($sysreg : ($coproc, $opc1, $crm, $crn, $opc2), $type $(: $bitflags_type)?, safe $(, $fake_sysregs)?);
17        $crate::write_sysreg!($sysreg : ($coproc, $opc1, $crm, $crn, $opc2), $type $(: $bitflags_type)?, safe $(, $fake_sysregs)?);
18    };
19    ($sysreg:ident : ($coproc:ident, $opc1:literal, $crm:ident), $type:ident $(: $bitflags_type:ty)?, safe_read, safe_write $(, $fake_sysregs:expr)?) => {
20        $crate::read_sysreg!($sysreg : ($coproc, $opc1, $crm), $type $(: $bitflags_type)?, safe $(, $fake_sysregs)?);
21        $crate::write_sysreg!($sysreg : ($coproc, $opc1, $crm), $type $(: $bitflags_type)?, safe $(, $fake_sysregs)?);
22    };
23    (
24        $(#[$attributes:meta])*
25        $sysreg:ident $(: $asm_sysreg:ident)?, $type:ident $(: $bitflags_type:ty)?, safe_read $(, $fake_sysregs:expr)?
26    ) => {
27        $crate::read_sysreg!($sysreg $(: $asm_sysreg)?, $type $(: $bitflags_type)?, safe $(, $fake_sysregs)?);
28        $crate::write_sysreg! {
29            $(#[$attributes])*
30            $sysreg $(: $asm_sysreg)?, $type $(: $bitflags_type)? $(, $fake_sysregs)?
31        }
32    };
33    (
34        $(#[$attributes:meta])*
35        $sysreg:ident : ($coproc:ident, $opc1:literal, $crm:ident, $crn:ident, $opc2:literal), $type:ident $(: $bitflags_type:ty)?, safe_read $(, $fake_sysregs:expr)?
36    ) => {
37        $crate::read_sysreg!($sysreg : ($coproc, $opc1, $crm, $crn, $opc2), $type $(: $bitflags_type)?, safe $(, $fake_sysregs)?);
38        $crate::write_sysreg! {
39            $(#[$attributes])*
40            $sysreg : ($coproc, $opc1, $crm, $crn, $opc2), $type $(: $bitflags_type)? $(, $fake_sysregs)?
41        }
42    };
43    (
44        $(#[$attributes:meta])*
45        $sysreg:ident : ($coproc:ident, $opc1:literal, $crm:ident), $type:ident $(: $bitflags_type:ty)?, safe_read $(, $fake_sysregs:expr)?
46    ) => {
47        $crate::read_sysreg!($sysreg : ($coproc, $opc1, $crm), $type $(: $bitflags_type)?, safe $(, $fake_sysregs)?);
48        $crate::write_sysreg! {
49            $(#[$attributes])*
50            $sysreg : ($coproc, $opc1, $crm), $type $(: $bitflags_type)? $(, $fake_sysregs)?
51        }
52    };
53}