From 5ef90e31891019f6b046471ed03ef5cbd455aa2e Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Thu, 28 Mar 2019 17:42:38 +0300 Subject: [PATCH] Fix set_spp and set_mpp functions --- src/register/mstatus.rs | 9 +++++++-- src/register/sstatus.rs | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) 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); }