Browse Source

Fix set_spp and set_mpp functions

Vadim Kaushan 6 years ago
parent
commit
5ef90e3189
2 changed files with 14 additions and 4 deletions
  1. 7 2
      src/register/mstatus.rs
  2. 7 2
      src/register/sstatus.rs

+ 7 - 2
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

+ 7 - 2
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);
 }