#[cfg(not(any(test, feature = "fakes")))]
#[macro_export]
macro_rules! read_sysreg {
($sysreg:ident : $asm_sysreg:ident, $type:ty, safe $(, $fake_sysregs:expr)?) => {
$crate::_paste::paste! {
#[doc = "Returns the value of the `"]
#[doc = stringify!($sysreg)]
#[doc = "` system register."]
#[inline(always)]
pub fn [< read_ $sysreg >]() -> $type {
let value;
unsafe {
core::arch::asm!(
concat!("mrs {value}, ", stringify!($asm_sysreg)),
options(nomem, nostack, preserves_flags),
value = out(reg) value,
);
}
value
}
}
};
($(#[$attributes:meta])* $sysreg:ident : $asm_sysreg:ident, $type:ty $(, $fake_sysregs:expr)?) => {
$crate::_paste::paste! {
#[doc = "Returns the value of the `"]
#[doc = stringify!($sysreg)]
#[doc = "` system register."]
$(#[$attributes])*
#[inline(always)]
pub unsafe fn [< read_ $sysreg >]() -> $type {
let value;
unsafe {
core::arch::asm!(
concat!("mrs {value}, ", stringify!($asm_sysreg)),
options(nomem, nostack, preserves_flags),
value = out(reg) value,
);
}
value
}
}
};
($sysreg:ident : $asm_sysreg:ident, $type:ty : $bitflags_type:ty, safe $(, $fake_sysregs:expr)?) => {
$crate::_paste::paste! {
#[doc = "Returns the value of the `"]
#[doc = stringify!($sysreg)]
#[doc = "` system register."]
#[inline(always)]
pub fn [< read_ $sysreg >]() -> $bitflags_type {
let value: $type;
unsafe {
core::arch::asm!(
concat!("mrs {value}, ", stringify!($asm_sysreg)),
options(nomem, nostack, preserves_flags),
value = out(reg) value,
);
}
<$bitflags_type>::from_bits_retain(value)
}
}
};
($(#[$attributes:meta])* $sysreg:ident : $asm_sysreg:ident, $type:ty : $bitflags_type:ty $(, $fake_sysregs:expr)?) => {
$crate::_paste::paste! {
#[doc = "Returns the value of the `"]
#[doc = stringify!($sysreg)]
#[doc = "` system register."]
$(#[$attributes])*
#[inline(always)]
pub unsafe fn [< read_ $sysreg >]() -> $bitflags_type {
let value: $type;
unsafe {
core::arch::asm!(
concat!("mrs {value}, ", stringify!($asm_sysreg)),
options(nomem, nostack, preserves_flags),
value = out(reg) value,
);
}
<$bitflags_type>::from_bits_retain(value)
}
}
};
($sysreg:ident, $type:ty, safe $(, $fake_sysregs:expr)?) => {
$crate::read_sysreg!($sysreg : $sysreg, $type, safe $(, $fake_sysregs)?);
};
($(#[$attributes:meta])* $sysreg:ident, $type:ty $(, $fake_sysregs:expr)?) => {
$crate::read_sysreg!($(#[$attributes])* $sysreg : $sysreg, $type $(, $fake_sysregs)?);
};
($sysreg:ident, $type:ty : $bitflags_type:ty, safe $(, $fake_sysregs:expr)?) => {
$crate::read_sysreg!($sysreg : $sysreg, $type : $bitflags_type, safe $(, $fake_sysregs)?);
};
($(#[$attributes:meta])* $sysreg:ident, $type:ty : $bitflags_type:ty $(, $fake_sysregs:expr)?) => {
$crate::read_sysreg($(#[$attributes])* $sysreg : $sysreg, $type : $bitflags_type $(, $fake_sysregs)?);
};
}
#[cfg(not(any(test, feature = "fakes")))]
#[macro_export]
macro_rules! write_sysreg {
($sysreg:ident : $asm_sysreg:ident, $type:ty, safe $(, $fake_sysregs:expr)?) => {
$crate::_paste::paste! {
#[doc = "Writes `value` to the `"]
#[doc = stringify!($sysreg)]
#[doc = "` system register."]
#[inline(always)]
pub fn [< write_ $sysreg >](value: $type) {
unsafe {
core::arch::asm!(
concat!("msr ", stringify!($asm_sysreg), ", {value}"),
options(nomem, nostack, preserves_flags),
value = in(reg) value,
);
}
}
}
};
(
$(#[$attributes:meta])*
$sysreg:ident : $asm_sysreg:ident, $type:ty $(, $fake_sysregs:expr)?
) => {
$crate::_paste::paste! {
#[doc = "Writes `value` to the `"]
#[doc = stringify!($sysreg)]
#[doc = "` system register."]
$(#[$attributes])*
#[inline(always)]
pub unsafe fn [< write_ $sysreg >](value: $type) {
unsafe {
core::arch::asm!(
concat!("msr ", stringify!($asm_sysreg), ", {value}"),
options(nostack, preserves_flags),
value = in(reg) value,
);
}
}
}
};
($sysreg:ident : $asm_sysreg:ident, $type:ty : $bitflags_type:ty, safe $(, $fake_sysregs:expr)?) => {
$crate::_paste::paste! {
#[doc = "Writes `value` to the `"]
#[doc = stringify!($sysreg)]
#[doc = "` system register."]
#[inline(always)]
pub fn [< write_ $sysreg >](value: $bitflags_type) {
let value: $type = value.bits();
unsafe {
core::arch::asm!(
concat!("msr ", stringify!($asm_sysreg), ", {value}"),
options(nomem, nostack, preserves_flags),
value = in(reg) value,
);
}
}
}
};
(
$(#[$attributes:meta])*
$sysreg:ident : $asm_sysreg:ident, $type:ty : $bitflags_type:ty $(, $fake_sysregs:expr)?
) => {
$crate::_paste::paste! {
#[doc = "Writes `value` to the `"]
#[doc = stringify!($sysreg)]
#[doc = "` system register."]
$(#[$attributes])*
#[inline(always)]
pub unsafe fn [< write_ $sysreg >](value: $bitflags_type) {
let value: $type = value.bits();
unsafe {
core::arch::asm!(
concat!("msr ", stringify!($asm_sysreg), ", {value}"),
options(nostack, preserves_flags),
value = in(reg) value,
);
}
}
}
};
($sysreg:ident, $type:ty, safe $(, $fake_sysregs:expr)?) => {
$crate::write_sysreg!($sysreg : $sysreg, $type, safe $(, $fake_sysregs)?);
};
(
$(#[$attributes:meta])*
$sysreg:ident, $type:ty $(, $fake_sysregs:expr)?
) => {
$crate::write_sysreg!($(#[$attributes])* $sysreg : $sysreg, $type $(, $fake_sysregs)?);
};
($sysreg:ident, $type:ty : $bitflags_type:ty, safe $(, $fake_sysregs:expr)?) => {
$crate::write_sysreg!($sysreg : $sysreg, $type : $bitflags_type, safe $(, $fake_sysregs)?);
};
(
$(#[$attributes:meta])*
$sysreg:ident, $type:ty : $bitflags_type:ty $(, $fake_sysregs:expr)?
) => {
$crate::write_sysreg!($(#[$attributes])* $sysreg : $sysreg, $type : $bitflags_type $(, $fake_sysregs)?);
};
}