|
@@ -1,5 +1,3 @@
|
|
|
-use core::mem::size_of;
|
|
|
-
|
|
|
/// Hart mask structure reference
|
|
|
#[derive(Debug, Clone)]
|
|
|
pub struct HartMask {
|
|
@@ -33,7 +31,7 @@ impl HartMask {
|
|
|
// hart_id < hart_mask_base, not in current mask range
|
|
|
return false;
|
|
|
};
|
|
|
- if idx > size_of::<usize>() {
|
|
|
+ if idx >= usize::BITS as usize {
|
|
|
// hart_idx >= hart_mask_base + XLEN, not in current mask range
|
|
|
return false;
|
|
|
}
|
|
@@ -113,3 +111,38 @@ unsafe fn get_vaddr_usize(vaddr_ptr: *const usize) -> usize {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+#[cfg(test)]
|
|
|
+mod tests {
|
|
|
+ use super::HartMask;
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn rustsbi_hart_mask() {
|
|
|
+ let mask = HartMask::from_mask_base(0b1, 400);
|
|
|
+ assert!(!mask.has_bit(0));
|
|
|
+ assert!(mask.has_bit(400));
|
|
|
+ assert!(!mask.has_bit(401));
|
|
|
+ let mask = HartMask::from_mask_base(0b110, 500);
|
|
|
+ assert!(!mask.has_bit(0));
|
|
|
+ assert!(!mask.has_bit(500));
|
|
|
+ assert!(mask.has_bit(501));
|
|
|
+ assert!(mask.has_bit(502));
|
|
|
+ assert!(!mask.has_bit(500 + (usize::BITS as usize)));
|
|
|
+ let max_bit = 1 << (usize::BITS - 1);
|
|
|
+ let mask = HartMask::from_mask_base(max_bit, 600);
|
|
|
+ assert!(mask.has_bit(600 + (usize::BITS as usize) - 1));
|
|
|
+ assert!(!mask.has_bit(600 + (usize::BITS as usize)));
|
|
|
+ let mask = HartMask::from_mask_base(0b11, usize::MAX - 1);
|
|
|
+ assert!(!mask.has_bit(usize::MAX - 2));
|
|
|
+ assert!(mask.has_bit(usize::MAX - 1));
|
|
|
+ assert!(mask.has_bit(usize::MAX));
|
|
|
+ assert!(!mask.has_bit(0));
|
|
|
+ // hart_mask_base == usize::MAX is special, it means hart_mask should be ignored
|
|
|
+ // and this hart mask contains all harts available
|
|
|
+ let mask = HartMask::from_mask_base(0, usize::MAX);
|
|
|
+ for i in 0..5 {
|
|
|
+ assert!(mask.has_bit(i));
|
|
|
+ }
|
|
|
+ assert!(mask.has_bit(usize::MAX));
|
|
|
+ }
|
|
|
+}
|