diff --git a/src/register/mstatus.rs b/src/register/mstatus.rs index 16ea4e1..e18f30c 100644 --- a/src/register/mstatus.rs +++ b/src/register/mstatus.rs @@ -165,13 +165,18 @@ set_csr!( /// Supervisor Previous Privilege Mode #[inline] pub unsafe fn set_spp(spp: SPP) { - _set((spp as usize) << 8); + match spp { + SPP::Supervisor => _set(1 << 8), + SPP::User => _clear(1 << 8), + } } /// Machine Previous Privilege Mode #[inline] pub unsafe fn set_mpp(mpp: MPP) { - _set((mpp as usize) << 11); + let mut value = _read(); + value.set_bits(11..13, mpp as usize); + _write(value); } /// Floating-point extension state diff --git a/src/register/sstatus.rs b/src/register/sstatus.rs index 7ae3d4e..b770030 100644 --- a/src/register/sstatus.rs +++ b/src/register/sstatus.rs @@ -131,12 +131,17 @@ set_clear_csr!( #[inline] #[cfg(riscv)] pub unsafe fn set_spp(spp: SPP) { - _set((spp as usize) << 8); + match spp { + SPP::Supervisor => _set(1 << 8), + SPP::User => _clear(1 << 8), + } } /// The status of the floating-point unit #[inline] #[cfg(riscv)] pub unsafe fn set_fs(fs: FS) { - _set((fs as usize) << 13); + let mut value = _read(); + value.set_bits(13..15, fs as usize); + _write(value); }